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常见文件操作的函数示例代码
Nov 15 Python
python检查指定文件是否存在的方法
Jul 06 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
对python自动生成接口测试的示例讲解
Nov 30 Python
python3使用matplotlib绘制条形图
Mar 25 Python
python生成器用法实例详解
Nov 22 Python
详解Python Opencv和PIL读取图像文件的差别
Dec 27 Python
Python sqlite3查询操作过程解析
Feb 20 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 Python
python能做哪方面的工作
Jun 15 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 Python
Python基础之常用库常用方法整理
Apr 30 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
php 接口类与抽象类的实际作用
2009/11/26 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
php中in_array函数用法探究
2014/11/25 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
php HTML无刷新提交表单
2016/04/05 PHP
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
css配合jquery美化 select
2013/11/29 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
使用Python发现隐藏的wifi
2020/03/04 Python
Python requests模块cookie实例解析
2020/04/14 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
大学生学年自我鉴定
2014/02/10 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
运动会演讲稿200字
2014/08/25 职场文书
党员十八大心得体会
2014/09/12 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
论文致谢词范文
2015/05/14 职场文书
矛盾论读书笔记
2015/06/29 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android