Python学习day3作业
days3作业
作业需求
HAproxy配置文件操作
- 根据用户输入,输出对应的backend下的server信息
- 可添加backend 和sever信息
- 可修改backend 和sever信息
- 可删除backend 和sever信息
- 操作配置文件前进行备份
- 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作
- [x] 博客
- [x] 查询backend下的server信息
- [x] 添加backend和server信息
- [ ] 修改backend 和sever信息
- [x] 删除backend和server信息
博客地址
基本流程图
程序代码
#!/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作业的更多相关文章
- Python学习day5作业
目录 Python学习day5作业 ATM和购物商城 1. 程序说明 2. 基本流程图 3. 程序测试帐号 4. 程序结构: 5. 程序测试 title: Python学习day5作业 tags: p ...
- python学习-day3
今天是第三天学习,加油! 第一部分 集合 一.集合 1.什么是集合以及特性? 特性:无序的,不重复的序列,可嵌套. 2.创建集合 方法一:创建空集合 s1 = set() print(type(s1) ...
- python学习day3
目录: 1.集合set 2.计数器 3.有序字典 4.默认字典 5.可命名元组 6.队列 7.深浅拷贝 8.函数 9.lambda表达式 10.内置函数 一.集合set set是一个无序且不重复的元素 ...
- 老男孩python学习之作业一购物小程序
想学编程由来已久 始终没有个结果,痛心不已 如今再次捡起来,望不负期望,不负岁月 ......一万字的废话...... 先介绍一下我的自学课程吧 "路飞学城"的<python ...
- python学习Day3 变量、格式化输出、注释、基本数据类型、运算符
今天复习内容(7项) 1.语言的分类 -- 机器语言:直接编写0,1指令,直接能被硬件执行 -- 汇编语言:编写助记符(与指令的对应关系),找到对应的指令直接交给硬件执行 -- 高级语言:编写人能识别 ...
- python学习 day3 (3月4日)---字符串
字符串: 下标(索引) 切片[起始:终止] 步长[起始:终止:1] 或者-1 从后往前 -1 -2 -3 15个专属方法: 1-6 : 格式:大小写 , 居中(6) s.capitalize() s ...
- python基础:day3作业
修改haproxy配置文件 基本功能:1.获取记录2.添加记录3.删除记录 代码结构:三个函数一个主函数 知识点:1.python简单数据结构的使用:列表.字典等 2.python两个模块的使用:os ...
- 老男孩python学习之作业二---三级菜单
因为之前花力气完成了购物小程序的作业 现在做这个三级菜单简直是so easy!! 1.显示省级菜单 2.交互,提示用户输入要查看的省份(退出e) 2.1.用户正确输入列表中的省份 3.显示市级菜单 3 ...
- python学习day3 编程语言分类 变量 格式化输出
1.编程语言分类 机器语言:直接使用二进制指令直接编写程序,直接操作计算机硬件,必须考虑硬件细节 汇编语言:使用英文标签代替二进制指令去编写程序,直接操作计算机硬件,必须考虑硬件细节对,不过相比机器语 ...
随机推荐
- Windows Server配置Jenkins,实现监测SVN提交自动构建.net4.5的项目
1,持续集成 概念:http://baike.baidu.com/view/5253255.htm,对于大多数人而言,自动构建/自动测试/自动部署,已经很发挥它的价值了.选择上: 推荐jenkins, ...
- C# 将DataTable数据源转换成实体类
using System; using System.Collections.Generic; using System.Data; using System.Reflection; /// < ...
- 2分钟在eclipse下使用SpringBoot搭建Spring MVC的WEB项目
1. 首先用eclipse创建一个maven工程, 普通maven工程即可 2. 修改pom如下: <?xml version="1.0" encoding="UT ...
- JAVA 8 Streams
什么是Stream 首先要说的是,不要被它的名称骗了,这里的Stream跟JAVA I/O中的InputStream和OutputStream是两个不同的概念.Java 8中的Stream其实是函数式 ...
- 【圣诞呈献】高性能 Socket 组件 HP-Socket v3.1.1 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- AnimatedModal.js – CSS3 全屏模态窗口
AnimatedModal.js 是一个用来创建一个全屏模态窗口的 jQuery 插件,基于 CSS3 过渡实现.您可以利用 Animate.css 中的转换或自行创建自己的过渡效果.支持 Firef ...
- jquery点击复选框触发事件给input赋值
体验效果:http://keleyi.com/keleyi/phtml/jqtexiao/31.htm 代码如下: <!DOCTYPE html> <html xmlns=" ...
- 数据结构->冒泡排序
数据结构->冒泡排序 实现效果 从小到大排序 算法原理 重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到不再需要交换,也就是说该数列 ...
- 初学RunLoop
RunLoop 运行循环,跑圈 可以看出每条线程都有一个与之对应的RunLoop对象 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建. 基本作用:保持程序的持续运行 处理A ...
- IOS 杂笔-17(堆区栈区等)
栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b; ...