Index: dashboard.scm
==================================================================
--- dashboard.scm
+++ dashboard.scm
@@ -76,10 +76,11 @@
     (begin
       (print "Failed to find megatest.config, exiting") 
       (exit 1)))
 
 (define *db* (open-db))
+(server:client-setup *db*)
 
 (define toplevel #f)
 (define dlg      #f)
 (define max-test-num 0)
 (define *keys*   (rdb:get-keys   *db*))

Index: db.scm
==================================================================
--- db.scm
+++ db.scm
@@ -35,12 +35,10 @@
 	 (db        (sqlite3:open-database dbpath)) ;; (never-give-up-open-db dbpath))
 	 (handler   (make-busy-timeout 36000)))
     (sqlite3:set-busy-handler! db handler)
     (if (not dbexists)
 	(db:initialize db))
-    (if (not (args:get-arg "-server"))
-	(server:client-setup db))
     db))
 
 (define (db:initialize db)
   (let* ((configdat (car *configinfo*))  ;; tut tut, global warning...
 	 (keys     (config-get-fields configdat))

Index: launch.scm
==================================================================
--- launch.scm
+++ launch.scm
@@ -90,10 +90,12 @@
 	      (begin
 		(debug:print 0 "Failed to setup, exiting") 
 		(exit 1)))
 	  ;; now can find our db
 	  (set! db (open-db))
+	  (if (not (args:get-arg "-server"))
+	      (server:client-setup db))
 	  (set-megatest-env-vars db run-id) ;; these may be needed by the launching process
 	  (change-directory work-area) 
 	  (set-run-config-vars db run-id)
 	  ;; environment overrides are done *before* the remaining critical envars.
 	  (alist->env-vars env-ovrd)
@@ -146,10 +148,12 @@
 				 ;; do all the ezsteps (if any)
 				 (if ezsteps
 				     (let* ((testconfig (read-config (conc work-area "/testconfig") #f #t environ-patt: "pre-launch-env-vars")) ;; FIXME??? is allow-system ok here?
 					    (ezstepslst (hash-table-ref/default testconfig "ezsteps" '()))
 					    (db         (open-db)))
+				       (if (not (args:get-arg "-server"))
+					   (server:client-setup db))
 				       (if (not (file-exists? ".ezsteps"))(create-directory ".ezsteps"))
 				       ;; if ezsteps was defined then we are sure to have at least one step but check anyway
 				       (if (not (> (length ezstepslst) 0))
 					   (debug:print 0 "ERROR: ezsteps defined but ezstepslst is zero length")
 					   (let loop ((ezstep (car ezstepslst))
@@ -244,10 +248,12 @@
 				   (let loop ((minutes   (calc-minutes)))
 				     (let* ((db       (open-db))
 					    (cpuload  (get-cpu-load))
 					    (diskfree (get-df (current-directory)))
 					    (tmpfree  (get-df "/tmp")))
+				       (if (not (args:get-arg "-server"))
+					   (server:client-setup db))
 				       (if (not cpuload)  (begin (debug:print 0 "WARNING: CPULOAD not found.")  (set! cpuload "n/a")))
 				       (if (not diskfree) (begin (debug:print 0 "WARNING: DISKFREE not found.") (set! diskfree "n/a")))
 				       (set! kill-job? (test-get-kill-request db run-id test-name itemdat))
 				       (rdb:test-update-meta-info db run-id test-name itemdat minutes cpuload diskfree tmpfree)
 				       (if kill-job? 
@@ -287,10 +293,12 @@
 	    (thread-start! th1)
 	    (thread-start! th2)
 	    (thread-join! th2)
 	    (mutex-lock! m)
 	    (set! db (open-db))
+	    (if (not (args:get-arg "-server"))
+		(server:client-setup db))
 	    (let* ((item-path (item-list->path itemdat))
 		   (testinfo  (db:get-test-info db run-id test-name item-path)))
 	      (if (not (equal? (db:test-get-state testinfo) "COMPLETED"))
 		  (begin
 		    (debug:print 2 "Test NOT logged as COMPLETED, (state=" (db:test-get-state testinfo) "), updating result, rollup-status is " rollup-status)

Index: megatest.scm
==================================================================
--- megatest.scm
+++ megatest.scm
@@ -240,10 +240,12 @@
       (if (not (setup-for-run))
 	  (begin 
 	    (debug:print 0 print "Failed to setup, exiting")
 	    (exit 1)))
       (set! db (open-db))
+      (if (not (args:get-arg "-server"))
+	  (server:client-setup db))
       (if (not (car *configinfo*))
 	  (begin
 	    (debug:print 0 "ERROR: Attempted to remove test(s) but run area config file not found")
 	    (exit 1))
 	  ;; put test parameters into convenient variables
@@ -275,10 +277,12 @@
 	   (runsdat  (rdb:get-runs db runpatt #f #f '()))
 	   (runs     (db:get-rows runsdat))
 	   (header   (db:get-header runsdat))
 	   (keys     (rdb:get-keys db))
 	   (keynames (map key:get-fieldname keys)))
+      (if (not (args:get-arg "-server"))
+	  (server:client-setup db))
       ;; Each run
       (for-each 
        (lambda (run)
 	 (debug:print 2 "Run: "
 		(string-intersperse (map (lambda (x)
@@ -440,10 +444,12 @@
 	  (if (not (setup-for-run))
 	      (begin
 		(debug:print 0 "Failed to setup, giving up on -test-paths, exiting")
 		(exit 1)))
 	  (set! db (open-db))    
+	  (if (not (args:get-arg "-server"))
+	      (server:client-setup db))
 	  (let* ((itempatt (args:get-arg "-itempatt"))
 		 (keys     (rdb:get-keys db))
 		 (keynames (map key:get-fieldname keys))
 		 (paths    (db:test-get-paths-matching db keynames target)))
 	    (set! *didsomething* #t)
@@ -487,11 +493,13 @@
 		(exit 1)))
 	  (if (not (setup-for-run))
 	      (begin
 		(debug:print 0 "Failed to setup, giving up on -archive, exiting")
 		(exit 1)))
-	  (set! db (open-db))    
+	  (set! db (open-db))   
+	  (if (not (args:get-arg "-server"))
+	      (server:client-setup db))
 	  (let* ((itempatt (args:get-arg "-itempatt"))
 		 (keys     (rdb:get-keys db))
 		 (keynames (map key:get-fieldname keys))
 		 (paths    (db:test-get-paths-matching db keynames target)))
 	    (set! *didsomething* #t)
@@ -559,10 +567,12 @@
 	  (if (not (setup-for-run))
 	      (begin
 		(debug:print 0 "Failed to setup, exiting")
 		(exit 1)))
 	  (set! db (open-db))
+	  (if (not (args:get-arg "-server"))
+	      (server:client-setup db))
 	  (if (and state status)
 	      (rdb:teststep-set-status! db run-id test-name step state status itemdat (args:get-arg "-m") logfile)
 	      (begin
 		(debug:print 0 "ERROR: You must specify :state and :status with every call to -step")
 		(exit 6)))
@@ -595,10 +605,12 @@
 	  (if (not (setup-for-run))
 	      (begin
 		(debug:print 0 "Failed to setup, exiting")
 		(exit 1)))
 	  (set! db (open-db))
+	  (if (not (args:get-arg "-server"))
+	      (server:client-setup db))
 	  (if (args:get-arg "-load-test-data")
 	      (db:load-test-data db run-id test-name itemdat))
 	  (if (args:get-arg "-setlog")
 	      (test-set-log! db run-id test-name itemdat (args:get-arg "-setlog")))
 	  (if (args:get-arg "-set-toplog")
@@ -633,11 +645,13 @@
 		    (change-directory startingdir)
 		    (set! exitstat (system fullcmd)) ;; cmd params))
 		    (set! *globalexitstatus* exitstat)
 		    (change-directory testpath)
 		    ;; re-open the db
-		    (set! db (open-db)) 
+		    (set! db (open-db))
+		    (if (not (args:get-arg "-server"))
+			(server:client-setup db))
 		    ;; run logpro if applicable ;; (process-run "ls" (list "/foo" "2>&1" "blah.log"))
 		    (if logprofile
 			(let* ((htmllogfile (conc stepname ".html"))
 			       (oldexitstat exitstat)
 			       (cmd         (string-intersperse (list "logpro" logprofile htmllogfile "<" logfile ">" (conc stepname "_logpro.log")) " ")))
@@ -686,10 +700,12 @@
       (if (not (setup-for-run))
 	  (begin
 	    (debug:print 0 "Failed to setup, exiting")
 	    (exit 1)))
       (set! db (open-db))
+      (if (not (args:get-arg "-server"))
+	  (server:client-setup db))
       (set! keys (rdb:get-keys db))
       (debug:print 1 "Keys: " (string-intersperse (map key:get-fieldname keys) ", "))
       (sqlite3:finalize! db)
       (set! *didsomething* #t)))
 
@@ -725,10 +741,12 @@
 	  (begin
 	    (debug:print 0 "Failed to setup, exiting") 
 	    (exit 1)))
       ;; now can find our db
       (set! db (open-db))
+      (if (not (args:get-arg "-server"))
+	  (server:client-setup db))
       (runs:update-all-test_meta db)
       (sqlite3:finalize! db)
       (set! *didsomething* #t)))
 
 ;;======================================================================
@@ -738,17 +756,20 @@
     (let* ((toppath (setup-for-run))
 	   (db      (if toppath (open-db) #f)))
       (if db
 	  (begin
 	    (set! *db* db)
+	    (if (not (args:get-arg "-server"))
+		(server:client-setup db))
 	    (import readline)
 	    (import apropos)
 	    (gnu-history-install-file-manager
 	     (string-append
 	      (or (get-environment-variable "HOME") ".") "/.megatest_history"))
 	    (current-input-port (make-gnu-readline-port "megatest> "))
-	    (repl)))))
+	    (repl)))
+      (set! *didsomething* #t)))
 
 ;;======================================================================
 ;; Exit and clean up
 ;;======================================================================
 

Index: runs.scm
==================================================================
--- runs.scm
+++ runs.scm
@@ -402,11 +402,11 @@
 	   (testdat       (rdb:get-test-info db run-id test-name item-path)))
       (if (not testdat)
 	  (begin
 	    ;; ensure that the path exists before registering the test
 	    (system (conc "mkdir -p " new-test-path))
-	    (register-test db run-id test-name item-path)
+	    (rtests:register-test db run-id test-name item-path)
 	    (set! testdat (rdb:get-test-info db run-id test-name item-path))))
       (change-directory test-path)
       (case (if force ;; (args:get-arg "-force")
 		'NOT_STARTED
 		(if testdat
@@ -582,10 +582,12 @@
 	(if (not (setup-for-run))
 	    (begin 
 	      (debug:print 0 "Failed to setup, exiting")
 	      (exit 1)))
 	(set! db   (open-db))
+	(if (not (args:get-arg "-server"))
+	    (server:client-setup db))
 	(set! keys (rdb:get-keys db))
 	;; have enough to process -target or -reqtarg here
 	(if (args:get-arg "-reqtarg")
 	    (let* ((runconfigf (conc  *toppath* "/runconfigs.config")) ;; DO NOT EVALUATE ALL 
 		   (runconfig  (read-config runconfigf #f #f environ-patt: #f))) 

Index: server.scm
==================================================================
--- server.scm
+++ server.scm
@@ -16,10 +16,11 @@
 
 (declare (unit server))
 
 (declare (uses common))
 (declare (uses db))
+(declare (uses tests))
 
 (include "common_records.scm")
 (include "db_records.scm")
 
 ;; procstr is the name of the procedure to be called as a string
@@ -185,10 +186,15 @@
     (rpc:publish-procedure!
      'rdb:delete-test-records
      (lambda (test-id)
        (db:delete-test-records db test-id)))
 
+    (rpc:publish-procedure!
+     'rtests:register-test
+     (lambda (run-id test-name item-path)
+       (tests:register-test db run-id test-name item-path)))
+
     (set! *rpc:listener* rpc:listener)
     (on-exit (lambda ()
 	       (sqlite3:execute db "DELETE FROM metadat WHERE var='SERVER' and val=?;" host:port)
 	       (sqlite3:finalize! db)))
     (thread-start! th1)
@@ -202,28 +208,30 @@
      (server:find-free-port-and-open (+ port 1)))
    (rpc:default-server-port port)
    (tcp-listen (rpc:default-server-port))))
 
 (define (server:client-setup db)
-  (let* ((hostinfo (db:get-var db "SERVER"))
-	 (hostdat  (if hostinfo (string-split hostinfo ":")))
-	 (host     (if hostinfo (car hostdat)))
-	 (port     (if (and hostinfo (> (length hostdat) 1))(cadr hostdat) #f)))
-    (if (and port
-	     (string->number port))
-	(let ((portn (string->number port)))
-	  (debug:print 2 "INFO: Setting up to connect to host " host ":" port)
-	 (handle-exceptions
-	  exn
-	  (begin
-	    (print "Exception: " exn)
-	    (set! *runremote* #f))
-	   (if (and (not (args:get-arg "-server")) ;; no point in the server using the server using the server
-		    ((rpc:procedure 'serve:login host portn) *toppath*))
-	       (begin
-		 (debug:print 2 "INFO: Connected to " host ":" port)
-		 (set! *runremote* (vector host portn)))
-	       (begin
-		 (debug:print 2 "INFO: Failed to connect to " host ":" port)
-		 (set! *runremote* #f)))))
-	(debug:print 2 "INFO: no server available"))))
+  (if *runremote*
+      (debug:print 0 "ERROR: Attempt to connect to server but already connected")
+      (let* ((hostinfo (db:get-var db "SERVER"))
+	     (hostdat  (if hostinfo (string-split hostinfo ":")))
+	     (host     (if hostinfo (car hostdat)))
+	     (port     (if (and hostinfo (> (length hostdat) 1))(cadr hostdat) #f)))
+	(if (and port
+		 (string->number port))
+	    (let ((portn (string->number port)))
+	      (debug:print 2 "INFO: Setting up to connect to host " host ":" port)
+	      (handle-exceptions
+	       exn
+	       (begin
+		 (print "Exception: " exn)
+		 (set! *runremote* #f))
+	       (if (and (not (args:get-arg "-server")) ;; no point in the server using the server using the server
+			((rpc:procedure 'serve:login host portn) *toppath*))
+		   (begin
+		     (debug:print 2 "INFO: Connected to " host ":" port)
+		     (set! *runremote* (vector host portn)))
+		   (begin
+		     (debug:print 2 "INFO: Failed to connect to " host ":" port)
+		     (set! *runremote* #f)))))
+	    (debug:print 2 "INFO: no server available")))))
 

Index: tests.scm
==================================================================
--- tests.scm
+++ tests.scm
@@ -1,7 +1,8 @@
-(use sqlite3 srfi-1 posix regex regex-case srfi-69 dot-locking)
+(use sqlite3 srfi-1 posix regex regex-case srfi-69 dot-locking tcp rpc)
 (import (prefix sqlite3 sqlite3:))
+(import (prefix rpc rpc:))
 
 (declare (unit tests))
 (declare (uses db))
 (declare (uses common))
 (declare (uses items))
@@ -11,11 +12,11 @@
 (include "key_records.scm")
 (include "db_records.scm")
 (include "run_records.scm")
 (include "test_records.scm")
 
-(define (register-test db run-id test-name item-path)
+(define (tests:register-test db run-id test-name item-path)
   (let ((item-paths (if (equal? item-path "")
 			(list item-path)
 			(list item-path ""))))
     (for-each 
      (lambda (pth)
@@ -377,5 +378,16 @@
 (define (test:archive db test-id)
   #f)
 
 (define (test:archive-tests db keynames target)
   #f)
+
+;;======================================================================
+;; R P C
+;;======================================================================
+
+(define (rtests:register-test db run-id test-name item-path)
+  (if *runremote*
+      (let ((host (vector-ref *runremote* 0))
+	    (port (vector-ref *runremote* 1)))
+	((rpc:procedure 'rtests:register-test host port) run-id test-name item-path))
+      (tests:register-test db run-id test-name item-path)))