#!/usr/bin/python
+#
+# RunlevelAgent - acts as a heartbeat back to myplc reporting that the node is
+# online and whether it is in boot or pre-boot run-level.
+# This is useful to identify nodes that are behind a firewall, as well as to
+# have the machine report run-time status both in safeboot and boot modes,
+# so that it is immediately visible at myplc (gui or api).
+#
import xml, xmlrpclib
import logging
def main():
- f=open(SESSION_FILE,'r')
- session_str=f.read().strip()
- api = PLC(Auth(session=session_str), api_server_url)
- # NOTE: What should we do if this call fails?
- # TODO: handle dns failure here.
- api.AuthCheck()
+ # Keep trying to authenticate session, waiting for NM to re-write the
+ # session file, or DNS to succeed, until AuthCheck succeeds.
+ while True:
+ try:
+ f=open(SESSION_FILE,'r')
+ session_str=f.read().strip()
+ api = PLC(Auth(session=session_str), api_server_url)
+ # NOTE: What should we do if this call fails?
+ # TODO: handle dns failure here.
+ api.AuthCheck()
+ break
+ except:
+ print "Retry in 30 seconds: ", os.popen("uptime").read().strip()
+ traceback.print_exc()
+ time.sleep(30)
try:
env = 'production'
# NOTE: here we are inferring the runlevel by environmental
# observations. We know how this process was started by the
# given command line argument. Then in bootmanager
- # runlevle, the bm.log gives information about the current
+ # runlevel, the bm.log gives information about the current
# activity.
# other options:
# call plc for current boot state?
# how long have we been running?
if env == "bootmanager":
- bs_val = extract_from('/tmp/bm.log', 'Current boot state:')
+ bs_val = extract_from('/tmp/bm.log', "'Current boot state:'")
if len(bs_val) > 0: bs_val = bs_val.split()[-1]
ex_val = extract_from('/tmp/bm.log', 'Exception')
fs_val = extract_from('/tmp/bm.log', 'mke2fs')