1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python
# -*- coding:utf8 -*-
import  os
import  json
 
def  fetch(backend):
         fetch_list  =  []
         with  open ( 'ha' ) as obj:
                 flag  =  False
                 for  line  in  obj:
                         # line 每一行,
                         if  line.strip()  = =  "backend %s"  %  backend:
                                 flag  =  True
                                 continue
                         # 判断,如果当前是 backend开头,不再放
                         if  flag  and  line.strip().startswith( 'backend' ):
                                 break
                         if  flag  and  line.strip():
                                 fetch_list.append(line.strip())
         return  fetch_list
 
#result = fetch("buy.oldboy.org")
#print result
def  adds(dict_info):
     #s = '{"backend": "www.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}'
         backend_title  =  dict_info.get( 'backend' )
         current_title  =  "backend %s"  %  backend_title
         current_record  =  "server %s %s weight %s maxconn %s"  %  (dict_info[ 'record' ][ 'server' ],dict_info[ 'record' ][ 'server' ],dict_info[ 'record' ][ 'weight' ],dict_info[ 'record' ][ 'maxconn' ])
         # 获取制定backend下的所有记录
         fetch_list  =  fetch(backend_title)
         #print fetch_list
         # backend是否存在
         if  fetch_list:
             #pass # 存在backend,则只需再添加记录
             # 1,要插入的记录,存在
             # 2,要插入的记录,不存在
             if  current_record  in  fetch_list:
                     pass
             else :
                     fetch_list.append(current_record) #如果不存在直接将current_record追加到fetch_list中
             # 此时fetch_list为处理完的新列表
             with  open ( 'ha' ) as read_obj,  open ( 'ha.new' 'w' ) as write_obj:
                     flag  =  False
                     has_write  =  False
                     for  line  in  read_obj: #读取原配置文件
                         if  line.strip()  = =  current_title: #如果读取的行内容与current_title相等,则把current_title写入到文件中,然后就跳出本次循环,
                                 write_obj.write(line)
                                 flag  =  True
                                 continue
                         if  flag  and  line.strip().startswith( 'backend' ): #如果flag为真并且读取的line.strip内容是以"backend开头",则将flag置False
                                 flag  =  False
                         if  flag:
                         #如果flag为True新的列表fetch_list所有数据一行一行的写入到新配置文件,即当遍历原配置文件中current_title标签下的current_record记录,如果curent_record有三条,则循环三次,每循环一次就将fetch_list完整遍历一次的然后一条一条地写入到新配置文件,所以这里要用一个标识符has_write作为判断是否写入,如果已经写入了就不再继续往新配置文件中写入
                                 if  not  has_write:
                                    for  new_line   in  fetch_list:
                                         temp  =  "%s %s \n"  % ( " " * 8 , new_line)
                                         write_obj.write(temp)
                                    has_write  =  True
                         else :
                             # 不满足以上的各种情况则直接将内容写入新配置文件
                                 write_obj.write(line)
         else :
                 #pass,如果不存在backend,则添加backend和current_record
                 # current_title,current_record
                 # 直接打开文件
                 with  open ( 'ha' ) as read_obj,  open ( 'ha.new' 'w' ) as write_obj:
                         for  line  in  read_obj:
                                 write_obj.write(line)
                         write_obj.write( '\n' + current_title + '\n' ) #将要插入的current_title和两条current_record记录再写到新配置文件末尾
                         temp  =  "%s %s \n"  % ( " " * 8 , current_record) #把current_record两条记录写到新配置文件中
                         write_obj.write(temp)
 
 
#s = '{"backend": "test.oldboy.org","record":{"server": "10.10.10.9","weight": 20,"maxconn": 3000}}'
#data_dict = json.loads(s)
#adds(data_dict)
 
def  remove(dict_info):
     backend_title  =  dict_info.get( 'backend' )
     current_title  =  "backend %s"  %  backend_title
     current_record  =  "server %s %s weight %s maxconn %s"  %  (dict_info[ 'record' ][ 'server' ],dict_info[ 'record' ][ 'server' ],dict_info[ 'record' ][ 'weight' ],dict_info[ 'record' ][ 'maxconn' ])
     # 获取制定backend下的所有记录
     fetch_list  =  fetch(backend_title)
     if  fetch_list:
        pass
     else :
          if  current_record  not  in  fetch_list:
             pass
          else :
             fetch_list[fetch_list.index(current_record)]
             if  len (fetch_list) >  0 :
                 fetch_list.insert( 0 , backend_title)
          with  open ( 'ha' ) as read_file,  open ( 'ha.new' 'w' ) as write_file:
             flag  =  False
             has_write  =  False
             for  line  in  read_file:
                 line_strip  =  line.strip()
                 if  line_strip  = =  backend_title:
                     flag  =  True
                     continue
                 if  flag  and  line_strip.startswith( 'backend' ):
                     flag  =  False
                 if  not  flag:
                     write_file.write(line)
                 else :
                     if  not  has_write:
                         for  in  fetch_list:
                             if  i.startswith( 'backend' ):
                                 write_file.write(i + '\n' )
                             else :
                                 write_file.write( "%s%s\n"  %  ( 8 * " " , i))
                     has_write  =  True
        
        
os.rename( "ha" 'ha.bak' )
os.rename( "ha.new" 'ha' )
        
 
 
if   __name__  = =  '__main__' :
     
     print  '1、获取;2、添加;3、删除'
     num  =  raw_input ( '请输入序号:' )
     data  =  raw_input ( '请输入内容:' )
     if  num  = =  '1' :
         fetch(data)
     else :
         dict_data  =  json.loads(data)
         if  num  = =  '2' :
             add(dict_data)
         elif  num  = =  '3' :
             remove(dict_data)
         else :
             pass