1 ! Copyright (C) 2021 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs calendar combinators
4 continuations destructors io io.encodings.string
5 io.encodings.utf8 io.files.info io.sockets io.streams.string
6 kernel layouts make parser prettyprint prettyprint.config
7 sequences splitting system system-info threads ;
10 TUPLE: broadcast-server < disposable
18 : <broadcast-server> ( broadcast-ip port -- obj )
19 broadcast-server new-disposable
20 over f swap <inet4> >>receive-inet4
21 -rot <inet4> >>broadcast-inet4
22 H{ } clone >>received ; inline
24 M: broadcast-server dispose*
25 [ receive-socket>> dispose ]
26 [ broadcast-socket>> dispose ] bi ;
28 : broadcast-server-send ( bytes type broadcast-server -- )
29 [ 2array unparse utf8 encode ] dip
30 [ broadcast-inet4>> ] [ broadcast-socket>> ] bi send ;
32 SINGLETONS: command data ;
34 : send-broadcast-command ( str server -- )
35 [ command ] dip broadcast-server-send ;
37 : send-broadcast-data ( str server -- )
38 [ data ] dip broadcast-server-send ;
40 : run-command ( string -- out )
41 [ parse-lines [ [ call( -- ) ] with-string-writer ] without-limits ]
44 : handle-data ( data inet4 broadcast-server -- )
45 [ received>> push-at ]
52 { command [ run-command swap send-broadcast-data ] }
53 [ unparse "unknown command: " prepend print 2drop ]
58 : receive-loop ( broadcast-server -- )
61 _ dup should-stop?>> [
65 receive-socket>> receive
66 [ utf8 decode split-lines parse-lines ] dip
72 : payload ( -- byte-array )
74 computer-name "computer-name" ,,
76 os-version "os-version" ,,
78 cell-bits "cell-bits" ,,
79 username "username" ,,
83 version-info "version-info" ,,
85 vm-path file-info size>> "vm-size" ,,
86 image-path "image-path" ,,
87 image-path file-info size>> "image-size" ,,
91 physical-mem "physical-mem" ,,
92 vm-path file-system-info
93 [ total-space>> "disk-total-size" ,, ]
94 [ free-space>> "disk-free-size" ,, ] bi
97 : send-loop ( broadcast-server -- )
100 _ dup should-stop?>> [
103 payload data rot broadcast-server-send t
109 : start-broadcast-server ( ip port -- obj )
112 dup receive-inet4>> <datagram> |dispose >>receive-socket
113 dup broadcast-inet4>> <any-port-local-broadcast> |dispose >>broadcast-socket
119 ! "192.168.88.255" 7777 start-broadcast-server
120 ! "USE: math 2 2 + ." over send-broadcast-command