From fbf936dcd60e895d5f544df1c8494252ea413c8a Mon Sep 17 00:00:00 2001
From: Stephen Soltesz <soltesz@cs.princeton.edu>
Date: Wed, 18 Feb 2009 23:07:11 +0000
Subject: [PATCH] get redirection to really work. converted to spaces added
 different runlevels for cmdline-specified environment

---
 RunlevelAgent.py           | 69 ++++++++++++++++++++++++--------------
 monitor-runlevelagent.init |  5 +--
 2 files changed, 47 insertions(+), 27 deletions(-)

diff --git a/RunlevelAgent.py b/RunlevelAgent.py
index 8ceae8a..9c7c0a2 100644
--- a/RunlevelAgent.py
+++ b/RunlevelAgent.py
@@ -13,7 +13,7 @@ SESSION_FILE="/etc/planetlab/session"
 
 def read_config_file(filename):
     ## NOTE: text copied from BootManager.py 
-	# TODO: unify this code to make it common. i.e. use ConfigParser module
+    # TODO: unify this code to make it common. i.e. use ConfigParser module
     vars = {}
     vars_file= file(filename,'r')
     validConfFile = True
@@ -49,32 +49,32 @@ except:
 
 
 class Auth:
-	def __init__(self, username=None, password=None, **kwargs):
-		if 'session' in kwargs:
-			self.auth= { 'AuthMethod' : 'session',
-					'session' : kwargs['session'] }
-		else:
-			if username==None and password==None:
-				self.auth = {'AuthMethod': "anonymous"}
-			else:
-				self.auth = {'Username' : username,
-							'AuthMethod' : 'password',
-							'AuthString' : password}
+    def __init__(self, username=None, password=None, **kwargs):
+        if 'session' in kwargs:
+            self.auth= { 'AuthMethod' : 'session',
+                    'session' : kwargs['session'] }
+        else:
+            if username==None and password==None:
+                self.auth = {'AuthMethod': "anonymous"}
+            else:
+                self.auth = {'Username' : username,
+                            'AuthMethod' : 'password',
+                            'AuthString' : password}
 class PLC:
-	def __init__(self, auth, url):
-		self.auth = auth
-		self.url = url
-		self.api = xmlrpclib.Server(self.url, verbose=False, allow_none=True)
+    def __init__(self, auth, url):
+        self.auth = auth
+        self.url = url
+        self.api = xmlrpclib.Server(self.url, verbose=False, allow_none=True)
 
-	def __getattr__(self, name):
-		method = getattr(self.api, name)
-		if method is None:
-			raise AssertionError("method does not exist")
+    def __getattr__(self, name):
+        method = getattr(self.api, name)
+        if method is None:
+            raise AssertionError("method does not exist")
 
-		return lambda *params : method(self.auth.auth, *params)
+        return lambda *params : method(self.auth.auth, *params)
 
-	def __repr__(self):
-		return self.api.__repr__()
+    def __repr__(self):
+        return self.api.__repr__()
 
 def main():
 
@@ -84,6 +84,14 @@ def main():
     # NOTE: should we rely on bootmanager for this functionality?
     api.AuthCheck()
 
+    try:
+        env = 'production'
+        if len(sys.argv) > 1:
+            env = sys.argv[1]
+    except:
+        traceback.print_exc()
+        pass
+
     while True:
         # TODO: remove from output
         print "reporting status: ", os.popen("uptime").read().strip()
@@ -100,11 +108,22 @@ def main():
             #       still running, we're likely in failboot now.
             #     length of runtime increases the certainty of inferred state.
             #     
-            api.ReportRunlevel({'run_level' : 'safeboot'})
+            if env == "bootmanager":
+                # if bm not running, and plc bootstate = boot, then
+                api.ReportRunlevel({'run_level' : 'failboot'})
+                api.ReportRunlevel({'run_level' : 'reinstall'})
+                # if bm not running, and plc bootstate = safeboot, then
+                api.ReportRunlevel({'run_level' : 'safeboot'})
+            elif env == "production":
+                api.ReportRunlevel({'run_level' : 'boot'})
+            else:
+                api.ReportRunlevel({'run_level' : 'failboot'})
+                
         except:
             traceback.print_exc()
 
-		# TODO: change to a configurable value
+        # TODO: change to a configurable value
+        sys.stdout.flush()
         time.sleep(60)
 
 if __name__ == "__main__":
diff --git a/monitor-runlevelagent.init b/monitor-runlevelagent.init
index 3c8b40d..165f7e8 100644
--- a/monitor-runlevelagent.init
+++ b/monitor-runlevelagent.init
@@ -15,6 +15,7 @@
 
 function start_rla ()
 {
+	args=$1
 	ret=$( pgrep -f -l RunlevelAgent )
 	if [[ -z $ret ]] ; then
 	    echo "Starting RunlevelAgent"
@@ -23,14 +24,14 @@ function start_rla ()
 		else
 			RLA=/usr/bin/RunlevelAgent.py
 		fi
-		$RLA &> /var/log/rla.log &
+		$RLA $args > /var/log/rla.log 2>&1 &
 	fi
 }
 
 case "$1" in
     start|restart|reload)
 
-		start_rla
+		start_rla $2
 
 	;;
     stop|status)
-- 
2.47.0