Developing lightweight computation at the DSG edge

qmpinfo.lua 4.5 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
28
29
30
31
32
33
34

qmpinfo = {}

function qmpinfo.get_modes(dev)
	local iw = iwinfo[iwinfo.type(dev)]
	return iw.hwmodelist(dev)
	
end

35
36
37
38
39
40
41
42
43
44
45
46

function qmpinfo.get_txpower(dev)
	local iw = iwinfo[iwinfo.type(dev)]
	local txp = iw.txpwrlist(dev)
	local txpower_supported = {}
	for _,v in ipairs(txp) do
		table.insert(txpower_supported,v.dbm)
	end
	return txpower_supported
	
end

47
function qmpinfo.get_channels(dev)
48
49
50
51
52
53
54
55
56
57
58
59
60
	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                                          
61
             
62
63
64
65
66
	local freqs = iw.freqlist(dev) --freqs list
	local c -- current channel
	local nc = 0 -- next channel
	local pc = 0 -- previous channel
	local adhoc
67
68
	local ht40_support = qmpinfo.get_modes(dev).n
	
69
70
71
72
73
74
75

	for i,f in ipairs(freqs) do
		c = f.channel
		ch = {}
		ch.channel = c
		ch.ht40p = false
		ch.ht40m = false
76
77
78
79
80
81

		if not f.restricted then
			ch.adhoc = true
		else
			ch.adhoc = false
		end
82
83
84
85
86
87
88
89
90
91
92
93

		-- 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
94

95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
		-- 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
114
115
116
117
118
119
120

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

121
		table.insert(clist,ch)
122

123
124
125
126
	end	
	return clist
end

127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148

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

149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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

173
174
175
176
177
178
179
180
181
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

182
return qmpinfo