Index: client.scm ================================================================== --- client.scm +++ client.scm @@ -10,25 +10,41 @@ ;;====================================================================== ;; C L I E N T S ;;====================================================================== -;; server:get-client-signature +(require-extension (srfi 18) extras tcp s11n) + +(use sqlite3 srfi-1 posix regex regex-case srfi-69 hostinfo md5 message-digest zmq) +(import (prefix sqlite3 sqlite3:)) + +(use spiffy uri-common intarweb http-client spiffy-request-vars) + +(declare (unit client)) + +(declare (uses common)) +(declare (uses db)) +(declare (uses tasks)) ;; tasks are where stuff is maintained about what is running. + +(include "common_records.scm") +(include "db_records.scm") + +;; client:get-signature (define (client:get-signature) (if *my-client-signature* *my-client-signature* (let ((sig (server:mk-signature))) (set! *my-client-signature* sig) *my-client-signature*))) -;; server:client-login +;; client:login serverdat (define (client:login serverdat) - (cdb:login serverdat *toppath* (server:get-client-signature))) + (cdb:login serverdat *toppath* (client:get-signature))) ;; Not currently used! But, I think it *should* be used!!! (define (client:logout serverdat) (let ((ok (and (socket? serverdat) - (cdb:logout serverdat *toppath* (server:get-client-signature))))) + (cdb:logout serverdat *toppath* (client:get-signature))))) ok)) ;; Do all the connection work, look up the transport type and set up the ;; connection if required. ;; @@ -35,11 +51,11 @@ ;; There are two scenarios. ;; 1. We are a test manager and we received *transport-type* and *runremote* via cmdline ;; 2. We are a run tests, list runs or other interactive process and we mush figure out ;; *transport-type* and *runremote* from the monitor.db ;; -;; server:client-setup +;; client:setup (define (client:setup #!key (numtries 50)) (if (not *toppath*) (if (not (setup-for-run)) (begin (debug:print 0 "ERROR: failed to find megatest.config, exiting") @@ -70,11 +86,11 @@ (else ;; default to fs (debug:print 0 "ERROR: unrecognised transport type " *transport-type* " attempting to continue with fs") (set! *transport-type* 'fs) (set! *megatest-db* (open-db)))))) -;; server:client-signal-handler +;; client:signal-handler (define (client:signal-handler signum) (handle-exceptions exn (debug:print " ... exiting ...") (let ((th1 (make-thread (lambda () @@ -88,14 +104,14 @@ "exit on ^C timer"))) (thread-start! th2) (thread-start! th1) (thread-join! th2)))) -;; server:client-launch +;; client:launch (define (client:launch) - (set-signal-handler! signal/int server:client-signal-handler) + (set-signal-handler! signal/int client:signal-handler) (if (client:setup) (debug:print-info 2 "connected as client") (begin (debug:print 0 "ERROR: Failed to connect as client") (exit)))) Index: dashboard.scm ================================================================== --- dashboard.scm +++ dashboard.scm @@ -82,16 +82,16 @@ (define *db* #f) ;; (open-db)) (if (args:get-arg "-host") (begin (set! *runremote* (string-split (args:get-arg "-host" ":"))) - (server:client-launch)) - (server:client-launch)) + (client:launch)) + (client:launch)) ;; HACK ALERT: this is a hack, please fix. (define *read-only* (not (file-read-access? (conc *toppath* "/megatest.db")))) -;; (server:client-setup *db*) +;; (client:setup *db*) (define toplevel #f) (define dlg #f) (define max-test-num 0) ;; (define *keys* (open-run-close db:get-keys #f)) Index: db.scm ================================================================== --- db.scm +++ db.scm @@ -26,10 +26,11 @@ (declare (unit db)) (declare (uses common)) (declare (uses keys)) (declare (uses ods)) (declare (uses fs-transport)) +(declare (uses client)) (include "common_records.scm") (include "db_records.scm") (include "key_records.scm") (include "run_records.scm") @@ -1095,11 +1096,11 @@ (case *transport-type* ((fs) (let ((packet (vector "na" qtype immediate "na" params 0))) (fs:process-queue-item packet))) ((http) - (let* ((client-sig (server:get-client-signature)) + (let* ((client-sig (client:get-signature)) (query-sig (message-digest-string (md5-primitive) (conc qtype immediate params))) (zdat (db:obj->string (vector client-sig qtype immediate query-sig params (current-seconds))))) ;; (with-output-to-string (lambda ()(serialize params)))) (debug:print-info 11 "zdat=" zdat) (let* ((res #f) (rawdat (http-transport:client-send-receive serverdat zdat)) @@ -1113,21 +1114,21 @@ (begin (thread-sleep! 5) (if (> numretries 0)(apply cdb:client-call serverdat qtype immediate (- numretries 1) params))) (let* ((push-socket (vector-ref serverdat 0)) (sub-socket (vector-ref serverdat 1)) - (client-sig (server:get-client-signature)) + (client-sig (client:get-signature)) (query-sig (message-digest-string (md5-primitive) (conc qtype immediate params))) (zdat (db:obj->string (vector client-sig qtype immediate query-sig params (current-seconds)))) ;; (with-output-to-string (lambda ()(serialize params)))) (res #f) (send-receive (lambda () (debug:print-info 11 "sending message") (send-message push-socket zdat) (debug:print-info 11 "message sent") (let loop () ;; get the sender info - ;; this should match (server:get-client-signature) + ;; this should match (client:get-signature) ;; we will need to process "all" messages here some day (receive-message* sub-socket) ;; now get the actual message (let ((myres (db:string->obj (receive-message* sub-socket)))) (if (equal? query-sig (vector-ref myres 1)) Index: http-transport.scm ================================================================== --- http-transport.scm +++ http-transport.scm @@ -185,11 +185,11 @@ final))))))) (define (http-transport:client-connect iface port) (let* ((login-res #f) (serverdat (list iface port))) - (set! login-res (server:client-login serverdat)) + (set! login-res (client:login serverdat)) (if (and (not (null? login-res)) (car login-res)) (begin (debug:print-info 2 "Logged in and connected to " iface ":" port) (set! *runremote* serverdat) Index: launch.scm ================================================================== --- launch.scm +++ launch.scm @@ -120,11 +120,11 @@ (debug:print 0 "Failed to setup, exiting") ;; (sqlite3:finalize! db) ;; (sqlite3:finalize! tdb) (exit 1))) ;; Can setup as client for server mode now - ;; (server:client-setup) + ;; (client:setup) (change-directory *toppath*) (set-megatest-env-vars run-id) ;; these may be needed by the launching process (change-directory work-area) Index: megatest.scm ================================================================== --- megatest.scm +++ megatest.scm @@ -20,10 +20,11 @@ (declare (uses megatest-version)) (declare (uses margs)) (declare (uses runs)) (declare (uses launch)) (declare (uses server)) +(declare (uses client)) (declare (uses tests)) (declare (uses genexample)) (define *db* #f) ;; this is only for the repl, do not use in general!!!! @@ -330,11 +331,11 @@ ;; if not list or kill then start a client (if appropriate) (if (or (args-defined? "-h" "-version" "-gen-megatest-area" "-gen-megatest-test") (eq? (length (hash-table-keys args:arg-hash)) 0)) (debug:print-info 1 "Server connection not needed") ;; ok, so lets connect to the server - (server:client-launch))) + (client:launch))) ;;====================================================================== ;; Weird special calls that need to run *after* the server has started? ;;====================================================================== @@ -781,11 +782,11 @@ (begin (debug:print 0 "Failed to setup, exiting") (exit 1))) ;; can setup as client for server mode now - ;; (server:client-setup) + ;; (client:setup) (if (args:get-arg "-load-test-data") ;; has sub commands that are rdb: ;; DO NOT put this one into either cdb:remote-run or open-run-close (db:load-test-data db test-id)) @@ -942,12 +943,12 @@ (db (if toppath (open-db) #f))) (if db (begin (set! *db* db) (set! *client-non-blocking-mode* #t) - ;; (server:client-setup) - ;; (server:client-launch) + ;; (client:setup) + ;; (client:launch) (import readline) (import apropos) (gnu-history-install-file-manager (string-append (or (get-environment-variable "HOME") ".") "/.megatest_history")) Index: rpc-transport.scm ================================================================== --- rpc-transport.scm +++ rpc-transport.scm @@ -25,11 +25,11 @@ (declare (uses tasks)) ;; tasks are where stuff is maintained about what is running. (include "common_records.scm") (include "db_records.scm") -(define (server:make-server-url hostport) +(define (rpc-server:make-server-url hostport) (if (not hostport) #f (conc "http://" (car hostport) ":" (cadr hostport)))) (define *server-loop-heart-beat* (current-seconds)) @@ -42,11 +42,11 @@ ;; Call this to start the actual server ;; (define *db:process-queue-mutex* (make-mutex)) -(define (server:run hostn) +(define (rpc-server:run hostn) (debug:print 2 "Attempting to start the server ...") (if (not *toppath*) (if (not (setup-for-run)) (begin (debug:print 0 "ERROR: cannot find megatest.config, cannot start server, exiting") @@ -108,11 +108,11 @@ ;; lite3:finalize! db))) )) -;; (define (server:main-loop) +;; (define (rpc-server:main-loop) ;; (print "INFO: Exectuing main server loop") ;; (access-log "megatest-http.log") ;; (server-bind-address #f) ;; (define-page (main-page-path) ;; (lambda () @@ -144,11 +144,11 @@ ;;; ;;; (start-server port: 12345) ;; This is recursively run by server:run until sucessful ;; -(define (server:try-start-server ipaddrstr portnum) +(define (rpc-server:try-start-server ipaddrstr portnum) (handle-exceptions exn (begin (print-error-message exn) (if (< portnum 9000) @@ -167,11 +167,11 @@ (print "INFO: Trying to start server on " ipaddrstr ":" portnum) ;; This starts the spiffy server (start-server port: portnum) (print "INFO: server has been stopped"))) -(define (server:mk-signature) +(define (rpc-server:mk-signature) (message-digest-string (md5-primitive) (with-output-to-string (lambda () (write (list (current-directory) (argv))))))) @@ -181,31 +181,25 @@ ;;====================================================================== ;; When using zmq this would send the message back (two step process) ;; with spiffy or rpc this simply returns the return data to be returned ;; -(define (server:reply return-addr query-sig success/fail result) +(define (rpc-server:reply return-addr query-sig success/fail result) (debug:print-info 11 "server:reply return-addr=" return-addr ", result=" result) ;; (send-message pubsock target send-more: #t) ;; (send-message pubsock (db:obj->string (vector success/fail query-sig result))) ;;====================================================================== ;; C L I E N T S ;;====================================================================== -(define (server:get-client-signature) - (if *my-client-signature* *my-client-signature* - (let ((sig (server:mk-signature))) - (set! *my-client-signature* sig) - *my-client-signature*))) - ;; ;; ;; 1 Hello, world! Goodbye Dolly ;; Send msg to serverdat and receive result -(define (server:client-send-receive serverdat msg) +(define (rpc-server:client-send-receive serverdat msg) (let* ((url (server:make-server-url serverdat)) (fullurl (conc url "/ctrl")) ;; (conc url "/?dat=" msg))) (numretries 0)) (handle-exceptions exn @@ -232,25 +226,25 @@ (debug:print-info 11 "match=" match) (let ((final (cadr match))) (debug:print-info 11 "final=" final) final))))))) -(define (server:client-login serverdat) +(define (client:login serverdat serverdat) (max-retry-attempts 100) - (cdb:login serverdat *toppath* (server:get-client-signature))) + (cdb:login serverdat *toppath* (client:get-signature))) ;; Not currently used! But, I think it *should* be used!!! -(define (server:client-logout serverdat) +(define (client:logout serverdat) (let ((ok (and (socket? serverdat) - (cdb:logout serverdat *toppath* (server:get-client-signature))))) + (cdb:logout serverdat *toppath* (client:get-signature))))) ;; (close-socket serverdat) ok)) -(define (server:client-connect iface port) +(define (rpc-server:client-connect iface port) (let* ((login-res #f) (serverdat (list iface port))) - (set! login-res (server:client-login serverdat)) + (set! login-res (client:login serverdat serverdat)) (if (and (not (null? login-res)) (car login-res)) (begin (debug:print-info 2 "Logged in and connected to " iface ":" port) (set! *runremote* serverdat) @@ -259,11 +253,11 @@ (debug:print-info 2 "Failed to login or connect to " iface ":" port) (set! *runremote* #f) #f)))) ;; Do all the connection work, start a server if not already running -(define (server:client-setup #!key (numtries 50)) +(define (client:setup #!key (numtries 50)) (if (not *toppath*) (if (not (setup-for-run)) (begin (debug:print 0 "ERROR: failed to find megatest.config, exiting") (exit)))) @@ -295,17 +289,17 @@ (sleep 2) ;; give server time to start (if (< count 5) (loop (+ count 1))))))) ;; we are starting a server, do not try again! That can lead to ;; recursively starting many processes!!! - (server:client-setup numtries: 0)) + (client:setup numtries: 0)) (debug:print-info 1 "Too many attempts, giving up"))))) ;; run server:keep-running in a parallel thread to monitor that the db is being ;; used and to shutdown after sometime if it is not. ;; -(define (server:keep-running) +(define (rpc-server:keep-running) ;; if none running or if > 20 seconds since ;; server last used then start shutdown ;; This thread waits for the server to come alive (let* ((server-info (let loop () (let ((sdat #f)) @@ -356,11 +350,11 @@ (debug:print-info 0 "Max cached queries was " *max-cache-size*) (debug:print-info 0 "Server shutdown complete. Exiting") (exit))))))) ;; all routes though here end in exit ... -(define (server:launch) +(define (rpc-server:launch) (if (not *toppath*) (if (not (setup-for-run)) (begin (debug:print 0 "ERROR: cannot find megatest.config, exiting") (exit)))) @@ -383,30 +377,5 @@ (thread-join! th2) ) (debug:print 0 "ERROR: Failed to setup for megatest"))) (exit))) -(define (server:client-signal-handler signum) - (handle-exceptions - exn - (debug:print " ... exiting ...") - (let ((th1 (make-thread (lambda () - "") ;; do nothing for now (was flush out last call if applicable) - "eat response")) - (th2 (make-thread (lambda () - (debug:print 0 "ERROR: Received ^C, attempting clean exit. Please be patient and wait a few seconds before hitting ^C again.") - (thread-sleep! 1) ;; give the flush one second to do it's stuff - (debug:print 0 " Done.") - (exit 4)) - "exit on ^C timer"))) - (thread-start! th2) - (thread-start! th1) - (thread-join! th2)))) - -(define (server:client-launch) - (set-signal-handler! signal/int server:client-signal-handler) - (if (server:client-setup) - (debug:print-info 2 "connected as client") - (begin - (debug:print 0 "ERROR: Failed to connect as client") - (exit)))) - Index: runs.scm ================================================================== --- runs.scm +++ runs.scm @@ -888,11 +888,11 @@ (exit 1))) (if (args:get-arg "-server") (open-run-close server:start db (args:get-arg "-server"))) ;; (if (not (or (args:get-arg "-runall") ;; runall and runtests are allowed to be servers ;; (args:get-arg "-runtests"))) - ;; (server:client-setup) ;; This is a duplicate startup!!!??? BUG? + ;; (client:setup) ;; This is a duplicate startup!!!??? BUG? ;; )) (set! keys (open-run-close db: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 Index: server.scm ================================================================== --- server.scm +++ server.scm @@ -8,20 +8,18 @@ ;; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ;; PURPOSE. (require-extension (srfi 18) extras tcp s11n) -(use sqlite3 srfi-1 posix regex regex-case srfi-69 hostinfo md5 message-digest zmq) -(import (prefix sqlite3 sqlite3:)) +(use srfi-1 posix regex regex-case srfi-69 hostinfo md5 message-digest zmq) (use spiffy uri-common intarweb http-client spiffy-request-vars) (declare (unit server)) (declare (uses common)) (declare (uses db)) -(declare (uses tests)) (declare (uses tasks)) ;; tasks are where stuff is maintained about what is running. (declare (uses http-transport)) (declare (uses zmq-transport)) (include "common_records.scm") Index: zmq-transport.scm ================================================================== --- zmq-transport.scm +++ zmq-transport.scm @@ -285,15 +285,15 @@ (define (zmq-transport:client-connect iface pullport pubport) (let* ((push-socket (zmq-transport:client-socket-connect iface pullport type: 'push)) (sub-socket (zmq-transport:client-socket-connect iface pubport type: 'sub - subscriptions: (list (server:get-client-signature) "all"))) + subscriptions: (list (client:get-signature) "all"))) (zmq-sockets (vector push-socket sub-socket)) (login-res #f)) (debug:print-info 11 "zmq-transport:client-connect started. Next is login") - (set! login-res (server:client-login zmq-sockets)) + (set! login-res (client:login serverdat zmq-sockets)) (if (and (not (null? login-res)) (car login-res)) (begin (debug:print-info 2 "Logged in and connected to " iface ":" pullport "/" pubport ".") (set! *runremote* zmq-sockets)