Developing lightweight computation at the DSG edge

qmpinfo.lua 5.19 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
74
75
76
77
	if iw ~= nil then
		local txp = iw.txpwrlist(dev)
		for _,v in ipairs(txp) do
			table.insert(txpower_supported,v.dbm)
		end
78
	end
79
	
80
81
82
83
	return txpower_supported
	
end

84
function qmpinfo.get_channels(dev)
85
86
87
88
89
90
91
92
93
94
95
96
97
	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                                          
98
             
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
105
	local ht40_support = qmpinfo.get_modes(dev).n
	
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
122
123
124
125
126
127
128
129
130

		-- 2.4Ghz band
		if c < 15 then
			if c < 4 then 
				ch.ht40p = true
			
			elseif c < 10 then 
				ch.ht40m = true  
				ch.ht40p = true
			else 
				ch.ht40m = true
			end
131

132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
		-- 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

			if nc ~= nil and nc-c == 4 then 
				ch.ht40p = true 
			end
	
			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
161
162
163
	end	
	return clist
end

164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185

function qmpinfo.get_ipv4()
	local ipv4 = {}
	local ipv4_raw = util.exec("ip -4 a | grep inet | awk '{print $2}' | awk -F/ '{print $1}' | grep -v 127.0.0.1")
	for _,v in ipairs(util.split(ipv4_raw)) do
		if #util.trim(v) > 1 then 
			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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
function qmpinfo.bandwidth_test(ip)                 
        local bwtest = util.trim(util.exec("netperf -6 -p 12865 -H "..ip.." -fm -v0 -P0"))
        local result = nil                           
        if #bwtest < 10 then                   
                result = bwtest                     
        end                
   
        return result                                  
end   

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

210
211
212
213
214
215
216
217
218
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

219
return qmpinfo