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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...