python实现数通设备tftp备份配置文件示例


Posted in Python onApril 02, 2014

 

环境:【wind2003[open Tftp server] + virtualbox:ubuntn10 server】
tftp : Open TFTP Server  
ubuntn 
python + pyexpect
采用虚拟机原因: pyexpect 不支持windows 

注:原打算采用secrueCrt 脚本编写,因实践中发现没有使用linux下pexpect易用,灵活  ,之前习惯使用expect,因tcl【语法】没有python易用、易维护

编写些程序原因:
最近出了比较严重故障:因netscreen设备bug,一个节点主备设备同时出故障,更换设备后,发现备份配置文件出现乱码【中文】,不能直接使用。
考虑设备在内网,目前有近300台数通设备,因此采用原始tftp备份方式
因备份设备不多:暂只考虑功能,程序效率放在次要

发布:
基本实现netscreen,cisco ios, hw vrp,h3c f1000设备 备份程序
分离出设备信息配置  2.增加备份是否成功检测

问题:
1 未解决ping 不可达主要,反馈慢问题  解决办法:ip 一项,不支持主机名,在 ipCheck函数中添加检查地址进行解决
2.登录设备部署expect代码,没有处理认证失败情况,或者超时等基本检查问题

#coding:utf-8
#!/usr/bin/python
'''
program: run.py
'''
import pexpect
import datetime
import time
import os
import re

#tftp服务器
tftpServer='192.168.1.115'
#备份主机列表【配置格式如下】
#ip  备份脚本[系统类型] 登录帐号  密码  super密码 是否需要备份
backupHosts=[
 {"ip":"192.168.1.27","script":"vrp","login":"test","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.168.1.28","script":"vrp","login":"test","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.10.100.100","script":"vrp","login":"test","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.10.100.101","script":"vrp","login":"test","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.10.98.167","script":"juniper","login":"netscreen","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.10.98.168","script":"juniper","login":"netscreen","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.168.1.124","script":"h3c_firewall","login":"test","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.168.1.125","script":"h3c_firewall","login":"test","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.10.98.233","script":"ios","login":"test","passwd":"*****","su_passwd":"*****","check":"Y"},
 {"ip":"192.10.98sd","script":"ios","login":"test","passwd":"*****","su_passwd":"*****","check":"Y"},
]

# 检查主机是否可达
def ipCheck(ip):
 if re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",ip):
  if os.uname()[0] == "Linux":
   output=os.popen("/bin/ping -c 1 -W 2 %s" % (ip)).read().split("\n")
   if "1 packets transmitted, 1 received, 0% packet loss, time 0ms" in output:
    return True
   else:
    return False
 else:
  return False
# 产生日期
def getToday():
 return datetime.date.today()
'''核心代码'''
def telnet_hw3552(ip,login,passwd,su_passwd):
 try:
  foo = pexpect.spawn('/usr/bin/telnet %s' % (ip))
  index = foo.expect(['sername:', 'assword:'])
  if index == 0:
   foo.sendline(login)
   foo.expect("assword:")
   foo.sendline(passwd)
  elif index == 1:
   foo.sendline(passwd)
  foo.expect(">")
  foo.sendline("super")
  foo.expect("assword:")
  foo.sendline(su_passwd)
  foo.expect(">")
  foo.sendline("tftp %s put %s %s " % (tftpServer,"vrpcfg.cfg",ip+"_hw_"+str(getToday())+".cfg"))
  index=foo.expect(["successfully","Error"])
  if index == 1:
   foo.sendline(" ")
   foo.expect(">")
   foo.sendline("tftp %s put %s %s " % (tftpServer,"vrpcfg.zip",ip+"_hw_"+str(getToday())+".zip"))
  foo.sendline("quit")
 except pexpect.EOF:
  foo.close()
 else:
  foo.close  
#思科ios系统交换机
def telnet_ciscoios(ip,login,passwd,su_passwd):
 try:
  foo = pexpect.spawn('/usr/bin/telnet %s' % (ip))
  index = foo.expect(['sername:', 'assword:']) 
  if index == 0:
   foo.sendline(login)
   foo.expect("assword:")
   foo.sendline(passwd)
  elif index == 1:
   foo.sendline(passwd)
  foo.expect(">")
  foo.sendline("en")
  foo.expect("assword:")
  foo.sendline(su_passwd)
  foo.expect("#")
  foo.sendline("copy running-config tftp")
  foo.expect(".*remote.*")
  foo.sendline("%s" % (tftpServer))
  foo.expect(".*filename.*")
  foo.sendline("%s" % (ip+"_ciscoIos_"+str(getToday())+"_runningconfig.cfg"))
  foo.expect("#")
  foo.sendline("exit")
 except pexpect.EOF:
  foo.close()
 else:
  foo.close
#h3c防火墙
def telnet_h3cfirewallf1000(ip,login,passwd,su_passwd):
 try:
  foo = pexpect.spawn('/usr/bin/telnet %s' % (ip))
  index = foo.expect(['sername:', 'assword:']) 
  if index == 0:
   foo.sendline(login)
   foo.expect("assword:")
   foo.sendline(passwd)
  elif index == 1:
   foo.sendline(passwd)
  foo.expect(">")
  foo.sendline("tftp %s put %s %s " % (tftpServer,"startup.cfg",ip+"_h3cf1000_"+str(getToday())+"_startup.cfg"))
  foo.expect(">")
  foo.sendline("tftp %s put %s %s " % (tftpServer,"system.xml",ip+"_h3cf1000_"+str(getToday())+"_system.xml"))
  foo.expect(">")
  foo.sendline("quit")
 except pexpect.EOF:
  foo.close()
 else:
  foo.close  
#netscreen firewall
def telnet_netscren(ip,login,passwd,su_passwd):
 try:
  foo = pexpect.spawn('/usr/bin/telnet %s' % (ip))
  index = foo.expect(['login:', 'assword:']) 
  if index == 0:
   foo.sendline(login)
   foo.expect("assword:")
   foo.sendline(passwd)
  elif index == 1:
   foo.sendline(passwd)
  foo.expect(">")
  foo.sendline(su_passwd)
  foo.expect(">")
  foo.sendline("save config to tftp %s %s" % (tftpServer,ip+"_netscreen_"+str(getToday())+".cfg"))
  foo.expect("Succeeded")
  foo.expect(">")
  foo.sendline("exit")
  foo.expect(".*save.*")
  foo.sendline("Y")  
 except pexpect.EOF:
  foo.close()
 else:
  foo.close  

#调用核心代码函数
def run():
 '''先查看配置,确认设备是否需要备份, 再确认设备是否网络可达,ok才进行备份操作'''
 for i in backupHosts:
  if i['check'] == "Y":
   if ipCheck(i['ip']):
    print(" --->>> backup %s  ......" % (i['ip']))
    if i['script'] == "vrp":
     telnet_hw3552(i['ip'],i['login'],i['passwd'],i['su_passwd']) #cfg
    elif i['script'] == "ios":
     telnet_ciscoios(i['ip'],i['login'],i['passwd'],i['su_passwd']) #cisco
    elif i['script'] == "juniper":
     telnet_netscren(i['ip'],i['login'],i['passwd'],i['su_passwd']) #juniper netscreen
    elif i['script'] == "h3c_firewall":
     telnet_h3cfirewallf1000(i['ip'],i['login'],i['passwd'],i['su_passwd']) #  h3c firewall
    else:
     print("%s [%s] nonsupoort this type system host" % (i['ip'],i['script']))
   else:
    print("unknown host %s or hosts ip config error" % (i['ip']))
#+++++++++++++++++++++main+++++++++++++++++++=
if __name__ == "__main__":
#执行备份 
 run()
#检查备份是否成功
 print("----------------------- report ------------------")
 backupPath='/win_data/tftp_log'  #备份路径
 tftpList=[]
 for i in os.popen("ls %s | grep \"%s\"" % (backupPath,getToday())).readlines():    #将备份到文件存放于列表中
  tftpList.append(i.split("_")[0])
 for i in backupHosts:    #检查需要备份设备,是否备份到[tftp上有没有文件]   没:则提示
  if i['check'] == "Y":
   if i['ip'] not in tftpList:
    print("%s backup error" % (i['ip']))
'''
#测试
testistrator@python:/win_data$ python run.py 
 --->>> backup 192.168.1.27  ......
 --->>> backup 192.168.1.28  ......
 --->>> backup 192.10.100.100  ......
 --->>> backup 192.10.100.101  ......
 --->>> backup 192.10.98.167  ......
 --->>> backup 192.10.98.168  ......
 --->>> backup 192.168.1.124  ......
 --->>> backup 192.168.1.125  ......
 --->>> backup 192.10.98.233  ......
unknown host 192.10.98sd or hosts ip config error
----------------------- report ------------------
192.10.98sd backup error
'''
Python 相关文章推荐
python用ConfigObj读写配置文件的实现代码
Mar 04 Python
python实现linux服务器批量修改密码并生成execl
Apr 22 Python
matplotlib中legend位置调整解析
Dec 19 Python
浅谈dataframe中更改列属性的方法
Jul 10 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
python-xpath获取html文档的部分内容
Mar 06 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
Python爬虫抓取指定网页图片代码实例
Jul 24 Python
python使用requests库爬取拉勾网招聘信息的实现
Nov 20 Python
jupyter 添加不同内核的操作
Feb 06 Python
Python还能这么玩之用Python修改了班花的开机密码
Jun 04 Python
python实现巡检系统(solaris)示例
Apr 02 #Python
python实现apahce网站日志分析示例
Apr 02 #Python
python实现数通设备端口监控示例
Apr 02 #Python
使用python解析xml成对应的html示例分享
Apr 02 #Python
Python爬虫框架Scrapy安装使用步骤
Apr 01 #Python
使用python绘制人人网好友关系图示例
Apr 01 #Python
python异步任务队列示例
Apr 01 #Python
You might like
解析数组非数字键名引号的必要性
2013/08/09 PHP
php实现留言板功能
2017/03/05 PHP
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
详谈python read readline readlines的区别
2017/09/22 Python
python变量的存储原理详解
2019/07/10 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
校班主任推荐信范文
2013/12/03 职场文书
一年级数学教学反思
2014/02/01 职场文书
安全教育演讲稿
2014/05/09 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
医学生求职信
2014/07/01 职场文书
公司外出活动方案
2014/08/14 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书