forked from Juniper/ansible-junos-stdlib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsw_upgrade
executable file
·129 lines (93 loc) · 3.84 KB
/
sw_upgrade
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env python2.7
import argparse
import os, sys, re
import logging
from getpass import getpass
from jnpr.junos import Device
JUNOSDIR = '/usr/local/junos'
PACKAGEDIR = JUNOSDIR + '/packages'
LOGDIR = JUNOSDIR + '/log'
def die(message, errno=1):
sys.stderr.write("ERROR:{0}\n".format(message))
sys.exit(errno)
# -------------------------------------------------------------------------
# CLI args processing
# -------------------------------------------------------------------------
def cli_args():
p = argparse.ArgumentParser(add_help=True)
# -------------------------------------------------------------------------
# login
# -------------------------------------------------------------------------
p.add_argument('hostname', nargs='?',
help='hostname or ipaddr')
p.add_argument('-u', '--user', default=os.getenv('USER'),
help='login user name, defaults to $USER')
p.add_argument('-P', '--passwd', default='',
help='login user password, defaults assumes ssh-keys')
p.add_argument('-k', action='store_true', default=False,
dest='passwd_prompt',
help='prompt for user password')
# -------------------------------------------------------------------------
# softawre
# -------------------------------------------------------------------------
p.add_argument('-v', '--version',
help="Junos version string for checking device facts")
p.add_argument('-p', '--package',
help='Junos package file')
# -------------------------------------------------------------------------
# modes/flags/etc.
# -------------------------------------------------------------------------
p.add_argument('--dry-run', dest='dry_run_mode', action='store_true',
help='Check for need to upgrade, but do not do it')
args = p.parse_args()
if args.passwd_prompt is True:
args.passwd = getpass()
if args.version is None:
# extract from package file
m = re.search('-([^\\-]*)-domestic.*', args.package)
args.version = m.group(1)
if args.version is None:
die("No version-string")
return args
# -------------------------------------------------------------------------
# software upgrade process
# -------------------------------------------------------------------------
def update_my_progress(dev, report):
logging.info(report)
def do_sw_upgrade(dev):
from jnpr.junos.utils.sw import SW
sw = SW(dev)
logfile = LOGDIR + '/' + args.hostname + '.log'
logging.basicConfig(filename=logfile, level=logging.INFO,
format='%(asctime)s:%(name)s:%(message)s')
logging.getLogger().name = args.hostname
print "logging to file: {0}".format(logfile)
logging.info("<BEGIN> Starting the software upgrade process: %s", args.package)
ok = sw.install(args.package, progress=update_my_progress)
if ok is not True:
die("Unable to install software")
logging.info("<REBOOT>")
rsp = sw.reboot()
# -------------------------------------------------------------------------
# MAIN
# -------------------------------------------------------------------------
args = cli_args()
dev = Device(args.hostname, user=args.user, password=args.passwd)
try:
print "{0}@{1} connecting ...".format(args.user, args.hostname)
dev.open()
except:
die("Unable to connect to device: {0}".format(args.hostname))
has_ver = dev.facts['version']
should_ver = args.version
need_upgrade = bool(has_ver != should_ver)
y_n = ('no', 'yes')[need_upgrade].upper()
print "UPGRADE={0}::HAS:{1} == SHOULD:{2}".format(y_n, has_ver, should_ver)
if args.dry_run_mode is True:
dev.close()
sys.exit(0)
if need_upgrade is False:
dev.close()
sys.exit(0)
do_sw_upgrade(dev)
dev.close()