150 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Lua
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Lua
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/lua
 | 
						|
 | 
						|
local uci = require('simple-uci').cursor()
 | 
						|
local site = require 'gluon.site'
 | 
						|
local util = require 'gluon.util'
 | 
						|
local wireless = require 'gluon.wireless'
 | 
						|
local sysconfig = require 'gluon.sysconfig'
 | 
						|
local util = require 'gluon.util'
 | 
						|
local olsrd = require 'gluon.olsrd'
 | 
						|
 | 
						|
-- Utils
 | 
						|
 | 
						|
function printf(...)
 | 
						|
	print(string.format(...))
 | 
						|
end
 | 
						|
 | 
						|
-- Print contents of `tbl`, with indentation.
 | 
						|
-- `indent` sets the initial level of indentation.
 | 
						|
-- src https://gist.github.com/xytis/5361405
 | 
						|
function tprint (tbl, indent)
 | 
						|
  if not indent then indent = 0 end
 | 
						|
  for k, v in pairs(tbl) do
 | 
						|
    formatting = string.rep('  ', indent) .. k .. ': '
 | 
						|
    if type(v) == 'table' then
 | 
						|
      print(formatting)
 | 
						|
      tprint(v, indent + 1)
 | 
						|
    else
 | 
						|
      print(formatting .. tostring(v))
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
-- src https://stackoverflow.com/a/24823383/3990041
 | 
						|
function table.slice(tbl, first, last, step)
 | 
						|
  local sliced = {}
 | 
						|
 | 
						|
  for i = first or 1, last or #tbl, step or 1 do
 | 
						|
    sliced[#sliced+1] = tbl[i]
 | 
						|
  end
 | 
						|
 | 
						|
  return sliced
 | 
						|
end
 | 
						|
 | 
						|
-- CLI lib
 | 
						|
 | 
						|
function exec_cmd(args, sub)
 | 
						|
	if sub[args[1]] == nil then
 | 
						|
		return cmd_err('does not exist')
 | 
						|
	else
 | 
						|
		local cmd = sub[args[1]]
 | 
						|
		if cmd[3] ~= nil and #args > 1 then
 | 
						|
			exec_cmd(table.slice(args, 2), cmd[3])
 | 
						|
		else
 | 
						|
			cmd[1](unpack(table.slice(args, 2)))
 | 
						|
		end
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
function list_cmd(level, sub)
 | 
						|
	for key, cmd in pairs(sub) do
 | 
						|
		printf('%s%s: %s', string.rep('  ', level), key, cmd[2])
 | 
						|
		if cmd[3] ~= nil then
 | 
						|
			list_cmd(level + 1, cmd[3])
 | 
						|
		end
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
function show_help()
 | 
						|
	printf('Usage: %s <command>', arg[0])
 | 
						|
	list_cmd(1, sub)
 | 
						|
end
 | 
						|
 | 
						|
function cmd_err(msg, no_show_help)
 | 
						|
	-- since argv0 is at... well... 0... even though this is lua...
 | 
						|
	--- ...slice just returns arg without argv0 as the for starts at 1
 | 
						|
	printf('Error: Command "%s" %s', table.concat(table.slice(arg), ' '), msg)
 | 
						|
	if not no_show_help then
 | 
						|
		printf('')
 | 
						|
		show_help()
 | 
						|
	end
 | 
						|
	os.exit(2)
 | 
						|
end
 | 
						|
 | 
						|
function dummy()
 | 
						|
	cmd_err('requires a subcommand')
 | 
						|
end
 | 
						|
 | 
						|
-- our stuff
 | 
						|
 | 
						|
function show_info()
 | 
						|
	local info = olsrd.oi()
 | 
						|
	tprint(info)
 | 
						|
end
 | 
						|
 | 
						|
function olsr1_nodeinfo(...)
 | 
						|
	if #{ ... } == 0 then
 | 
						|
		return cmd_err('requires at least one argument (example: "all")', true)
 | 
						|
	end
 | 
						|
 | 
						|
	local query = table.concat({ ... }, '/')
 | 
						|
	local res = olsrd.olsr1_get_nodeinfo(query)
 | 
						|
	tprint(res)
 | 
						|
end
 | 
						|
 | 
						|
function olsr2_nodeinfo_raw(...)
 | 
						|
	if #{ ... } == 0 then
 | 
						|
		return cmd_err('requires at least one argument (example: "nhdpinfo link")', true)
 | 
						|
	end
 | 
						|
 | 
						|
	local query = table.concat({ ... }, ' ')
 | 
						|
	local res = olsrd.olsr2_get_nodeinfo_raw(query)
 | 
						|
	print(res)
 | 
						|
end
 | 
						|
 | 
						|
function olsr2_nodeinfo_json(...)
 | 
						|
	if #{ ... } == 0 then
 | 
						|
		return cmd_err('requires at least one argument (example: "nhdpinfo jsonraw link")', true)
 | 
						|
	end
 | 
						|
 | 
						|
	local query = table.concat({ ... }, ' ')
 | 
						|
	local res = olsrd.olsr2_get_nodeinfo(query)
 | 
						|
	tprint(res)
 | 
						|
end
 | 
						|
 | 
						|
function olsr1_neigh()
 | 
						|
	return olsr1_nodeinfo('links')
 | 
						|
end
 | 
						|
 | 
						|
function olsr2_neigh()
 | 
						|
	return olsr2_nodeinfo_json('nhdpinfo jsonraw link')
 | 
						|
end
 | 
						|
 | 
						|
sub = {
 | 
						|
	info = { show_info, 'Show information about status of olsr1 and olsr2' },
 | 
						|
	help = { show_help, 'Show help' },
 | 
						|
	olsr1 = { dummy, 'OLSRv1 Control Commands', {
 | 
						|
		nodeinfo = { olsr1_nodeinfo, 'OLSRv1 Nodeinfo' },
 | 
						|
		neigh = { olsr1_neigh, 'OLSRv1 Neighbour List' },
 | 
						|
	}	},
 | 
						|
	olsr2 = { dummy, 'OLSRv2 Control Commands', {
 | 
						|
		nodeinfo = { dummy, 'OLSRv2 Nodeinfo', {
 | 
						|
			raw = { olsr2_nodeinfo_raw, 'OLSRv2 Nodeinfo Raw' },
 | 
						|
			json = { olsr2_nodeinfo_json, 'OLSRv2 Nodeinfo JSON' }
 | 
						|
		} },
 | 
						|
		neigh = { olsr2_neigh, 'OLSRv2 Neighbour List' },
 | 
						|
	}	}
 | 
						|
}
 | 
						|
 | 
						|
exec_cmd(table.slice(arg), sub)
 |