Switch to side-by-side view

--- a/web/scweb.py
+++ b/web/scweb.py
@@ -1,12 +1,41 @@
+# Copyright (C) 2017-2018 J.F.Dockes
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the
+#   Free Software Foundation, Inc.,
+#   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+from __future__ import print_function
 import subprocess
 import sys
 import bottle
 import re
 import time
 
-SPLITRE = '''\|\|'''
+def _msg(s):
+    print("%s"%s, file=sys.stderr)
+
+cmd = None
+def _maybestartserver():
+    global cmd
+    if not cmd:
+        devnull = open('/dev/null', 'w')
+        cmd = subprocess.Popen(['scctl', '-S'], stderr=devnull, stdout=devnull)
+        devnull.close()
+        
+SPLITRE = b'''\|\|'''
 
 def _listReceivers():
+    _maybestartserver()
     devnull = open('/dev/null', 'w')
     try:
         data = subprocess.check_output(['scctl', '-lm'], stderr = devnull)
@@ -14,7 +43,7 @@
         data = "scctl error"
     o = []
     for line in data.splitlines():
-        #print >> sys.stderr, line
+        #_msg(line)
         fields = re.split(SPLITRE, line);
         if len(fields) == 4:
             status, fname, uuid, uri = fields
@@ -27,6 +56,7 @@
             status = status.strip()
         if status is not None:
             o.append((fname, status, uuid, uri))
+    devnull.close()
     return o
 
 @bottle.route('/static/:path#.+#')
@@ -36,8 +66,7 @@
 @bottle.route('/')
 @bottle.view('main')
 def top():
-    devnull = open('/dev/null', 'w')
-    cmd = subprocess.Popen(['scctl', '-S'], stderr = devnull, stdout = devnull)
+    _maybestartserver()
     # Sleep a wee bit to give a chance to the server to initialize
     time.sleep(1)
     return dict(title='')
@@ -51,6 +80,7 @@
 @bottle.post('/assoc')
 @bottle.view('assoc')
 def assocReceivers():
+    _maybestartserver()
     devnull = open('/dev/null', 'w')
 
     assocs = bottle.request.forms.getall('Assoc')
@@ -59,7 +89,7 @@
         arglist = ['scctl', '-r', sender]
         for uuid in assocs:
             arglist.append(uuid)
-        print >> sys.stderr, arglist
+        _msg(arglist)
 
         try:
             subprocess.check_call(arglist, stderr = devnull)
@@ -76,7 +106,7 @@
         fields = re.split(SPLITRE, line);
         fname, uuid, reason, uri = fields
         s.append((fname, uuid, uri))
-
+    devnull.close()
     return {'receivers' : _listReceivers(), 'senders' : s}
 
 
@@ -84,6 +114,7 @@
 @bottle.post('/stop')
 @bottle.view('stop')
 def stopReceivers():
+    _maybestartserver()
     devnull = open('/dev/null', 'w')
     for uuid in bottle.request.forms.getall('Stop'):
         try:
@@ -107,4 +138,5 @@
             status, fname, uuid = fields
             if status != 'Off':
                 a.append(fname, status, uuid, '')
+    devnull.close()
     return {'active' : a}