Megatest

Hex Artifact Content
Login

Artifact 15ec21316037662535a3b9782f2ee405892ac1bc:


0000: 0a 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 32 30  .;; Copyright 20
0010: 30 36 2d 32 30 31 32 2c 20 4d 61 74 74 68 65 77  06-2012, Matthew
0020: 20 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20 0a 3b 3b   Welland..;; .;;
0030: 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69    This program i
0040: 73 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65  s made available
0050: 20 75 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47   under the GNU G
0060: 50 4c 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 6f  PL version 2.0 o
0070: 72 0a 3b 3b 20 20 67 72 65 61 74 65 72 2e 20 53  r.;;  greater. S
0080: 65 65 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79  ee the accompany
0090: 69 6e 67 20 66 69 6c 65 20 43 4f 50 59 49 4e 47  ing file COPYING
00a0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3b 3b   for details..;;
00b0: 20 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72   .;;  This progr
00c0: 61 6d 20 69 73 20 64 69 73 74 72 69 62 75 74 65  am is distribute
00d0: 64 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41  d WITHOUT ANY WA
00e0: 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20  RRANTY; without 
00f0: 65 76 65 6e 20 74 68 65 0a 3b 3b 20 20 69 6d 70  even the.;;  imp
0100: 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66  lied warranty of
0110: 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59   MERCHANTABILITY
0120: 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20   or FITNESS FOR 
0130: 41 20 50 41 52 54 49 43 55 4c 41 52 0a 3b 3b 20  A PARTICULAR.;; 
0140: 20 50 55 52 50 4f 53 45 2e 0a 0a 28 72 65 71 75   PURPOSE...(requ
0150: 69 72 65 2d 65 78 74 65 6e 73 69 6f 6e 20 28 73  ire-extension (s
0160: 72 66 69 20 31 38 29 20 65 78 74 72 61 73 20 74  rfi 18) extras t
0170: 63 70 20 73 31 31 6e 29 0a 0a 28 75 73 65 20 73  cp s11n)..(use s
0180: 71 6c 69 74 65 33 20 73 72 66 69 2d 31 20 70 6f  qlite3 srfi-1 po
0190: 73 69 78 20 72 65 67 65 78 20 72 65 67 65 78 2d  six regex regex-
01a0: 63 61 73 65 20 73 72 66 69 2d 36 39 20 68 6f 73  case srfi-69 hos
01b0: 74 69 6e 66 6f 20 6d 64 35 20 6d 65 73 73 61 67  tinfo md5 messag
01c0: 65 2d 64 69 67 65 73 74 20 7a 6d 71 29 0a 28 69  e-digest zmq).(i
01d0: 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 73 71  mport (prefix sq
01e0: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a 29 29  lite3 sqlite3:))
01f0: 0a 0a 28 75 73 65 20 73 70 69 66 66 79 20 75 72  ..(use spiffy ur
0200: 69 2d 63 6f 6d 6d 6f 6e 20 69 6e 74 61 72 77 65  i-common intarwe
0210: 62 20 68 74 74 70 2d 63 6c 69 65 6e 74 20 73 70  b http-client sp
0220: 69 66 66 79 2d 72 65 71 75 65 73 74 2d 76 61 72  iffy-request-var
0230: 73 29 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e  s)..(declare (un
0240: 69 74 20 73 65 72 76 65 72 29 29 0a 0a 28 64 65  it server))..(de
0250: 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f 6d 6d  clare (uses comm
0260: 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75  on)).(declare (u
0270: 73 65 73 20 64 62 29 29 0a 28 64 65 63 6c 61 72  ses db)).(declar
0280: 65 20 28 75 73 65 73 20 74 65 73 74 73 29 29 0a  e (uses tests)).
0290: 28 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 74  (declare (uses t
02a0: 61 73 6b 73 29 29 20 3b 3b 20 74 61 73 6b 73 20  asks)) ;; tasks 
02b0: 61 72 65 20 77 68 65 72 65 20 73 74 75 66 66 20  are where stuff 
02c0: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 61 62  is maintained ab
02d0: 6f 75 74 20 77 68 61 74 20 69 73 20 72 75 6e 6e  out what is runn
02e0: 69 6e 67 2e 0a 28 64 65 63 6c 61 72 65 20 28 75  ing..(declare (u
02f0: 73 65 73 20 68 74 74 70 2d 74 72 61 6e 73 70 6f  ses http-transpo
0300: 72 74 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75  rt)).(declare (u
0310: 73 65 73 20 7a 6d 71 2d 74 72 61 6e 73 70 6f 72  ses zmq-transpor
0320: 74 29 29 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63  t))..(include "c
0330: 6f 6d 6d 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63  ommon_records.sc
0340: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 64 62  m").(include "db
0350: 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a 0a  _records.scm")..
0360: 28 64 65 66 69 6e 65 20 28 73 65 72 76 65 72 3a  (define (server:
0370: 6d 61 6b 65 2d 73 65 72 76 65 72 2d 75 72 6c 20  make-server-url 
0380: 68 6f 73 74 70 6f 72 74 29 0a 20 20 28 69 66 20  hostport).  (if 
0390: 28 6e 6f 74 20 68 6f 73 74 70 6f 72 74 29 0a 20  (not hostport). 
03a0: 20 20 20 20 20 23 66 0a 20 20 20 20 20 20 28 63       #f.      (c
03b0: 6f 6e 63 20 22 68 74 74 70 3a 2f 2f 22 20 28 63  onc "http://" (c
03c0: 61 72 20 68 6f 73 74 70 6f 72 74 29 20 22 3a 22  ar hostport) ":"
03d0: 20 28 63 61 64 72 20 68 6f 73 74 70 6f 72 74 29   (cadr hostport)
03e0: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 20 2a 73  )))..(define  *s
03f0: 65 72 76 65 72 2d 6c 6f 6f 70 2d 68 65 61 72 74  erver-loop-heart
0400: 2d 62 65 61 74 2a 20 28 63 75 72 72 65 6e 74 2d  -beat* (current-
0410: 73 65 63 6f 6e 64 73 29 29 0a 28 64 65 66 69 6e  seconds)).(defin
0420: 65 20 2a 68 65 61 72 74 62 65 61 74 2d 6d 75 74  e *heartbeat-mut
0430: 65 78 2a 20 28 6d 61 6b 65 2d 6d 75 74 65 78 29  ex* (make-mutex)
0440: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
0450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53  ===========.;; S
0490: 20 45 20 52 20 56 20 45 20 52 0a 3b 3b 3d 3d 3d   E R V E R.;;===
04a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
04b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
04c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
04d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
04e0: 3d 3d 3d 0a 0a 3b 3b 20 43 61 6c 6c 20 74 68 69  ===..;; Call thi
04f0: 73 20 74 6f 20 73 74 61 72 74 20 74 68 65 20 61  s to start the a
0500: 63 74 75 61 6c 20 73 65 72 76 65 72 0a 3b 3b 0a  ctual server.;;.
0510: 0a 28 64 65 66 69 6e 65 20 2a 64 62 3a 70 72 6f  .(define *db:pro
0520: 63 65 73 73 2d 71 75 65 75 65 2d 6d 75 74 65 78  cess-queue-mutex
0530: 2a 20 28 6d 61 6b 65 2d 6d 75 74 65 78 29 29 0a  * (make-mutex)).
0540: 0a 28 64 65 66 69 6e 65 20 28 73 65 72 76 65 72  .(define (server
0550: 3a 72 75 6e 20 68 6f 73 74 6e 29 0a 20 20 28 64  :run hostn).  (d
0560: 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 41 74  ebug:print 2 "At
0570: 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 74 61 72  tempting to star
0580: 74 20 74 68 65 20 73 65 72 76 65 72 20 2e 2e 2e  t the server ...
0590: 22 29 0a 20 20 28 69 66 20 28 6e 6f 74 20 2a 74  ").  (if (not *t
05a0: 6f 70 70 61 74 68 2a 29 0a 20 20 20 20 20 20 28  oppath*).      (
05b0: 69 66 20 28 6e 6f 74 20 28 73 65 74 75 70 2d 66  if (not (setup-f
05c0: 6f 72 2d 72 75 6e 29 29 0a 09 20 20 28 62 65 67  or-run))..  (beg
05d0: 69 6e 0a 09 20 20 20 20 28 64 65 62 75 67 3a 70  in..    (debug:p
05e0: 72 69 6e 74 20 30 20 22 45 52 52 4f 52 3a 20 63  rint 0 "ERROR: c
05f0: 61 6e 6e 6f 74 20 66 69 6e 64 20 6d 65 67 61 74  annot find megat
0600: 65 73 74 2e 63 6f 6e 66 69 67 2c 20 63 61 6e 6e  est.config, cann
0610: 6f 74 20 73 74 61 72 74 20 73 65 72 76 65 72 2c  ot start server,
0620: 20 65 78 69 74 69 6e 67 22 29 0a 09 20 20 20 20   exiting")..    
0630: 28 65 78 69 74 29 29 29 29 0a 20 20 28 6c 65 74  (exit)))).  (let
0640: 2a 20 28 3b 3b 20 28 69 66 61 63 65 20 20 20 20  * (;; (iface    
0650: 20 20 20 20 20 20 20 28 69 66 20 28 73 74 72 69         (if (stri
0660: 6e 67 3d 3f 20 22 2d 22 20 68 6f 73 74 6e 29 0a  ng=? "-" hostn).
0670: 09 20 3b 3b 20 20 20 20 20 20 20 20 09 20 20 20  . ;;        .   
0680: 20 20 20 23 66 20 3b 3b 20 28 67 65 74 2d 68 6f     #f ;; (get-ho
0690: 73 74 2d 6e 61 6d 65 29 20 0a 09 20 3b 3b 20 20  st-name) .. ;;  
06a0: 20 20 20 20 20 20 09 20 20 20 20 20 20 68 6f 73        .      hos
06b0: 74 6e 29 29 0a 09 20 28 64 62 20 20 20 20 20 20  tn)).. (db      
06c0: 20 20 20 20 20 20 20 20 23 66 29 20 3b 3b 20 20          #f) ;;  
06d0: 20 20 20 20 20 20 28 6f 70 65 6e 2d 64 62 29 29        (open-db))
06e0: 20 3b 3b 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ;; we don't wan
06f0: 74 20 74 68 65 20 73 65 72 76 65 72 20 74 6f 20  t the server to 
0700: 62 65 20 6f 70 65 6e 69 6e 67 20 61 6e 64 20 63  be opening and c
0710: 6c 6f 73 69 6e 67 20 74 68 65 20 64 62 20 75 6e  losing the db un
0720: 6e 65 63 65 73 61 72 69 6c 79 0a 09 20 28 68 6f  necesarily.. (ho
0730: 73 74 6e 61 6d 65 20 20 20 20 20 20 20 20 28 67  stname        (g
0740: 65 74 2d 68 6f 73 74 2d 6e 61 6d 65 29 29 0a 09  et-host-name))..
0750: 20 28 69 70 61 64 64 72 73 74 72 20 20 20 20 20   (ipaddrstr     
0760: 20 20 28 6c 65 74 20 28 28 69 70 73 74 72 20 28    (let ((ipstr (
0770: 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 22 2d 22  if (string=? "-"
0780: 20 68 6f 73 74 6e 29 0a 09 09 09 09 09 20 20 20   hostn)......   
0790: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
07a0: 72 73 65 20 28 6d 61 70 20 6e 75 6d 62 65 72 2d  rse (map number-
07b0: 3e 73 74 72 69 6e 67 20 28 75 38 76 65 63 74 6f  >string (u8vecto
07c0: 72 2d 3e 6c 69 73 74 20 28 68 6f 73 74 6e 61 6d  r->list (hostnam
07d0: 65 2d 3e 69 70 20 68 6f 73 74 6e 61 6d 65 29 29  e->ip hostname))
07e0: 29 20 22 2e 22 29 0a 09 09 09 09 09 20 20 20 23  ) ".")......   #
07f0: 66 29 29 29 0a 09 09 09 20 20 20 20 28 69 66 20  f)))....    (if 
0800: 69 70 73 74 72 20 69 70 73 74 72 20 68 6f 73 74  ipstr ipstr host
0810: 6e 29 29 29 20 3b 3b 20 68 6f 73 74 6e 61 6d 65  n))) ;; hostname
0820: 29 29 29 0a 09 20 28 73 74 61 72 74 2d 70 6f 72  ))).. (start-por
0830: 74 20 20 20 20 28 69 66 20 28 61 72 67 73 3a 67  t    (if (args:g
0840: 65 74 2d 61 72 67 20 22 2d 70 6f 72 74 22 29 0a  et-arg "-port").
0850: 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d 3e  ...    (string->
0860: 6e 75 6d 62 65 72 20 28 61 72 67 73 3a 67 65 74  number (args:get
0870: 2d 61 72 67 20 22 2d 70 6f 72 74 22 29 29 0a 09  -arg "-port"))..
0880: 09 09 20 20 20 20 28 2b 20 35 30 30 30 20 28 72  ..    (+ 5000 (r
0890: 61 6e 64 6f 6d 20 31 30 30 31 29 29 29 29 0a 09  andom 1001))))..
08a0: 20 28 6c 69 6e 6b 2d 74 72 65 65 2d 70 61 74 68   (link-tree-path
08b0: 20 28 63 6f 6e 66 69 67 2d 6c 6f 6f 6b 75 70 20   (config-lookup 
08c0: 2a 63 6f 6e 66 69 67 64 61 74 2a 20 22 73 65 74  *configdat* "set
08d0: 75 70 22 20 22 6c 69 6e 6b 74 72 65 65 22 29 29  up" "linktree"))
08e0: 29 0a 20 20 20 20 28 73 65 74 21 20 2a 63 61 63  ).    (set! *cac
08f0: 68 65 2d 6f 6e 2a 20 23 74 29 0a 20 20 20 20 28  he-on* #t).    (
0900: 72 6f 6f 74 2d 70 61 74 68 20 20 20 20 20 28 69  root-path     (i
0910: 66 20 6c 69 6e 6b 2d 74 72 65 65 2d 70 61 74 68  f link-tree-path
0920: 20 0a 09 09 20 20 20 20 20 20 20 6c 69 6e 6b 2d   ...       link-
0930: 74 72 65 65 2d 70 61 74 68 0a 09 09 20 20 20 20  tree-path...    
0940: 20 20 20 28 63 75 72 72 65 6e 74 2d 64 69 72 65     (current-dire
0950: 63 74 6f 72 79 29 29 29 20 3b 3b 20 57 41 52 4e  ctory))) ;; WARN
0960: 49 4e 47 3a 20 53 45 43 55 52 49 54 59 20 48 4f  ING: SECURITY HO
0970: 4c 45 2e 20 46 49 58 20 41 53 41 50 21 0a 0a 20  LE. FIX ASAP!.. 
0980: 20 20 20 3b 3b 20 53 65 74 75 70 20 74 68 65 20     ;; Setup the 
0990: 77 65 62 20 73 65 72 76 65 72 20 61 6e 64 20 61  web server and a
09a0: 20 2f 63 74 72 6c 20 69 6e 74 65 72 66 61 63 65   /ctrl interface
09b0: 0a 20 20 20 20 3b 3b 0a 20 20 20 20 28 76 68 6f  .    ;;.    (vho
09c0: 73 74 2d 6d 61 70 20 60 28 28 28 2a 20 61 6e 79  st-map `(((* any
09d0: 29 20 2e 20 2c 28 6c 61 6d 62 64 61 20 28 63 6f  ) . ,(lambda (co
09e0: 6e 74 69 6e 75 65 29 0a 09 09 09 20 20 20 20 20  ntinue)....     
09f0: 20 20 3b 3b 20 6f 70 65 6e 20 74 68 65 20 64 62    ;; open the db
0a00: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   on the first ca
0a10: 6c 6c 20 0a 09 09 09 20 20 20 20 20 20 20 28 69  ll ....       (i
0a20: 66 20 28 6e 6f 74 20 64 62 29 28 73 65 74 21 20  f (not db)(set! 
0a30: 64 62 20 28 6f 70 65 6e 2d 64 62 29 29 29 0a 09  db (open-db)))..
0a40: 09 09 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28  ..       (let* (
0a50: 28 24 20 20 20 28 72 65 71 75 65 73 74 2d 76 61  ($   (request-va
0a60: 72 73 20 73 6f 75 72 63 65 3a 20 27 62 6f 74 68  rs source: 'both
0a70: 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 61  )).....      (da
0a80: 74 20 28 24 20 27 64 61 74 29 29 0a 09 09 09 09  t ($ 'dat)).....
0a90: 20 20 20 20 20 20 28 72 65 73 20 23 66 29 29 0a        (res #f)).
0aa0: 09 09 09 09 20 28 63 6f 6e 64 0a 09 09 09 09 20  .... (cond..... 
0ab0: 20 28 28 65 71 75 61 6c 3f 20 28 75 72 69 2d 70   ((equal? (uri-p
0ac0: 61 74 68 20 28 72 65 71 75 65 73 74 2d 75 72 69  ath (request-uri
0ad0: 20 28 63 75 72 72 65 6e 74 2d 72 65 71 75 65 73   (current-reques
0ae0: 74 29 29 29 20 0a 09 09 09 09 09 20 20 20 27 28  t))) ......   '(
0af0: 2f 20 22 68 65 79 22 29 29 0a 09 09 09 09 20 20  / "hey")).....  
0b00: 20 28 73 65 6e 64 2d 72 65 73 70 6f 6e 73 65 20   (send-response 
0b10: 62 6f 64 79 3a 20 22 68 65 79 20 74 68 65 72 65  body: "hey there
0b20: 21 5c 6e 22 0a 09 09 09 09 09 09 20 20 68 65 61  !\n".......  hea
0b30: 64 65 72 73 3a 20 27 28 28 63 6f 6e 74 65 6e 74  ders: '((content
0b40: 2d 74 79 70 65 20 74 65 78 74 2f 70 6c 61 69 6e  -type text/plain
0b50: 29 29 29 29 0a 09 09 09 09 20 20 3b 3b 20 54 68  )))).....  ;; Th
0b60: 69 73 20 69 73 20 74 68 65 20 2f 63 74 72 6c 20  is is the /ctrl 
0b70: 70 61 74 68 20 77 68 65 72 65 20 64 61 74 61 20  path where data 
0b80: 69 73 20 68 61 6e 64 65 64 20 74 6f 20 74 68 65  is handed to the
0b90: 20 73 65 72 76 65 72 20 61 6e 64 0a 09 09 09 09   server and.....
0ba0: 20 20 3b 3b 20 72 65 73 70 6f 6e 73 65 73 20 0a    ;; responses .
0bb0: 09 09 09 09 20 20 28 28 65 71 75 61 6c 3f 20 28  ....  ((equal? (
0bc0: 75 72 69 2d 70 61 74 68 20 28 72 65 71 75 65 73  uri-path (reques
0bd0: 74 2d 75 72 69 20 28 63 75 72 72 65 6e 74 2d 72  t-uri (current-r
0be0: 65 71 75 65 73 74 29 29 29 0a 09 09 09 09 09 20  equest)))...... 
0bf0: 20 20 27 28 2f 20 22 63 74 72 6c 22 29 29 0a 09    '(/ "ctrl"))..
0c00: 09 09 09 20 20 20 28 6c 65 74 2a 20 28 28 70 61  ...   (let* ((pa
0c10: 63 6b 65 74 20 28 64 62 3a 73 74 72 69 6e 67 2d  cket (db:string-
0c20: 3e 6f 62 6a 20 64 61 74 29 29 0a 09 09 09 09 09  >obj dat))......
0c30: 20 20 28 71 74 79 70 65 20 20 28 63 64 62 3a 70    (qtype  (cdb:p
0c40: 61 63 6b 65 74 2d 67 65 74 2d 71 74 79 70 65 20  acket-get-qtype 
0c50: 70 61 63 6b 65 74 29 29 29 0a 09 09 09 09 20 20  packet))).....  
0c60: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 2d     (debug:print-
0c70: 69 6e 66 6f 20 31 32 20 22 73 65 72 76 65 72 3d  info 12 "server=
0c80: 3e 20 72 65 63 65 69 76 65 64 20 70 61 63 6b 65  > received packe
0c90: 74 3d 22 20 70 61 63 6b 65 74 29 0a 09 09 09 09  t=" packet).....
0ca0: 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28 6d       (if (not (m
0cb0: 65 6d 62 65 72 20 71 74 79 70 65 20 27 28 73 79  ember qtype '(sy
0cc0: 6e 63 20 70 69 6e 67 29 29 29 0a 09 09 09 09 09  nc ping)))......
0cd0: 20 28 62 65 67 69 6e 0a 09 09 09 09 09 20 20 20   (begin......   
0ce0: 28 6d 75 74 65 78 2d 6c 6f 63 6b 21 20 2a 68 65  (mutex-lock! *he
0cf0: 61 72 74 62 65 61 74 2d 6d 75 74 65 78 2a 29 0a  artbeat-mutex*).
0d00: 09 09 09 09 09 20 20 20 28 73 65 74 21 20 2a 6c  .....   (set! *l
0d10: 61 73 74 2d 64 62 2d 61 63 63 65 73 73 2a 20 28  ast-db-access* (
0d20: 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29  current-seconds)
0d30: 29 0a 09 09 09 09 09 20 20 20 28 6d 75 74 65 78  )......   (mutex
0d40: 2d 75 6e 6c 6f 63 6b 21 20 2a 68 65 61 72 74 62  -unlock! *heartb
0d50: 65 61 74 2d 6d 75 74 65 78 2a 29 29 29 0a 09 09  eat-mutex*)))...
0d60: 09 09 20 20 20 20 20 3b 3b 20 28 6d 75 74 65 78  ..     ;; (mutex
0d70: 2d 6c 6f 63 6b 21 20 2a 64 62 3a 70 72 6f 63 65  -lock! *db:proce
0d80: 73 73 2d 71 75 65 75 65 2d 6d 75 74 65 78 2a 29  ss-queue-mutex*)
0d90: 20 3b 3b 20 74 72 79 69 6e 67 20 61 20 6d 75 74   ;; trying a mut
0da0: 65 78 0a 09 09 09 09 20 20 20 20 20 3b 3b 20 28  ex.....     ;; (
0db0: 73 65 74 21 20 72 65 73 20 28 6f 70 65 6e 2d 72  set! res (open-r
0dc0: 75 6e 2d 63 6c 6f 73 65 20 64 62 3a 70 72 6f 63  un-close db:proc
0dd0: 65 73 73 2d 71 75 65 75 65 2d 69 74 65 6d 20 6f  ess-queue-item o
0de0: 70 65 6e 2d 64 62 20 70 61 63 6b 65 74 29 29 0a  pen-db packet)).
0df0: 09 09 09 09 20 20 20 20 20 28 73 65 74 21 20 72  ....     (set! r
0e00: 65 73 20 28 64 62 3a 70 72 6f 63 65 73 73 2d 71  es (db:process-q
0e10: 75 65 75 65 2d 69 74 65 6d 20 64 62 20 70 61 63  ueue-item db pac
0e20: 6b 65 74 29 29 0a 09 09 09 09 20 20 20 20 20 3b  ket)).....     ;
0e30: 3b 20 28 6d 75 74 65 78 2d 75 6e 6c 6f 63 6b 21  ; (mutex-unlock!
0e40: 20 2a 64 62 3a 70 72 6f 63 65 73 73 2d 71 75 65   *db:process-que
0e50: 75 65 2d 6d 75 74 65 78 2a 29 0a 09 09 09 09 20  ue-mutex*)..... 
0e60: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
0e70: 2d 69 6e 66 6f 20 31 31 20 22 52 65 74 75 72 6e  -info 11 "Return
0e80: 20 76 61 6c 75 65 20 66 72 6f 6d 20 64 62 3a 70   value from db:p
0e90: 72 6f 63 65 73 73 2d 71 75 65 75 65 2d 69 74 65  rocess-queue-ite
0ea0: 6d 20 69 73 20 22 20 72 65 73 29 0a 09 09 09 09  m is " res).....
0eb0: 20 20 20 20 20 28 73 65 6e 64 2d 72 65 73 70 6f       (send-respo
0ec0: 6e 73 65 20 62 6f 64 79 3a 20 28 63 6f 6e 63 20  nse body: (conc 
0ed0: 22 3c 68 65 61 64 3e 63 74 72 6c 20 64 61 74 61  "<head>ctrl data
0ee0: 3c 2f 68 65 61 64 3e 5c 6e 3c 62 6f 64 79 3e 22  </head>\n<body>"
0ef0: 0a 09 09 09 09 09 09 09 09 72 65 73 0a 09 09 09  .........res....
0f00: 09 09 09 09 09 22 3c 2f 62 6f 64 79 3e 22 29 0a  ....."</body>").
0f10: 09 09 09 09 09 09 20 20 20 20 68 65 61 64 65 72  ......    header
0f20: 73 3a 20 27 28 28 63 6f 6e 74 65 6e 74 2d 74 79  s: '((content-ty
0f30: 70 65 20 74 65 78 74 2f 70 6c 61 69 6e 29 29 29  pe text/plain)))
0f40: 29 29 0a 09 09 09 09 20 20 28 65 6c 73 65 20 28  )).....  (else (
0f50: 63 6f 6e 74 69 6e 75 65 29 29 29 29 29 29 29 29  continue))))))))
0f60: 0a 20 20 20 20 28 73 65 72 76 65 72 3a 74 72 79  .    (server:try
0f70: 2d 73 74 61 72 74 2d 73 65 72 76 65 72 20 69 70  -start-server ip
0f80: 61 64 64 72 73 74 72 20 73 74 61 72 74 2d 70 6f  addrstr start-po
0f90: 72 74 29 0a 20 20 20 20 3b 3b 20 6c 69 74 65 33  rt).    ;; lite3
0fa0: 3a 66 69 6e 61 6c 69 7a 65 21 20 64 62 29 29 29  :finalize! db)))
0fb0: 0a 20 20 20 20 29 29 0a 0a 0a 28 64 65 66 69 6e  .    ))...(defin
0fc0: 65 20 28 73 65 72 76 65 72 3a 6d 6b 2d 73 69 67  e (server:mk-sig
0fd0: 6e 61 74 75 72 65 29 0a 20 20 28 6d 65 73 73 61  nature).  (messa
0fe0: 67 65 2d 64 69 67 65 73 74 2d 73 74 72 69 6e 67  ge-digest-string
0ff0: 20 28 6d 64 35 2d 70 72 69 6d 69 74 69 76 65 29   (md5-primitive)
1000: 20 0a 09 09 09 20 28 77 69 74 68 2d 6f 75 74 70   .... (with-outp
1010: 75 74 2d 74 6f 2d 73 74 72 69 6e 67 0a 09 09 09  ut-to-string....
1020: 20 20 20 28 6c 61 6d 62 64 61 20 28 29 0a 09 09     (lambda ()...
1030: 09 20 20 20 20 20 28 77 72 69 74 65 20 28 6c 69  .     (write (li
1040: 73 74 20 28 63 75 72 72 65 6e 74 2d 64 69 72 65  st (current-dire
1050: 63 74 6f 72 79 29 0a 09 09 09 09 09 20 20 28 61  ctory)......  (a
1060: 72 67 76 29 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d  rgv)))))))..;;==
1070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1090: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10b0: 3d 3d 3d 3d 0a 3b 3b 20 53 20 45 20 52 20 56 20  ====.;; S E R V 
10c0: 45 20 52 20 20 20 55 20 54 20 49 20 4c 20 49 20  E R   U T I L I 
10d0: 54 20 49 20 45 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d  T I E S .;;=====
10e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1120: 3d 0a 0a 3b 3b 20 57 68 65 6e 20 75 73 69 6e 67  =..;; When using
1130: 20 7a 6d 71 20 74 68 69 73 20 77 6f 75 6c 64 20   zmq this would 
1140: 73 65 6e 64 20 74 68 65 20 6d 65 73 73 61 67 65  send the message
1150: 20 62 61 63 6b 20 28 74 77 6f 20 73 74 65 70 20   back (two step 
1160: 70 72 6f 63 65 73 73 29 0a 3b 3b 20 77 69 74 68  process).;; with
1170: 20 73 70 69 66 66 79 20 6f 72 20 72 70 63 20 74   spiffy or rpc t
1180: 68 69 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72  his simply retur
1190: 6e 73 20 74 68 65 20 72 65 74 75 72 6e 20 64 61  ns the return da
11a0: 74 61 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ta to be returne
11b0: 64 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 73  d.;; .(define (s
11c0: 65 72 76 65 72 3a 72 65 70 6c 79 20 72 65 74 75  erver:reply retu
11d0: 72 6e 2d 61 64 64 72 20 71 75 65 72 79 2d 73 69  rn-addr query-si
11e0: 67 20 73 75 63 63 65 73 73 2f 66 61 69 6c 20 72  g success/fail r
11f0: 65 73 75 6c 74 29 0a 20 20 28 64 65 62 75 67 3a  esult).  (debug:
1200: 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 73  print-info 11 "s
1210: 65 72 76 65 72 3a 72 65 70 6c 79 20 72 65 74 75  erver:reply retu
1220: 72 6e 2d 61 64 64 72 3d 22 20 72 65 74 75 72 6e  rn-addr=" return
1230: 2d 61 64 64 72 20 22 2c 20 72 65 73 75 6c 74 3d  -addr ", result=
1240: 22 20 72 65 73 75 6c 74 29 0a 20 20 3b 3b 20 28  " result).  ;; (
1250: 73 65 6e 64 2d 6d 65 73 73 61 67 65 20 70 75 62  send-message pub
1260: 73 6f 63 6b 20 74 61 72 67 65 74 20 73 65 6e 64  sock target send
1270: 2d 6d 6f 72 65 3a 20 23 74 29 0a 20 20 3b 3b 20  -more: #t).  ;; 
1280: 28 73 65 6e 64 2d 6d 65 73 73 61 67 65 20 70 75  (send-message pu
1290: 62 73 6f 63 6b 20 0a 20 20 28 63 61 73 65 20 2a  bsock .  (case *
12a0: 74 72 61 6e 73 70 6f 72 74 2d 74 79 70 65 2a 0a  transport-type*.
12b0: 20 20 20 20 28 28 66 73 29 20 72 65 73 75 6c 74      ((fs) result
12c0: 29 0a 20 20 20 20 28 28 68 74 74 70 29 28 64 62  ).    ((http)(db
12d0: 3a 6f 62 6a 2d 3e 73 74 72 69 6e 67 20 28 76 65  :obj->string (ve
12e0: 63 74 6f 72 20 73 75 63 63 65 73 73 2f 66 61 69  ctor success/fai
12f0: 6c 20 71 75 65 72 79 2d 73 69 67 20 72 65 73 75  l query-sig resu
1300: 6c 74 29 29 29 0a 20 20 20 20 28 28 7a 6d 71 29  lt))).    ((zmq)
1310: 0a 20 20 20 20 20 28 6c 65 74 20 28 28 70 75 62  .     (let ((pub
1320: 2d 73 6f 63 6b 65 74 20 28 76 65 63 74 6f 72 2d  -socket (vector-
1330: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
1340: 31 29 29 29 0a 20 20 20 20 20 20 20 28 73 65 6e  1))).       (sen
1350: 64 2d 6d 65 73 73 61 67 65 20 70 75 62 2d 73 6f  d-message pub-so
1360: 63 6b 65 74 20 72 65 74 75 72 6e 2d 61 64 64 72  cket return-addr
1370: 20 73 65 6e 64 2d 6d 6f 72 65 3a 20 23 74 29 0a   send-more: #t).
1380: 20 20 20 20 20 20 20 28 73 65 6e 64 2d 6d 65 73         (send-mes
1390: 73 61 67 65 20 70 75 62 2d 73 6f 63 6b 65 74 20  sage pub-socket 
13a0: 28 64 62 3a 6f 62 6a 2d 3e 73 74 72 69 6e 67 20  (db:obj->string 
13b0: 28 76 65 63 74 6f 72 20 73 75 63 63 65 73 73 2f  (vector success/
13c0: 66 61 69 6c 20 71 75 65 72 79 2d 73 69 67 20 72  fail query-sig r
13d0: 65 73 75 6c 74 29 29 29 29 29 0a 20 20 20 20 28  esult))))).    (
13e0: 65 6c 73 65 20 0a 20 20 20 20 20 28 64 65 62 75  else .     (debu
13f0: 67 3a 70 72 69 6e 74 20 30 20 22 45 52 52 4f 52  g:print 0 "ERROR
1400: 3a 20 75 6e 72 65 63 6f 67 6e 69 73 65 64 20 74  : unrecognised t
1410: 72 61 6e 73 70 6f 72 74 20 74 79 70 65 3a 20 22  ransport type: "
1420: 20 2a 74 72 61 6e 73 70 6f 72 74 2d 74 79 70 65   *transport-type
1430: 2a 29 0a 20 20 20 20 20 72 65 73 75 6c 74 29 29  *).     result))
1440: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
1450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43  ===========.;; C
1490: 20 4c 20 49 20 45 20 4e 20 54 20 53 0a 3b 3b 3d   L I E N T S.;;=
14a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14e0: 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28  =====..(define (
14f0: 73 65 72 76 65 72 3a 67 65 74 2d 63 6c 69 65 6e  server:get-clien
1500: 74 2d 73 69 67 6e 61 74 75 72 65 29 0a 20 20 28  t-signature).  (
1510: 69 66 20 2a 6d 79 2d 63 6c 69 65 6e 74 2d 73 69  if *my-client-si
1520: 67 6e 61 74 75 72 65 2a 20 2a 6d 79 2d 63 6c 69  gnature* *my-cli
1530: 65 6e 74 2d 73 69 67 6e 61 74 75 72 65 2a 0a 20  ent-signature*. 
1540: 20 20 20 20 20 28 6c 65 74 20 28 28 73 69 67 20       (let ((sig 
1550: 28 73 65 72 76 65 72 3a 6d 6b 2d 73 69 67 6e 61  (server:mk-signa
1560: 74 75 72 65 29 29 29 0a 09 28 73 65 74 21 20 2a  ture)))..(set! *
1570: 6d 79 2d 63 6c 69 65 6e 74 2d 73 69 67 6e 61 74  my-client-signat
1580: 75 72 65 2a 20 73 69 67 29 0a 09 2a 6d 79 2d 63  ure* sig)..*my-c
1590: 6c 69 65 6e 74 2d 73 69 67 6e 61 74 75 72 65 2a  lient-signature*
15a0: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 65  )))..(define (se
15b0: 72 76 65 72 3a 63 6c 69 65 6e 74 2d 6c 6f 67 69  rver:client-logi
15c0: 6e 20 73 65 72 76 65 72 64 61 74 29 0a 20 20 28  n serverdat).  (
15d0: 63 64 62 3a 6c 6f 67 69 6e 20 73 65 72 76 65 72  cdb:login server
15e0: 64 61 74 20 2a 74 6f 70 70 61 74 68 2a 20 28 73  dat *toppath* (s
15f0: 65 72 76 65 72 3a 67 65 74 2d 63 6c 69 65 6e 74  erver:get-client
1600: 2d 73 69 67 6e 61 74 75 72 65 29 29 29 0a 0a 3b  -signature)))..;
1610: 3b 20 4e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  ; Not currently 
1620: 75 73 65 64 21 20 42 75 74 2c 20 49 20 74 68 69  used! But, I thi
1630: 6e 6b 20 69 74 20 2a 73 68 6f 75 6c 64 2a 20 62  nk it *should* b
1640: 65 20 75 73 65 64 21 21 21 0a 28 64 65 66 69 6e  e used!!!.(defin
1650: 65 20 28 73 65 72 76 65 72 3a 63 6c 69 65 6e 74  e (server:client
1660: 2d 6c 6f 67 6f 75 74 20 73 65 72 76 65 72 64 61  -logout serverda
1670: 74 29 0a 20 20 28 6c 65 74 20 28 28 6f 6b 20 28  t).  (let ((ok (
1680: 61 6e 64 20 28 73 6f 63 6b 65 74 3f 20 73 65 72  and (socket? ser
1690: 76 65 72 64 61 74 29 0a 09 09 20 28 63 64 62 3a  verdat)... (cdb:
16a0: 6c 6f 67 6f 75 74 20 73 65 72 76 65 72 64 61 74  logout serverdat
16b0: 20 2a 74 6f 70 70 61 74 68 2a 20 28 73 65 72 76   *toppath* (serv
16c0: 65 72 3a 67 65 74 2d 63 6c 69 65 6e 74 2d 73 69  er:get-client-si
16d0: 67 6e 61 74 75 72 65 29 29 29 29 29 0a 20 20 20  gnature))))).   
16e0: 20 6f 6b 29 29 0a 0a 3b 3b 20 44 6f 20 61 6c 6c   ok))..;; Do all
16f0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1700: 77 6f 72 6b 2c 20 6c 6f 6f 6b 20 75 70 20 74 68  work, look up th
1710: 65 20 74 72 61 6e 73 70 6f 72 74 20 74 79 70 65  e transport type
1720: 20 61 6e 64 20 73 65 74 20 75 70 20 74 68 65 0a   and set up the.
1730: 3b 3b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 66  ;; connection if
1740: 20 72 65 71 75 69 72 65 64 2e 0a 3b 3b 0a 3b 3b   required..;;.;;
1750: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
1760: 63 65 6e 61 72 69 6f 73 2e 20 0a 3b 3b 20 20 20  cenarios. .;;   
1770: 31 2e 20 57 65 20 61 72 65 20 61 20 74 65 73 74  1. We are a test
1780: 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 77 65 20   manager and we 
1790: 72 65 63 65 69 76 65 64 20 2a 74 72 61 6e 73 70  received *transp
17a0: 6f 72 74 2d 74 79 70 65 2a 20 61 6e 64 20 2a 72  ort-type* and *r
17b0: 75 6e 72 65 6d 6f 74 65 2a 20 76 69 61 20 63 6d  unremote* via cm
17c0: 64 6c 69 6e 65 0a 3b 3b 20 20 20 32 2e 20 57 65  dline.;;   2. We
17d0: 20 61 72 65 20 61 20 72 75 6e 20 74 65 73 74 73   are a run tests
17e0: 2c 20 6c 69 73 74 20 72 75 6e 73 20 6f 72 20 6f  , list runs or o
17f0: 74 68 65 72 20 69 6e 74 65 72 61 63 74 69 76 65  ther interactive
1800: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 77 65 20   process and we 
1810: 6d 75 73 68 20 66 69 67 75 72 65 20 6f 75 74 0a  mush figure out.
1820: 3b 3b 20 20 20 20 20 20 2a 74 72 61 6e 73 70 6f  ;;      *transpo
1830: 72 74 2d 74 79 70 65 2a 20 61 6e 64 20 2a 72 75  rt-type* and *ru
1840: 6e 72 65 6d 6f 74 65 2a 20 66 72 6f 6d 20 74 68  nremote* from th
1850: 65 20 6d 6f 6e 69 74 6f 72 2e 64 62 0a 3b 3b 0a  e monitor.db.;;.
1860: 28 64 65 66 69 6e 65 20 28 73 65 72 76 65 72 3a  (define (server:
1870: 63 6c 69 65 6e 74 2d 73 65 74 75 70 20 23 21 6b  client-setup #!k
1880: 65 79 20 28 6e 75 6d 74 72 69 65 73 20 35 30 29  ey (numtries 50)
1890: 29 0a 20 20 28 69 66 20 28 6e 6f 74 20 2a 74 6f  ).  (if (not *to
18a0: 70 70 61 74 68 2a 29 0a 20 20 20 20 20 20 28 69  ppath*).      (i
18b0: 66 20 28 6e 6f 74 20 28 73 65 74 75 70 2d 66 6f  f (not (setup-fo
18c0: 72 2d 72 75 6e 29 29 0a 09 20 20 28 62 65 67 69  r-run))..  (begi
18d0: 6e 0a 09 20 20 20 20 28 64 65 62 75 67 3a 70 72  n..    (debug:pr
18e0: 69 6e 74 20 30 20 22 45 52 52 4f 52 3a 20 66 61  int 0 "ERROR: fa
18f0: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 6d 65 67  iled to find meg
1900: 61 74 65 73 74 2e 63 6f 6e 66 69 67 2c 20 65 78  atest.config, ex
1910: 69 74 69 6e 67 22 29 0a 09 20 20 20 20 28 65 78  iting")..    (ex
1920: 69 74 29 29 29 29 0a 20 20 28 64 65 62 75 67 3a  it)))).  (debug:
1930: 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 2a  print-info 11 "*
1940: 74 72 61 6e 73 70 6f 72 74 2d 74 79 70 65 2a 20  transport-type* 
1950: 69 73 20 22 20 2a 74 72 61 6e 73 70 6f 72 74 2d  is " *transport-
1960: 74 79 70 65 2a 20 22 2c 20 2a 72 75 6e 72 65 6d  type* ", *runrem
1970: 6f 74 65 2a 20 69 73 20 22 20 2a 72 75 6e 72 65  ote* is " *runre
1980: 6d 6f 74 65 2a 29 0a 20 20 28 6c 65 74 2a 20 28  mote*).  (let* (
1990: 28 68 6f 73 74 69 6e 66 6f 20 20 28 69 66 20 28  (hostinfo  (if (
19a0: 6e 6f 74 20 2a 74 72 61 6e 73 70 6f 72 74 2d 74  not *transport-t
19b0: 79 70 65 2a 29 20 3b 3b 20 49 66 20 77 65 20 64  ype*) ;; If we d
19c0: 6f 6e 74 27 20 61 6c 72 65 61 64 79 20 68 61 76  ont' already hav
19d0: 65 20 74 72 61 6e 73 70 6f 72 74 20 74 79 70 65  e transport type
19e0: 20 73 65 74 20 74 68 65 6e 20 66 69 67 75 72 65   set then figure
19f0: 20 69 74 20 6f 75 74 0a 09 09 09 28 6f 70 65 6e   it out....(open
1a00: 2d 72 75 6e 2d 63 6c 6f 73 65 20 74 61 73 6b 73  -run-close tasks
1a10: 3a 67 65 74 2d 62 65 73 74 2d 73 65 72 76 65 72  :get-best-server
1a20: 20 74 61 73 6b 73 3a 6f 70 65 6e 2d 64 62 29 0a   tasks:open-db).
1a30: 09 09 09 23 66 29 29 29 0a 20 20 20 20 3b 3b 20  ...#f))).    ;; 
1a40: 69 66 20 68 61 76 65 20 68 6f 73 74 69 6e 66 6f  if have hostinfo
1a50: 20 74 68 65 6e 20 65 78 74 72 61 63 74 20 74 68   then extract th
1a60: 65 20 74 72 61 6e 73 70 6f 72 74 20 74 79 70 65  e transport type
1a70: 20 0a 20 20 20 20 3b 3b 20 65 6c 73 65 20 66 61   .    ;; else fa
1a80: 6c 6c 20 62 61 63 6b 20 74 6f 20 66 73 0a 20 20  ll back to fs.  
1a90: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69    (debug:print-i
1aa0: 6e 66 6f 20 31 31 20 22 43 4c 49 45 4e 54 20 53  nfo 11 "CLIENT S
1ab0: 45 54 55 50 2c 20 68 6f 73 74 69 6e 66 6f 3d 22  ETUP, hostinfo="
1ac0: 20 68 6f 73 74 69 6e 66 6f 29 0a 20 20 20 20 28   hostinfo).    (
1ad0: 73 65 74 21 20 2a 74 72 61 6e 73 70 6f 72 74 2d  set! *transport-
1ae0: 74 79 70 65 2a 20 28 69 66 20 68 6f 73 74 69 6e  type* (if hostin
1af0: 66 6f 20 0a 20 20 20 20 09 09 09 20 20 20 20 20  fo .    ...     
1b00: 20 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f    (string->symbo
1b10: 6c 20 28 74 61 73 6b 73 3a 68 6f 73 74 69 6e 66  l (tasks:hostinf
1b20: 6f 2d 67 65 74 2d 74 72 61 6e 73 70 6f 72 74 20  o-get-transport 
1b30: 68 6f 73 74 69 6e 66 6f 29 29 0a 09 09 09 20 20  hostinfo))....  
1b40: 20 20 20 20 20 27 66 73 29 29 0a 20 20 20 20 3b       'fs)).    ;
1b50: 3b 20 3b 3b 20 44 45 42 55 47 20 53 54 55 46 46  ; ;; DEBUG STUFF
1b60: 0a 20 20 20 20 3b 3b 20 28 69 66 20 28 65 71 3f  .    ;; (if (eq?
1b70: 20 2a 74 72 61 6e 73 70 6f 72 74 2d 74 79 70 65   *transport-type
1b80: 2a 20 27 66 73 29 28 62 65 67 69 6e 20 28 70 72  * 'fs)(begin (pr
1b90: 69 6e 74 20 22 45 52 52 4f 52 21 21 21 21 21 21  int "ERROR!!!!!!
1ba0: 21 20 72 65 66 75 73 69 6e 67 20 74 6f 20 72 75  ! refusing to ru
1bb0: 6e 20 77 69 74 68 20 74 72 61 6e 73 70 6f 72 74  n with transport
1bc0: 20 22 20 2a 74 72 61 6e 73 70 6f 72 74 2d 74 79   " *transport-ty
1bd0: 70 65 2a 29 28 65 78 69 74 20 39 39 29 29 29 0a  pe*)(exit 99))).
1be0: 20 20 20 20 0a 20 20 20 20 28 64 65 62 75 67 3a      .    (debug:
1bf0: 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 55  print-info 11 "U
1c00: 73 69 6e 67 20 74 72 61 6e 73 70 6f 72 74 20 74  sing transport t
1c10: 79 70 65 20 6f 66 20 22 20 2a 74 72 61 6e 73 70  ype of " *transp
1c20: 6f 72 74 2d 74 79 70 65 2a 20 28 69 66 20 68 6f  ort-type* (if ho
1c30: 73 74 69 6e 66 6f 20 28 63 6f 6e 63 20 22 20 74  stinfo (conc " t
1c40: 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 22 20 68  o connect to " h
1c50: 6f 73 74 69 6e 66 6f 29 20 22 22 29 29 0a 20 20  ostinfo) "")).  
1c60: 20 20 28 63 61 73 65 20 2a 74 72 61 6e 73 70 6f    (case *transpo
1c70: 72 74 2d 74 79 70 65 2a 20 0a 20 20 20 20 20 20  rt-type* .      
1c80: 28 28 66 73 29 28 69 66 20 28 6e 6f 74 20 2a 6d  ((fs)(if (not *m
1c90: 65 67 61 74 65 73 74 2d 64 62 2a 29 28 73 65 74  egatest-db*)(set
1ca0: 21 20 2a 6d 65 67 61 74 65 73 74 2d 64 62 2a 20  ! *megatest-db* 
1cb0: 28 6f 70 65 6e 2d 64 62 29 29 29 29 0a 20 20 20  (open-db)))).   
1cc0: 20 20 20 28 28 68 74 74 70 29 0a 20 20 20 20 20     ((http).     
1cd0: 20 20 28 68 74 74 70 2d 74 72 61 6e 73 70 6f 72    (http-transpor
1ce0: 74 3a 63 6c 69 65 6e 74 2d 63 6f 6e 6e 65 63 74  t:client-connect
1cf0: 20 28 74 61 73 6b 73 3a 68 6f 73 74 69 6e 66 6f   (tasks:hostinfo
1d00: 2d 67 65 74 2d 69 6e 74 65 72 66 61 63 65 20 68  -get-interface h
1d10: 6f 73 74 69 6e 66 6f 29 0a 09 09 09 09 20 20 20  ostinfo).....   
1d20: 20 20 20 28 74 61 73 6b 73 3a 68 6f 73 74 69 6e     (tasks:hostin
1d30: 66 6f 2d 67 65 74 2d 70 6f 72 74 20 68 6f 73 74  fo-get-port host
1d40: 69 6e 66 6f 29 29 29 0a 20 20 20 20 20 20 28 28  info))).      ((
1d50: 7a 6d 71 29 0a 20 20 20 20 20 20 20 28 7a 6d 71  zmq).       (zmq
1d60: 2d 74 72 61 6e 73 70 6f 72 74 3a 63 6c 69 65 6e  -transport:clien
1d70: 74 2d 63 6f 6e 6e 65 63 74 20 28 74 61 73 6b 73  t-connect (tasks
1d80: 3a 68 6f 73 74 69 6e 66 6f 2d 67 65 74 2d 69 6e  :hostinfo-get-in
1d90: 74 65 72 66 61 63 65 20 68 6f 73 74 69 6e 66 6f  terface hostinfo
1da0: 29 0a 09 09 09 09 20 20 20 20 20 28 74 61 73 6b  ).....     (task
1db0: 73 3a 68 6f 73 74 69 6e 66 6f 2d 67 65 74 2d 70  s:hostinfo-get-p
1dc0: 6f 72 74 20 20 20 20 20 20 68 6f 73 74 69 6e 66  ort      hostinf
1dd0: 6f 29 0a 09 09 09 09 20 20 20 20 20 28 74 61 73  o).....     (tas
1de0: 6b 73 3a 68 6f 73 74 69 6e 66 6f 2d 67 65 74 2d  ks:hostinfo-get-
1df0: 70 75 62 70 6f 72 74 20 20 20 68 6f 73 74 69 6e  pubport   hostin
1e00: 66 6f 29 29 29 0a 20 20 20 20 20 20 28 65 6c 73  fo))).      (els
1e10: 65 20 20 3b 3b 20 64 65 66 61 75 6c 74 20 74 6f  e  ;; default to
1e20: 20 66 73 0a 20 20 20 20 20 20 20 28 64 65 62 75   fs.       (debu
1e30: 67 3a 70 72 69 6e 74 20 30 20 22 45 52 52 4f 52  g:print 0 "ERROR
1e40: 3a 20 75 6e 72 65 63 6f 67 6e 69 73 65 64 20 74  : unrecognised t
1e50: 72 61 6e 73 70 6f 72 74 20 74 79 70 65 20 22 20  ransport type " 
1e60: 2a 74 72 61 6e 73 70 6f 72 74 2d 74 79 70 65 2a  *transport-type*
1e70: 20 22 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f   " attempting to
1e80: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 66   continue with f
1e90: 73 22 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  s").       (set!
1ea0: 20 2a 74 72 61 6e 73 70 6f 72 74 2d 74 79 70 65   *transport-type
1eb0: 2a 20 27 66 73 29 0a 20 20 20 20 20 20 20 28 73  * 'fs).       (s
1ec0: 65 74 21 20 2a 6d 65 67 61 74 65 73 74 2d 64 62  et! *megatest-db
1ed0: 2a 20 20 20 20 28 6f 70 65 6e 2d 64 62 29 29 29  *    (open-db)))
1ee0: 29 29 29 0a 0a 0a 3b 3b 20 61 6c 6c 20 72 6f 75  )))...;; all rou
1ef0: 74 65 73 20 74 68 6f 75 67 68 20 68 65 72 65 20  tes though here 
1f00: 65 6e 64 20 69 6e 20 65 78 69 74 20 2e 2e 2e 0a  end in exit ....
1f10: 28 64 65 66 69 6e 65 20 28 73 65 72 76 65 72 3a  (define (server:
1f20: 6c 61 75 6e 63 68 20 74 72 61 6e 73 70 6f 72 74  launch transport
1f30: 29 0a 20 20 28 69 66 20 28 6e 6f 74 20 2a 74 6f  ).  (if (not *to
1f40: 70 70 61 74 68 2a 29 0a 20 20 20 20 20 20 28 69  ppath*).      (i
1f50: 66 20 28 6e 6f 74 20 28 73 65 74 75 70 2d 66 6f  f (not (setup-fo
1f60: 72 2d 72 75 6e 29 29 0a 09 20 20 28 62 65 67 69  r-run))..  (begi
1f70: 6e 0a 09 20 20 20 20 28 64 65 62 75 67 3a 70 72  n..    (debug:pr
1f80: 69 6e 74 20 30 20 22 45 52 52 4f 52 3a 20 63 61  int 0 "ERROR: ca
1f90: 6e 6e 6f 74 20 66 69 6e 64 20 6d 65 67 61 74 65  nnot find megate
1fa0: 73 74 2e 63 6f 6e 66 69 67 2c 20 65 78 69 74 69  st.config, exiti
1fb0: 6e 67 22 29 0a 09 20 20 20 20 28 65 78 69 74 29  ng")..    (exit)
1fc0: 29 29 29 0a 20 20 28 64 65 62 75 67 3a 70 72 69  ))).  (debug:pri
1fd0: 6e 74 2d 69 6e 66 6f 20 32 20 22 53 74 61 72 74  nt-info 2 "Start
1fe0: 69 6e 67 20 73 65 72 76 65 72 20 75 73 69 6e 67  ing server using
1ff0: 20 22 20 74 72 61 6e 73 70 6f 72 74 20 22 20 74   " transport " t
2000: 72 61 6e 73 70 6f 72 74 22 29 0a 20 20 28 73 65  ransport").  (se
2010: 74 21 20 2a 74 72 61 6e 73 70 6f 72 74 2d 74 79  t! *transport-ty
2020: 70 65 2a 20 74 72 61 6e 73 70 6f 72 74 29 0a 20  pe* transport). 
2030: 20 28 63 61 73 65 20 74 72 61 6e 73 70 6f 72 74   (case transport
2040: 0a 20 20 20 20 28 28 66 73 29 20 20 20 28 65 78  .    ((fs)   (ex
2050: 69 74 29 29 20 3b 3b 20 74 68 65 72 65 20 69 73  it)) ;; there is
2060: 20 6e 6f 20 22 66 73 22 20 74 72 61 6e 73 70 6f   no "fs" transpo
2070: 72 74 0a 20 20 20 20 28 28 68 74 74 70 29 20 28  rt.    ((http) (
2080: 68 74 74 70 2d 74 72 61 6e 73 70 6f 72 74 3a 6c  http-transport:l
2090: 61 75 6e 63 68 29 29 0a 20 20 20 20 28 28 7a 6d  aunch)).    ((zm
20a0: 71 29 20 20 28 7a 6d 71 2d 74 72 61 6e 73 70 6f  q)  (zmq-transpo
20b0: 72 74 3a 6c 61 75 6e 63 68 29 29 0a 20 20 20 20  rt:launch)).    
20c0: 28 65 6c 73 65 0a 20 20 20 20 20 28 64 65 62 75  (else.     (debu
20d0: 67 3a 70 72 69 6e 74 20 22 57 41 52 4e 49 4e 47  g:print "WARNING
20e0: 3a 20 75 6e 72 65 63 6f 67 6e 69 73 65 64 20 74  : unrecognised t
20f0: 72 61 6e 73 70 6f 72 74 20 22 20 74 72 61 6e 73  ransport " trans
2100: 70 6f 72 74 29 0a 20 20 20 20 20 28 65 78 69 74  port).     (exit
2110: 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73  ))))..(define (s
2120: 65 72 76 65 72 3a 63 6c 69 65 6e 74 2d 73 69 67  erver:client-sig
2130: 6e 61 6c 2d 68 61 6e 64 6c 65 72 20 73 69 67 6e  nal-handler sign
2140: 75 6d 29 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78  um).  (handle-ex
2150: 63 65 70 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a  ceptions.   exn.
2160: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
2170: 22 20 2e 2e 2e 20 65 78 69 74 69 6e 67 20 2e 2e  " ... exiting ..
2180: 2e 22 29 0a 20 20 20 28 6c 65 74 20 28 28 74 68  .").   (let ((th
2190: 31 20 28 6d 61 6b 65 2d 74 68 72 65 61 64 20 28  1 (make-thread (
21a0: 6c 61 6d 62 64 61 20 28 29 0a 09 09 09 20 20 20  lambda ()....   
21b0: 20 20 22 22 29 20 3b 3b 20 64 6f 20 6e 6f 74 68    "") ;; do noth
21c0: 69 6e 67 20 66 6f 72 20 6e 6f 77 20 28 77 61 73  ing for now (was
21d0: 20 66 6c 75 73 68 20 6f 75 74 20 6c 61 73 74 20   flush out last 
21e0: 63 61 6c 6c 20 69 66 20 61 70 70 6c 69 63 61 62  call if applicab
21f0: 6c 65 29 0a 09 09 09 20 20 20 22 65 61 74 20 72  le)....   "eat r
2200: 65 73 70 6f 6e 73 65 22 29 29 0a 09 20 28 74 68  esponse")).. (th
2210: 32 20 28 6d 61 6b 65 2d 74 68 72 65 61 64 20 28  2 (make-thread (
2220: 6c 61 6d 62 64 61 20 28 29 0a 09 09 09 20 20 20  lambda ()....   
2230: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30    (debug:print 0
2240: 20 22 45 52 52 4f 52 3a 20 52 65 63 65 69 76 65   "ERROR: Receive
2250: 64 20 5e 43 2c 20 61 74 74 65 6d 70 74 69 6e 67  d ^C, attempting
2260: 20 63 6c 65 61 6e 20 65 78 69 74 2e 20 50 6c 65   clean exit. Ple
2270: 61 73 65 20 62 65 20 70 61 74 69 65 6e 74 20 61  ase be patient a
2280: 6e 64 20 77 61 69 74 20 61 20 66 65 77 20 73 65  nd wait a few se
2290: 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 68 69 74  conds before hit
22a0: 74 69 6e 67 20 5e 43 20 61 67 61 69 6e 2e 22 29  ting ^C again.")
22b0: 0a 09 09 09 20 20 20 20 20 28 74 68 72 65 61 64  ....     (thread
22c0: 2d 73 6c 65 65 70 21 20 31 29 20 3b 3b 20 67 69  -sleep! 1) ;; gi
22d0: 76 65 20 74 68 65 20 66 6c 75 73 68 20 6f 6e 65  ve the flush one
22e0: 20 73 65 63 6f 6e 64 20 74 6f 20 64 6f 20 69 74   second to do it
22f0: 27 73 20 73 74 75 66 66 0a 09 09 09 20 20 20 20  's stuff....    
2300: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20   (debug:print 0 
2310: 22 20 20 20 20 20 20 20 44 6f 6e 65 2e 22 29 0a  "       Done.").
2320: 09 09 09 20 20 20 20 20 28 65 78 69 74 20 34 29  ...     (exit 4)
2330: 29 0a 09 09 09 20 20 20 22 65 78 69 74 20 6f 6e  )....   "exit on
2340: 20 5e 43 20 74 69 6d 65 72 22 29 29 29 0a 20 20   ^C timer"))).  
2350: 20 20 20 28 74 68 72 65 61 64 2d 73 74 61 72 74     (thread-start
2360: 21 20 74 68 32 29 0a 20 20 20 20 20 28 74 68 72  ! th2).     (thr
2370: 65 61 64 2d 73 74 61 72 74 21 20 74 68 31 29 0a  ead-start! th1).
2380: 20 20 20 20 20 28 74 68 72 65 61 64 2d 6a 6f 69       (thread-joi
2390: 6e 21 20 74 68 32 29 29 29 29 0a 0a 28 64 65 66  n! th2))))..(def
23a0: 69 6e 65 20 28 73 65 72 76 65 72 3a 63 6c 69 65  ine (server:clie
23b0: 6e 74 2d 6c 61 75 6e 63 68 29 0a 20 20 28 73 65  nt-launch).  (se
23c0: 74 2d 73 69 67 6e 61 6c 2d 68 61 6e 64 6c 65 72  t-signal-handler
23d0: 21 20 73 69 67 6e 61 6c 2f 69 6e 74 20 73 65 72  ! signal/int ser
23e0: 76 65 72 3a 63 6c 69 65 6e 74 2d 73 69 67 6e 61  ver:client-signa
23f0: 6c 2d 68 61 6e 64 6c 65 72 29 0a 20 20 20 28 69  l-handler).   (i
2400: 66 20 28 73 65 72 76 65 72 3a 63 6c 69 65 6e 74  f (server:client
2410: 2d 73 65 74 75 70 29 0a 20 20 20 20 20 20 20 28  -setup).       (
2420: 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f  debug:print-info
2430: 20 32 20 22 63 6f 6e 6e 65 63 74 65 64 20 61 73   2 "connected as
2440: 20 63 6c 69 65 6e 74 22 29 0a 20 20 20 20 20 20   client").      
2450: 20 28 62 65 67 69 6e 0a 09 20 28 64 65 62 75 67   (begin.. (debug
2460: 3a 70 72 69 6e 74 20 30 20 22 45 52 52 4f 52 3a  :print 0 "ERROR:
2470: 20 46 61 69 6c 65 64 20 74 6f 20 63 6f 6e 6e 65   Failed to conne
2480: 63 74 20 61 73 20 63 6c 69 65 6e 74 22 29 0a 09  ct as client")..
2490: 20 28 65 78 69 74 29 29 29 29 0a 0a               (exit))))..