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)退出

  • 相关阅读:
    Ajax基础知识详解
    php 基础语法整理
    06 js-递归
    原生js 实现瀑布流布局
    解决高度坍塌问题
    jQuery动画效果
    jQuery增删元素类名
    JQueryTab栏切换(important!)
    jQuery排他思想(important!)
    jQuery设置元素样式
  • 原文地址:https://www.cnblogs.com/hukey/p/9288279.html
Copyright © 2011-2022 走看看