修改haproxy配置文件

基本功能:
1.获取记录
2.添加记录
3.删除记录

代码结构:
三个函数一个主函数

知识点:
1.python简单数据结构的使用:列表、字典等

2.python两个模块的使用:os和json

      a.os.rename('文件1','文件2')

      b.json完成自动识别字典、列表,并识别后进行自动转换

3.python函数的定义和调用

4.标志位的灵活运用:flag和haswrite分别用于找backend的record和判断是否已经将记录写入到文件

5.python基本语法的使用:for循环、if...else....判断

6.python文件的操作的基本使用:with open('文件1','模式') as obj1,open('文件2','模式') as obj2

流程图:

代码:

#!/usr/bin/env python3

#antuor:Alan
import os
import json """
把文件按从上到下的顺序分为上部分,要处理部分,下部分;
step1: 上部分从原配置文件写入-->新配置文件
step2: 遇到要处理部分则写入-->fetch_list
step3: 下部分从原配置文件写入-->新配置文件
step4: fetch_list入-->新配置文件
""" def fetch(backend): ###定义fetch函数,并同时传入我们指定backend参数,此参数代表backend名
flag = False ###定义flag为False,目的是为了后面是否取可用的backend
fetch_list=[] ###定义空列表,目的是为了后面将取出的backend信息存储在此列表里面
with open('配置文件.txt') as obj: ###打开配置文件
for line in obj: ###一行行读取
if line.strip() == "backend %s" %(backend): ###line.stri()去掉空格和换行符
flag = True ###读到要取的记录flage改为True
continue ###结束本次循环,下面代码不执行,开始新的循环
if flag and line.strip().startswith('backend'): ###如果已经取到记录,则又读到backend开头的数据则不取
flag=False
if flag and line.strip(): ###判断flag为True,且不是空行(布尔值非空是True)
fetch_list.append(line.strip()) ###把数据加入列表 return fetch_list ###返回值 def add1(dict_info): ###定义add1函数,同时传入参数dict_info,字典参数里面包含要传入的server信息
backend_title = dict_info.get("backend") ###插入的backend的名称(变量初始化)
context_title = "backend %s" %(backend_title) ###插入backend整个字段(变量初始化)
record_title = dict_info["record"] ###要插入的记录(变量初始化)
context_record = "server %s %s weight %s maxconn %s" %(record_title["server"],record_title["server"],record_title["weight"],record_title["maxconn"])
fetch_list=fetch(backend_title) ###把读取的记录放入列表(变量初始化) if fetch_list: ###判断列表是否为空
flag=False ###标志位
has_write = False ###标志位
with open('配置文件.txt','r') as read_obj,open('新配置文件.txt','w') as write_obj:
for line in read_obj:
if line.strip() == context_title:
write_obj.write("\n"+line)
flag=True
continue
if flag and line.startswith('backend'): ###flag为True,如果在读到backend信息,则不处理
flag = False
if flag:
for new_line in fetch_list:
if not has_write:
temp = "%s%s" %(" "*8,new_line) ###把列表的记录赋值给temp
write_obj.write(temp)
has_write=True
else:
write_obj.write(line) else: ###如果fetch_list为空
with open('配置文件.txt') as read_obj,open('新配置文件.txt','w') as write_obj:
for line in read_obj:
write_obj.write(line)
write_obj.write("\n"+context_title+"\n")
temp=" "*8+context_record+"\n"
write_obj.write(temp) os.rename('配置文件.txt','配置文件.txt') ###将原文件配置文件改名备用文件为配置文件b
os.rename('新配置文件.txt','配置文件.txt') ###将新配置文件改名为配置文件 def delete(dict_info): ###删除函数 del_backend = dict_info["backend"]
del_record = dict_info["record"] context_title = "backend %s" %(del_backend)
context_record = "server %s %s weight %s maxconn %s" %(del_record["server"],del_record["server"],del_record["weight"],del_record["maxconn"]) fetch_list = fetch(del_backend) if not fetch_list:
return else: if context_record not in fetch_list:
print ("your server message is not exists")
return else:
fetch_list.remove(context_record) with open('配置文件.txt','r') as read_obj,open('新配置文件.txt','w') as write_obj:
flag = False
has_write = False
for line in read_obj:
if line.strip() == context_title:
write_obj.write(line)
flag = True
continue
if flag and line.startswith('backend'):
flag = False
if flag:
if not has_write:
print (fetch_list)
for new_line in fetch_list:
temp = "%s%s\n" %(" "*8,new_line)
write_obj.write(temp)
has_write = True
else:
write_obj.write(line) os.rename('配置文件.txt','配置文件.txt')
os.rename('新配置文件.txt','配置文件.txt') s='{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}' ###要添加的记录信息 if __name__ == "__main__": ###主函数,入口 print (u"1.获取记录\n2.添加记录\n3.删除记录\n") ###获取用户的操作选择
select_num=input("请输入需要进行的操作编号:") if select_num == "1": ###根据用户的选择,进行调用函数
backend = input("请输入backend信息:")
fetch_list = fetch(backend)
for i in fetch_list:
print ("配置信息:%s" % i)
else:
print ("请按以下格式输入:")
print ('{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}')
data_str = input("请输入信息>>>")
data_dict = json.loads(data_str)
if select_num == "2":
add1(data_dict)
elif select_num == "3":
delete(data_dict)
else:
print ("输入有误!!!!!")

  

python基础:day3作业的更多相关文章

  1. python基础 实战作业 ---Excel基本读写与数据处理

    代码地址如下:http://www.demodashi.com/demo/11650.html 看完本篇需要: 10min 作业练习需要: 0.5h~3h(依练习者对python熟悉程度而定) 看完本 ...

  2. python基础 Day3

    python Day3 1.作业回顾 设定一个理想的数字比如88,让用户输入数字,如果比88大,则显示猜测的结果大:如果比66小,则显示猜测的结果小了,给用户三次猜测机会,如果显示猜测正确退出循环,如 ...

  3. Python学习day3作业

    days3作业 作业需求 HAproxy配置文件操作 根据用户输入,输出对应的backend下的server信息 可添加backend 和sever信息 可修改backend 和sever信息 可删除 ...

  4. 我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)

    作业二:三级菜单 三级菜单 可一次进入各个子菜单 思路: 这个题看似不难,难点在于三层循环的嵌套,我的思路就是通过flag的真假来控制每一层的循环的,简单来说就是就是通过给每一层循环一个单独的布尔变量 ...

  5. 我的Python成长之路---第一天---Python基础(作业1:登录验证)---2015年12月26日(雾霾)

    作业一:编写登录接口 输入用户名密码 认证成功系那是欢迎信息 输错三次后锁定 思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则 1)认证流程参考的是Lin ...

  6. python基础day3

    一.文件管理 文件管理是很多应用程序的基本功能和重要组成部分.Python可以使文件管理极其简单,特别是和其它语言相对比. 1.    读操作 1.1r模式 1.1.1读取其他路径下文件 首先在D盘创 ...

  7. python基础之作业1---用户登录

    作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 import sys, os, getpass os.system('clear')i = 0while i < 3: ...

  8. python基础day2作业:购物车

    #功能:1.可注册账号2.登录买家账号3.可查询编辑购物车里商品4.可以余额充值5.可提示余额不足6.购物车结算 #使用:1.第一次使用先注册账号填写账号金额2.账号金额信息保存在buyer_acco ...

  9. python基础之作业3----三级菜单小练习

    data = { "华为技术":{ "产品与解决方案":{ "云核心网":{"云核心网研发管理部","云核心网 ...

随机推荐

  1. Java中类的初始化顺序

    一.一个类的初始化顺序(没继承情况)  规则: 1.静态变量>普通变量>构造方法   2.变量定义的顺序决定初始化的顺序 3.静态变量和静态块是一样的,普通变量和非静态块是一样的,即能够把 ...

  2. 分享个新浪下载图片的ProgressBar进度样式

    https://github.com/eltld/ImageLoadProgress2

  3. 如何选择Javascript模板引擎(javascript template engine)?

    译者 jjfat 日期:2012-9-17  来源: GBin1.com 随着前端开发的密集度越来越高,Ajax和JSON的使用越来越频繁,大家肯定免不了在前台开发中大量的使用标签,常见到的例子如下: ...

  4. dsPIC33EP 高速PWM模块初始化设置及应用

    //文件 p33pwm6.h #ifndef _P33PWM6_H_ #define _P33PWM6_H_ //#include "p33pwm6.h" #define FSYN ...

  5. Linux TCP队列相关参数的总结 转

        在Linux上做网络应用的性能优化时,一般都会对TCP相关的内核参数进行调节,特别是和缓冲.队列有关的参数.网上搜到的文章会告诉你需要修改哪些参数,但我们经常是知其然而不知其所以然,每次照抄过 ...

  6. DOS攻击之详解--转载

    源地址没有找到,间接引用地址:http://wushank.blog.51cto.com/3489095/1156004 DoS到底是什么?接触PC机较早的同志会直接想到微软磁盘操作系统的DOS--D ...

  7. 关于Android中获取Intent里的数据

    Intent获取数据和发送数据的办法: //直接通过Intent发送 intent.putExtra("name","wytings"); //直接通过Inte ...

  8. 基于python3的手机号生成脚本

    今天利用业余,自己突发想法来写个手机号码生成的脚本,其实自己用的方法很简单,想必肯定又不少人写的比我的好,我只是自己闲来无聊搞一下, #作者:雷子 #qq:952943386 #日期:2016年7月1 ...

  9. 1.4.8 拼凑在一起(putting the pieces together)

    putting the pieces together 在最高的级别,schema.xml结构如下, <schema> <types> <fields> <u ...

  10. 【Shell脚本学习17】Shell case esac语句

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...