Skip to content

Commit

Permalink
wifi : methodes pour activer et début de configuration du wifi
Browse files Browse the repository at this point in the history
  • Loading branch information
mqu committed May 3, 2013
1 parent b841a52 commit 8734eb4
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 38 deletions.
157 changes: 131 additions & 26 deletions ruby/Mafreebox.rb
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ module Mafreebox
exit(-1)
end

# require '../lib-extra/unidecoder.rb'

=begin
Expand Down Expand Up @@ -169,7 +168,7 @@ def http_post(cmd, args, headers={})
end

http = Net::HTTP.new(uri.host, uri.port)
# http.set_debug_output $stdout #useful to see the raw messages going over the wire
http.set_debug_output $stdout #useful to see the raw messages going over the wire
http.read_timeout = 15
http.open_timeout = 15

Expand Down Expand Up @@ -220,6 +219,16 @@ def exec(cmd, args=[])
JSON::parse(self.post(cgi, args.to_json, headers).body)['result']
end

def exec_xml(cmd, args=[])
args['csrf_token'] = self.token

headers = {
'X-Requested-With' => 'XMLHttpRequest',
}

return self.post('wifi.cgi', args, headers)
end

# automatic call of modules :
# - si sym (nom de la méthode appellée fait partie de la liste de modules, on retourne une référence
# sinon, on laisse passer (super) : ce qui va générer une exception
Expand Down Expand Up @@ -294,6 +303,14 @@ def login

return true
end

def token
return @config[:token]
end

def cookie
@config[:cookie]
end
end

# fonctions communes à tous les modules
Expand All @@ -316,9 +333,13 @@ def exec(cmd, args=[])
@fb.exec(cmd, args)
end

def exec_xml(cmd, args=[])
@fb.exec_xml(cmd, args)
end

# un POST par délégation sur la classe Freebox.
def post(cmd, args)
@fb.post(cmd, args)
def post(cmd, args, headers)
@fb.post(cmd, args, headers)
end

def http_get(cmd)
Expand Down Expand Up @@ -847,9 +868,10 @@ def logs

list[:recus] << {
:heure => e[0].inner_text, # heure d'appel : format Mardi 5 février à 15:29:40
:date => self.date_parse(e[0].inner_text), # date + heure décodé
:nom => e[1].inner_text, # nom ou numéro
:tel => e[2].inner_text, # numéro de l'appelant
:duree => e[3].inner_text, # duré de l'appel ou "appel manqué"
:duree => self.parse_duration(e[3].inner_text) # duré de l'appel ou "appel manqué"
}
}

Expand All @@ -872,33 +894,60 @@ def logs
# retourne un hash contenant :
# - :fr => l'heure initiale (francais)
# - :en => l'heure décodée en anglais
# - : time_t : l'heure au format time_t (nb seconde écoulées depuis une date de référence =~ 1/01/1970).
# - :time_t : l'heure au format time_t (nb seconde écoulées depuis une date de référence =~ 1/01/1970).
# - :date : un objet de type DateTime.
def date_parse(date)

require 'time'
# suppress characters accents (à->a, è->e) and lowercase
date = date.to_ascii.downcase
date = date.downcase
# date = date.to_ascii.downcase

week_days = %w(lundi mardi mercredi jeudi vendredi samedi dimanche)
months = %w(janvier fevrier mars avril mai juin juillet aout septembre octobre novembre decembre)
months = %w(janvier février mars avril mai juin juillet aout septembre octobre novembre décembre)
year = Date.today.year

# expr : /(week-name) (day-number) (month) (time)/
expr = /(#{week_days.join('|')})\s+(\d+)\s+(#{months.join('|')})\s+a\s+(.*)/i
expr = /(#{week_days.join('|')})\s+(\d+)\s+(#{months.join('|')})\s+[aà]\s+(.*)/i
e = date.scan(expr)

raise("parse error : unsupported date format or format error : '#{date}'") if(e.length == 0)
e = e[0]

d = DateTime.parse(sprintf("%.4d/%.2d/%.2s %s UTC+1", Date.today.year, months.index(e[2])+1, e[1], e[3]))

return {
'fr' => date,
'en' => Time.parse(d.to_s).to_s,
'time_t' => d.to_i
:fr => date,
:en => Time.parse(d.to_s).to_s,
:time_t => d.to_time.to_i,
:date => d
}

end

# parse duration string in the form in french :
# 00:01:01 -> 1 minute 1 seconde
# 00:00:22 -> 22 secondes
# 00:00:00 -> appel manqué
#
def parse_duration duration

return 0 if duration == "appel manqué"

h,m,s=0,0,0

h = match(duration, /(\d+)\s+heures*/)
m = match(duration, /(\d+)\s+minutes*/)
s = match(duration, /(\d+)\s+secondes*/)

return h*3600+m*60+s
end

def match str, expr
m = str.scan(expr)
return 0 if m.size==0
return m[0][0].to_i
end
end

=begin
Expand Down Expand Up @@ -1194,13 +1243,12 @@ def ip_address_set(ip)
filter_type=whitelist|blacklist
mac-address=adresse MAC de la carte réseau
commandes : (information extraite avec firebug)
commandes : (information extraite avec firebug) ; attention, les methodes sont des actions XML (XMLHttpRequest).
0 - éléments communs :
csrf_token=TOKEN
1 - Wifi / configuration / valider
method=wifi.ap_params_set
enabled=on|off
channel=1..13
ht_mode=disabled|20|40_upper|40_lower (Mode 802.11n)
Expand Down Expand Up @@ -1257,6 +1305,7 @@ class Wifi < Module
def initialize fb
super
@name = 'wifi'
@config=nil
end

def status_get
Expand All @@ -1267,8 +1316,34 @@ def config_get
self.exec('config_get')
end

def config_set(cnf)
self.exec('config_set', cnf)
def get_param(name)
@config=self.get if(@config==nil)
case name
when 'enabled'
return @config[:config]['ap_params']['enabled']
when 'channel'
return @config[:config]['ap_params']['channel']
when 'ht_mode'
return @config[:config]['ap_params']['ht']['ht_mode']
when 'band'
return @config[:config]['ap_params']['band']
else
raise "error : unknown parameter #{name}"
end
end
def method_missing sym, *args
case sym
when :enabled?
return self.get_param('enabled')=='true'
when :enable
return self.set_active(true)
when :disable
return self.set_active(false)
when :channel=
return self.set_channel(*args)
else
return self.get_param(sym.to_s)
end
end

def get
Expand All @@ -1282,18 +1357,48 @@ def stations_get
self.exec('config_get')
end

# FIXME : non fonctionnel ; à terminer.
# enabled=on|off
# channel=1..13
# ht_mode=disabled|20|40_upper|40_lower (Mode 802.11n)
def ap_param_set cnf
# current conf
_cnf = {
'enabled' => self.enabled,
'channel' => self.channel,
'ht_mode' => self.ht_mode,
'method' => 'wifi.ap_params_set'
}

# override values from cnf hash
cnf.each do |k,v|
_cnf[k] = v
end

pp _cnf

# reset cached config
@config=nil
return self.exec_xml('wifi.cgi', _cnf)

end

# active ou désactive la fonction wifi sur la freebox
def set_active(status)
cnf = {}
case status
when false
when 'off'
status = 'off'
when true
when 'on'
status = 'on'
when false, 'off'
cnf['enabled'] = 'off'
when true, 'on'
cnf['enabled'] = 'on'
else
raise "error : unknow status (#{status})"
end
cnf = { 'enabled' => status}
self.exec('app_params_set', cnf)
return ap_param_set(cnf)
end

# canal d'emission.
def set_channel chan
return ap_param_set({'channel' => chan})
end
end

Expand Down
23 changes: 11 additions & 12 deletions ruby/test-mafreebox.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/ruby
# coding: utf-8

# author : Marc Quinton, février 2013, licence : http://fr.wikipedia.org/wiki/WTFPL
# author : Marc Quinton, février-avril 2013, licence : http://fr.wikipedia.org/wiki/WTFPL

require 'pp'
require './Mafreebox.rb'
Expand Down Expand Up @@ -99,22 +99,21 @@ def file_write _file, data
pp mafreebox.lan.get

when "wifi"
pp mafreebox.wifi.get

# pp mafreebox.wifi.get
if(ARGV[1] == 'set-active')
pp ARGV
case ARGV[2]
when true
when "true"
when "on"
when true, "true", "on"
puts "set-active = on"
mafreebox.wifi.set_active(true)
when false
when "false"
when "off"
pp mafreebox.wifi.set_active(true)
when false, "false", "off"
puts "set-active = off"
mafreebox.wifi.set_active(false)
pp mafreebox.wifi.set_active(false)
end

# pp mafreebox.wifi.get
elsif(ARGV[1] == 'channel')
pp mafreebox.wifi.channel=ARGV[2]
else
pp mafreebox.wifi.get
end
Expand Down

0 comments on commit 8734eb4

Please sign in to comment.