zoukankan      html  css  js  c++  java
  • 作业:老板现在给你任务,公司有haproxy配置文件,希望通过python程序可以对ha配置文件进行增删改

      1 # 老板现在给你任务,公司有haproxy配置文件,希望通过python程序可以对ha配置文件进行增删改
      2 #分析:对文件进行增删改,首先需要找到需要修改文件的位置,即必须先把文件读取出来,找到对应
      3 #位置,进行内容的修改,增加和删除;
      4 import json,os  #json模块用于将用户输入的字符串转换为字典
      5 
      6 #首先定义fetch函数,同时传入指定参数backend,用来将修改的地方找出来
      7 def fetch(backend):
      8     flag=False #定义flag,目的是为了判断后面是否有可取的backend
      9     fetch_list=[]  #定义空列表,用来存储读取的backend
     10 
     11     #以读的形式打开"ha"文件,一行行的读,然后我们将满足我们要求的行存入到列表fetch_list中
     12     #最后返回装有我们指定backend信息的列表
     13     with open("ha.txt","r") as obj:
     14         for line in obj:
     15             if line.strip()=="backend %s" %(backend):
     16                 flag=True
     17                 continue
     18             if line.strip().startswith("backend"):
     19                 flag=False
     20             if flag and line.strip():
     21                 fetch_list.append(line.strip())
     22     return fetch_list
     23 
     24 #定义add1函数,并同时传入参数dict_info ,此字典参数包含我们要传入的server信息
     25 def add1(dict_info):
     26     backend_title=dict_info.get("backend")  #首先获取要插入的backend的名称
     27     context_title="backend %s"%(backend_title)  #要插入的backend的整个字段
     28     record_title=dict_info["record"]
     29     #要插入的记录信息
     30     context_record="server %s %s weight %s maxconn %s" %(record_title["server"],record_title["server"],
     31                                                          record_title["weight"],record_title["maxconn"])
     32     #将backend获取,并存储在fetch_list列表中
     33     fetch_list=fetch(backend_title)
     34 
     35      #如果要插入的backend存在
     36         #1.首先设定2个标志:flag和has_write
     37             #flag:用于找到要添加的backend下的内容
     38             #has_write:用于判断fetch_list中的内容是否重新写入到了文件
     39         #2.遍历源文件ha:
     40             #1首先逐行读取,并同时进行判断,
     41                 # 1.判断backend是否已经找到,先把backend写入文件,然后找到后将flag设置为True,最后跳出本次循环
     42                 # 2.判断找到的backend里面的record是否为空,若为空将flag设置为False
     43                 # 3.对flag进行判断
     44                     #1.将flag为True的record从fetch_list写入到文件中,在这里面同时要进行是否已经写入的判断,
     45                     # 即定义has_write的作用
     46                     #2.若flag为False,就直接写入新文件,即将非列表里的内容直接写入
     47     if fetch_list:
     48         flag=False
     49         has_write=False
     50         with open("ha.txt","r") as read_obj,open("ha.new","w") as write_obj:
     51             for line in read_obj:
     52                 if line.strip()==context_title:
     53                     write_obj.write("
    "+line)
     54                     flag=True
     55                     continue
     56                 if flag and line.startswith("backend"):
     57                     flag=False
     58                 if flag:
     59                     for new_line in fetch_list:
     60                         if not has_write:
     61                             temp="%s%s" % (" "*8,new_line)
     62                             write_obj.write(temp)
     63                             has_write=True
     64                 else:
     65                     write_obj.write(line)
     66     else:
     67          #如果要插入的backend不存在
     68         #分2部分写入:
     69             # 1部分.从ha文件里面直接读取,并同时将读取的内容写入新的文件ha.new
     70             # 2部分.将新的backend和context信息,直接写到新的文件ha.new的文件尾部
     71             with open("ha.txt","r") as read_obj,open("ha.new","w") as write_obj:
     72                 for line in read_obj:
     73                     write_obj.write(line)
     74                 write_obj.write("
    "+context_title+"
    ")
     75                 temp=" "*8+context_record+"
    "
     76                 write_obj.write(temp)
     77     #将原文件ha改名备用文件为ha.bak,即将ha下线
     78     #将新文件ha.new改名为线上文件ha.txt,即将ha.new上线
     79     os.rename("ha.txt","ha.bak")
     80     os.rename("ha.new","ha.txt")
     81 
     82 #删除函数
     83 def delete(dict_info):
     84     #1、首先获取用户的记录并以列表的形势存储,以便于我们调用
     85     del_backend=dict_info["backend"]
     86     del_record=dict_info["record"]
     87 
     88     context_title="backend %s" %(del_backend)
     89     context_record="server %s %s weight %s maxconn %s" %(del_record["server"],del_record["server"],
     90                                                          del_record["weight"],del_record["maxconn"])
     91     #调用fetch函数,得到包含backend内容的列表
     92     fetch_list=fetch(del_backend)
     93     #判断1、若列表为空格,直接返回,即没有可以删除的对象
     94     if not fetch_list:
     95         return
     96     else:
     97         #判断1、若用户输入的server信息不在列表里面,直接返回
     98         if context_record not in fetch_list:
     99             print("服务器信息不存在")
    100             return
    101         else:
    102             fetch_list.remove(context_record)  #若输入的server信息在列表中,则将此信息从列表中删除
    103 
    104         #逐行从ha文件中读取,并同时进行判断
    105         #核心思想:
    106             #首先边读取、边判断、边写入,
    107             # 判断其实就是我们自己输入的backend,找到后将列表fetch_list信息写入到新的文件里面。
    108             # 其余的非列表的内容直接从源文件ha写到新文件ha.new即可
    109         with open("ha.txt","r") as read_obj,open("ha.new","w") as write_obj:
    110             flag=False
    111             has_write=False
    112             for line in read_obj:
    113                 if line.strip()==context_title:
    114                     write_obj.write(line)
    115                     flag=True
    116                     continue
    117                 if flag and line.startswith("backend"):
    118                     flag=False
    119 
    120                 if flag:
    121                     if not has_write:
    122                         print(fetch_list)
    123                         for new_line in fetch_list:
    124                             temp="%s%s
    " %(" "*8,new_line)
    125                             write_obj.write(temp)
    126                         has_write=True
    127                 else:
    128                     write_obj.write(line)
    129     #将原文件ha改名备用文件为ha.bak,即将ha下线
    130     #将新文件ha.new改名为线上文件ha,即将ha.new上线
    131     os.rename("ha.txt","ha.bak")
    132     os.rename("ha.new","ha.txt")
    133 
    134 
    135 if __name__=="__main__":
    136     #获取用户的操作选择
    137     print("1、获取记录
    2、添加记录
    3、删除记录
    ")
    138     select_num=input("请输入你的选择:")
    139     #根据用户的选择,进行函数调用
    140     if select_num=="1":
    141         backend=input("请输入backend:")
    142         fetch_list=fetch(backend)
    143         for i in fetch_list:
    144             print(i)
    145     else:
    146         print("请按如下例子输入:")
    147         print('{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}')
    148         data_str=input("请输入record:")
    149         data_dict=json.loads(data_str)
    150         if select_num=="2":
    151             add1(data_dict)
    152         elif select_num=="3":
    153             delete(data_dict)
    154         else:
    155             print("输入错误")

    新手,编码有不成熟的地方,还望各位同道多多指正!

  • 相关阅读:
    Changing Icon File Of Push Button At Runtime In Oracle Forms 6i
    Set Font Properties On Mouse Hover Of Push Button And Text Items At Run time In Oracle Forms
    Change An Item Property Using Set_Item_Property In Oracle Forms
    Calling / Running a report in Oracle forms 10g / 11g
    Change Or Set Report Object Property At Run Time In Oracle Forms Using Set_Report_Object_Property Command
    Refresh / Updating a form screen in Oracle D2k Forms 6i
    Know How And When To Use System.Message_Level To Control Messages In Oracle Forms
    Perform Cut Copy Paste Operations Using Cut_Region Copy_Region Paste_Region Commands In Oracle Forms
    CHECKBOX_CHECKED built-in in Oracle D2k Forms
    Limiting To Select Only 5 Check Boxes Out Of Ten In Oracle Forms
  • 原文地址:https://www.cnblogs.com/eric8899/p/5965396.html
Copyright © 2011-2022 走看看