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("输入错误")

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

  • 相关阅读:
    蓝桥杯基础 算法训练 图形显示 (简单模拟,坑)
    越喜欢村上春树,就越懂得生活
    HTML 基础 之 列表标签 () 学习笔记
    HTML 基础 之 段落标签() 学习笔记
    《Norwegain Wood》—— The Beatles
    蓝桥杯基础 算法训练 前缀表达式 (基础语法)
    Python3 使用 urllib 包访问Web网站
    蓝桥杯 算法提高 队列操作 (STL基本操作)
    蓝桥杯 算法提高 11-1 实现strcmp函数 (C语言实现,指针实现)
    蓝桥杯基础 算法训练 矩阵乘法 (模板题)
  • 原文地址:https://www.cnblogs.com/eric8899/p/5965396.html
Copyright © 2011-2022 走看看