python案例1---修改haproxy的配置文件

運用的知識點:

  1.python簡單數據結構的使用:列表、字典等

  2.python兩個模塊的使用:os和json

      1.os.rename('文件1','文件2')

      2.json完成自動識別字典、列表,並識別後進行自動轉換

  3.python函數的定義和調用

  4.標誌位的靈活運用:flag和haswrite分別用於找backend的record和判斷是否已經將記錄寫入到文件

  5.python基本語法的使用:for循環、if...else....判斷

  6.python文件的操作的基本使用:with open('文件1','模式') as obj1,open('文件2','模式') as obj2

 

  

代碼:

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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#導入2個模塊json和os
import  json,os
 
#定義fetch函數,並同時傳入我們指定backend參數,此參數代表backend名
def fetch(backend):
    flag = False #定義flag,目的是爲了後面是否取可用的backend
    fetch_list=[]  #定義空列表,目的是爲了後面將取出的backend信息存儲在此列表裏面
 
    #以讀的形式打開'ha'文件,一行一行讀,然後將我們指定backend讀取到列表裏面
    #最後返回裝有我們指定backend信息的列表
    with open('ha') as obj:
        for line in obj:
            if line.strip() == "backend %s" %(backend):
                flag = True
                continue
            if line.strip().startswith('backend'):
                flag=False
            if flag and line.strip():
                fetch_list.append(line.strip())
 
    return fetch_list
 
#定義add1函數,並同時傳入參數dict_info,此字典參數裏面包含我們要傳入的server相關信息
def add1(dict_info):
 
    backend_title = dict_info.get("backend"#要插入的backend的名稱
    context_title = "backend %s" %(backend_title)  #要插入backend整個字段
    record_title = dict_info["record"]
    #要插入的記錄信息
    context_record = "server %s %s weight %s maxconn %s" %(record_title["server"],record_title["server"],record_title["weight"],record_title["maxconn"])
 
    #將backend獲取,並存儲在fetch_list列表裏面
    fetch_list=fetch(backend_title)
 
    #如果要插入的backend存在
        #1.首先設定2個標誌:flag和has_write
            #flag:用於找到要添加的backend下的內容
            #has_write:用於判斷fetch_list中的內容是否重新寫入到了文件
        #2.遍歷源文件ha:
            #1首先逐行讀取,並同時進行判斷,
                # 1.判斷backend是否已經找到,先把backend寫入文件,然後找到後將flag設置爲True,最後跳出本次循環
                # 2.判斷找到的backend裏面的record是否爲空,若爲空將flag設置爲False
                # 3.對flag進行判斷
                    #1.將flag爲True的record從fetch_list寫入到文件中,在這裏面同時要進行是否已經寫入的判斷,即定義has_write的作用
                    #2.若flag爲False,就直接寫入新文件,即將非列表裏的內容直接寫入
 
    if fetch_list:
        flag=False
        has_write = False
        with open('ha') as read_obj,open('ha.new','w') as write_obj:
            for line in read_obj:
                if line.strip() == context_title:
                    write_obj.write("\n"+line)
                    flag=True
                    continue
                if flag and line.startswith('backend'):
                    flag = False
                if flag:
                    for new_line in fetch_list:
                        if not has_write:
                            temp = "%s%s" %(" "*8,new_line)
                            write_obj.write(temp)
                            has_write=True
                else:
                    write_obj.write(line)
 
 
    else:
    #如果要插入的backend不存在
        #分2部分寫入:
            # 1部分.從ha文件裏面直接讀取,並同時將讀取的內容寫入新的文件ha.new
            # 2部分.將新的backend和context信息,直接寫到新的文件ha.new的文件尾部
        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"+context_title+"\n")
            temp=" "*8+context_record+"\n"
            write_obj.write(temp)
 
    #將原文件ha改名備用文件爲ha.bak,即將ha下線
    #將新文件ha.new改名爲線上文件ha,即將ha.new上線
    os.rename('ha','ha.bak')
    os.rename('ha.new','ha')
 
 
#刪除函數
def delete(dict_info):
    #1.首先獲取用戶的記錄並以列表的形式存儲,以便於我們調用
    del_backend = dict_info["backend"]
    del_record = dict_info["record"]
 
    context_title = "backend %s" %(del_backend)
    context_record = "server %s %s weight %s maxconn %s" %(del_record["server"],del_record["server"],del_record["weight"],del_record["maxconn"])
 
    #調用上面定義的fetch()函數,得到包含backend內容的列表
    fetch_list = fetch(del_backend)
    #判斷1:若列表爲空:直接返回
    if not fetch_list:
        return
    #判斷2:否則不爲空
    else:
        #判斷1:若用戶輸入的server信息不在fetch_list裏面,直接返回
        if context_record not in fetch_list:
            print "your server message is not exists"
            return
        #判斷2:若輸入的server在fetch_list裏面,就將此server信息從列表中移除
        else:
            fetch_list.remove(context_record)
 
        #逐行從ha文件中讀取,並同時進行判斷
        #核心思想:
            #首先邊讀取、邊判斷、邊寫入,
            # 判斷其實就是我們自己輸入的backend,找到後將列表fetch_list信息寫入到新的文件裏面。
            # 其餘的非列表的內容直接從源文件ha寫到新文件ha.new即可
        with open('ha','r') as read_obj,open('ha.new','w') as write_obj:
            flag = False
            has_write = False
            for line in read_obj:
                if line.strip() == context_title:
                    write_obj.write(line)
                    flag = True
                    continue
                if flag and line.startswith('backend'):
                    flag = False
                if flag:
                    if not has_write:
                        print fetch_list
                        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)
 
    #將原文件ha改名備用文件爲ha.bak,即將ha下線
    #將新文件ha.new改名爲線上文件ha,即將ha.new上線
    os.rename('ha','ha.bak')
    os.rename('ha.new','ha')
 
 
"""
s='{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}'
data_info=json.loads(s)
add1(data_info)
#delete(data_info)
"""
 
#主函數
if __name__ == "__main__":
    #獲取用戶的操作選擇
    print u"1.獲取記錄\n2.添加記錄\n3.刪除記錄\n"
    select_num=raw_input("plz input number:")
 
    #根據用戶的選擇,進行調用函數
    if select_num == "1":
        backend = raw_input("plz input backend:")
        fetch_list = fetch(backend)
        for in fetch_list:
            print i
    else:
        print "plz input like this example:"
        print '{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}'
        data_str = raw_input("plz input record>>>")
        data_dict = json.loads(data_str)
        if select_num == "2":
            add1(data_dict)
        elif select_num == "3":
            delete(data_dict)
        else:
            print "input error"

轉載自:http://www.cnblogs.com/jachy/p/4983246.html

發佈了210 篇原創文章 · 獲贊 28 · 訪問量 120萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章