zoukankan      html  css  js  c++  java
  • Python蜕变-2017-4-23

      我的第一篇博客,这是试水练习。这次上的菜是Haporxy配置文件操作。

    <1> 上需求:

    具体配置文件如下:

     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 weight 20 maxconn 3000
    View Code

    <2>分析需求:

      1.将配置文件中的主要信息也就是“backend”后的数据展示出来。

      2.能够对数据进行增删改查的操作。

      3.每次操作后进行备份。

    <3>功能分析:

      1.读取配置文件并截取有用数据打印。

      2.具备增删改查功能,在此有用户输入,所以有必要进行判断,防止错误输入导致程序崩溃。

      3.将操作后的数据与原始的无关数据进行拼接写入配置文件

    <4>完整代码:

      1 #--------------------------Haporxy配置文件操作--------------------------------------
      2 #py3.4                            by:羽凡                                 2017-4-23
      3 #----------------------------------------------读取文件处理数据(返回字典Info{})-------
      4 def Deal_file():
      5     s = ""
      6     Info = {}
      7     with open("配置文件.txt","r") as f:
      8         for i in f:
      9             if i.startswith("backend"):
     10                 backend = i.strip().split(" ")[1]
     11                 Info[backend] = []
     12             elif i.strip().startswith("server"):
     13                 server = i.strip().split(" ")[1]
     14                 weight = i.strip().split(" ")[3]
     15                 maxconn = i.strip().split(" ")[5]
     16                 Server = {"server":server,"weight":weight,"maxconn":maxconn}
     17                 Info[backend].append(Server)
     18             else:
     19                 continue
     20     return Info
     21 #----------------------------------------------信息保存-----------------------------
     22 def Save_Info(Info):
     23     s = ""
     24     with open("配置文件.txt","r") as f:
     25         for i in f:
     26             if not i.startswith("backend"):
     27                 s = s + i
     28             else:
     29                 break
     30     s1 = ""
     31     for backend in Info:
     32         s2 = "backend " + backend
     33         s1 = s1 + s2 + "
    "
     34         for di in Info[backend]:
     35             server = di["server"]
     36             weight = di["weight"]
     37             maxconn = di["maxconn"]
     38             s3 = "      server {} weight {} maxconn {}".format(server,weight,maxconn)
     39             s1 = s1 + s3 + "
    "
     40     S = s + s1
     41     with open("配置文件.txt","w+") as F:
     42         F.write(S)
     43     return(S)
     44 #----------------------------------------------展示信息,返回指令---------------------
     45 def Show(Info):
     46     show_list = []
     47     print("--------------------""33[1;31;0m""HaProxy配置文件管理""33[0m""-------------------------------")
     48     for i,n in enumerate(Info):
     49         show_list.append(n)
     50         print("33[1;32;0m",i+1,n,"33[0m")
     51     print("------------------------------------------------------------------------")
     52     order = input("请输入指令(A)新建、(D)删除、(M)修改、(C)查询、(Q)退出:")
     53     while order not in ("A","D","M","C","Q"):
     54         order = input("33[1;31;0m""输入错误,请重新输入:""33[0m")
     55     show_list = list(show_list)
     56     return order,show_list
     57 #----------------------------------------------Backend编号输入判断-------------------
     58 def Jude(choice,show_list):
     59     try:
     60         if eval(choice) not in range(len(show_list)+1):
     61             return True
     62         else:return False
     63     except:
     64         return True
     65 #----------------------------------------------Server编号判断-----------------------
     66 def JudeS(choiceS,a):
     67     try:
     68         if int(choiceS) in range(1,a+1) or int(choiceS) == 1:
     69             return False
     70         else:
     71             return True
     72     except:
     73         return True
     74 #----------------------------------------------新增信息判断--------------------------
     75 def JudeA(backend,weight,maxconn):
     76     try:
     77         if backend.startswith("www") and int(weight) in range(50) and int(maxconn) in range(5000):
     78             return False
     79     except:
     80         return True
     81 #----------------------------------------------查询---------------------------------
     82 def Check(show_list):
     83     choice = input("请选择backend:")
     84     while Jude(choice,show_list):
     85         choice = input("33[1;31;0m""输入错误,请重新输入:""33[0m")
     86     choice = int(choice)
     87     print("------------------------------",show_list[choice-1],"------------------------------")
     88     for a,b in enumerate(Info[show_list[choice-1]]):
     89             print("{} server:{}     weight:{}   maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
     90     print("----------------------------------------------------------------------------")
     91     select = input("请输入指令(Q)退出、(B)返回:")
     92     while select not in ("Q","B"):
     93         select = input("33[1;31;0m""请输入正确指令:""33[0m")
     94     if select == "Q":
     95         pass
     96     elif select == "B":
     97         main()
     98 #----------------------------------------------删除---------------------------------
     99 def Delete(show_list):
    100     choice = input("删除Backend(B) or  Server(S)?:")
    101     while(choice not in ("B","S")):
    102         choice = input("33[1;31;0m""请输入正确的指令:""33[0m")
    103     selection = input("请选择Backend编号:")
    104     while Jude(selection,show_list):
    105         selection = input("33[1;31;0m""请输入正确的编号:""33[0m")
    106     selection = int(selection)
    107     if choice =="B":
    108         del Info[show_list[selection-1]]
    109         Save_Info(Info)
    110         print("33[1;31;0m""删除成功!""33[0m")
    111         main()
    112     elif choice == "S":
    113         print("------------------------------",show_list[selection-1],"------------------------------")
    114         for a,b in enumerate(Info[show_list[selection-1]]):
    115             print("{} server:{}     weight:{}   maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
    116         print("----------------------------------------------------------------------------")
    117         choiceS = input("选择要删除的Server:")
    118         while JudeS(choiceS,a):
    119             choiceS = input("33[1;31;0m""请输入正确的编号:""33[0m")
    120         choiceS = int(choiceS)
    121         Info[show_list[selection-1]].pop(choiceS-1)
    122         Save_Info(Info)
    123         print("33[1;31;0m""删除成功!""33[0m")
    124         main()
    125 #----------------------------------------------增加---------------------------------
    126 def Add():
    127     print("————>请输入详细信息<————")
    128     backend = input("Backend名称:")
    129     server = input("Server名称:")
    130     weight = input("权重(weight):")
    131     maxconn = input("最大链接数(maxconn):")
    132     while JudeA(backend,weight,maxconn):
    133         print("33[1;31;0m""输入信息错误,请重新输入!!!""33[0m")
    134         Add()
    135     if backend not in Info:
    136         Info[backend] = [{"server":server,"weight":weight,"maxconn":maxconn}]
    137         print(">>>>>新建成功")
    138     else:
    139         flag = 1
    140         for ser in Info[backend]:
    141             if server == ser["server"]:
    142                 flag = 0
    143                 ser["weight"] = weight
    144                 ser["maxconn"] = maxconn
    145                 print(">>>>>backend及server信息已存在,""33[1;31;0m""server信息已修改""33[0m")
    146         if flag:
    147             Info[backend].append({"server":server,"weight":weight,"maxconn":maxconn})
    148             print(">>>>>backend已存在,""33[1;31;0m""server添加成功""33[0m")
    149     Save_Info(Info)
    150     main()
    151 #----------------------------------------------修改---------------------------------
    152 def Modify(show_list):
    153     selection = input("修改backend(B)  or  server(S)?>")
    154     while (selection not in ("B","S")):
    155         selection = input("33[1;31;0m""请输入正确回答:""33[0m")
    156     choice = input("请输入要修改的backend编号:")
    157     while Jude(choice,show_list):
    158         choice = input("33[1;31;0m""请输入正确编号:""33[0m")
    159     choice = int(choice)
    160     if selection == "B":
    161         backend = input("修改backend名称为:")
    162         while not backend.startswith("www"):
    163             backend = input("33[1;31;0m""请输入合法的backend名称:""33[0m")
    164         temp = Info[show_list[choice-1]]
    165         del Info[show_list[choice-1]]
    166         Info[backend] = temp
    167         Save_Info(Info)
    168         print("33[1;31;0m""修改backend成功""33[0m")
    169         main()
    170     else:
    171         print("------------------------------",show_list[choice-1],"------------------------------")
    172         for a,b in enumerate(Info[show_list[choice-1]]):
    173             print("{} server:{}     weight:{}   maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
    174         print("----------------------------------------------------------------------------")
    175         selection = input("修改哪个server?>")
    176         while JudeS(selection,a):
    177             selection = input("33[1;31;0m""请输入正确的server编号:""33[0m")
    178         selection = int(selection)
    179         sername = input("修改server为:")
    180         Info[show_list[choice-1]][a-1]["server"] = sername
    181         Save_Info(Info)
    182         print("33[1;31;0m""修改server成功""33[0m")
    183         main()
    184 #----------------------------------------------指令处理------------------------------
    185 def Deal_order(order,show_list):
    186     if order =="Q":          #退出
    187         pass
    188     elif order =="A"  :      #新建
    189         Add()
    190     elif order == "D":       #删除
    191         Delete(show_list)
    192     elif order == "M":       #修改
    193         Modify(show_list)
    194     elif order == "C":
    195         Check(show_list)
    196     else:
    197         order = input("33[1;31;0m""输入错误,请重新输入:""33[0m")
    198         Deal_order(order,show_list)
    199 #----------------------------------------------主函数--------------------------------
    200 def main():
    201     order,show_list = Show(Info)
    202     Deal_order(order,show_list)
    203 if __name__=="__main__":
    204     Info = Deal_file()
    205     main()
    View Code

    <5>处理流程:

    <6>主要函数功能介绍:

       1.Deal_file():读取配置文件,并截取操作数据,通过String.startswith()找到截取位置获取数据,返回字典形式。

     1 def Deal_file():
     2     s = ""
     3     Info = {}
     4     with open("配置文件.txt","r") as f:
     5         for i in f:
     6             if i.startswith("backend"):
     7                 backend = i.strip().split(" ")[1]
     8                 Info[backend] = []
     9             elif i.strip().startswith("server"):
    10                 server = i.strip().split(" ")[1]
    11                 weight = i.strip().split(" ")[3]
    12                 maxconn = i.strip().split(" ")[5]
    13                 Server = {"server":server,"weight":weight,"maxconn":maxconn}
    14                 Info[backend].append(Server)
    15             else:
    16                 continue
    17     return Info
    View Code

      2.Save_Info():将操作后的数据与原始无关数据拼接保存,接收字典作为参数。

     1 def Save_Info(Info):
     2     s = ""
     3     with open("配置文件.txt","r") as f:
     4         for i in f:
     5             if not i.startswith("backend"):
     6                 s = s + i
     7             else:
     8                 break
     9     s1 = ""
    10     for backend in Info:
    11         s2 = "backend " + backend
    12         s1 = s1 + s2 + "
    "
    13         for di in Info[backend]:
    14             server = di["server"]
    15             weight = di["weight"]
    16             maxconn = di["maxconn"]
    17             s3 = "      server {} weight {} maxconn {}".format(server,weight,maxconn)
    18             s1 = s1 + s3 + "
    "
    19     S = s + s1
    20     with open("配置文件.txt","w+") as F:
    21         F.write(S)
    22     return(S)
    View Code

      3.Show():将要操作的数据打印出来提示输入操作指令,白名单判断输入指令,进行判断,返回输入指令和打印列表。

      效果:

     1 def Show(Info):
     2     show_list = []
     3     print("--------------------""33[1;31;0m""HaProxy配置文件管理""33[0m""-------------------------------")
     4     for i,n in enumerate(Info):
     5         show_list.append(n)
     6         print("33[1;32;0m",i+1,n,"33[0m")
     7     print("------------------------------------------------------------------------")
     8     order = input("请输入指令(A)新建、(D)删除、(M)修改、(C)查询、(Q)退出:")
     9     while order not in ("A","D","M","C","Q"):
    10         order = input("33[1;31;0m""输入错误,请重新输入:""33[0m")
    11     show_list = list(show_list)
    12     return order,show_list
    View Code

      4.Jude()、JudeA()、JudeS()分别对输入的backend编号、server编号和新建的数据信息进行简单判断。

     1 #----------------------------------------------Backend编号输入判断-------------------
     2 def Jude(choice,show_list):
     3     try:
     4         if eval(choice) not in range(len(show_list)+1):
     5             return True
     6         else:return False
     7     except:
     8         return True
     9 #----------------------------------------------Server编号判断-----------------------
    10 def JudeS(choiceS,a):
    11     try:
    12         if int(choiceS) in range(1,a+1) or int(choiceS) == 1:
    13             return False
    14         else:
    15             return True
    16     except:
    17         return True
    18 #----------------------------------------------新增信息判断--------------------------
    19 def JudeA(backend,weight,maxconn):
    20     try:
    21         if backend.startswith("www") and int(weight) in range(50) and int(maxconn) in range(5000):
    22             return False
    23     except:
    24         return True
    View Code

      5.Deal_order():接受来自Show()的返回值,对输入的指令进行分流给不同的函数处理。

     1 def Deal_order(order,show_list):
     2     if order =="Q":          #退出
     3         pass
     4     elif order =="A"  :      #新建
     5         Add()
     6     elif order == "D":       #删除
     7         Delete(show_list)
     8     elif order == "M":       #修改
     9         Modify(show_list)
    10     elif order == "C":
    11         Check(show_list)
    12     else:
    13         order = input("33[1;31;0m""输入错误,请重新输入:""33[0m")
    14         Deal_order(order,show_list)
    View Code

      6.Check():查询,主要查看backend下的server信息。

      效果:

     1 #----------------------------------------------查询---------------------------------
     2 def Check(show_list):
     3     choice = input("请选择backend:")
     4     while Jude(choice,show_list):
     5         choice = input("33[1;31;0m""输入错误,请重新输入:""33[0m")
     6     choice = int(choice)
     7     print("------------------------------",show_list[choice-1],"------------------------------")
     8     for a,b in enumerate(Info[show_list[choice-1]]):
     9             print("{} server:{}     weight:{}   maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
    10     print("----------------------------------------------------------------------------")
    11     select = input("请输入指令(Q)退出、(B)返回:")
    12     while select not in ("Q","B"):
    13         select = input("33[1;31;0m""请输入正确指令:""33[0m")
    14     if select == "Q":
    15         pass
    16     elif select == "B":
    17         main()
    View Code

      7.Add():新建,可以新建backend若已存在则在backend下新建server信息,若两种都存在则修改server信息。

     1 #----------------------------------------------增加---------------------------------
     2 def Add():
     3     print("————>请输入详细信息<————")
     4     backend = input("Backend名称:")
     5     server = input("Server名称:")
     6     weight = input("权重(weight):")
     7     maxconn = input("最大链接数(maxconn):")
     8     while JudeA(backend,weight,maxconn):
     9         print("33[1;31;0m""输入信息错误,请重新输入!!!""33[0m")
    10         Add()
    11     if backend not in Info:
    12         Info[backend] = [{"server":server,"weight":weight,"maxconn":maxconn}]
    13         print(">>>>>新建成功")
    14     else:
    15         flag = 1
    16         for ser in Info[backend]:
    17             if server == ser["server"]:
    18                 flag = 0
    19                 ser["weight"] = weight
    20                 ser["maxconn"] = maxconn
    21                 print(">>>>>backend及server信息已存在,""33[1;31;0m""server信息已修改""33[0m")
    22         if flag:
    23             Info[backend].append({"server":server,"weight":weight,"maxconn":maxconn})
    24             print(">>>>>backend已存在,""33[1;31;0m""server添加成功""33[0m")
    25     Save_Info(Info)
    26     main()
    View Code

      8.Delete():删除,可以删除backend或Server信息。

      效果:

     1 #----------------------------------------------删除---------------------------------
     2 def Delete(show_list):
     3     choice = input("删除Backend(B) or  Server(S)?:")
     4     while(choice not in ("B","S")):
     5         choice = input("33[1;31;0m""请输入正确的指令:""33[0m")
     6     selection = input("请选择Backend编号:")
     7     while Jude(selection,show_list):
     8         selection = input("33[1;31;0m""请输入正确的编号:""33[0m")
     9     selection = int(selection)
    10     if choice =="B":
    11         del Info[show_list[selection-1]]
    12         Save_Info(Info)
    13         print("33[1;31;0m""删除成功!""33[0m")
    14         main()
    15     elif choice == "S":
    16         print("------------------------------",show_list[selection-1],"------------------------------")
    17         for a,b in enumerate(Info[show_list[selection-1]]):
    18             print("{} server:{}     weight:{}   maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
    19         print("----------------------------------------------------------------------------")
    20         choiceS = input("选择要删除的Server:")
    21         while JudeS(choiceS,a):
    22             choiceS = input("33[1;31;0m""请输入正确的编号:""33[0m")
    23         choiceS = int(choiceS)
    24         Info[show_list[selection-1]].pop(choiceS-1)
    25         Save_Info(Info)
    26         print("33[1;31;0m""删除成功!""33[0m")
    27         main()
    View Code

      9.Modify():修改,修改backend或是Server信息。

      效果:

     1 def Modify(show_list):
     2     selection = input("修改backend(B)  or  server(S)?>")
     3     while (selection not in ("B","S")):
     4         selection = input("33[1;31;0m""请输入正确回答:""33[0m")
     5     choice = input("请输入要修改的backend编号:")
     6     while Jude(choice,show_list):
     7         choice = input("33[1;31;0m""请输入正确编号:""33[0m")
     8     choice = int(choice)
     9     if selection == "B":
    10         backend = input("修改backend名称为:")
    11         while not backend.startswith("www"):
    12             backend = input("33[1;31;0m""请输入合法的backend名称:""33[0m")
    13         temp = Info[show_list[choice-1]]
    14         del Info[show_list[choice-1]]
    15         Info[backend] = temp
    16         Save_Info(Info)
    17         print("33[1;31;0m""修改backend成功""33[0m")
    18         main()
    19     else:
    20         print("------------------------------",show_list[choice-1],"------------------------------")
    21         for a,b in enumerate(Info[show_list[choice-1]]):
    22             print("{} server:{}     weight:{}   maxconn:{}".format(a+1,b["server"],b["weight"],b["maxconn"]))
    23         print("----------------------------------------------------------------------------")
    24         selection = input("修改哪个server?>")
    25         while JudeS(selection,a):
    26             selection = input("33[1;31;0m""请输入正确的server编号:""33[0m")
    27         selection = int(selection)
    28         sername = input("修改server为:")
    29         Info[show_list[choice-1]][a-1]["server"] = sername
    30         Save_Info(Info)
    31         print("33[1;31;0m""修改server成功""33[0m")
    32         main()
    View Code

      

    天下飞羽,花落凡尘
  • 相关阅读:
    格式化数字,将字符串格式的数字,如:1000000 改为 1 000 000 这种展示方式
    jquery图片裁剪插件
    前端开发采坑之安卓和ios的兼容问题
    页面消息提示,上下滚动
    可以使用css的方式让input不能输入文字吗?
    智慧农村“三网合一”云平台测绘 大数据 农业 信息平台 应急
    三维虚拟城市平台测绘 大数据 规划 三维 信息平台 智慧城市
    农业大数据“一张图”平台测绘 大数据 房产 国土 农业 信息平台
    应急管理管理局安全生产预警平台应急管理系统不动产登记 测绘 大数据 规划 科教 三维 信息平台
    地下综合管廊管理平台测绘 大数据 地下管线 三维 信息平台
  • 原文地址:https://www.cnblogs.com/AngelYuFan/p/6752460.html
Copyright © 2011-2022 走看看