CModem 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/README +26 -0
  2. data/lib/cmodem.rb +208 -0
  3. data/test/test.rb +40 -0
  4. metadata +48 -0
data/README ADDED
@@ -0,0 +1,26 @@
1
+ CModem es un conjunto de clases para facilitar la administración de los cable modems.
2
+
3
+
4
+
5
+ = Actualmente =
6
+ * soporta instrucciones para el Cable Modem Thomson587.
7
+
8
+ = USO =
9
+ Ejemplo
10
+ require 'rubygems'
11
+ require 'cmodem'
12
+
13
+ m = CableModemThomson587.new('192.168.1.254')
14
+ if m.autenticar('admin', 'admin')
15
+ puts "Clave y usuario si funcionan"
16
+ #llamas comando del thomson
17
+ m.c.systemlog.show.call
18
+
19
+ end
20
+
21
+ m.cerrar
22
+ Se nos crea un archivo con IP.log donde queda almacena la salida de la conexión.
23
+
24
+ C
25
+ D
26
+ m.c.systemlog.
data/lib/cmodem.rb ADDED
@@ -0,0 +1,208 @@
1
+ =begin
2
+ Libreria para administrar CableModem
3
+ (C) 2011 Jovany Leandro G.C <lenadro@manadalibre.org>
4
+
5
+ cmodem is free software: you can redistribute it and/or modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation, either version 3 of the License, or
8
+ any later version.
9
+
10
+ Ronela is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with cmodem. If not, see <http://www.gnu.org/licenses/>.
17
+ =end
18
+
19
+ require 'net/telnet'
20
+
21
+
22
+ module CModem
23
+
24
+ #== Comando
25
+ #Esta clase hace mapeo de methodos para
26
+ #construir la linea de comandos para el cable modem
27
+ #Ejemplo
28
+ #c = Comando.new
29
+ #print c.firewall.config({:state=>:disabled}) => :firewall config state=disabled
30
+ class Comando
31
+ def initialize(n=nil, name_caller=nil, &caller)
32
+ @cmd = n.nil? ? ':' : n
33
+ @name_caller = name_caller
34
+ @caller = caller
35
+ end
36
+
37
+ def method_missing(s, *args)
38
+
39
+ if s == @name_caller
40
+ @caller.call(@cmd)
41
+ end
42
+
43
+ if @cmd == ":"
44
+ linea = @cmd + s.to_s
45
+ else
46
+ linea = @cmd + " " + s.to_s
47
+ end
48
+
49
+ if args.size == 1
50
+ args[0].each_pair { |k,v| linea += " " + k.to_s + "=" + v.to_s }
51
+ end
52
+
53
+ Comando.new(linea, @name_caller) { |c| @caller.call(c) }
54
+ end
55
+
56
+ def to_s
57
+ @cmd
58
+ end
59
+ end
60
+
61
+
62
+
63
+ #Agregar manejador de comandos
64
+ #cuando no exista arrojar execpcion
65
+ class CableModem < Net::Telnet
66
+
67
+
68
+ end
69
+
70
+ #Esto es configurado con el TG587
71
+ class CableModemThomson587 < CableModem
72
+ attr_reader :c
73
+
74
+ def initialize(host, timeout=10)
75
+
76
+ @options = {}
77
+ @options['Prompt'] = /.+=>\z/n
78
+ @options['Host'] = host
79
+ @options['Timeout'] = timeout
80
+ @options['Output_log'] = host+'.log'
81
+ super(@options)
82
+ @c = Comando.new(':', :call) { |c| cmd c }
83
+ @username = nil
84
+ @password = nil
85
+ end
86
+
87
+ #intenta obtener serial y mac por puerto 80
88
+ def info
89
+ require 'net/http'
90
+ res = Net::HTTP.get_response(URI("http://#{@options['Host']}/"))
91
+
92
+ #los thompson por general envia parte de la serial
93
+ #por http WWW-Authenticate
94
+ #si los dos primeros digitos CP
95
+ data = res["www-authenticate"].scan(/nonce+=\"([^,]+)\"/)[0][0].split(':')
96
+ return {:serial => data[0], :MAC => data[1]}
97
+ end
98
+
99
+ def autenticar(username, password)
100
+ #se dice que cuando logea queda el prompt con =>"
101
+ login({"LoginPrompt" => /[Uu]sername[: ]*\z/n, "Name" => username, "Password" => password}).include? "=>"
102
+ end
103
+
104
+
105
+ def cerrar
106
+ close
107
+ end
108
+
109
+
110
+
111
+ #Wife utis
112
+ def wifi_cambiar(ssid, any=true)
113
+ any = "enabled" if any
114
+ anf = "disabled" if !any
115
+
116
+ @c.wireless.ifconfig(:ssid => ssid, :any => any, :state=>:enabled).call
117
+ end
118
+
119
+ #Cambia seguridad del wifi
120
+ #@type wep o wpa o false (desactiva)
121
+ #@pass clave
122
+ def wifi_secmode(type, pass=nil)
123
+ @c.wireless.secmode.config(:mode => :disable).call
124
+ case type
125
+ when :wep
126
+ @c.wireless.secmode.wep(:encryptionkey => pass).call if !pass.nil?
127
+ @c.wireless.secmode.config(:mode => :wep).call
128
+ when :wpa
129
+ @c.wireless.secmode.send("wpa-psk", :presharedkey => pass).call if !pass.nil?
130
+ @c.wireless.secmode.config(:mode => "wpa-psk").call
131
+ end
132
+
133
+ end
134
+
135
+ def wifi_wps(state)
136
+ state = :enabled if state
137
+ state = :disabled if state
138
+ @c.wireless.wps.config(:state => state)
139
+ end
140
+
141
+ def wifi_wds(state)
142
+ state = :enabled if state
143
+ state = :disabled if state
144
+ @c.wireless.wds.config(:state => state)
145
+ end
146
+
147
+ #PPP utils
148
+ def ppp_cambiar(intf, user, pass)
149
+ @c.ppp.ifconfig(:intf => intf, :user => user, :password => pass).call
150
+ end
151
+
152
+ def ppp_llamar(intf)
153
+ @c.ppp.ifattach(:intf => intf).call
154
+ end
155
+
156
+ def ppp_colgar(intf)
157
+ @c.ppp.ifdetach(:intf => intf).call
158
+ end
159
+
160
+ #Limpiar Registros
161
+ def barrer
162
+ @c.ids.clear.call
163
+
164
+ #limpiar QOS
165
+ @c.ipqos.meter.clear.call
166
+ @c.ipqos.queue.clear.call
167
+
168
+ #limpiar ARP
169
+
170
+ #limpiar MEMORIA
171
+ @c.memm.debug.clearstats.call
172
+ @c.hostmgr.clear.call
173
+ end
174
+
175
+ #IP
176
+
177
+ def manifestarse_udp(addr, port=80)
178
+ @c.ip.debug.sendto(:addr => addr, :count=>1000000, :size=>20000, :interval=>1, :dstport => port).call
179
+ end
180
+
181
+ def usuario_agregar(nombre, pass, rol)
182
+ @c.user.add(:name => nombre, :password => pass, :role => rol).call
183
+ end
184
+
185
+
186
+ #Como no ser para reabrir conexiones con net/telnet
187
+ #dispongo este procedimiento
188
+ def self.script(ip, &block)
189
+ c = self.new(ip)
190
+ c.instance_eval(&block)
191
+ c.close
192
+ end
193
+
194
+ #Prueba nombre y clave para autenticarse
195
+ def self.autenticable?(ip, nombre, pass)
196
+ c = self.new(ip)
197
+ q = c.autenticar(nombre, pass)
198
+ c.close
199
+ q
200
+ end
201
+
202
+ end
203
+
204
+ end
205
+
206
+
207
+
208
+
data/test/test.rb ADDED
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "#{Dir.pwd}/cmodem"
3
+
4
+ IP = '192.168.1.254'
5
+
6
+
7
+ #Ejemplo Probar claves
8
+ def probar_claves(ip, claves)
9
+
10
+ claves.each { |c|
11
+ m = CModem::CableModemThomson587.new(ip)
12
+ r = m.autenticar(c[:nombre], c[:clave])
13
+ puts "IP: #{ip} nombre:#{c[:nombre]} clave:#{c[:clave]} Autentica? #{r}"
14
+ m.cerrar
15
+ }
16
+
17
+ end
18
+
19
+ probar_claves(IP, [
20
+ {:nombre => 'admin', :clave => 'admin'},
21
+ {:nombre => 'tech', :clave => 'tech'},
22
+ {:nombre => 'admin', :clave => ''}
23
+ ])
24
+
25
+
26
+ #Ejemplo adivinar clave
27
+ m = CModem::CableModemThomson587.new(IP)
28
+ if m.autenticar('admin', "CPE##{m.info[:serial][-6..-1]}")
29
+ puts "IP: #{IP} Autenticación automática con CPE# funciona"
30
+ else
31
+ puts "IP: #{IP} No autentica automáticamente co CPE#"
32
+ end
33
+
34
+ #cliente.ppp_cambiar('Internet', 'aoeu', 1234)
35
+ #cliente.usuario_agregar('roota', 'roota', 'root')
36
+ #loop {
37
+ # cliente.manifestarse_udp('192.168.1.64')
38
+ #}
39
+
40
+
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: CModem
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jovany Leandro G.C
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-23 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email: info@manadalibre.org
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files:
19
+ - README
20
+ files:
21
+ - lib/cmodem.rb
22
+ - test/test.rb
23
+ - README
24
+ homepage:
25
+ licenses: []
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.11
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: Administrador Cable Modem
48
+ test_files: []