操作haproxy配置文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re,sys,os,time,platform
from collections import defaultdict,OrderedDict
conf = "haproxy.cfg"
jgf = ''
def input_handle(s):if str.isdigit(s):s = int(s)return sdef backend_read(conf):show_dict = {}backend_list = []backend_name_dict = defaultdict(list)with open(conf, "r") as ha_file:for line in ha_file:line = line.strip("\n")if re.match('backend', line):backend = line.split()[1]backend_list.append(backend)elif re.match('\s+server', line):server = line.split()server_dic = OrderedDict()server_dic["name"] = server[1]server_dic["address"] = server[2]server_dic["weight"] = server[4]server_dic["maxconn"] = server[6]backend_name_dict[backend].append(server_dic)for k,v in enumerate(backend_list, 1):show_dict[k] = vprint('%d . %s' % (k, v))return (show_dict,backend_name_dict)def backend_server_show(backend_show_value,server_show_dict):print(jgf.center(70,'='))print('\033[1m后端服务器信(%s)息如下:\033[0m' %backend_show_value)print('\033[31;1m%-20s %-20s %-20s %-20s\033[0m' % ('name', 'addres', 'weight', 'maxconn'))server_list = server_show_dict[backend_show_value]for v in server_list:n = list(v.values())print('\033[32;1m%-20s %-20s %-20s %-20s\033[1m' % (n[0], n[1], n[2], n[3]))print(jgf.center(60, '='))def name_decide():(name,name_flag) = ('',True)while name_flag:name_input = input('\033[32m请输入新服务器名(退出输入q):\033[0m')if len(name_input) == 0:continueelif name_input == 'q':name_flag = Falsesys.exit('\033[32m脚本已退出!\033[1m')elif re.match('[0-9a-zA-Z\_]+',name_input):name = name_inputname_flag = Falseelse:print('\033[31m名称输入错误,请重新输入!!!\033[0m')return (name)def ipaddress_decide():(address,address_flag) = ('',True)while address_flag:address_input = input('\033[32m请输入新IP(退出输入q):\033[0m')if len(address_input) == 0:continueelif address_input == 'q':address_flag = Falsesys.exit('\033[32;1m脚本已退出!\033[1m')elif re.match('(25[0-5]|2[0-4]\d|[0-1]?\d\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}(\:\d{1,5})?$',address_input):address = address_inputaddress_flag = Falseelse:print('\033[31m地址输入错误,请重新输入!!!\033[0m')return (address)def number_decide(name):(number,number_flag) = ('',True)while number_flag:number_input = input('\033[32m请输入%s(数字)(退出输入q):\033[0m' % name)if len(number_input) == 0:continueelif number_input == 'q':number_flag = Falsesys.exit('\033[32;1m脚本已退出!\033[32;1m')else:try:int(number_input)except:print('033[31;1m%s输入类型错误,请重新输入!!!\033[0m' % name)else:number = number_inputnumber_flag = Falsereturn (number)def backend_input_if(input_index,input_dict):(input_name,input_flag) = ('',True)if len(input_index) != 0:input_index = input_handle(input_index)if input_index == 'b':input_flag = Falseelif input_index in input_dict.keys():input_name = input_dict[input_index]elif input_index in input_dict.values():input_name = input_indexelse:input_name = ''return (input_name,input_flag)def backend_server_handle(conf,handle_dict):newfile = '%s.new' % confserver_flag = Falsewith open(conf,'r') as read_file,open(newfile,'w') as write_file:for line in read_file:if re.match('backend',line):write_file.write(line)backend_name = line.split()[1]for server_dict in handle_dict[backend_name]:server_line = '\tserver {name} {address} weight {weight} maxconn {maxconn} \n'write_file.write(server_line.format(**server_dict))server_flag = Trueelif server_flag and re.match('\s+server',line):passelse:write_file.write(line)server_flag = Falseprint('\033[33;1m server更新成功\033[0m')system = platform.system()if system == 'Windows':os.system('move %s %s.bak' % (conf, conf))os.system('move %s %s' % (newfile, conf))elif system == 'Linux':os.system('mv %s %s.bak' %(conf,conf))os.system('mv %s %s' %(newfile,conf))if __name__ == '__main__':flag = Truebackend_name = ''haproxy_name_show_dict = {}haproxy_server_show_dict = {}while flag:print(jgf.center(60,'='))hy='\033[36m欢迎访问haproxy配置文件管理脚本\033[0m'print(hy.center(60,'*'))print('\033[1mbackend列表信息如下:')(haproxy_name_show_dict, haproxy_server_show_dict) = backend_read(conf)print(jgf.center(50,'='))time.sleep(1)print('''        \033[35;1m1.查询后端服务\033[0m\033[34;1m 2.添加后端服务\033[0m\033[33;1m 3.修改后端服务\033[0m\033[31;1m 4.删除后端服务\033[0m\033[32;1m 5.退出\033[0m''')print(jgf.center(60,'='))select_num = input('\033[35;1m请选择操作条目:\033[0m')if select_num == '1':query_flag = Truewhile query_flag:backend_index = input('\033[31;1m请输入需要查询的backend编号名称(返回上级菜单输入b,退出输入q):\033[0m')(backend_name,query_flag) = backend_input_if(backend_index,haproxy_name_show_dict)if backend_name:backend_server_show(backend_name,haproxy_server_show_dict)elif backend_index == 'b':breakelif backend_index == 'q':sys.exit('\033[35;1m退出脚本!\033[0m')else:query_flag = Falseprint('\033[31;1m您输入的节点不存在!请重新输入!')time.sleep(1)if select_num == '2':add_flag = Truewhile add_flag:backend_index = input('\033[32;1m请输入添加的backend编号或者名称(返回上级菜单请输入b: \033[0m)')(backend_name,add_flag) = backend_input_if(backend_index,haproxy_name_show_dict)if backend_name:backend_server_show(backend_name,haproxy_server_show_dict)add_server_dict = OrderedDict()print('\033[34;1m请依次输入后端服务信息(name,address,wight,maxconn):\033[0m')add_server_dict['name'] = name_decide()add_server_dict['address'] = ipaddress_decide()add_server_dict['weight'] = number_decide('权重值')add_server_dict['maxconn'] = number_decide('最大连接数')print(add_server_dict['name'],add_server_dict['address'],add_server_dict['weight'],add_server_dict['maxconn'])if add_server_dict['name'] and add_server_dict['address'] and add_server_dict['weight'] and add_server_dict['maxconn']:add_commit = input('\033[31;1m请确认是否添加此条目(y | n):\033[0m')if add_commit == 'y':haproxy_server_show_dict[backend_name].append(add_server_dict)backend_server_handle(conf,haproxy_server_show_dict)else:add_flag = Falseelse:print('\033[31;1m server信息输入有误,请重新输入!!!\033[0m')time.sleep(2)if select_num == '3':backend_modify_flag = Truewhile backend_modify_flag:backend_index = input('\033[32;1m请输入修改的backend的编号或名称(返回上级菜单,请输入b): \033[0m')(backend_name,backend_modify_flag) = backend_input_if(backend_index,haproxy_name_show_dict)if backend_name:backend_server_show(backend_name,haproxy_server_show_dict)server_modify_flag = Truewhile server_modify_flag:server_index = input('\033[32;1m请输入修改的server的编号(返回上级菜单,请输入b): \033[0m')if len(server_index) != 0:server_index = input_handle(server_index)if server_index =='b':server_modify_flag = Falseelif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]):modify_server_dict = OrderedDict()print('\033[34;1m请以此输入后端服务信息(name,address,weight,maxconn): \033[0m')modify_server_dict['name'] = name_decide()modify_server_dict['address'] = ipaddress_decide()modify_server_dict['weight'] = number_decide('权重值')modify_server_dict['maxconn'] = number_decide('最大连接数')print(modify_server_dict['name'],modify_server_dict['address'],modify_server_dict['weight'],modify_server_dict['maxconn'])if modify_server_dict['name'] and modify_server_dict['address'] and modify_server_dict['weight'] and modify_server_dict['maxconn']:modify_commit = input('\033[32;1m请确认是否修改此条目(y|n):\033[0m')if modify_commit == 'y':haproxy_server_show_dict[backend_name][server_index - 1] = modify_server_dictbackend_server_handle(conf,haproxy_server_show_dict)modify_server_flag = Falseelse:modify_server_flag = Falseelse:print('\033[31m server输入信息有误,请重新输入!!!\033[0m')else:print('\033[31m server编号输入错误,请重新输入!!!\033[0m')if select_num == '4':backend_delete_flag = Truewhile backend_delete_flag:backend_index = input('\033[32;1m请输入删除的backend下条目编号或名称(返回上层菜单,请输入b): \033[0m')(backend_name,backend_delete_flag) = backend_input_if(backend_index,haproxy_name_show_dict)if backend_name:backend_server_show(backend_name,haproxy_server_show_dict)server_delete_flag = Truewhile server_delete_flag:server_index = input('\033[32;1m请输入要删除的server编号(返回上层菜单,请输入b): \033[0m')if len(server_index) != 0:server_index = input_handle(server_index)if server_index == 'b':server_delete_flag = Falseelif server_index >= 1 and server_index <= len(haproxy_server_show_dict[backend_name]):print(haproxy_server_show_dict[backend_name][server_index - 1])delete_commit = input('请确认是否删除此条目(y|n):')if delete_commit == 'y':del haproxy_server_show_dict[backend_name][server_index -1]backend_server_handle(conf,haproxy_server_show_dict)delete_server_flag = Falseelse:delete_server_flag = Falseelse:print('\033[31m server编号输入错误,请重新输入!!!\033[0m')if select_num == '5':print('\033[31;1m程序将退出,欢迎再次使用,谢谢!\033[0m')time.sleep(1)print('\033[31;1m程序退出')sys.exit()

转载于:https://www.cnblogs.com/wxy-x/p/6734710.html

Python 03 基础作业相关推荐

  1. 慕课python作业_大学慕课Python编程基础作业答案

    大学慕课Python编程基础作业答案 更多相关问题 A.EnglishnessB.BritishnessC.ScottishnessD.Welshness A.beforeB.followedC.fo ...

  2. python开发基础作业02:三级菜单,使用字典dic及列表

    作业要求及提示:三级菜单 ''' 1.三级菜单 2.可依次进入各子菜单 3.菜单能够回到上一级 4.用到知识点:字典.列表.多层循环.函数 条件:基本  if  else 嵌套  if...if... ...

  3. python在线作业_南开大学20春学期《Python编程基础》在线作业参考答案

    南开大学20春学期(1709.1803.1809.1903.1909.2003)<Python编程基础>在线作业 试卷总分:100 得分:98 一.单选题(共20 道试题,共40 分) 1 ...

  4. 【Python零基础快速入门系列 | 03】AI数据容器底层核心之Python列表

    • 这是机器未来的第7篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/124957520 <Python零基础快速入门 ...

  5. 南开大学python编程基础_[南开大学]20春学期《Python编程基础》在线作业(答案100分)...

    [奥鹏]-[南开大学]20春学期(1709.1803.1809.1903.1909.2003)<Python编程基础>在线作业 试卷总分:100    得分:100 第1题,已知" ...

  6. 大学python作业_2020年大学moocPython编程基础作业答案

    2020年大学moocPython编程基础作业答案 更多相关问题 [问答题,简答题] 套管按绝缘材料和绝缘结构分为哪几种? [问答题,简答题] 钢丝绳卡子有什么用途? [问答题,简答题] 套管按绝缘材 ...

  7. 第二章:python必备基础语法

    文章目录 第二章 python必备基础语法 一.变量 1.1 什么是变量?有什么用处? 1.2 如何声明一个变量(即定义变量)? 1.3 变量的命名规则及风格 1.4 变量值的三大特性 作业: 1.5 ...

  8. Python零基础入门,纯干货!【Python基础知识点汇总整理】

    目录 第一章 认识Python.Python常用集成开发环境PyCharm 一.认识 Python 01. Python 的起源 1.2 Python 的设计目标 1.3 Python 的设计哲学 0 ...

  9. python全栈第21期_2019 Python最新基础入门(全栈21期)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2019 Python最新基础入门(全栈21期) 01s21开班仪式 开班入学必听Alex大神讲行业前景1 .mp4 开班入学必听Alex大神讲行业前景2 ...

最新文章

  1. BZOJ4551: [Tjoi2016Heoi2016]树
  2. CodeIgniter URL
  3. 安卓市场官方版_尖端实用的安卓手机APP推荐 是你们想要的!
  4. Uedit32和Ubuntu 选定跳转
  5. Scala声明变量、常用类型、条件表达式、块表达式、循环
  6. pixhawk/px4如何获取及使用传感器数据
  7. linux cacti 搭建,linux下搭建cacti监控(示例代码)
  8. AT指令:AT+CMGF
  9. C#链接各种数据库代码总结
  10. mysql 数据生成_mysql生成数据
  11. linux ruby安装目录,SuseLInux下安装Ruby 及 Rails遇到的问题及解决方法
  12. Excel 中VBA脚本的简单应用
  13. adobe软件卸载不了怎么办?那就使用dobe官方清理工具吧!
  14. Win7 登录WinXP 共享文件夹,总是提示用户名或密码错误 的解决办法
  15. H5及H5页面是什么意思?如何制作H5页面?
  16. 新手使用PS心得-技巧
  17. 论文阅读 Jointly Optimize Data Augmentation and Network Training
  18. 2.1.4 选择器处理网络请求
  19. Linux课程设计石头剪刀布,课程设计-石头剪刀布程序.doc
  20. QA之道知多少(一) 初出茅庐

热门文章

  1. 声纹识别中的召回和精度概念
  2. 【计算机网络】 —— 标准化工作及相关组织
  3. CV之LBP特征描述算子-人脸检测
  4. edu汇编语言——实训课程
  5. 【入门2】分支结构 (今天刷洛谷了嘛)
  6. 备战蓝桥杯—有边数限制的最短路 (bellman_ford+)——[AcWing]有边数限制的最短路
  7. 蔡高厅老师 - 高等数学阅读笔记 - 03 - 极限(13、14、15、16、17)
  8. html怎么显示数学公式,怎么使用html数学公式显示库MathJax - js笔记
  9. html js控制页面蒙版,JavaScript蒙板(model)功能的简单实现代码
  10. 大容量存储方案_基因行业容器存储解决方案