32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
portlogger:set-port
portlogger:release-port
portlogger:set-failed
portlogger:is-port-in-use
portlogger:main
)
(import scheme posix chicken data-structures)
(require-extension (srfi 18) extras tcp s11n)
(import srfi-1 posix srfi-69 hostinfo dot-locking z3 regex)
(import (prefix sqlite3 sqlite3:))
(import (prefix mtconfigf configf:))
;; lsof -i
(define *configdat* #f)
(define (portlogger:set-configdat! cfgdat)
(set! *configdat* cfgdat))
(define (debug:print . params)
(apply print params))
(define debug:print-error debug:print)
(define (portlogger:set-printers! pdebug pdebugerr)
(set! debug:print pdebug)
(set! debug:print-error pdebugerr))
(define *default-log-port* (current-error-port))
(define (portlogger:set-default-log-port! port)
(set! *default-log-port* port))
(define (portlogger:open-db fname)
(let* ((avail #t) ;; for now - assume wait on journal not needed (tasks:wait-on-journal fname 5 remove: #t)) ;; wait up to about 10 seconds for the journal to go away
(exists (file-exists? fname))
(db (if avail
(sqlite3:open-database fname)
(begin
(system (conc "rm -f " fname))
(sqlite3:open-database fname))))
(handler (sqlite3:make-busy-timeout 136000))
(canwrite (file-write-access? fname)))
(sqlite3:set-busy-handler! db handler)
(sqlite3:execute db "PRAGMA synchronous = 0;")
(sqlite3:execute
db
"CREATE TABLE IF NOT EXISTS ports (
port INTEGER PRIMARY KEY,
state TEXT DEFAULT 'not-used',
fail_count INTEGER DEFAULT 0,
update_time TIMESTAMP DEFAULT (strftime('%s','now')) );")
db))
|
|
|
|
|
|
>
>
|
>
>
<
|
|
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
portlogger:set-port
portlogger:release-port
portlogger:set-failed
portlogger:is-port-in-use
portlogger:main
)
(import scheme posix chicken data-structures ports)
(require-extension (srfi 18) extras tcp s11n)
(use srfi-1 posix srfi-69 hostinfo dot-locking z3 regex)
(use (prefix sqlite3 sqlite3:))
(use (prefix mtconfigf configf:))
;; lsof -i
(define *configdat* #f)
(define (portlogger:set-configdat! cfgdat)
(set! *configdat* cfgdat))
(define (debug:print level port . params)
(with-output-to-port
port
(lambda ()(apply print params))))
(define debug:print-error debug:print)
(define *default-log-port* (current-error-port))
(define (portlogger:set-printers! pdebug pdebugerr)
(set! debug:print pdebug)
(set! debug:print-error pdebugerr))
(define (portlogger:set-default-log-port! port)
(set! *default-log-port* port))
(define (portlogger:open-db fname)
(let* ((avail #t) ;; for now - assume wait on journal not needed (tasks:wait-on-journal fname 5 remove: #t)) ;; wait up to about 10 seconds for the journal to go away
(exists (file-exists? fname))
(db (if avail
(sqlite3:open-database fname)
(begin
(system (conc "rm -f " fname))
(sqlite3:open-database fname))))
(handler (sqlite3:make-busy-timeout 136000))
(canwrite (file-write-access? fname)))
(sqlite3:set-busy-handler! db handler)
(sqlite3:execute db "PRAGMA synchronous = 0;")
(sqlite3:execute
db
"CREATE TABLE IF NOT EXISTS ports (
port INTEGER PRIMARY KEY,
state TEXT DEFAULT 'not-used',
fail_count INTEGER DEFAULT 0,
update_time TIMESTAMP DEFAULT (strftime('%s','now')) );")
db))
|
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
;;
(define (portlogger:is-port-in-use port-num)
(let-values (((inp oup pid)
(process "netstat" (list "-tulpn" ))))
(let loop ((inl (read-line inp)))
(if (not (eof-object? inl))
(begin
(if (string-search (regexp (conc ":" port-num)) inl)
#t
(loop (read-line inp))))))))
;;======================================================================
;; MAIN
;;======================================================================
|
|
|
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
;;
(define (portlogger:is-port-in-use port-num)
(let-values (((inp oup pid)
(process "netstat" (list "-tulpn" ))))
(let loop ((inl (read-line inp)))
(if (not (eof-object? inl))
(begin
(if (string-search (regexp (conc ":" port-num "\\s+")) inl)
#t
(loop (read-line inp))))))))
;;======================================================================
;; MAIN
;;======================================================================
|
222
223
224
225
226
227
228
229
230
231
232
233
234
|
((find)(portlogger:find-port db))
((set) (let ((port (cadr args))
(state (caddr args)))
(portlogger:set-port db
(if (number? port) port (string->number port))
state)
state))
((failed)(portlogger:set-failed db (string->number (cadr args))) 'failed)))))
(sqlite3:finalize! db)
result))
;; (print (apply portlogger:main (cdr (argv))))
)
|
|
>
|
225
226
227
228
229
230
231
232
233
234
235
236
237
238
|
((find)(portlogger:find-port db))
((set) (let ((port (cadr args))
(state (caddr args)))
(portlogger:set-port db
(if (number? port) port (string->number port))
state)
state))
((failed)(portlogger:set-failed db (string->number (cadr args))) 'failed)
(else "nosuchcommand")))))
(sqlite3:finalize! db)
result))
;; (print (apply portlogger:main (cdr (argv))))
)
|