s13 day3作業

来源:http://www.cnblogs.com/ernest-zhang/archive/2016/05/27/5536538.html
-Advertisement-
Play Games

ha_proxy配置文件修改程式ha_file 為存儲配置信息的文件。運行的時候對該文件進行操作。1.查詢信息:用戶輸入功能變數名稱,獲得功能變數名稱相關信息2.修改配置文件:用戶輸入的格式應該為 {"backend": "test.oldboy.org","record":{"server": "100.1.7. ...


ha_proxy配置文件修改程式
ha_file 為存儲配置信息的文件。運行的時候對該文件進行操作。
1.查詢信息:用戶輸入功能變數名稱,獲得功能變數名稱相關信息
2.修改配置文件:用戶輸入的格式應該為 {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
然後執行判斷,如果輸入的backend存在,則判斷對應的信息是否重覆,如果重覆,則提醒用戶,同時對配置文件不做更改。
如果輸入的信息與原配置信息不符,則追加到相應的backend下。
如果輸入的backend不存在,則追加到文件末尾。
3.刪除信息:用戶輸入存在的功能變數名稱,則刪除功能變數名稱和相應的配置文件。如果不存在,則提示錯誤。

下麵是ha_file文件信息

 1 global
 2         log 127.0.0.1 local2
 3         daemon
 4         maxconn 256
 5         log 127.0.0.1 local2 info
 6 defaults
 7         log global
 8         mode http
 9         timeout connect 5000ms
10         timeout client 50000ms
11         timeout server 50000ms
12         option  dontlognull
13 
14 listen stats :8888
15         stats enable
16         stats uri       /admin
17         stats auth      admin:1234
18 
19 frontend oldboy.org
20         bind 0.0.0.0:80
21         option httplog
22         option httpclose
23         option  forwardfor
24         log global
25         acl www hdr_reg(host) -i www.oldboy.org
26         use_backend www.oldboy.org if www
27 
28 backend www.oldboy.org
29         server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
30         server 100.1.7.9 100.1.7.9 weight 20 maxconn 300
31         server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
ha_file

下麵是主要程式代碼,

 1 #!/use/bin/env python
 2 #_*_ coding:utf_8 _*_
 3 import json,time,os,sys
 4 
 5 time_now=time.strftime('%Y-%m-%d %H:%M:%S')
 6 time_flag=time.strftime('%Y-%m-%d-%H-%M-%S')
 7 
 8 
 9 if __name__ =='__main__':
10     """
11     主函數,通過判斷用戶輸入執行相應操作
12     :return:
13     """
14     while True:
15         print(
16             '''
17 ---------------------------------------
18     請輸入下列編號進行操作,按q退出:
19         1:獲取haproxy記錄
20         2:增加haproxy記錄
21         3: 刪除haproxy記錄
22 ----------------------------------------
23          ''')
24         get_mun = input('請輸入操作序號:')
25         if get_mun == 'q':
26             exit('bye')
27         if get_mun.isdigit:
28             get_mun = int(get_mun)
29         if get_mun == 1: #如果選擇1,則執行get_ha()
30             read = input("請輸入backend:(例如:www.oldboy.org)")
31             ha_list = get_ha(read)
32             if len(ha_list)!= 0:
33                 print(ha_list)
34             else:
35                 print('沒有找到相應記錄,請檢查輸入是否正確')
36         elif get_mun == 2:
37             add_ha()
38         elif get_mun == 3:
39             del_domain = input('請輸入想要刪除的值:')
40             del_ha(del_domain)
main()

main函數調用其他幾個函數,分別為查詢記錄,增加記錄和刪除記錄

定義查詢函數

 1 def get_ha(get_read):
 2     """
 3     定義查詢函數
 4     :param get_read:用戶輸入想查詢的信息
 5     :return:返回查詢結果
 6     """
 7     get_flags = 0 #設置標識符,當匹配到輸入時置為1
 8     get_list = [] #將匹配到的內容放在列表中
 9     with open('ha_file','r',encoding='utf-8') as f:
10         for line in f.readlines():
11             line = line.strip() #去掉多餘的空格和換行符
12             if line == 'backend %s'%get_read:
13                 get_flags = 1
14             elif line.startswith('backend'):
15                 get_flags = 0
16             elif get_flags == 1 and len(line)!= 0 :
17                 get_list.append(line)
18     return get_list
get_ha()

定義增加函數

 1 def add_ha():
 2     while True:
 3         add_resource_str = input('請輸入想要增加的記錄: ')
 4         result_check = check_input(add_resource_str)
 5         if result_check == False:
 6             print('請輸入正確格式')
 7         if result_check == True:
 8             add_resource = json.loads(add_resource_str) #取得輸入的值
 9             domain_info = add_resource['backend']
10             server_info = add_resource['record']['server']
11             weight_info = add_resource['record']['weight']
12             maxcont_info = add_resource['record']['maxconn']
13             match_info = ('server {} {} weight {} maxconn {}').format(server_info,server_info,weight_info,maxcont_info)
14             #match_info 判斷信息是否存在,不存在則添加進文件
15             # print(match_info,type(match_info))
16             # print(domain_info)
17             get_match = get_ha(domain_info) #原文件已經存在的記錄
18             # print(get_match[0])
19             if get_match != []:#功能變數名稱信息存在
20                 if get_match[0] == match_info:
21                     print('信息已存在,不做更改')
22                 else:
23                     #功能變數名稱信息存在,但是有更新,f1為原文件,f2為備份文件
24                     with open('ha_file','r',encoding='utf-8') as f1:
25                         all_config = f1.readlines()
26                     match_item = 'backend {}\n'.format(domain_info) #獲得更新後的配置信息
27                     #print(match_item)
28                     if str(match_item) in all_config:
29                         update_index = all_config.index(str(match_item))
30                         insert_record_index = int(update_index) +1
31                         all_config.insert(int(insert_record_index),8*' '+match_info+'\n') #將數據插入
32                         with open('ha_new','w',encoding='utf-8') as f2:
33                             f2.writelines(all_config)
34                         os.rename('ha_file','ha_bak%s'%(time_flag))
35                         os.rename('ha_new','ha_file')
36             else:  #原文件不存在相同功能變數名稱,追加到文件末尾
37                 with open('ha_file','r',encoding='utf-8') as f1,open('ha_new','w',encoding='utf-8') as f2:
38                     all_config = f1.readlines()
39                     str_append = ('''
40 backend %s
41         %s
42         '''%(domain_info,match_info))# 字元串預格式化
43                     all_config.append(str_append)
44                     f2.writelines(all_config)
45                     os.rename('ha_file','ha_bak')
46                     os.rename('ha_new','ha_file')
47         return
add_ha

定義刪除函數

 1 def get_ha(get_read):
 2     """
 3     定義查詢函數
 4     :param get_read:用戶輸入想查詢的信息
 5     :return:返回查詢結果
 6     """
 7     get_flags = 0 #設置標識符,當匹配到輸入時置為1
 8     get_list = [] #將匹配到的內容放在列表中
 9     with open('ha_file','r',encoding='utf-8') as f:
10         for line in f.readlines():
11             line = line.strip() #去掉多餘的空格和換行符
12             if line == 'backend %s'%get_read:
13                 get_flags = 1
14             elif line.startswith('backend'):
15                 get_flags = 0
16             elif get_flags == 1 and len(line)!= 0 :
17                 get_list.append(line)
18     return get_list
del_ha

由於本次為手動輸入記錄,對格式有嚴格的要求,所以定義一個檢查輸入的函數。實際環境中應該是從其他地方get到格式化好的值。

 1 def check_input(check_dir):
 2     """
 3     檢查輸入格式是否正確
 4     :param check_str:
 5     :return:
 6     """
 7     try:
 8         check = json.loads(check_dir)
 9         domain_info = check['backend']
10         server_info = check['record']['server']
11         weight_info = check['record']['weight']
12         maxcont_info = check['record']['maxconn']
13 
14     except:
15         return False
16     else:
17         return True
check_input

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、關於構造函數和析構函數 1、python中有構造函數和析構函數,和其他語言是一樣的。如果子類需要用到父類的構造函數,則需要在子類的構造函數中顯式的調用,且如果子類有自己的構造函數,必然不會自動調用父類的構造函數;但是對於沒有構造函數的子類來說,則會自動繼承父類的構造函數,且子類總會預設繼承多個父 ...
  • 本文內容全部出自《Python基礎教程》第二版,在此分享自己的學習之路。 lxx___歡迎轉載:http://www.cnblogs.com/Marlowes/p/5520948.htmllxx___ Created on Marlowes 本章將會介紹如何創建Python程式的圖形用戶界面(GUI ...
  • 前言: 本章會使用OC和Swift分別進行實現,需要瞭解Swift的小伙伴可以翻一下之前的博文 LBS和SoloMo(索羅門) LBS:基於位置的服務,根據定位展示周邊美食、景點等信息(全稱:Location Bassed Service) SoloMo:將位置社交、本地、移動化(全稱:Soclal ...
  • ...
  • 只能自定一個彈窗樣式 首先必須明白的一點是,alert只是一個方法,而這個方法內部是native code,這是我們無法修改的部分,而最終暴露的只有這個alert方法名字而已,你甚至拿不到alert的屬性,因此要真正意義上的做到修改alert樣式是不可行的。 有了以上這個條件基礎,我們能做的只有重寫 ...
  • 本來說完字元串、數字、布爾值之後,應該要繼續講元祖、列表之類的。但是元祖和列表都屬於序列,所以有必要先講講python的序列是什麼。 首先,序列是是Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。每個索引對應一個元素。 ...
  • Python執行某一類的時候,相當於執行__init__ 方法 例如:list() list __init__ set 是一個無序且不重覆的元素集合,可看做數學中的集合 用法: 1.創建集合 s = set() 創建空集合 s = set([11,22,33]) s = set('asdfghh') ...
  • 現階段php如果要操作mysql資料庫 php給我們提供了3套庫 1、mysql擴展庫 面向過程操作 2、mysqli擴展庫 面向對象操作和麵向過程操作並存 安全性和效率高於mysql擴展庫 3、PDO擴展庫 面向對象操作 今天這篇博文主要要談談mysql擴展庫和mysqli擴展庫 主要是記錄了著2 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...