Added Bi-renderers for byte fields in hub lists.
[doldaconnect.git] / lib / guile / hubmgr
CommitLineData
6b081952 1#!/usr/bin/guile -s
2!#
3
4(use-modules (dolcon ui) (dolcon util))
5(use-modules (ice-9 format))
6
7(define max-hubs 6)
8(define hub-list '())
9(define hl-file (string-append (getenv "HOME") "/.hublist"))
10(define hublist '())
11(define connlist '())
12(define statelist '())
13
14(define (logf . args)
15 (let ((fmt (car args)) (args (cdr args)))
16 (apply format (cons* #t (string-append fmt "~%") args))))
17
18(define (list-delta l1 l2)
19 (let ((r1 '()) (r2 '()))
20 (for-each (lambda (o1)
21 (catch 'found
22 (lambda ()
23 (for-each (lambda (o2)
24 (if (equal? o1 o2) (throw 'found o2)))
25 l2)
26 (set! r2 (cons o1 r2)))
27 (lambda (sig ret)
28 (set! r1 (cons (cons o1 ret) r1))
29 (set! l2 (delq ret l2)))))
30 l1)
31 (list r1 r2 l2)))
32
33(define (read-hl)
34 (catch 'system-error
35 (lambda ()
36 (let ((p (open-input-file hl-file)))
37 (catch 'eof
38 (lambda ()
39 (let ((lines '()))
40 (while #t
41 (let ((line (read-line p)))
42 (if (eof-object? line)
43 (throw 'eof lines)
44 (let ((lexed (dc-lexsexpr line)))
45 (if (> (length lexed) 0)
46 (set! lines (append lines (list lexed))))))))))
47 (lambda (s a) (close-port p) a))))
48 (lambda (key . args)
49 '())))
50
51(define (cklist)
52 (set! statelist (let ((nl '()) (ct (current-time)))
53 (for-each (lambda (o)
54 (if (< ct (+ (cadr o) (caddr o)))
55 (set! nl (cons o nl))))
56 statelist)
57 nl))
58 (for-each (lambda (o)
59 (if (and (not (assq o connlist))
60 (not (assq o statelist)))
61 (begin (logf "connecting to ~a" (cadr o))
62 (set! connlist (cons (cons o 'pend) connlist))
63 (dc-qcmd (list* "cnct" o)
64 (let ((hub o))
65 (lambda (resp)
66 (let ((er (dc-extract resp)) (ir (dc-intresp resp)))
67 (if (= (cdr (assq 'code er)) 200)
68 (begin (set-cdr! (assq hub connlist) (car ir))
69 (logf "~a state syn (~a)" (cadr hub) (car ir)))
70 (begin (set! connlist (delq (assq hub connlist) connlist))
71 (logf "~a failed (~a)" (cadr hub) (cdr (assq 'code er))))))))))))
72 hublist))
73
74(define (hubmgr-main args)
75 (let ((dc-server #f))
76 (if (not dc-server) (set! dc-server (getenv "DCSERVER")))
77 (if (not dc-server) (set! dc-server "localhost"))
78
79 (set! hublist (read-hl))
80 (logf "read ~a hubs" (length hublist))
81 (dc-c&l #t dc-server #t)
82 (dc-ecmd-assert 200 "notify" "fn:act" "on")
83 (dc-handle-fn)
84 (dc-fnproc-reg 'state (lambda (fn)
2a156d4f 85 (if (and (eq? (cdr (assq 'state fn)) 'dead)
86 (assq (cdr (assq 'id fn)) (map (lambda (o) (cons (cdr o) (car o))) connlist)))
6b081952 87 (begin (logf "~a died" (cdr (assq 'id fn)))
88 (dc-qcmd (list "dcnct" (cdr (assq 'id fn))))))
89 (cklist)))
90 (dc-fnproc-reg 'dstr (lambda (fn)
91 (let ((clf (assq (cdr (assq 'id fn)) (map (lambda (o) (cons (cdr o) (car o))) connlist))))
92 (if clf
93 (let ((hlf (cdr clf)))
94 (logf "~a disappeared" (cadr hlf))
95 (set! connlist (delq (assq hlf connlist) connlist))
96 (set! statelist (cons (list hlf (current-time) 10) statelist)))))
97 (cklist)))
98 (dc-loop-reg ".periodic" #f cklist)
99
100 (cklist)
101 (dc-loop)))
102
103(setlocale LC_ALL "")
104(hubmgr-main (command-line))