Developing lightweight computation at the DSG edge

qmpinfo.lua 5.7 KB
Newer Older
1
#!/usr/bin/lua
2
--[[
3
    Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

    The full GNU General Public License is included in this distribution in
    the file called "COPYING".
--]]
22
23

iwinfo = require "iwinfo"
24
25
util = require "luci.util"
sys = require "luci.sys"
26
27

qmpinfo = {}
p4u's avatar
p4u committed
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
local i,d

function qmpinfo.get_devices()

	ethernet_interfaces = { 'eth' }
	wireless_interfaces = { 'ath', 'wlan' }

	local eth_int = {}
	for i,d in ipairs(sys.net.devices()) do
		for i,r in ipairs(ethernet_interfaces) do
			if string.find(d,r) ~= nil then
				if string.find(d,"%.") == nil  then
					table.insert(eth_int,d)
				end
			end
		end
	end

	local wl_int = {}
	for i,d in ipairs(luci.sys.net.devices()) do
		for i,r in ipairs(wireless_interfaces) do
			if string.find(d,r) ~= nil then
				if string.find(d,"%.") == nil  then
					table.insert(wl_int,d)
				end
			end
		end
	end

	return {eth_int,wl_int}

end
60
61

function qmpinfo.get_modes(dev)
62
	local modes = {}
63
	local iw = iwinfo[iwinfo.type(dev)]
64
65
	if iw ~= nil then modes = iw.hwmodelist(dev) end
	return modes
66

67
68
end

69
70
71
72

function qmpinfo.get_txpower(dev)
	local iw = iwinfo[iwinfo.type(dev)]
	local txpower_supported = {}
73
	if iw ~= nil then
74
		local txp = iw.txpwrlist(dev) or {}
75
76
77
		for _,v in ipairs(txp) do
			table.insert(txpower_supported,v.dbm)
		end
78
	end
79

80
	return txpower_supported
81

82
83
end

84
function qmpinfo.get_channels(dev)
85
86
87
88
89
90
91
92
93
94
95
96
97
98
	local clist = {} -- output channel list
	local iw = iwinfo[iwinfo.type(dev)]
	local ch = {}

	-- if there are not wireless cards, returning a dummy value
	if iw == nil then
		ch.channel=0
		ch.adhoc=false
		ch.ht40p=false
		ch.ht40m=false
		table.insert(clist,ch)
		return clist
	end

99
100
101
102
103
	local freqs = iw.freqlist(dev) --freqs list
	local c -- current channel
	local nc = 0 -- next channel
	local pc = 0 -- previous channel
	local adhoc
104
	local ht40_support = qmpinfo.get_modes(dev).n
105

106
107
108
109
110
111
112

	for i,f in ipairs(freqs) do
		c = f.channel
		ch = {}
		ch.channel = c
		ch.ht40p = false
		ch.ht40m = false
113
114
115
116
117
118

		if not f.restricted then
			ch.adhoc = true
		else
			ch.adhoc = false
		end
119
120
121

		-- 2.4Ghz band
		if c < 15 then
122
			if c < 4 then
123
				ch.ht40p = true
124
125
126

			elseif c < 10 then
				ch.ht40m = true
127
				ch.ht40p = true
128
			else
129
130
				ch.ht40m = true
			end
131

132
133
134
135
136
137
138
139
140
141
		-- 5Ghz band
		elseif c > 14 then
			if #freqs == i then nc = nil
			else nc = freqs[i+1].channel
			end

			if i == 1 then pc = nil
			else pc = freqs[i-1].channel
			end

142
143
			if nc ~= nil and nc-c == 4 then
				ch.ht40p = true
144
			end
145

146
147
148
149
150
			if pc ~= nil and c-pc == 4 then
				ch.ht40m = true
			end

		end
151
152
153
154
155
156
157

		-- If the device does not support ht40, both vars (+/-) are false
		if not ht40_support then
			ch.ht40p = false
			ch.ht40m = false
		end

158
		table.insert(clist,ch)
159

160
	end
161
162
163
	return clist
end

164
165
166

function qmpinfo.get_ipv4()
	local ipv4 = {}
167
	local ipv4_raw = util.exec("ip -4 a | awk '/inet/&&!/bmx6_/{print $2}'")
168
	for _,v in ipairs(util.split(ipv4_raw)) do
169
		if #util.trim(v) > 1 then
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
			table.insert(ipv4,util.trim(v))
		end
	end
	return ipv4
end

function qmpinfo.get_hostname()
	local hostname = util.exec("cat /proc/sys/kernel/hostname")
	return hostname
end

function qmpinfo.get_uname()
	local uname = util.exec("uname -a")
	return uname
end

186
function qmpinfo.bandwidth_test(ip)
187
        local bwtest = util.trim(util.exec("netperf -6 -p 12865 -H "..ip.." -fm -v0 -P0"))
188
189
190
191
192
193
194
        local result = nil
        if #bwtest < 10 then
                result = bwtest
        end

        return result
end
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209

function qmpinfo.nodes()
	local nodes = util.split(util.exec('bmx6 -c --originators | awk \'{print $1 "|" $3}\' | grep -e ".*:.*:"'))
	local ni
	result = {}
	for _,n in ipairs(nodes) do
		if n ~= "" then
		 ni = util.split(n,"|")
		 ni[1] = util.split(ni[1],".")[1]
		 table.insert(result,ni)
		end
	end
	return result
end

p4u's avatar
p4u committed
210
211
212
213
214
215
216
217
218
219
220
221
222
223
function qmpinfo.links()
	local nodes = util.split(util.exec('bmx6 -c --links | awk \'{print $1 "|" $2}\' |  grep -e ".*:.*:"'))
	local ni
	result = {}
	for _,n in ipairs(nodes) do
		if n ~= "" then
		ni = util.split(n,"|")
		ni[1] = util.split(ni[1],".")[1]
		table.insert(result,ni)
		end
	end
	return result
end

224
225
226
227
228
229
230
231
232
233
234
235
function qmpinfo.get_version(option)                    
	local version = nil
	if option == nil or option == "full" then version = util.exec("cat /etc/qmp/qmp.release | grep DESCRIPTION | cut -d= -f2")
	elseif option == "build" then version = util.exec("cat /etc/qmp/qmp.release | grep BUILDDATE | cut -d= -f2")
	elseif option == "branch" then version = util.exec("cat /etc/qmp/qmp.release | grep BRANCH | cut -d= -f2")
	elseif option == "codename" then version = util.exec("cat /etc/qmp/qmp.release | grep CODENAME | cut -d= -f2")
	elseif option == "release" then version = util.exec("cat /etc/qmp/qmp.release | grep RELEASE | cut -d= -f2")
	elseif option == "revision" then version = util.exec("cat /etc/qmp/qmp.release | grep REVISION | cut -d= -f2")
	else version = nil
	end
	return version
end  
p4u's avatar
p4u committed
236

237
238
239
240
241
242
243
244
245
function qmpinfo.get_key()
	local keyf = util.exec("uci get qmp.node.key")
	if #keyf < 2 then
		keyf = "/tmp/qmp_key"
	end
	local key = util.split(util.exec("cat "..keyf))[1]
	return key
end

246
return qmpinfo
p4u's avatar
p4u committed
247