第三周作业 修改配置文件

HAproxy配置文件操作

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

2. 可添加backend 和sever信息

3. 可修改backend 和sever信息

4. 可删除backend 和sever信息

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

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

流程图:

配置文件信息如下

global
        log 127.0.0.1 local2
        daemon
        maxconn 256
        log 127.0.0.1 local2 info
defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        option  dontlognull
listen stats :8888
        stats enable
        stats uri       /admin
        stats auth      admin:1234
frontend oldboy.org
        bind 0.0.0.0:80
        option httplog
        option httpclose
        option  forwardfor
        log global
        acl www hdr_reg(host) -i www.oldboy.org
        use_backend www.oldboy.org if www
backend www.oldboy.org
        server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
        server 100.1.9.9 100.1.9.9 weight 20 maxconn 3000
backend buy.oldboy.org
        server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000

代码如下:

#!/usr/bin/env python3
# -*-conding:utf-8-**
# __Author__:‘liudong‘
import json, shutil

def fetch(backend):
    """
    根据用户输入站点查找对应配置项目
    :param backend: 从主程序读取的用户输入的站点配置条目
    :return: 返回配置的值
    """
    config_list = []
    with open(‘ha.conf‘, ‘r‘, encoding=‘utf-8‘) as f:
        flag = False  # 用于标志所读内容是否为需要的数据
        for line in f:
            if line.strip().startswith(‘backend‘) and line.strip() == "backend " + backend:
                # 判断以backend开始,且后面内容和用户输入的域名相同,即所需要查询的配置条目
                flag = True
                continue
            if line.strip().startswith(‘backend‘):
                # 判断以backend开头,与用户输入域名不相同、即不是要查询的配置项目
                flag = False
                # break
            if flag and line.strip():
                config_list.append(line.strip())
    # print(confg_list)
    return config_list

def add(backend, record):
    """
    用于增加用户输入的配置项目
    :param backend: 用户输入的要增加的backend和域名
    :param record: 用户输入的服务器记录
    :return:
    """
    record_list = fetch(backend)
    if not record_list:
        # backend不存在,没找到要修改的backend
        with open(‘ha.conf‘, ‘r‘) as old, open("new.conf", ‘w‘) as new:
            for line in old:
                new.write(line)
            new.write("\nbackend " + backend + "\n")
            new.write(" " * 8 + record + "\n")
            # print(‘Added sucessed!‘)
    else:  # 用户输入的backend存在
        if record in record_list:  # 用户输入的backend项和record均已经存在
            shutil.copy(‘ha.conf‘, ‘new.conf‘)  # 复制配置文件到新文件中
            print(‘The config list you added is exits,No configure file was changed!‘)
        else:  # 用户输入的backend已经存在,record不存在
            record_list.append(record)  # 把用户输入的配置记录内容,添加到列表record_list中
            with open(‘ha.conf‘, ‘r‘) as old, open(‘new.conf‘, ‘w‘) as new:
                flag = False  # 判断是否读取到backend开关的标识符
                for line in old:  # 一行一行读取原配置文件
                    if line.strip().startswith("backend ") and line.strip() == "backend " + backend:
                        # 如果该行以backend开始并且等于用户输入的backend域名
                        flag = True
                        new.write(line)
                        for new_line in record_list:
                            new.write(" " * 8 + new_line)
                        continue
                    if flag and line.strip().startswith("backend"):
                        flag = False
                        new.write(line)
                        continue
                    if line.strip() and not flag:
                        new.write(line)
    print(‘modified successed! new record is %s %s‘ % (backend, record))
    shutil.copy(‘ha.conf‘, ‘ha.bak‘)  # /备份原文件
    shutil.copy(‘new.conf‘, ‘ha.conf‘)  # 把新修改好的文件改成正式文件

def del_Item(backend):
    """
    用于删除用户输入的配置项目
    :param backend: 用户输入的要删除的backend和域名
    :param record: 用户输入的要删除的服务器记录
    :return:
    """
    record_list = fetch(backend)
    print(record_list)
    if not record_list:
    # 没找到要删除的配置项目
        with open(‘ha.conf‘, ‘r‘) as old, open("new.conf", ‘w‘) as new:
            for line in old:
                new.write(line)
        print(‘There is no item, No need to delete!‘)
    else:  # 用户输入的backend存在
        with open(‘ha.conf‘, ‘r‘) as old, open(‘new.conf‘, ‘w‘) as new:
            flag = False  # 判断是否读取到backend开关的标识符
            for line in old:  # 一行一行读取原配置文件
                if line.strip().startswith("backend ") and line.strip() == "backend " + backend:
                # 如果该行以backend开始并且等于用户输入的backend域名
                    flag = True
                    continue
                # new.write(line)
                # for new_line in record_list:
                # new.write(" " * 8 + new_line + "\n")
                # continue
                if flag and line.strip().startswith("backend"):
                    flag = False
                    new.write(line)
                    continue
                if line.strip() and not flag:
                    new.write(line)
    print(‘%s is deleted!‘ % backend)
    shutil.copy(‘ha.conf‘, ‘ha.bak‘)  # /备份原文件
    shutil.copy(‘new.conf‘, ‘ha.conf‘)  # 把新修改好的文件改成正式文件

if __name__ == ‘__main__‘:
    while True:
        print(‘Welcome to ha config tools‘.center(50, ‘-‘))
        # 读取用户第一项选择内容
        start_choice = input(‘1.获取ha记录\n2.增加ha记录\n3.删除ha记录\nPlease input what you want to do:[q=quit]‘)
        print(‘‘.center(50, ‘-‘))
        if start_choice == ‘q‘:
            exit()
        elif start_choice == ‘1‘:
            option1_choice = input(‘1.查询配置,请输入backend项目域名:‘)  # 用户输入要查询的域名
            print_conf = fetch(option1_choice)  # 保存返回的内容
            print(‘你要查询的配置为:‘)
            print(print_conf)  # 打印返回的配置内容:列表形式
            # print(‘‘.center(50, ‘-‘))
        elif start_choice == ‘2‘:
            str_exa = ‘{"backend":"ttt.jachy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":3000}}‘
            mod_config = input(‘2.选择要修改的配置项目及配置条目,格式%s:‘ % str_exa)
            dic = json.loads(mod_config)
            bk = dic["backend"]
            rd = "server %s %s weight %s maxconn %s" % (dic[‘record‘][‘server‘],
                                                        dic[‘record‘][‘server‘],
                                                        dic[‘record‘][‘weight‘],
                                                        dic[‘record‘][‘maxconn‘])
            # print(bk + ‘\n‘)
            # print(rd)
            add(bk, rd)
        elif start_choice == ‘3‘:
            str_del = ‘{"backend":"ttt.jachy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":3000}}‘
            del_config = input(‘2.选择要删除的配置项目及配置条目,格式%s:‘ % str_del)
            del_dic = json.loads(del_config)
            del_bk = del_dic["backend"]
            # del_rd = "server %s %s weight %s maxconn %s" % (dic[‘record‘][‘server‘],
            #                                                 dic[‘record‘][‘server‘],
            #                                                 dic[‘record‘][‘weight‘],
            #                                                 dic[‘record‘][‘maxconn‘])
            del_Item(del_bk)
        else:
            print(‘input error!‘)

readme

作者:liudong

程序实现查询、增加、删除backend项目中域名和服务器信息的功能。

1.查询时,输入域名查询该backend域名对应的服务器配置信息。

2.增加域名和服务器配置信息:

用户输入增加的信息时需要按{"backend":"ttt.jachy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":3000}}格式输入,

程序使用json数据流转换为字典处理。

2.1已经存在相关信息时,直接写入新文件new.conf。

2.2已经存在域名,没有服务器信息时,增加至该域名配置下一行,并写入新配置文件new.conf。

2.3如果域名和服务器信息均不存在,末尾追加backend和域名服务器信息至新配置文件new.conf。

备份原文件ha.conf到ha.bak,把new.conf更名为ha.conf。

3.删除域名和服务器配置信息:

域名不存在时,直接把原配置文件ha.conf内容写入新文件new.conf。

域名存在时,跳过该行及该项目配置信息,把其余的内容从原文件ha.conf写入新配置文件new.conf。

备份原文件ha.conf到ha.bak,把new.conf更名为ha.conf。

时间: 2024-10-25 08:37:52

第三周作业 修改配置文件的相关文章

马哥2016全新Linux+Python高端运维班第三周作业作答

                    马哥2016全新Linux+Python高端运维班第三周作业                                           1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可.     [[email protected] ~]# who | awk '{print $1 $NF}'| uniq -d     [[email protected] ~]# who     yicx     :0  

2017-2018-2《网络攻防实践》第三周作业

第三周作业: 第一节:第三章学习: 1.1网络信息收集 网络信息收集的目的是尽可能了解目标,这包括目标的漏洞IP地址范围,外部网络阔朴结构等. 1.2网络信息收集方法 网络踩点: Web搜索与挖掘(Google Hacking,百度,雅虎) IP与DNS查询 1.3 网络拓扑侦察 tracert也被称为Windows路由跟踪实用程序,在命令提示符(cmd)中使用tracert命令可以用于确定IP数据包访问目标时所选择的路径.本文主要探讨了tracert命令的各个功能 1.3 网络扫描 网络踩点相

解题报告——-2018级2016第二学期第三周作业

解题报告——2018级2016第二学期第三周作业 A:[NOIP2002P]过河卒 题目: 描述 如图,A 点有一个过河卒,需要走到目标 B   点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例 如上图 C  点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 20  的整数,并由键盘输入)

魏昊卿——《Linux内核分析》第三周作业:Linux系统启动过程

魏昊卿——<Linux内核分析>第三周作业:Linux系统启动过程 一.实验部分 实验指导 使用实验楼的虚拟机打开shell 1 cd LinuxKernel/ 2 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序(<软件工程C编码实践篇>的课程项目),支持三个命令help.version和quit,您也可以添加更多的命令,对选修过<软件工程C编码实践篇>

第三周作业(一)VS安装及单元测试练习

第三周作业(一) 需求:练习教科书第22~25页单元测试练习,要求自行安装Visual Studio开发平台,版本至少在2010以上,要求把程序安装过程和练习过程写到博客上,越详细越好,要图文并茂,没有书的同学可以向班内助教同学借阅. 1.visual studio 开发平台安装 事实上我对Visual Studio了解不多,只知道支持的编程语言多,用的人也挺多,功能强大.至于到底好在哪里,还是要用上一阵自己体验一下才知道.听同学说VS2015有些卡,所以这里我选择了VS2013. 如图,具体版

【作业】第三周作业

从第三周开始,作业不再是是老师布置,因为这个时候,你们基本上都开始做项目了, 于是, 作业的来源: 1.书上的课后作业 2.课件上面的随堂讨论或作业 3.你瞎想到的问题 4.[推荐]在实际项目中,结合软件工程知识点,提出作业 最为推荐第四种方式,比如, 关于白盒测试的知识点,结合你的项目实践,就可以得出如下题目: 白盒测试有几种,请结合你的代码片段,一一举例说明,并给出测试用例. 作业的评分,还是10/5/0,三种,请参见: http://www.cnblogs.com/jerry1979/p/

第三周:HAproxy配置文件操作

作业 HAproxy配置文件操作: 1. 根据用户输入输出对应的backend下的server信息 2. 可添加backend 和sever信息 3. 可修改backend 和sever信息 4. 可删除backend 和sever信息 5. 操作配置文件前进行备份 6 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建:若信息与已有信息重复则不操作 #Author xq import os import shutil import time def f_new(f_

软件工程_东师站_第三周作业

身体是革命的本钱,这话一点不假,白天昏沉,晚上发烧,一直不好,啥都干不动.   代码行数 博客字数 知识点 第一周 400 430 见我博客软件工程——师大站1 第二周 0 5200 见我博客软件工程_东师站_课堂笔记 第三周 0 63 站立会议.单元测试

马哥2016全新Linux+Python高端运维班第三周作业

本周作业内容: 1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. # who | cut -d' ' -f1 | sort -u 2.取出最后登录到当前系统的用户的相关信息. # id $(who | sort -t' ' -k3,4 | tail -1 | cut -d' ' -f1) 3.取出当前系统上被用户当作其默认shell的最多的那个shell. # cut -d: -f7 /etc/passwd | sort | uniq -c | sort