zoukankan      html  css  js  c++  java
  • 初学 python 之 HAproxy配置文件操作

    HAproxy配置文件操作:

    1. 根据用户输入输出对应的backend下的server信息

    2. 可添加backend 和sever信息

    3. 可修改backend 和sever信息

    4. 可删除backend 和sever信息

    5. 操作配置文件前进行备份

    6 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作

    配置文件 参考 http://www.cnblogs.com/alex3714/articles/5717620.html

    目标:

    练习文件读写,列表和列表解析,函数使用,循环表达式,if...else流程控制表达式.

    程序流程:

    1.开始,读取配置文件,用f.readlins()生成一个内容列表,列表元素按顺序依次与文本各行内容一一对应!

    2.输入操作符

      输入是c,进入21

        21.输入网址, 网址不存在则返回2; 网址存在,则显示该网址的server信息,进入211                             # 查看信息

          211.输入ip,则删除该ip的server信息,备份和更新文件,显示新信息,然后返回2;输入b则直接返回2  # 删除server或返回不操作

      输入m,进入22                                                                                                                                                                             # 添加修改信息

        22.按格式输入网址以及server信息,网址存在则进入221,网址不存在则添加网址以及server信息,备份和更新文件,显示新信息,然后返回2                 # 网址不存在则添加

          221.ip存在,则进入2211;ip不存在就添加server信息,备份和更新文件,显示新信息,然后返回2                                                                 # ip不存在则添加

            2211.weight 或 maxconn 的值相同,则显示网址和server信息,然后返回2;值不同,则修改值,备份和更新文件,显示新信息,然后返回2           # 输入信息已存在则显示信息,返回不操作

      输入q,直接退出

     

    重点:

    利用列表有序特性,定位文本内容,实现查询,重点是,实现修改,插入添加等文本文件操作!

    因为列表元素按顺序依次与文本各行内容一一对应,所以提取列表元素下标即可定位内容在文本位置,对列表的查询,修改,添加,然后写入文件即可!

    使用函数处理 多处文件备份和更新等写入操作和多处显示列表信息操作 优化代码

     

    代码:

      1 # Author:Jay He
      2 
      3 # 整个程序围绕data = f.readlines()列表做处理!
      4 
      5 
      6 def get_server_list(net):
      7     index_st = data.index(net)
      8     index_follow = [data.index(i) for i in data[index_st+1:] if i[0] == 'b']
      9     # 把net往后的顶格字母是b的所有行下标放入index_follow
     10     if index_follow:          # 空列表本身就是False
     11         index_end = min(index_follow)
     12         # 是非空列表,就提取下标最小来截取ip下的server信息
     13         get_list = [i.strip() for i in data[index_st+1:index_end]]
     14         # 截取ip下包含的所有server信息,传递给列表get_list
     15     else:
     16         get_list = [i.strip() for i in data[index_st+1:]]
     17         # 是空列表,直接截取net往后的所有信息,传递给列表get_list
     18     return get_list
     19 # 提取网址下server信息列表函数
     20 
     21 
     22 def show_info():
     23     print('	%s' % add_info[0])
     24     for j in search_get:
     25         if j == add_info[1]:
     26             print('		33[1;31m%s33[0m' % j)
     27         else:
     28             print('		%s' % j)
     29 # 显示server信息函数
     30 
     31 
     32 def output_write():
     33     with open('profile_bak', 'w', encoding='utf-8') as f_backup,
     34             open('profile', 'w', encoding='utf-8') as f_new:
     35         for line in data_bak:
     36             f_backup.write(line)
     37         # 原内容备份到profile_bak
     38         for line in data:
     39             f_new.write(line)
     40         # 更新修改过的内容到profile
     41 # 备份和更新
     42 
     43 
     44 while True:
     45     with open('profile', 'r', encoding='utf-8') as f:
     46         data = f.readlines()
     47     input_choice = input('''输入c查询和删除,输入m添加和修改;输入q退出>>>''')
     48     if input_choice == 'q':
     49         break
     50     elif input_choice == 'c':
     51         input_net = input('请输入需要查询的网址,例如:www.baidu.com>>>')
     52         add_info = ['backend '+input_net, 'none']                                # 按统一格式处理输入信息
     53         check_net = '%s
    ' % add_info[0]                                         # 调整输入信息为data列表元素格式
     54         if check_net in data:
     55             search_get = get_server_list(check_net)                              # 获取server列表
     56             print('参看网址的server信息如下:')
     57             show_info()                                                          # 显示server信息
     58             input_del = input('输入ip,删除server,例如:100.1.7.9;输入b返回>>>')
     59             server_list = [k.split() for k in search_get if k != '']            # 调整server列表,可读取ip
     60             ip_list = [k2[1] for k2 in server_list if k2 != '']                 # 提取ip列表
     61             if input_del in ip_list:
     62                 index_del = data.index(check_net)+ip_list.index(input_del)+1     # 定位输入ip在data中的位置
     63                 add_info[1] = search_get[ip_list.index(input_del)]               # 把定位好的server信息传递给add_info方便下面用
     64                 del data[index_del]                                              # 在data中删除server信息,准备输出
     65                 del search_get[ip_list.index(input_del)]                         # 在search_get中删除server信息,准备显示
     66                 data_bak = data                                                  # 设置备份列表data_bak,准备输出
     67                 output_write()                                                   # 输出
     68                 print('33[1;31m%s %s ip已删除!33[0m当前server信息如下:' % (add_info[0], add_info[1]))
     69                 show_info()                                                      # 显示
     70             else:
     71                 continue
     72         else:
     73             print('没有网址%s的server信息' % input_net)
     74             continue
     75         # 查看功能,方便删除server
     76     elif input_choice == 'm':
     77         input_info = input('''
     78 请输入需要添加或者修改的信息,
     79 例如:backend www.oldboy.org,server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
     80 >>>''')
     81         add_info = input_info.split(',')                                # 按统一格式处理输入信息
     82         add_net = '%s
    ' % add_info[0]                                  # 调整输入信息为data列表元素格式
     83         add_server = '        %s
    ' % add_info[1]                       # 调整输入信息为data列表元素格式
     84         if add_net in data:
     85             search_get = get_server_list(add_net)                       # 获取server列表
     86             begin = data.index(add_net)                                 # 提取网址在data中的位置
     87             server_list = [k.split() for k in search_get if k != '']   # 调整server列表,可读取ip
     88             ip_list = [k2[1] for k2 in server_list if k2 != '']        # 提取ip列表
     89             server_info = add_info[1].split()                           # 调整输入信息各元素可提取
     90             ip = server_info[1]                                         # 提取输入ip值
     91             weight = server_info[4]                                     # 提取输入weight值
     92             maxconn = server_info[6]                                    # 提取输入maxconn值
     93             if ip in ip_list:
     94                 index_ip = ip_list.index(ip)
     95                 # 确定ip在ip_list的位置,对应的也是ip在server_list的位置,同时也是ip在search_get的位置
     96                 if weight == server_list[index_ip][4] and maxconn == server_list[index_ip][6]:
     97                     print('需添加的33[1;31m%s %s ip已存在!各值无变化!33[0m当前server信息如下:'
     98                           % (add_info[0], add_info[1]))
     99                     show_info()                        # 显示
    100                     continue
    101                     # 网址以及ip都存在,weight和maxconn值无变化,则显示ip信息
    102                 else:
    103                     the_ip = begin+index_ip+1            # 确定需要修改的ip在data的位置,由于server_list和server_get位置顺序一致
    104                     data_bak = data                      # 设置备份列表data_bak,准备输出
    105                     data[the_ip] = add_server            # 修改内容,准备输出
    106                     search_get[index_ip] = add_info[1]   # 更新显示列表search_get,准备显示
    107                     output_write()                       # 输出
    108                     print('需添加的33[1;31m%s %s ip已存在!各值已更新!33[0m当前server信息如下:'
    109                           % (add_info[0], add_info[1]))
    110                     show_info()                          # 显示
    111                     continue
    112                     # 网址以及ip都存在,weight或maxconn的值有变化,更新值并显示ip信息
    113             else:
    114                 data_bak = data                                              # 设置备份列表data_bak,准备输出
    115                 insert_index = begin+len(search_get)                         # 在data中设置插入位置
    116                 data = data[:insert_index]+[add_server]+data[insert_index:]  # data中插入内容,准备输出
    117                 search_get = search_get[:-1]+[add_info[1]]+search_get[-1:]   # 更新显示列表search_get,准备显示
    118                 output_write()                                               # 输出
    119                 print('需添加的33[1;31m%s %s 已加入配置!33[0m当前IP信息如下:' % (add_info[0], add_info[1]))
    120                 show_info()                                                  # 显示
    121                 continue
    122                 # 网址存在,ip不存在,则添加ip信息
    123         else:
    124             data_bak = data                          # 设置备份列表data_bak
    125             data.append(add_net)                     # 更新输出列表data
    126             data.append(add_server)                  # 更新输出列表data
    127             search_get = [add_info[1]]               # 更新显示列表search_get
    128             output_write()                           # 输出
    129             print('需添加的33[1;31m%s %s 已加入配置!33[0m当前IP信息如下:' % (add_info[0], add_info[1]))
    130             show_info()                              # 显示
    131             continue
    132             # 网址不存在,添加网址及ip信息
    View Code
  • 相关阅读:
    数据结构-树与二叉树-思维导图
    The last packet successfully received from the server was 2,272 milliseconds ago. The last packet sent successfully to the server was 2,258 milliseconds ago.
    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property
    redis学习笔记
    AJAX校验注册用户名是否存在
    AJAX学习笔记
    JSON学习笔记
    JQuery基础知识学习笔记
    Filter、Listener学习笔记
    三层架构学习笔记
  • 原文地址:https://www.cnblogs.com/JayeHe/p/6554868.html
Copyright © 2011-2022 走看看