days3作业

作业需求

HAproxy配置文件操作

  1. 根据用户输入,输出对应的backend下的server信息
  2. 可添加backend 和sever信息
  3. 可修改backend 和sever信息
  4. 可删除backend 和sever信息
  5. 操作配置文件前进行备份
  6. 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作
  • [x] 博客
  • [x] 查询backend下的server信息
  • [x] 添加backend和server信息
  • [ ] 修改backend 和sever信息
  • [x] 删除backend和server信息

博客地址

ygqygq2的博客地址

基本流程图

程序代码

#!/usr/bin/env python
# _*_coding:utf-8_*_
'''
* Created on 2016/11/7 21:24.
* @author: Chinge_Yang.
''' import shutil
import json def list_function():
print("Please choice the ID of a action.".center(50, "#"))
print("【1】.Fetch haproxy.cfg backend infomation.")
print("【2】.Add haproxy.cfg backend infomation.")
print("【3】.Delete haproxy.cfg backend infomation.")
print("End".center(50, "#")) def fetch(backend):
# 取出backend相关server信息
result = [] # 定义结果列表
with open("haproxy.cfg", "r", encoding="utf-8") as f: # 循环读取文件
flag = False # 标记为假
for line in f:
# 以backend开头
line = line.strip()
if line.startswith("backend") and line == "backend " + backend:
flag = True # 读取到backend开头的信息,标记为真
continue
# 下一个backend开头
if flag and line.strip().startswith("backend"):
flag = False
break
# server信息添加到result列表
if flag and line.strip():
result.append(line.strip())
return result def writer(backend, record_list):
with open("haproxy.cfg", "r") as old, open("new.cfg", "w") as new:
flag = False
for line in old:
if line.strip().startswith('backend') and line.strip() == "backend " + backend:
flag = True
new.write(line)
for new_line in record_list:
new.write(" " * 4 + new_line + "\n")
continue # 跳到下一次循环,避免下一个backend写二次 if flag and line.strip().startswith("backend"): # 下一个backend
flag = False
new.write(line)
continue # 退出此循环,避免server信息二次写入
if line.strip() and not flag:
new.write(line) def add(backend, record):
global change_flag
record_list = fetch(backend) # 查找是否存在记录
if not record_list: # backend不存在, record不存在
with open('haproxy.cfg', 'r') as old, open('new.cfg', 'w') as new:
for line in old:
new.write(line)
# 添加新记录
new.write("\nbackend " + backend + "\n")
new.write(" " * 4 + record + "\n")
print("\033[32;1mAdd done\033[0m")
change_flag = True
else: # backend存在,record存在
if record in record_list:
print("\033[31;1mRecord already in it,Nothing to do!\033[0m")
change_flag = False
else: # backend存在,record不存在
record_list.append(record)
writer(backend, record_list)
print("\033[32;1mAdd done\033[0m")
change_flag = True def delete(backend, record):
global change_flag
record_list = fetch(backend) # 查找是否存在记录
if not record_list: # backend不存在, record不存在
print("Not match the backend,no need delete!".center(50, "#"))
change_flag = False
else: # backend存在,record存在
if record in record_list:
record_list.remove(record) # 移除元素
writer(backend, record_list) # 写入
print("\033[31;1mDelete done\033[0m")
change_flag = True
else: # backend存在,record不存在
print("Only match backend,no need delete!".center(50, "#"))
change_flag = False
return change_flag def output(servers):
# 输出指定backend的server信息
print("Match the server info:".center(50, "#"))
for server in servers:
print("\033[32;1m%s\033[0m" % server)
print("#".center(50, "#")) def input_json():
# 判断输入,要求为json格式
continue_flag = False
while continue_flag is not True:
backend_record = input("Input backend info(json):").strip()
try:
backend_record_dict = json.loads(backend_record)
except Exception as e:
print("\033[31;1mInput not a json data type!\033[0m")
continue
continue_flag = True
return backend_record_dict def operate(action):
global change_flag
if action == "fetch":
backend_info = input("Input backend info:").strip()
result = fetch(backend_info) # 取出backend信息
if result:
output(result) # 输出获取到的server信息
else:
print("\033[31;1mNot a match is found!\033[0m")
elif action is None:
print("\033[31;1mNothing to do!\033[0m")
else:
backend_record_dict = input_json() # 要求输入json格式
for key in backend_record_dict:
backend = key
record = backend_record_dict[key]
if action == "add":
add(backend, record)
elif action == "delete":
delete(backend, record)
if change_flag is True: # 文件有修改,才进行文件更新
# 将操作结果生效
shutil.copy("haproxy.cfg", "old.cfg")
shutil.copy("new.cfg", "haproxy.cfg")
result = fetch(backend)
output(result) # 输出获取到的server信息 def judge_input():
# 判断输入功能编号,执行相应步骤
input_info = input("Your input number:").strip()
if input_info == "1": # 查询指定backend记录
action = "fetch"
elif input_info == "2": # 添加backend记录
action = "add"
elif input_info == "3": # 删除backend记录
action = "delete"
elif input_info == "q" or input_info == "quit":
exit("Bye,thanks!".center(50, "#"))
else:
print("\033[31;1mInput error!\033[0m")
action = None
return action def main():
exit_flag = False
while exit_flag is not True:
global change_flag
change_flag = False
list_function()
action = judge_input()
operate(action) if __name__ == '__main__':
main()

HAproxy配置文件操作

1.程序说明

实现功能如下

  • [x] 查询backend下的server信息
  • [x] 添加backend和server信息
  • [ ] 修改backend 和sever信息
  • [x] 删除backend和server信息

2.程序测试帐号

3.程序测试

cat haproxy.cfg

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 51cto.com
bind 0.0.0.0:80
option httplog
option httpclose
option forwardfor
log global
acl www hdr_reg(host) -i test01.example.com
use_backend test01.example.com if www
backend test01.example.com
server 100.1.7.10 100.1.7.10 weight 20 maxconn 3000
backend test.com
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
server 100.1.7.13 100.1.7.13 weight 20 maxconn 3000 backend www.test.com
server 100.1.7.13 100.1.7.13 weight 20 maxconn 3000

执行结果:

########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:1
Input backend info:test.com
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
##################################################
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:2
Input backend info(json):{"test.com":"testtest.com"}
Add done
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
testtest.com
##################################################
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:1
Input backend info:test.com
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
testtest.com
##################################################
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:3
Input backend info(json):{"test.com":"testtest.com"}
Delete done
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
##################################################
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:4
Input error!
Nothing to do!
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:3
Input backend info(json):d
Input not a json data type!
Input backend info(json):{"test01.example.com":"server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000"}
########Only match backend,no need delete!########
########Please choice the ID of a action.#########
【1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:q
###################Bye,thanks!#################### Process finished with exit code 1

Python学习day3作业的更多相关文章

  1. Python学习day5作业

    目录 Python学习day5作业 ATM和购物商城 1. 程序说明 2. 基本流程图 3. 程序测试帐号 4. 程序结构: 5. 程序测试 title: Python学习day5作业 tags: p ...

  2. python学习-day3

    今天是第三天学习,加油! 第一部分 集合 一.集合 1.什么是集合以及特性? 特性:无序的,不重复的序列,可嵌套. 2.创建集合 方法一:创建空集合 s1 = set() print(type(s1) ...

  3. python学习day3

    目录: 1.集合set 2.计数器 3.有序字典 4.默认字典 5.可命名元组 6.队列 7.深浅拷贝 8.函数 9.lambda表达式 10.内置函数 一.集合set set是一个无序且不重复的元素 ...

  4. 老男孩python学习之作业一购物小程序

    想学编程由来已久 始终没有个结果,痛心不已 如今再次捡起来,望不负期望,不负岁月 ......一万字的废话...... 先介绍一下我的自学课程吧 "路飞学城"的<python ...

  5. python学习Day3 变量、格式化输出、注释、基本数据类型、运算符

    今天复习内容(7项) 1.语言的分类 -- 机器语言:直接编写0,1指令,直接能被硬件执行 -- 汇编语言:编写助记符(与指令的对应关系),找到对应的指令直接交给硬件执行 -- 高级语言:编写人能识别 ...

  6. python学习 day3 (3月4日)---字符串

    字符串: 下标(索引) 切片[起始:终止] 步长[起始:终止:1] 或者-1 从后往前 -1 -2 -3 15个专属方法: 1-6  : 格式:大小写 , 居中(6) s.capitalize() s ...

  7. python基础:day3作业

    修改haproxy配置文件 基本功能:1.获取记录2.添加记录3.删除记录 代码结构:三个函数一个主函数 知识点:1.python简单数据结构的使用:列表.字典等 2.python两个模块的使用:os ...

  8. 老男孩python学习之作业二---三级菜单

    因为之前花力气完成了购物小程序的作业 现在做这个三级菜单简直是so easy!! 1.显示省级菜单 2.交互,提示用户输入要查看的省份(退出e) 2.1.用户正确输入列表中的省份 3.显示市级菜单 3 ...

  9. python学习day3 编程语言分类 变量 格式化输出

    1.编程语言分类 机器语言:直接使用二进制指令直接编写程序,直接操作计算机硬件,必须考虑硬件细节 汇编语言:使用英文标签代替二进制指令去编写程序,直接操作计算机硬件,必须考虑硬件细节对,不过相比机器语 ...

随机推荐

  1. Nancy之文件上传与下载

    零.前言 由于前段时间一直在找工作,找到工作后又比较忙,又加班又通宵的赶项目,所以博客有段时间没有更新了. 今天稍微空闲一点,碰巧前几天看到有园友问我Nancy中下载文件的问题,然后就趁着休息的时间写 ...

  2. [Asp.net 5] Options-配置文件之后的配置

    今天要讲的是OptionsModel解决方案,整个解决方案中也只有Microsoft.Framework.OptionsModel一个工程.按照表面文字OptionsModel应该翻译成选项模型,但是 ...

  3. IIS 配置Http重定向到Https

    注意首先要安装url重定向模块    https://www.microsoft.com/zh-CN/download/details.aspx?id=7435 然后在web.config末尾添加如下 ...

  4. 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command)

    [源码下载] 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command) 作者:webabcd 介绍背水一战 Windows 10 之 MVV ...

  5. C标准头文件<stdio.h>

    是很多人学C语言接触的第一个头文件,顾名思义,stdio就是"标准输入输出",其中声明了一组关于输入输出的类型,宏和函数,其中就包括了打印著名的"hello,world! ...

  6. php实现设计模式之 适配器模式

    <?php /* * 适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作(结构型模式) * * 一个源接口,不符合 ...

  7. 微信js-sdk注意事项

    1.录音结束后播放需要localId,用 var voice = { localId: '', serverId: '' }; 来存储,然后用voice.localId引用 2.token和ticke ...

  8. The habits of highly successful people

    1.Morning Routine (早上列行公事) Probably the most common habit ultra-successful people have is they can t ...

  9. iOS使用Zbar扫描二维码

    iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...

  10. 了解HTML 元素分类

    HTML中包含大量的标签, 这些标签在我们使用中发现会有小小的差别, 有的标签用了之后不会有太大的布局变化, 只是语义化, 而有的标签却会重起一行, 相当于自己回车了一次, 这就是不同标签元素的分类不 ...