zoukankan      html  css  js  c++  java
  • [ python ] 项目:haproxy配置文件增删改查

    1. 开发要求

    实现对 haproxy.cfg 增删改查操作

    2. 程序介绍

    # 作者:hkey
    
    # 博客地址:https://www.cnblogs.com/hukey/p/9288279.html
    
    # 功能实现:对 haproxy.cfg 增删改查
    
    # 目录结构:
    haproxy/
    ├── haproxy.cfg     # haproxy 主配置文件
    └── ops.py            # 操作程序
    
    
    # 使用说明:
    
        1. 查询
        2. 新增
        3. 修改
        4. 删除
        5. 退出
    README

    3. 程序逻辑图

    4. 程序代码

    global
        log         127.0.0.1 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
    
        # turn on stats unix socket
        stats socket /var/lib/haproxy/stats
    
    defaults
        mode                    http
        log                     global
        option                  httplog
        option                  dontlognull
        #option http-server-close
        #option forwardfor       except 127.0.0.0/8
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000
    
    backend www.super.com
        server 10.0.10.1 weight 20 maxconn 30
        server 10.0.10.2 weight 999 maxconn 20
    
    backend www.super1.com
        server 10.0.10.1 weight 20 maxconn 30
        server 10.0.10.2 weight 999 maxconn 20
        server 10.0.10.3 weight 999 maxconn 20
    
    backend www.super2.com
        server 10.0.10.2 weight 20 maxconn 21
        server 10.0.10.20 weight 30 maxconn 40
        server 10.0.10.3 weight 20 maxconn 21
    backend www.super20.com
        server 10.0.0.10 10.0.10.10 weight 20 maxconn 21
    haproxy.cfg
    # -*- coding: utf-8 -*-
    # Author: hkey
    import os
    
    def file_handle(backend_data, src=None, type='fetch'):
        '''解耦函数'''
        if type == 'fetch':
            with open('haproxy.cfg', 'r') as read_f:
                ret = []
                Flag = False
                for read_line in read_f:
                    if backend_data == read_line.strip():
                        Flag = True
                        continue
                    if Flag == True and read_line.startswith('backend'):
                        break
                    if Flag:
                        print('33[42;1m%s33[0m' % read_line, end='')
                        ret.append(read_line)
            return ret
    
        elif type == 'change':
            with open('haproxy.cfg', 'r') as read_f, open('haproxy.conf', 'w') as write_f:
                flag = False
                has_write = False
                for read_line in read_f:
                    if read_line.strip() == backend_data:
                        flag = True
                        continue
                    if flag and read_line.startswith('backend'):
                        flag = False
                    if not flag:
                        write_f.write(read_line)
                    else:
                        if not has_write:
                            for record in src:
                                write_f.write(record)
                            has_write = True
            os.rename('haproxy.cfg', 'haproxy.cfg_bak')
            os.rename('haproxy.conf', 'haproxy.cfg')
            os.remove('haproxy.cfg_bak')
    
    
    def fetch(find_str):
        '''查询功能'''
        backend_str = 'backend %s' % find_str
        return file_handle(backend_str)
    
    def add(backend):
        '''新增功能'''
        print('这是新增功能.')
        backend_list = fetch(backend)
        if not backend_list:
            return '33[41;1mbackend不存在。33[0m'
        new_server = input('输入新增server:')
        backend_data = 'backend %s' % backend
        backend_list.insert(0, '%s
    %s
    ' % (backend_data, new_server))
        return file_handle(backend_data, src=backend_list, type='change')
    
    
    def change(modify_data):
        '''修改功能'''
        print('这是修改功能.')
        modify_data = eval(modify_data)
        backend = modify_data[0]['backend']
        backend_data = 'backend %s' % backend
        backend_list = fetch(backend)
        old_server = '%sserver %s weight %s maxconn %s
    ' %(' ' *4, modify_data[0]['record']['server'],
                                               modify_data[0]['record']['weight'], modify_data[0]['record']['maxconn'])
        new_server = '%sserver %s weight %s maxconn %s
    ' %(' ' *4, modify_data[1]['record']['server'],
                                               modify_data[1]['record']['weight'], modify_data[1]['record']['maxconn'])
    
        if not backend_list and old_server not in backend_list:
            return '修改的记录不存在。'
        else:
            index = backend_list.index(old_server)
            backend_list[index] = new_server
            backend_list.insert(0, '%s
    ' % backend_data)
            return file_handle(backend_data, src=backend_list, type='change')
    
    def delete(backend):
        '''删除功能'''
        print('这是删除功能.')
        backend_list = fetch(backend)
        if not backend_list:
            return '33[41;1mbackend 【%s】不存在。33[0m' % backend
        del_server = input('输入要删除的server:') + '
    '
        if del_server not in backend_list:
            return '33[41;1m输入的server不存在。33[0m'
        else:
            backend_data = 'backend %s' % backend
            backend_list.insert(0, '%s
    ' %backend_data)
            backend_list.remove(del_server)
            return file_handle(backend_data, src=backend_list, type='change')
    
    
    if __name__ == '__main__':
        msg = '''
        1. 查询
        2. 新增
        3. 修改
        4. 删除
        5. 退出
        '''
    
        msg_dict = {
            '1': fetch,
            '2': add,
            '3': change,
            '4': delete,
        }
    
        while True:
            print(msg)
            choice = input('>>>').strip()
            if not choice: continue
            if choice == '5': break
            find_str = input('请输入你的数据:').strip()
            res = msg_dict[choice](find_str)
            print(res)
    ops.py

    5. 程序运行展示

    (1)查询

    (2)新增

        server 1.1.1.1 weight 1 maxconn 1(前面4个空格)

    (3)修改

    [{'backend': 'www.super2.com', 'record':{'server': '10.0.10.20', 'weight': 30, 'maxconn': 40}}, {'backend': 'www.super2.com', 'record':{'server': '10.0.10.200', 'weight': 100, 'maxconn': 100}}]

    (4)删除

        server 1.1.1.1 weight 1 maxconn 1(开头4个空格)

    (5)退出

  • 相关阅读:
    做正确的事,正确的做事
    博客园翻车启示录
    从一次线下读书会获得的收获
    坚持一个好习惯该有多难?
    有道云笔记
    Leetcode 10. 正则表达式匹配
    C++版
    VS 2013 professional版在win10上安装出错的解决方法
    华为校招2016.09机试 第1题: 字符串按指定长度重新分割
    C#版
  • 原文地址:https://www.cnblogs.com/hukey/p/9288279.html
Copyright © 2011-2022 走看看