1 ! Copyright (C) 2021 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs calendar combinators
4 combinators.extras continuations destructors io
5 io.encodings.string io.encodings.utf8 io.files.info io.sockets
6 io.streams.string kernel layouts make parser prettyprint
7 prettyprint.config sequences splitting system system-info
11 TUPLE: broadcast-server < disposable
19 : <broadcast-server> ( broadcast-ip port -- obj )
20 broadcast-server new-disposable
21 over f swap <inet4> >>receive-inet4
22 -rot <inet4> >>broadcast-inet4
23 H{ } clone >>received ; inline
25 M: broadcast-server dispose*
26 [ receive-socket>> dispose ]
27 [ broadcast-socket>> dispose ] bi ;
29 : broadcast-server-send ( bytes type broadcast-server -- )
30 [ 2array unparse utf8 encode ] dip
31 [ broadcast-inet4>> ] [ broadcast-socket>> ] bi send ;
33 SINGLETONS: command data ;
35 : send-broadcast-command ( str server -- )
36 [ command ] dip broadcast-server-send ;
38 : send-broadcast-data ( str server -- )
39 [ data ] dip broadcast-server-send ;
41 : run-command ( string -- out )
42 [ parse-lines [ [ call( -- ) ] with-string-writer ] without-limits ]
45 : handle-data ( data inet4 broadcast-server -- )
46 [ received>> push-at ]
53 { command [ run-command swap send-broadcast-data ] }
54 [ unparse "unknown command: " prepend print 2drop ]
59 : receive-loop ( broadcast-server -- )
62 _ dup should-stop?>> [
66 receive-socket>> receive
67 [ utf8 decode "\n" split parse-lines ] dip
73 : payload ( -- byte-array )
75 computer-name "computer-name" ,,
77 os-version "os-version" ,,
79 cell-bits "cell-bits" ,,
80 username "username" ,,
84 version-info "version-info" ,,
86 vm-path file-info size>> "vm-size" ,,
87 image-path "image-path" ,,
88 image-path file-info size>> "image-size" ,,
92 physical-mem "physical-mem" ,,
93 vm-path file-system-info
94 [ total-space>> "disk-total-size" ,, ]
95 [ free-space>> "disk-free-size" ,, ] bi
98 : send-loop ( broadcast-server -- )
101 _ dup should-stop?>> [
104 payload data rot broadcast-server-send t
110 : start-broadcast-server ( ip port -- obj )
113 dup receive-inet4>> <datagram> |dispose >>receive-socket
114 dup broadcast-inet4>> <any-port-local-broadcast> |dispose >>broadcast-socket
120 ! "192.168.88.255" 7777 start-broadcast-server
121 ! "USE: math 2 2 + ." over send-broadcast-command