5 api = plc.PLC(auth.auth, auth.plc)
12 from nodecommon import *
14 import config as configmodule
16 from config import config as cfg
17 from optparse import OptionParser
19 parser = OptionParser()
20 parser.set_defaults(node=None,
23 parser.add_option("", "--node", dest="node", metavar="nodename.edu",
24 help="A single node name to add to the nodegroup")
25 parser.add_option("", "--endrecord", dest="endrecord", action="store_true",
26 help="Force an end to the action record; to prompt Montior to start messaging again.")
27 parser.add_option("", "--findbad", dest="findbad", action="store_true",
28 help="Re-run findbad on the nodes we're going to check before acting.")
29 parser.add_option("", "--bootcd", dest="bootcd", action="store_true",
30 help="A stock help message for fetching a new BootCD from the PLC GUI.")
34 def diff_time(timestamp):
38 diff = now - timestamp
39 # return the number of seconds as a difference from current time.
41 if diff < 60: # sec in min.
43 t_str = "%s sec ago" % t
44 elif diff < 60*60: # sec in hour
46 t_str = "%s min ago" % int(t)
47 elif diff < 60*60*24: # sec in day
49 t_str = "%s hours ago" % int(t)
50 elif diff < 60*60*24*7: # sec in week
51 t = diff // (60*60*24)
52 t_str = "%s days ago" % int(t)
53 elif diff < 60*60*24*30: # approx sec in month
54 t = diff // (60*60*24*7)
55 t_str = "%s weeks ago" % int(t)
56 elif diff > 60*60*24*30: # approx sec in month
57 t = diff // (60*60*24*7*30)
58 t_str = "%s months ago" % int(t)
61 def plc_print_nodeinfo(plcnode):
62 url = "https://www.planet-lab.org/db/nodes/index.php?nodepattern="
63 plcnode['url'] = url + plcnode['hostname']
65 print "%(hostname)s %(url)s" % plcnode
66 print " Checked: %s" % time.ctime()
68 print "\t boot_state | created | updated | last_contact | key"
69 print "\t %5s | %11.11s | %11.11s | %12s | %s" % \
70 (color_boot_state(plcnode['boot_state']), diff_time(plcnode['date_created']),
71 diff_time(plcnode['last_updated']),
72 diff_time(plcnode['last_contact']), plcnode['key'])
74 def fb_print_nodeinfo(fbnode):
76 if 'checked' in fbnode:
77 print "%11.11s " % diff_time(fbnode['checked'])
80 print "\t state | ssh | pcu | bootcd | category | kernel"
82 fbnode['bootcd'] = fbnode['bootcd'].split()[-1]
84 fbnode['bootcd'] = "unknown"
86 fbnode['state'] = color_boot_state(get_current_state(fbnode))
88 fbnode['state'] = "none"
89 if len(fbnode['kernel'].split()) > 2:
90 fbnode['kernel'] = fbnode['kernel'].split()[2]
91 print "\t %(state)5s | %(ssh)5.5s | %(pcu)5.5s | %(bootcd)6.6s | %(category)8.8s | %(kernel)s" % fbnode
93 def act_print_nodeinfo(actnode, header):
95 if 'date_created' in actnode:
96 print " Created: %11.11s" % diff_time(actnode['date_created'])
97 print " LastTime %11.11s" % diff_time(actnode['time'])
98 print "\t RT | category | action | msg"
101 if 'rt' in actnode and 'Status' in actnode['rt']:
102 print "\t %5.5s %5.5s | %8.8s | %15.15s | %s" % \
103 (actnode['rt']['Status'], actnode['rt']['id'][7:],
104 actnode['category'], actnode['action'][0],
105 actnode['msg_format'][:-1])
107 if type(actnode['action']) == type([]):
108 action = actnode['action'][0]
110 action = actnode['action']
111 if 'category' in actnode:
112 category = actnode['category']
116 if 'msg_format' in actnode:
117 print "\t %5.5s | %8.8s | %15.15s | %s" % \
118 (actnode['ticket_id'],
120 actnode['msg_format'][:-1])
122 print "\t %5.5s | %8.8s | %15.15s" % \
123 (actnode['ticket_id'],
126 def pcu_print_info(pcuinfo, hostname):
128 if 'checked' in pcuinfo:
129 print "%11.11s " % diff_time(pcuinfo['checked'])
133 print "\t user | password | port | pcu_id | hostname "
134 print "\t %17s | %17s | %4s | %6s | %30s | %s" % \
135 (pcuinfo['username'], pcuinfo['password'],
136 pcuinfo[hostname], pcuinfo['pcu_id'], reboot.pcu_name(pcuinfo), pcuinfo['model'])
138 if 'portstatus' in pcuinfo and pcuinfo['portstatus'] != {} and pcuinfo['portstatus'] != None:
139 if pcuinfo['portstatus']['22'] == "open":
140 print "\t ssh -o PasswordAuthentication=yes -o PubkeyAuthentication=no %s@%s" % (pcuinfo['username'], reboot.pcu_name(pcuinfo))
141 if pcuinfo['portstatus']['23'] == "open":
142 print "\t telnet %s" % (reboot.pcu_name(pcuinfo))
143 if pcuinfo['portstatus']['80'] == "open" or \
144 pcuinfo['portstatus']['443'] == "open":
145 print "\t https://%s" % (reboot.pcu_name(pcuinfo))
146 print "\t import %s.png" % (reboot.pcu_name(pcuinfo))
147 print """\t mutt -s "crash for %s" -a %s.png sapanb@cs.princeton.edu < /dev/null""" % (hostname, reboot.pcu_name(pcuinfo))
148 if pcuinfo['portstatus']['443'] == "open":
149 print "\t racadm.py -r %s -u %s -p '%s'" % (pcuinfo['ip'], pcuinfo['username'], pcuinfo['password'])
150 print "\t cmdhttps/locfg.pl -s %s -f iloxml/Reset_Server.xml -u %s -p '%s' | grep MESSAGE" % \
151 (reboot.pcu_name(pcuinfo), pcuinfo['username'], pcuinfo['password'])
152 print "\t cmdhttps/locfg.pl -s %s -f iloxml/License.xml -u %s -p '%s' | grep MESSAGE" % \
153 (reboot.pcu_name(pcuinfo), pcuinfo['username'], pcuinfo['password'])
154 if pcuinfo['portstatus']['16992'] == "open":
155 print "\t ./cmdamt/remoteControl -A -verbose 'http://%s:16992/RemoteControlService' -user admin -pass '%s'" % (reboot.pcu_name(pcuinfo), pcuinfo['password'])
158 # rerun findbad with the nodes in the given nodes.
161 configmodule.setFileFromList(file, config.args)
162 os.system("./findbad.py --cachenodes --debug=0 --dbname=findbad --increment --nodelist %s" % file)
164 fb = database.dbLoad("findbad")
165 act_all = database.dbLoad("act_all")
167 for node in config.args:
170 plc_nodeinfo = api.GetNodes({'hostname': config.node}, None)[0]
171 fb_nodeinfo = fb['nodes'][config.node]['values']
173 plc_print_nodeinfo(plc_nodeinfo)
174 fb_print_nodeinfo(fb_nodeinfo)
176 if fb_nodeinfo['pcu'] == "PCU":
177 pcu = reboot.get_pcu_values(fb_nodeinfo['plcnode']['pcu_ids'][0])
178 pcu_print_info(pcu, config.node)
180 if config.node in act_all and len(act_all[config.node]) > 0:
184 node_end_record(config.node)
185 #a = Action(config.node, act_all[config.node][0])
187 #a.delField('found_rt_ticket')
188 #a.delField('second-mail-at-oneweek')
189 #a.delField('second-mail-at-twoweeks')
190 #a.delField('first-found')
192 #rec['action'] = ["close_rt"]
193 #rec['category'] = "UNKNOWN"
194 #rec['stage'] = "monitor-end-record"
195 #rec['time'] = time.time() - 7*60*60*24
196 #act_all[config.node].insert(0,rec)
197 #database.dbDump("act_all", act_all)
199 for act_nodeinfo in act_all[config.node]:
200 act_print_nodeinfo(act_nodeinfo, header)
201 else: act_nodeinfo = None
207 If you need a new bootcd, the steps are very simple:
210 * https://www.planet-lab.org/db/nodes/index.php?nodepattern=%s
211 * Select Download -> Download ISO image for %s
212 * Save the ISO, and burn it to a writable CD-ROM.
213 * Replace the old CD and reboot the machine.
215 Please let me know if you have any additional questions.
216 """ % (config.node, config.node)