運用的知識點:
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
代碼:
#!/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 i 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"
