您好,登錄后才能下訂單哦!
上次已經進行了圖解。本次將展示一些主要的函數:
##################################### 1 服務器組展示函數:sys_show() #################### def sys_show(file): sys_zone_name = 'backend' ### 搜索關鍵字, 系統組名稱 ### srv_zone_name = '' ### 搜索關鍵字,服務器組的名稱 ,例如:Oracle ### svr_name = 'server' ###搜索關鍵字,服務器關鍵字### srv_zone_names_list = [] ### 服務器組名稱sys_zone_name組成的列表 ### srv_zone_names_dict = {} ### 服務器組名稱sys_zone_name組成的字典,返回該值 ### svr_zones_dict = defaultdict(list) ### 各服務器組名稱(srv_zone_name)和對應服務器詳細參數(svr_record_dict{})組成的字典 ,返回該值### svr_record_dict = OrderedDict() ### 包含服務器詳細參數有序字典 ### svr_record_list = [] ### svr_record_dict{} 的列表形式### svr_name_flag = False ### 標記是否找到該服務組(srv_zone_name)的標志### with open(file, mode='r', encoding='UTF-8') as cfg_file: for line in cfg_file.readlines(): line = line.strip('\n') if re.match(sys_zone_name, line): ### 系統組名稱 sys_zone_name 如果在line中 ### srv_zone_name = re.split('\s+', line)[1] ### 取得 srv_zone_name值 ### srv_zone_names_list.append(srv_zone_name) ### 將srv_zone_name值存入列表 srv_zone_names_list中 ### svr_name_flag = True ### 找到 對應的系統 sys_zone_name ### elif svr_name_flag and re.match('\s+server', line): ### 在該系統 sys_zone_name下,如果存在svr_name關鍵字 ### svr_record_list = re.split('\s+', line) ### 該行以 空格 為分隔符 將具體信息 存入 svr_record_list[]中 ### svr_record_dict = OrderedDict() ### 在定義新參數前,歸位svr_record_dict,,否則會使用下面的新參數覆蓋所有原先的賦值### svr_record_dict['server_name'] = svr_record_list[2] svr_record_dict['IP_address'] = svr_record_list[4] svr_record_dict['weight'] = svr_record_list[6] svr_record_dict['maxconn'] = svr_record_list[8] ###取出列表svr_record_list 的信息,存入svr_record_dict{}字典中### svr_zones_dict[srv_zone_name].append(svr_record_dict) ### 將srv_zone_name 與 svr_record_dict關聯 ### else: svr_name_flag = False for k, v in enumerate(srv_zone_names_list, 1): srv_zone_names_dict[k] = v ###對srv_zone_names_list進行新字典賦值### print(' \033[34m %d . %-6s 服務器組 \033[0m' % (k, v)) ###輸出 帶編號的 服務器組 名稱### return srv_zone_names_dict, svr_zones_dict ###返回srv_zone_names_dict字典 和svr_zones_dict 字典### #########################################################################################
效果圖:
下面是服務器展示函數:
#################################### 4 服務器展示函數 srv_record_show () ################ def srv_record_show(srv_zone_name, svr_zones_dict): ############對sys名稱進行遍歷并加上數字編號########################### print('\n================================================================================') print('(%s)服務器信息如下 : ' % srv_zone_name) print('%-5s %-18s %-18s %-18s %-18s' % ('id', 'name', 'address', 'weight', 'maxconn')) svr_detail = svr_zones_dict[srv_zone_name] for k, v in enumerate(svr_detail, 1): ###用enumerate進行unit_record展示### print('%-5s ' % k, end='') for kk, vv in v.items(): print('%-18s' % vv, end='|') print() print('\n=========================================================================') #########################################################################################
效果圖如下:
#################################### 8 配置文件回寫函數 wrt2cfg() ####################### def wrt2cfg(file, svr_zones_all_dict): newfile = '%s.new' % file ###定義回寫的新文件### svr_name_flag = False ###同時開啟2個文件,分別進行讀寫### with open(file, 'r', encoding='UTF-8') as read_file, open(newfile, 'w', encoding='UTF-8') as write_file: for line in read_file: if re.match('backend', line): ###讀取read_file,匹配至backend行時### write_file.write(line) ###將本行插入到write_file中。### srv_zone_name = re.split('\s+', line)[1] for srv_dict in svr_zones_all_dict[srv_zone_name]: ###對svr_zones_all_dict字典進行遍歷### server_line = '\t server {server_name} IP {IP_address} weight {weight} maxconn {maxconn}\n' write_file.write(server_line.format(**srv_dict)) ###將srv_zone_name下的server行插入到write_file### svr_name_flag = True ###讀取到read_file中以server開頭的行,將該行svr_name_flag標記為真### elif svr_name_flag and re.match('\s+server', line): ###讀取read_file,匹配至server開頭的行時跳過,對write_file不做任何操作### pass else: write_file.write(line) ###將read_file其他的行直接插入到write_file中### svr_name_flag = False ###讀取read_file,未發現以server開頭的行時,將該行server_flag標記為FALSE### print('\033[39m 配置文件 更新成功\033[0m') os.system('move %s %s.bak ' % (file, file)) ###對源文件read_file進行備份### os.system('move %s %s' % (newfile, file)) ##對新生成的write_file進行改名### #########################################################################################
#################################### 9 更新服務器數據函數 update_svr_dict()############# def update_svr_dict (new_svr_dict,update_select_num) : old_select_num = update_select_num (new_svr_dict['server_name'], update_select_num) = name_filter(update_select_num) ###對name檢查### if old_select_num == update_select_num : (new_svr_dict['IP_address'], update_select_num) = ipaddress_filter(update_select_num) ###對IP檢查### if old_select_num == update_select_num : (new_svr_dict['weight'], update_select_num) = number_filter('權重值',update_select_num) ###對權重檢查### if old_select_num == update_select_num : (new_svr_dict['maxconn'], update_select_num) = number_filter('最大連接數',update_select_num) ###對最大連接數檢查### if old_select_num == update_select_num : print (new_svr_dict['server_name'], new_svr_dict['IP_address'], new_svr_dict['weight'], new_svr_dict['maxconn']) return (new_svr_dict,update_select_num) #########################################################################################
主程序如下:
##################################主程序開始############################################# if __name__ == '__main__': flag = True ### 腳本運行的標志 ### sys_zone_name_ky = 'backend' ### 系統的 名稱 ### srv_zone_name_vl = '' ### 服務器組的名稱 例如:Oracle sys_cfg_file = 'configuretion.cfg' ###指定sys的配置文件### svr_zones_all_dict = {} ### svr_zones_all_dict字典 記錄各服務器的詳細信息 ### srv_zone_all_names_dict = {} ### svr_name_ky 字典(由svr_name_ky列表和 數字編號 組成的字典)### global_opt2 = '' srv_zone_name_vl_num = '' while flag: ### 循環M ### os.system('cls') ###清屏### print('\n \033[38m ================================================================') print(' \033[36m 歡迎使用 數據庫服務器 配置文件管理平臺:\033[0m') print('\033[32m ================================================================') print(''' \033[39m 1. 查詢具體服務器\033[0m \033[34m 2. 添加具體服務器\033[0m \033[39m 3. 修改服務器列表\033[0m \033[34m 4. 刪除服務器列表\033[0m \033[31m 0. 退出\033[0m ''') print('================================================================') select_num = input('\033[30m 請按 數字鍵(0~4) 選擇:\033[0m') ##################################### 0 退出 exit ############################### if select_num == '0': flag = False continue while select_num in ['1','2','3','4'] : ### 循環 0 ### if select_num == '1':temp_vl = '查看' #temp_vl 為下一步顯示對應選定的操作而設置的臨時參數 if select_num == '2':temp_vl = '添加' if select_num == '3':temp_vl = '修改' if select_num == '4':temp_vl = '刪除' old_select_num = select_num print('\n %-8s ZONE 服務器組信息如下 : ' % sys_zone_name_ky) (srv_zone_all_names_dict, svr_zones_all_dict) = sys_show(sys_cfg_file) print('\033[32m ================================================================') input_content = input('\033[39;1m請輸入進行\033[33;1m%s\033[0m操作的服務器組的編號或名稱' \ '(返回主菜單,請輸入B or b):\033[0m' % temp_vl ) ############################## 對輸入值進行過濾 ############################# (srv_zone_name_vl, tmp_flag) = content_filter(input_content, srv_zone_all_names_dict) if srv_zone_name_vl: ###顯示對應 srv_zone 下的服務器列表### srv_record_show(srv_zone_name_vl, svr_zones_all_dict) if tmp_flag == False : break ##################################### 1 查詢服務器信息 ###################### if select_num == '1': continue ##################################### 2. 更新服務器信息 ##################### while select_num == old_select_num and srv_zone_name_vl: ### 循環1 ### if select_num in [ '3', '4' ]: ###判斷修改、刪除選項中輸入的服務器編號準確性### srv_zone_name_vl_num = input('\033[32;1m請輸入\033[33;1m%s\033[0m的服務器的編號,((N|n)返回上級菜單):\033[0m'% temp_vl) if srv_zone_name_vl_num in ['N', 'n']: break if len(srv_zone_name_vl_num) != 0: srv_zone_name_vl_num = input_str2int(srv_zone_name_vl_num) #####################指定具體的server編號進行判斷##### elif srv_zone_name_vl_num not in range(1, len(svr_zones_all_dict[srv_zone_name_vl]) + 1): print('超出范圍,請重新輸入!!!') continue ###srv_zone_name_vl_num不在在服務器組個數范圍之內,提示并重新選擇### if select_num in [ '2','3' ]: ###添加和修改服務器時進行的操作步驟:更新服務器列表### update_srv_dict = OrderedDict() (update_srv_dict, select_num) = update_svr_dict(update_srv_dict,select_num) if select_num in [ '4' ]: print(svr_zones_all_dict[srv_zone_name_vl][srv_zone_name_vl_num - 1]) #顯示被選中刪除的服務器列表# if select_num == old_select_num : ###如果在以上操作中沒有進行取消操作,則選擇參數不會變化,維持原來的用戶操作。### update_opt = input('(Y|y)\033[33;1m%s\033[0m此服務器,任意鍵取消:' % temp_vl) if update_opt in ['y','Y']: if select_num == '2': svr_zones_all_dict[srv_zone_name_vl].append(update_srv_dict) if select_num == '3': svr_zones_all_dict[srv_zone_name_vl][srv_zone_name_vl_num - 1] =update_srv_dict if select_num == '4': del svr_zones_all_dict[srv_zone_name_vl][srv_zone_name_vl_num - 1] wrt2cfg(sys_cfg_file, svr_zones_all_dict) srv_record_show(srv_zone_name_vl, svr_zones_all_dict) print('\033[33;1m%s\033[0m成功!' % temp_vl) else : ###如果在添加、修改、刪除過程中,選擇了取消,則select_num=5 ,對應操作皆被取消### print("\033[33;1m%s\033[0m被取消" % temp_vl) global_opt2 = input('(Y|y)繼續\033[33;1m%s\033[0m本組服務器,(N|n)返回重新選擇服務器組,(B|b)返回主菜單:' % temp_vl) ###以上所有操作完成后,根據用戶需求,修正select_num 數值,提示用戶下一步操作。### if global_opt2 in ['B', 'b']: ### 遇到select_num = '5'時,返回主菜單。### select_num = '5' print("返回主菜單。") elif global_opt2 in ['N', 'n']: ###用戶繼續選擇服務器組,繼續進行對原來的操作select_num = old_select_num,。### select_num = old_select_num break else: select_num = old_select_num ###在原來選擇的服務器組中,繼續進行操作。### else: sys.exit('\033[36m 程序退出,歡迎使用,謝謝! \033[0m') #########################################################################################
部分截圖如下:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。