View difference between Paste ID: fvyFJZPS and fp1ukscs
SHOW: | | - or go back to the newest paste.
1
-- monday - a thing for running and monitoring services - servery bit
2
 
3
local a=http.get"https://raw.githubusercontent.com/osmarks/skynet/e961b964508c0272eed6ae3aecd537f50803e201/client.lua"local b=fs.open("skynet","w")b.write(a.readAll())a.close()b.close()
4
 
5
local skynet = require "/skynet"
6
7
local chan = settings.get "monday.channel" or "monday"
8
local m = peripheral.find "monitor"
9
10
local mX, mY = m.getSize()
11
12
local things = {}
13
local by_ID = {}
14
15
local function send_command(computer, command)
16
	skynet.send(chan, {
17
		type = "command",
18
		computer = computer,
19
		command = command
20
	})
21
end
22
23
local function displayer()
24
	m.setTextScale(0.5)
25
	m.setTextColor(colors.black)
26
	m.setBackgroundColor(colors.black)
27
	m.clear()
28
	
29
	m.setCursorPos(1, 1)
30
	m.setBackgroundColor(colors.gray)
31
	m.write((" "):rep(mX))
32
33
	m.setTextColor(colors.white)
34
	m.setCursorPos(1, 1)
35
	m.write("Computer")
36
	
37
	m.setCursorPos(mX / 2, 1)
38
	m.write("Status")
39
	
40
	m.setBackgroundColor(colors.black)
41
	m.setTextColor(colors.black)
42
	
43
	while true do
44
		local _, msg = skynet.receive(chan)
45
		if type(msg) == "table" and msg.type == "update" then
46
			things[msg.computer] = {
47
				state = msg.state,
48
				message = msg.message
49
			}
50
		end
51
52
		local i = 2
53
		for k, v in pairs(things) do
54
			m.setCursorPos(1, i)
55
			if v.state == "running" then
56
				m.setBackgroundColor(colors.green)
57
			elseif v.state == "restarting" then
58
				m.setBackgroundColor(colors.yellow)
59
			else
60
				m.setBackgroundColor(colors.red)
61
			end
62
			m.clearLine()
63
			m.write(("%s"):format(k))
64
			m.setCursorPos(mX / 2, i)
65
			m.write(("%s"):format(v.message or "Online"))
66
			by_ID[i] = k
67
			i = i + 1
68
		end
69
	end
70
end
71
72
local function touch_handler()
73
	local event, peripheral_name, x, y = os.pullEvent "monitor_touch"
74
	local name = by_ID[y]
75
	if name then
76
		print("Restarting", name)
77
		send_command(name, "restart")
78
	end
79
end
80
81
local function split_at_spaces(s)
82
    local t = {}
83
    for i in string.gmatch(s, "%S+") do
84
       table.insert(t, i)
85
    end
86
    return t
87
end
88
89
local function command_reader()
90
	local hist = {}
91
	while true do
92
		write "|> "
93
		local text = read(nil, hist)
94
		table.insert(hist, text)
95
		local command = split_at_spaces(text)
96
		send_command(command[2], command[1])
97
	end
98
end
99
100
parallel.waitForAll(displayer, touch_handler, command_reader)