1
0
mirror of https://github.com/kepler155c/opus synced 2024-11-05 08:26:16 +00:00
opus/sys/apps/Network.lua

253 lines
5.9 KiB
Lua
Raw Normal View History

2018-01-21 10:44:13 +00:00
_G.requireInjector(_ENV)
2018-12-05 02:16:48 +00:00
local Config = require('config')
local Event = require('event')
2016-12-11 19:24:52 +00:00
local Socket = require('socket')
local UI = require('ui')
local Util = require('util')
2016-12-11 19:24:52 +00:00
2017-10-08 21:45:01 +00:00
local colors = _G.colors
local device = _G.device
local multishell = _ENV.multishell
local network = _G.network
2017-10-11 20:31:48 +00:00
local os = _G.os
2017-10-08 21:45:01 +00:00
local shell = _ENV.shell
2016-12-11 19:24:52 +00:00
UI:configure('Network', ...)
local gridColumns = {
2018-01-24 22:39:38 +00:00
{ heading = 'Label', key = 'label' },
{ heading = 'Dist', key = 'distance' },
{ heading = 'Status', key = 'status' },
2016-12-11 19:24:52 +00:00
}
2018-12-05 02:16:48 +00:00
local trusted = Util.readTable('usr/.known_hosts')
local config = Config.load('network', { })
2016-12-11 19:24:52 +00:00
if UI.term.width >= 30 then
2018-01-24 22:39:38 +00:00
table.insert(gridColumns, { heading = 'Fuel', key = 'fuel', width = 5 })
table.insert(gridColumns, { heading = 'Uptime', key = 'uptime' })
2016-12-11 19:24:52 +00:00
end
2016-12-27 21:01:06 +00:00
local page = UI.Page {
2018-01-24 22:39:38 +00:00
menuBar = UI.MenuBar {
buttons = {
{ text = 'Connect', dropdown = {
{ text = 'Telnet t', event = 'telnet' },
{ text = 'VNC v', event = 'vnc' },
UI.MenuBar.spacer,
{ text = 'Reboot r', event = 'reboot' },
} },
--{ text = 'Chat', event = 'chat' },
{ text = 'Trust', dropdown = {
{ text = 'Establish', event = 'trust' },
{ text = 'Remove', event = 'untrust' },
} },
2018-12-06 02:21:30 +00:00
{ text = 'Help', event = 'help', noCheck = true },
2018-12-05 02:16:48 +00:00
{
2019-01-05 15:35:25 +00:00
text = '\187',
2018-12-05 02:16:48 +00:00
x = -3,
dropdown = {
2018-12-06 02:21:30 +00:00
{ text = 'Show all', event = 'show_all', noCheck = true },
2018-12-05 02:16:48 +00:00
UI.MenuBar.spacer,
2018-12-06 02:21:30 +00:00
{ text = 'Show trusted', event = 'show_trusted', noCheck = true },
2018-12-05 02:16:48 +00:00
},
},
2018-01-24 22:39:38 +00:00
},
},
grid = UI.ScrollingGrid {
y = 2,
values = network,
columns = gridColumns,
sortColumn = 'label',
autospace = true,
},
notification = UI.Notification { },
accelerators = {
t = 'telnet',
v = 'vnc',
r = 'reboot',
q = 'quit',
c = 'clear',
},
2016-12-27 21:01:06 +00:00
}
2016-12-11 19:24:52 +00:00
2017-05-14 01:05:05 +00:00
local function sendCommand(host, command)
2018-01-24 22:39:38 +00:00
if not device.wireless_modem then
page.notification:error('Wireless modem not present')
return
end
page.notification:info('Connecting')
page:sync()
local socket = Socket.connect(host, 161)
if socket then
socket:write({ type = command })
socket:close()
page.notification:success('Command sent')
else
page.notification:error('Failed to connect')
end
2016-12-11 19:24:52 +00:00
end
function page:eventHandler(event)
2018-01-24 22:39:38 +00:00
local t = self.grid:getSelected()
if t then
if event.type == 'telnet' then
multishell.openTab({
path = 'sys/apps/telnet.lua',
focused = true,
args = { t.id },
title = t.label,
})
elseif event.type == 'vnc' then
multishell.openTab({
path = 'sys/apps/vnc.lua',
focused = true,
args = { t.id },
title = t.label,
})
2018-12-10 15:33:56 +00:00
os.queueEvent('overview_shortcut', {
title = t.label,
category = "VNC",
icon = "\
\031e\\\031 \031e/\031dn\
\031e\\/\031 \0319c",
run = "vnc.lua " .. t.id,
})
2018-01-24 22:39:38 +00:00
elseif event.type == 'clear' then
Util.clear(network)
page.grid:update()
page.grid:draw()
elseif event.type == 'trust' then
shell.openForegroundTab('trust ' .. t.id)
elseif event.type == 'untrust' then
local trustList = Util.readTable('usr/.known_hosts') or { }
trustList[t.id] = nil
Util.writeTable('usr/.known_hosts', trustList)
elseif event.type == 'chat' then
multishell.openTab({
path = 'sys/apps/shell',
args = { 'chat join opusChat-' .. t.id .. ' guest-' .. os.getComputerID() },
title = 'Chatroom',
focused = true,
})
elseif event.type == 'reboot' then
sendCommand(t.id, 'reboot')
elseif event.type == 'shutdown' then
sendCommand(t.id, 'shutdown')
end
end
if event.type == 'help' then
UI:setPage(UI.Dialog {
title = 'Network Help',
height = 10,
backgroundColor = colors.white,
text = UI.TextArea {
x = 2, y = 2,
backgroundColor = colors.white,
value = [[
2017-10-09 17:08:38 +00:00
In order to connect to another computer:
2018-01-24 22:39:38 +00:00
1. The target computer must have a password set (run 'password' from the shell prompt).
2. From this computer, click trust and enter the password for that computer.
2017-10-09 17:08:38 +00:00
This only needs to be done once.
2018-01-24 22:39:38 +00:00
]],
},
accelerators = {
q = 'cancel',
}
})
2018-12-05 02:16:48 +00:00
elseif event.type == 'show_all' then
config.showTrusted = false
2018-12-06 02:21:30 +00:00
self.grid:setValues(network)
2018-12-05 02:16:48 +00:00
Config.update('network', config)
elseif event.type == 'show_trusted' then
config.showTrusted = true
Config.update('network', config)
2018-01-24 22:39:38 +00:00
elseif event.type == 'quit' then
Event.exitPullEvents()
end
UI.Page.eventHandler(self, event)
2016-12-11 19:24:52 +00:00
end
2017-10-09 17:08:38 +00:00
function page.menuBar:getActive(menuItem)
2018-01-24 22:39:38 +00:00
local t = page.grid:getSelected()
if menuItem.event == 'untrust' then
local trustList = Util.readTable('usr/.known_hosts') or { }
return t and trustList[t.id]
end
2018-12-06 02:21:30 +00:00
return menuItem.noCheck or not not t
2017-10-09 17:08:38 +00:00
end
2016-12-11 19:24:52 +00:00
function page.grid:getRowTextColor(row, selected)
2018-01-24 22:39:38 +00:00
if not row.active then
return colors.orange
end
return UI.Grid.getRowTextColor(self, row, selected)
2016-12-11 19:24:52 +00:00
end
function page.grid:getDisplayValues(row)
2018-01-24 22:39:38 +00:00
row = Util.shallowCopy(row)
if row.uptime then
if row.uptime < 60 then
row.uptime = string.format("%ds", math.floor(row.uptime))
else
row.uptime = string.format("%sm", math.floor(row.uptime/6)/10)
end
end
if row.fuel then
2018-12-21 00:28:26 +00:00
row.fuel = row.fuel > 0 and Util.toBytes(row.fuel) or ''
2018-01-24 22:39:38 +00:00
end
if row.distance then
row.distance = Util.round(row.distance, 1)
end
return row
2016-12-11 19:24:52 +00:00
end
2017-07-24 02:37:07 +00:00
Event.onInterval(1, function()
2018-12-05 02:16:48 +00:00
local t = { }
if config.showTrusted then
for k,v in pairs(network) do
if trusted[k] then
t[k] = v
end
end
page.grid:setValues(t)
else
page.grid:update()
end
2018-01-24 22:39:38 +00:00
page.grid:draw()
page:sync()
2016-12-27 03:26:43 +00:00
end)
2016-12-11 19:24:52 +00:00
2017-10-08 21:45:01 +00:00
Event.on('device_attach', function(_, deviceName)
2018-01-24 22:39:38 +00:00
if deviceName == 'wireless_modem' then
page.notification:success('Modem connected')
page:sync()
end
2016-12-11 19:24:52 +00:00
end)
2017-10-08 21:45:01 +00:00
Event.on('device_detach', function(_, deviceName)
2018-01-24 22:39:38 +00:00
if deviceName == 'wireless_modem' then
page.notification:error('Wireless modem not attached')
page:sync()
end
2016-12-11 19:24:52 +00:00
end)
if not device.wireless_modem then
2018-01-24 22:39:38 +00:00
page.notification:error('Wireless modem not attached')
2016-12-11 19:24:52 +00:00
end
UI:setPage(page)
2017-07-28 23:01:59 +00:00
UI:pullEvents()