gs_phone 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.txt CHANGED
@@ -1,7 +1,18 @@
1
+ Version 0.0.3
2
+ (25 March 2007)
3
+
4
+ * Added installation instructions
5
+ * Added unit tests to cover the majority of the current codebase
6
+ * Moved the control flow out of the class and into gs_phone
7
+ * Running gs_phone with no arguements will show the help
8
+ * Added a simple mock gsutil program for testing
9
+ * Cleaned up the message from the program
10
+ * Implemented a -v option to print out more status information
11
+
1
12
  Version 0.0.2
2
13
  (23 March 2007)
3
14
 
4
- * Changed the option parsing to use Subverion style commands
15
+ * Changed the option parsing to use Subversion style commands
5
16
  * Added context based help to each command
6
17
  * Setup a hidden folder in the HOME to store our configuration files
7
18
  * Added a basic generated template file used by gsutil
data/Rakefile CHANGED
@@ -60,7 +60,7 @@ namespace :test do
60
60
  task :coverage do
61
61
  rm_f "coverage"
62
62
  rm_f "coverage.data"
63
- file_list = FileList.new("test/**/*.rb")
63
+ file_list = FileList.new("test/**/*_test.rb")
64
64
  system("rcov --sort coverage #{file_list.to_s}")
65
65
  end
66
66
  end
data/TODO.txt CHANGED
@@ -4,12 +4,8 @@ This is the list of tasks that need to be done or have been completed.
4
4
 
5
5
  = CURRENT
6
6
 
7
- * Add an INSTALL file
8
- * Add unit tests
9
7
  * Announce package
10
8
  * Get a list of the ip addresses currently assigned (Currently this works: grep -i '^ip' users.yml | awk '// {print $2}' | sort)
11
- * Cleanup the option parser
12
- * Cleanup the output from the program (e.g. remove "GS >")
13
9
  * Allow asterisk intregration
14
10
  * Read user list from extensions.conf and/or sip.conf
15
11
 
@@ -26,3 +22,9 @@ This is the list of tasks that need to be done or have been completed.
26
22
  * Create a RubyForge Project
27
23
  * Rework commandline passing to be like Subversion (svn command options)
28
24
  * Make --help the default command if no option is given
25
+ * Add an INSTALL file
26
+ * BUG: help is still not the default command if no option is given
27
+ * BUG: If gsutil is not found the program acts as if everything is ok. It should error out.
28
+ * Add unit tests
29
+ * Cleanup the option parser
30
+ * Cleanup the output from the program (e.g. remove "GS >")
data/bin/gs_phone CHANGED
@@ -8,5 +8,41 @@ require 'rubygems'
8
8
  require_gem 'gs_phone'
9
9
  require 'gs_phone'
10
10
 
11
- GrandStream.new(ARGV)
12
11
 
12
+ gs = GrandStream.new
13
+
14
+ if not ARGV.nil? and ARGV.include?("-v")
15
+ gs.verbose = true
16
+ ARGV.delete_if { |a| a == "-v"}
17
+ end
18
+
19
+ @command = ARGV[0]
20
+ @ip = ARGV[1]
21
+ @current_ip = ARGV[2]
22
+ @admin = ARGV[3]
23
+
24
+ case @command
25
+ when "help"
26
+ response = gs.help(ARGV[1])
27
+ when "new"
28
+ # Don't use response because we want to give feeback throughout this process
29
+ puts gs.add_user(@ip)
30
+ puts gs.make(@ip)
31
+ puts gs.update_config(@ip, @current_ip, @admin)
32
+ puts gs.reboot_phone(@ip)
33
+ when "add"
34
+ response = gs.add_user(@ip)
35
+ when "make"
36
+ response = gs.make(@ip)
37
+ when "update"
38
+ response = gs.update_config(@ip, @current_ip, @admin)
39
+ when "reboot"
40
+ response = gs.reboot_phone(@ip)
41
+ when "find"
42
+ response = gs.find_ip
43
+ else
44
+ response = gs.help
45
+ end
46
+
47
+ # Print out any responses, used for verbose options
48
+ puts response unless response.nil?
@@ -2,7 +2,7 @@ module GsPhone #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 2
5
+ TINY = 3
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/lib/gs_phone.rb CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -w
1
+ #!/usr/bin/ruby
2
2
  # This is used to manage the Grandstream phones.
3
3
  # It is a wrapper over Charles Howes (gsutil@ch.pkts.ca)'s gsutil
4
4
  # utility (http://www.pkts.ca/gsutil.shtml)
@@ -24,52 +24,43 @@ require 'yaml'
24
24
 
25
25
  class GrandStream
26
26
 
27
+ attr_reader :user_file
28
+ attr_reader :admin_password
29
+ attr_reader :gsutil
30
+ attr_reader :template_files
31
+ attr_reader :config_file
32
+ attr_accessor :verbose
33
+
27
34
  # Default configurations
28
35
  @user_file = "#{ENV["HOME"]}/.gs_phone/users.yml"
29
36
  @admin_password = "admin"
30
37
  @gsutil = "#{ENV["HOME"]}/.gs_phone/gsutil"
31
- @config_file = "#{ENV["HOME"]}/.gs_phone/settings.yml"
32
38
  @template_files = "#{ENV["HOME"]}/.gs_phone/templates/"
33
-
34
- # Setup the help messages with the optparse library
35
- def initialize(args)
36
- read_configuration
37
- @command = args[0]
38
- @ip = args[1]
39
- @current_ip = args[2]
40
- @admin = args[3]
41
-
42
- case @command
43
- when "help"
44
- help_command = args[1]
45
- puts usage_summary(help_command)
46
- when "new"
47
- self.add_user(@ip)
48
- self.make(@ip)
49
- self.update_config(@ip, @current_ip, @admin)
50
- self.reboot_phone(@ip)
51
- when "add"
52
- self.add_user(@ip)
53
- when "make"
54
- self.make(@ip)
55
- when "update"
56
- self.update_config(@ip, @current_ip, @admin)
57
- when "reboot"
58
- self.reboot_phone(@ip)
59
- when "find"
60
- self.find_ip
39
+ @new_config_created = ""
40
+
41
+ def initialize
42
+ @verbose = false
43
+ # Use the GS_PHONE_CONFIG environnment to set the data directory
44
+ if not ENV["GS_PHONE_CONFIG"].nil?
45
+ @config_file = ENV["GS_PHONE_CONFIG"]
61
46
  else
62
-
47
+ @config_file = "#{ENV["HOME"]}/.gs_phone/"
63
48
  end
49
+ read_configuration
50
+ # TODO: need to find a way to stop printing this in TEST
51
+ # puts @new_config_created unless @new_config_created.nil?
64
52
  end
65
53
 
54
+ def help(command=nil)
55
+ usage_summary(command)
56
+ end
66
57
 
67
58
  # Read the gs_phone configuration file to get the settings
68
59
  def read_configuration
69
-
70
- if File.exists?("#{ENV["HOME"]}/.gs_phone/settings.yml")
60
+
61
+ if File.exists?(@config_file + "/settings.yml")
71
62
  settings = Hash.new
72
- settings = YAML::load(File.open("#{ENV["HOME"]}/.gs_phone/settings.yml"))
63
+ settings = YAML::load(File.open(@config_file + "/settings.yml"))
73
64
 
74
65
  @user_file = settings["user_file"] if settings.include?("user_file")
75
66
  @admin_password = settings["admin_password"]
@@ -77,46 +68,57 @@ class GrandStream
77
68
  @config_file = settings["config_file"]
78
69
  @template_files = settings["template_files"]
79
70
  else
80
- puts "You have no default configuration file. We will create one for you"
71
+ # No settings found so we need to follow a differnt logic path
72
+ # using the @new_config_created to hold our info messages
73
+ @new_config_created = "You have no default configuration file. We will create one for you\n"
81
74
  settings = {
82
75
  "admin_password" => "admin",
83
- "user_file" => "#{ENV["HOME"]}/.gs_phone/users.yml",
84
- "gsutil" => "#{ENV["HOME"]}/.gs_phone/gsutil",
85
- "config_file" => "#{ENV["HOME"]}/.gs_phone/settings.yml",
86
- "template_files" => "#{ENV["HOME"]}/.gs_phone/templates/"
76
+ "user_file" => "#{@config_file}/users.yml",
77
+ "gsutil" => "#{@config_file}/gsutil",
78
+ "config_file" => "#{@config_file}/settings.yml",
79
+ "template_files" => "#{@config_file}/templates/"
87
80
  }
88
81
 
89
- Dir.mkdir("#{ENV["HOME"]}/.gs_phone")
90
- Dir.mkdir("#{ENV["HOME"]}/.gs_phone/templates")
91
- cfg_template = File.new("#{ENV["HOME"]}/.gs_phone/templates/template.cfg", "w")
82
+ Dir.mkdir(@config_file)
83
+ Dir.mkdir("#{@config_file}/templates")
84
+ cfg_template = File.new("#{@config_file}/templates/template.cfg", "w")
92
85
  cfg_template.puts add_template
93
86
  cfg_template.close
94
87
 
95
- file = File.new("#{ENV["HOME"]}/.gs_phone/settings.yml","w")
88
+ file = File.new("#{@config_file}/settings.yml","w")
96
89
  file.puts settings.to_yaml
97
90
  file.close
98
91
 
99
- puts "File #{ENV["HOME"]}/.gs_phone/ has been created. Please make sure the"
100
- puts " settings are correct."
101
- exit
92
+ @new_config_created << "File #{@config_file}/ has been created. Please make sure the\n"
93
+ @new_config_created << " settings are correct."
102
94
 
103
95
  end
104
96
  end
105
97
 
106
98
  # Add a user to the configuration file
107
- def add_user(ip_addr=nil)
99
+ def add_user(ip_addr=nil,username=nil,password=nil,mac_addy=nil)
108
100
  # Lets get some details for the new user
109
- puts "GS> Username?"
110
- username = STDIN.gets.chomp
111
- puts "GS> Extension Number?"
112
- password = STDIN.gets.chomp
101
+ if username.nil?
102
+ puts "Username?"
103
+ username = STDIN.gets.chomp
104
+ end
105
+
106
+ # TODO: assuming password and extensions are the same.
107
+ if password.nil?
108
+ puts "Extension Number?"
109
+ password = STDIN.gets.chomp
110
+ end
111
+
113
112
  # Skip the ip address if they already passed it in.
114
113
  if ip_addr.nil?
115
- puts "GS> Phone IP Address (i.e. 192.168.1.1)"
114
+ puts "Phone IP Address (i.e. 192.168.1.1)"
116
115
  ip_addr = STDIN.gets.chomp
117
116
  end
118
- puts "GS> MAC Address?"
119
- mac_addy = STDIN.gets.chomp
117
+
118
+ if mac_addy.nil?
119
+ puts "MAC Address?"
120
+ mac_addy = STDIN.gets.chomp
121
+ end
120
122
 
121
123
  # Open the user file and enter the data
122
124
  users = File.open(@user_file, 'a')
@@ -127,54 +129,54 @@ class GrandStream
127
129
  users.puts "mac: " + mac_addy
128
130
  users.close
129
131
 
130
- # Set this so we can use it in other parts of the script if "--new" was called
131
- @ip = ip_addr
132
+ # Set this so we can use it in other parts of the script if "new" was called
133
+ @ip = ip_addr
132
134
  end
133
135
 
134
136
  # Generate a config file from the template
135
137
  def make(ip_address=@ip)
136
138
  # Skip the ip address if they already passed it in.
137
139
  if ip_address.nil?
138
- puts "GS> What ip address? "
140
+ puts "What ip address? "
139
141
  ip_address = STDIN.gets.chomp
140
142
  end
141
143
 
142
- @user_list = Hash.new
143
- @phone = Array.new
144
-
144
+ exten = ""
145
+
145
146
  # Open the user file and find the user who has the ip address that matches
146
147
  # the one we are looking for
147
- users = File.open(@user_file)
148
- data = YAML::load_documents(users) do |element|
149
- if element['ip'] == ip_address and not element['skip'] == 'y'
150
- name = element['name']
151
- password = element['ext'].to_s
152
- exten = element['ext'].to_s
153
- ip = element['ip']
154
-
155
- # Split the ip address into each octal, the Grandstream config files
156
- # needs it this way
157
- ip1, ip2, ip3, ip4 = ip.split('.')
158
-
159
- templated = IO.readlines(@template_files + "template.cfg")
160
- phone_config = ""
161
-
162
- # Substitue in the user fields into their config
163
- # a.k.a. Magic REGEX section
164
- templated.each do |line|
165
- phone_config << line.gsub(/<<ext>>/, exten).gsub(/<<name>>/, name).gsub(/<<password>>/, password).gsub(/<<ip1>>/, ip1).gsub(/<<ip2>>/, ip2).gsub(/<<ip3>>/, ip3).gsub(/<<ip4>>/, ip4)
166
- end
167
- # Write out the string to a file now
168
- File.open("#{@template_files}#{ip}.cfg", "w+") do |file|
169
- file.puts phone_config
170
- end
171
- puts "GS< Made config for extension #{exten.to_s}"
172
- end # IF
173
- end # DO
148
+ File.open(@user_file) do |users|
149
+ data = YAML::load_documents(users) do |element|
150
+ if element['ip'] == ip_address and not element['skip'] == 'y'
151
+ name = element['name']
152
+ password = element['ext'].to_s
153
+ exten = element['ext'].to_s
154
+ ip = element['ip']
155
+
156
+ # Split the ip address into each octal, the Grandstream config files
157
+ # needs it this way
158
+ ip1, ip2, ip3, ip4 = ip.split('.')
159
+
160
+ templated = IO.readlines(@template_files + "template.cfg")
161
+ phone_config = ""
162
+
163
+ # Substitue in the user fields into their config
164
+ # a.k.a. Magic REGEX section
165
+ templated.each do |line|
166
+ phone_config << line.gsub(/<<ext>>/, exten).gsub(/<<name>>/, name).gsub(/<<password>>/, password).gsub(/<<ip1>>/, ip1).gsub(/<<ip2>>/, ip2).gsub(/<<ip3>>/, ip3).gsub(/<<ip4>>/, ip4)
167
+ end
168
+ # Write out the string to a file now
169
+ File.open("#{@template_files}#{ip}.cfg", "w+") do |file|
170
+ file.puts phone_config
171
+ end
172
+ end # IF
173
+ end # DO
174
+ end # File
175
+ return "Made config for extension #{exten.to_s}"
174
176
  end
175
177
 
176
178
  def make_all
177
- puts "GS< Making all configs"
179
+ puts "Making all configs" if @verbose
178
180
  @user_list = Hash.new
179
181
 
180
182
  users = File.open(@user_file)
@@ -183,7 +185,6 @@ class GrandStream
183
185
  @user_list[element['ext']] = element['ip']
184
186
  end
185
187
  @user_list.each do |ext,ip|
186
- puts "GS< Making config for #{ext} (#{ip})"
187
188
  make(ip)
188
189
  end
189
190
  end
@@ -193,7 +194,7 @@ class GrandStream
193
194
  def update_config(ip_address=@ip, current_ip=nil, admin=nil)
194
195
  # Skip the ip address if they already passed it in.
195
196
  if ip_address.nil?
196
- puts "GS> What ip address? "
197
+ puts "What ip address? "
197
198
  ip_address = STDIN.gets.chomp
198
199
  end
199
200
  if admin.nil?
@@ -202,15 +203,19 @@ class GrandStream
202
203
  if current_ip.nil?
203
204
  current_ip = ip_address
204
205
  end
205
- # Setup the string to shell out to the gsutil script to scrape the webforms
206
- cmd = "#{@gsutil} -p '#{admin}' -r '#{current_ip}' < #{@template_files}#{ip_address}.cfg"
207
- `#{cmd}`.to_s # Evil eval().
208
- puts "GS< Config sent to phone"
206
+
207
+ # Shell out to the gsutil script to scrape the webforms
208
+ if system("#{@gsutil} -p '#{admin}' -r '#{current_ip}' < #{@template_files}#{ip_address}.cfg")
209
+ return "Config sent to phone" if @verbose
210
+ else
211
+ # TODO: This path is never reached, even if gsutil has an error.
212
+ return "ERROR: Failed to send config"
213
+ end
209
214
  end
210
215
 
211
216
  # Make a config file for each phone and push it to the phone
212
217
  def update_all
213
- puts "GS< Updating all phones"
218
+ puts "Updating all phones" if @verbose
214
219
  @user_list = Hash.new
215
220
 
216
221
  users = File.open(@user_file)
@@ -220,10 +225,15 @@ class GrandStream
220
225
  @user_list[element['ext']] = element['ip']
221
226
  end
222
227
  end
228
+
229
+ responses = String.new
223
230
  @user_list.each do |ext,ip|
224
- puts "GS< Making config for #{ext} (#{ip})"
225
- update_config(ip)
231
+ response = update_config(ip)
232
+ if response
233
+ responses << response
234
+ end
226
235
  end
236
+ return responses if @verbose
227
237
  end
228
238
 
229
239
 
@@ -231,21 +241,23 @@ class GrandStream
231
241
  def reboot_phone(ip_address=@ip)
232
242
  # Skip the ip address if they already passed it in.
233
243
  if ip_address.nil?
234
- puts "GS> What ip address? "
244
+ puts "What ip address? "
235
245
  ip_address = STDIN.gets.chomp
236
246
  end
237
247
  # Need a delay, if we just uploaded the new config then the phone will give a 500
238
248
  # error if we try to reboot it too soon
239
249
  sleep(3)
240
250
  # Setup the string to shell out to the gsutil script to scrape the webforms
241
- cmd = "#{@gsutil} -p '#{@admin_password}' -b '#{ip_address}'"
242
- `#{cmd}` # Evil eval() two
243
- puts "GS< Phone rebooted"
251
+ if system("#{@gsutil} -p '#{@admin_password}' -b '#{ip_address}'")
252
+ return "Phone rebooted" if @verbose
253
+ else
254
+ return "ERROR: Failed to reboot phone"
255
+ end
244
256
  end
245
257
 
246
258
  # Reboot all phones
247
259
  def reboot_all_phones
248
- puts "GS< Rebooting all phones"
260
+ puts "Rebooting all phones" if @verbose
249
261
  @user_list = Hash.new
250
262
 
251
263
  users = File.open(@user_file)
@@ -255,32 +267,36 @@ class GrandStream
255
267
  @user_list[element['ext']] = element['ip']
256
268
  end
257
269
  end
258
- # Need a delay, if we just uploaded the new config then the phone will give a 500
259
- # error if we try to reboot it too soon
260
- sleep(3)
261
- # Go-go BOFH method, this will reboot every phone in the user list.
270
+
271
+ responses = String.new
262
272
  @user_list.each do |ext,ip|
263
- puts "GS< Rebooting phone #{ext} (#{ip})"
264
- cmd = "#{@gsutil} -p '#{@admin_password}' -b '#{ip}'"
265
- `#{cmd}`
273
+ response = reboot_phone(ip)
274
+ if response
275
+ responses << response
276
+ end
266
277
  end
278
+
279
+ return responses if @verbose
267
280
  end
268
281
 
269
282
  # Finds the ip address of the phone if you know the extension.
270
- def find_ip
271
- print "What extension? "
272
- exten_in = STDIN.gets.chomp.to_i
283
+ def find_ip(extension=nil)
284
+ if extension.nil?
285
+ print "What extension? "
286
+ extension = STDIN.gets.chomp
287
+ end
273
288
 
274
289
  # Go thorugh config file loking for the extension
275
290
  data = YAML::load_documents(File.open(@user_file)) do |element|
276
- if element['ext'] == exten_in
291
+ if element['ext'] == extension.to_i
277
292
  @ip = element['ip']
278
- puts "GS< #{element['ip']}"
293
+ puts "#{element['ip']}" if @verbose
294
+ return element['ip']
279
295
  end
280
296
  end
281
297
  end
282
298
 
283
- def usage_summary(command)
299
+ def usage_summary(command)
284
300
  usage = ""
285
301
  case command
286
302
  when "new"
@@ -320,7 +336,7 @@ Usage: update IP_ADDRESS [CURRENT_ADDRESS] [ADMIN_PASSWORD]
320
336
 
321
337
  Sends the updated configuration file for IP_ADDRESS to the phone.
322
338
 
323
- Optionaly, a phone configuration can be sent to a phone that currently has
339
+ Optionally, a phone configuration can be sent to a phone that currently has
324
340
  a different ip address by using CURRENT_ADDRESS
325
341
 
326
342
  The admin password from the configuration file can also be overridden
@@ -358,9 +374,6 @@ EOFIND
358
374
  usage =<<EOHELP
359
375
  Usage: COMMAND [options]
360
376
 
361
- IP is the ip address you want the phone to use crtIP is the ip address
362
- the phone currently has pass is the current phone password
363
-
364
377
  COMMANDS DESCRIPTION
365
378
  new Add new user and setup their phone
366
379
  add Adds a user to the phone database
@@ -1,11 +1,352 @@
1
1
  require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
- class GsPhoneTest < Test::Unit::TestCase
3
+ class GrandstreamTest < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
+ # Recreate the base config files
7
+ ENV["GS_PHONE_CONFIG"] = "tmp"
8
+ end
9
+
10
+ def teardown
11
+ # Remove the base config files
12
+ system("rm -Rf tmp")
6
13
  end
7
14
 
8
15
  def test_truth
9
16
  assert true
10
17
  end
18
+
19
+ def create_new_settings
20
+ GrandStream.new()
21
+ # Copy in my ruby gsutil script so it can be used as a mock of the real gsutil.
22
+ system("cp test/mock_gsutil.rb tmp/gsutil")
23
+ end
24
+
25
+ def change_admin_password
26
+ settings = ""
27
+ File.open("tmp/settings.yml", "r") do |file|
28
+ settings = file.readlines
29
+ end
30
+
31
+ settings.each do |line|
32
+ line.gsub!(": admin",": gs_phone")
33
+ end
34
+
35
+ File.open("tmp/settings.yml", "w") do |file|
36
+ file.puts settings
37
+ end
38
+ end
39
+
40
+ def test_new_config
41
+ create_new_settings
42
+
43
+ # Make sure the files are there
44
+ assert File.exists?( "tmp/settings.yml")
45
+ assert File.exists?( "tmp/templates")
46
+ assert File.exists?( "tmp/templates/template.cfg")
47
+
48
+ # Make sure the settings file is correct
49
+ settings = YAML::load(File.open("tmp/settings.yml"))
50
+ assert_equal "admin", settings["admin_password"]
51
+ assert_equal "tmp/users.yml", settings["user_file"]
52
+ assert_equal "tmp/gsutil", settings["gsutil"]
53
+ assert_equal "tmp/settings.yml", settings["config_file"]
54
+ assert_equal "tmp/templates/", settings["template_files"]
55
+
56
+ end
57
+
58
+ # Reading an existing settings file
59
+ def test_read_settings
60
+ create_new_settings
61
+ gs = GrandStream.new()
62
+ assert_equal "admin", gs.admin_password
63
+ assert_equal "tmp/users.yml", gs.user_file
64
+ assert_equal "tmp/gsutil", gs.gsutil
65
+ assert_equal "tmp/settings.yml", gs.config_file
66
+ assert_equal "tmp/templates/", gs.template_files
67
+ end
68
+
69
+ # Adding a new user
70
+ def test_add_user
71
+ create_new_settings
72
+ gs = GrandStream.new
73
+ gs.add_user("192.168.100.23","John Doe","200","000B820B0A7C")
74
+
75
+ assert File.exists?("tmp/users.yml")
76
+ users = YAML::load(File.open("tmp/users.yml"))
77
+ assert_equal "John Doe", users["name"]
78
+ assert_equal 200, users["ext"]
79
+ assert_equal "192.168.100.23", users["ip"]
80
+ assert_equal "000B820B0A7C", users["mac"]
81
+
82
+ end
83
+
84
+ # Making a configuration file
85
+ def test_make
86
+ create_new_settings
87
+ gs = GrandStream.new
88
+ gs.add_user("192.168.100.23","John Doe","200","000B820B0A7C")
89
+
90
+ # Make the file and check that it is correct
91
+ gs.make("192.168.100.23")
92
+ assert File.exists?("tmp/templates/192.168.100.23.cfg")
93
+
94
+ config = File.read("tmp/templates/192.168.100.23.cfg")
95
+
96
+ assert config.match("name = John Doe"), "Could not find the name in the file"
97
+ assert config.match("end_user_password = 200"), "Could not find the password in the file"
98
+ assert config.match("sip_userid = 200"), "Could not find the extension in the file"
99
+ assert config.match("authenticate_id = 200"), "Could not find the extension in the file"
100
+ assert config.match("static_ipaddress_1 = 192"), "Could not find the ip address in the file"
101
+ assert config.match("static_ipaddress_2 = 168"), "Could not find the ip address in the file"
102
+ assert config.match("static_ipaddress_3 = 100"), "Could not find the ip address in the file"
103
+ assert config.match("static_ipaddress_4 = 23"), "Could not find the ip address in the file"
104
+
105
+
106
+ end
107
+
108
+ # Making all of the configuration files
109
+ def test_make_all
110
+ create_new_settings
111
+ gs = GrandStream.new
112
+
113
+ # Users
114
+ userlist = {
115
+ "192.168.100.23" => "John Doe1",
116
+ "192.168.100.24" => "John Doe2",
117
+ "192.168.100.25" => "John Doe3",
118
+ "192.168.100.26" => "John Doe4",
119
+ "192.168.100.27" => "John Doe5",
120
+ "192.168.100.28" => "John Doe6"
121
+ }
122
+
123
+ # Create some users
124
+ userlist.each do |ip,user|
125
+ gs.add_user(ip,user,rand(300).to_s,"000B820B0A7C")
126
+ end
127
+
128
+ # Make all of the files
129
+ gs.make_all
130
+
131
+ # Check that they are all there and correct
132
+ userlist.each do |ip, user|
133
+ assert File.exists?("tmp/templates/#{ip}.cfg")
134
+ config = File.read("tmp/templates/#{ip}.cfg")
135
+ assert config.match("name = #{user}"), "Could not find the name in the file"
136
+ end
137
+ end
138
+
139
+ # Finding the ip address of one phone
140
+ def test_find_ip
141
+ create_new_settings
142
+ gs = GrandStream.new
143
+ gs.add_user("192.168.100.23","John Doe","200","000B820B0A7C")
144
+
145
+ assert_equal "192.168.100.23", gs.find_ip("200")
146
+ end
147
+
148
+ # Reboot the phone
149
+ def test_reboot
150
+ create_new_settings
151
+ # Change the admin password so the mock will work
152
+ change_admin_password
153
+ gs = GrandStream.new
154
+ assert_nil gs.reboot_phone("192.168.1.25") # a nil return means no error
155
+
156
+ end
157
+
158
+ # Reboot the phone with an incorrect password
159
+ def test_reboot_incorrect_password
160
+ create_new_settings
161
+ gs = GrandStream.new
162
+ assert_equal "ERROR: Failed to reboot phone", gs.reboot_phone("192.168.1.25")
163
+
164
+ end
165
+
166
+
167
+ # Rebooting all of the phones
168
+ def test_reboot_all
169
+ create_new_settings
170
+ # Change the admin password so the mock will work
171
+ change_admin_password
172
+ gs = GrandStream.new
173
+ gs.add_user("192.168.1.25","John Doe1","200","000B820B0A7C")
174
+ gs.add_user("192.168.1.25","John Doe2","201","000B820B0A7C")
175
+
176
+ assert_nil gs.reboot_all_phones # a nil return means no error
177
+
178
+ end
179
+
180
+ # Sending the update
181
+ def test_update
182
+ create_new_settings
183
+ # Change the admin password so the mock will work
184
+ change_admin_password
185
+ gs = GrandStream.new
186
+ gs.add_user("192.168.1.25","John Doe","200","000B820B0A7C")
187
+ gs.make("192.168.1.25")
188
+
189
+ assert_nil gs.update_config("192.168.1.25") # nil means no error
190
+
191
+ end
192
+
193
+ # Send the update with an incorrect password
194
+ def test_update_incorrect_password
195
+ create_new_settings
196
+ gs = GrandStream.new
197
+ gs.add_user("192.168.1.25","John Doe","200","000B820B0A7C")
198
+ gs.make("192.168.1.25")
199
+
200
+ assert_equal "ERROR: Failed to send config", gs.update_config("192.168.1.25")
201
+
202
+ end
203
+
204
+ # Sending all of the updates
205
+ def test_update_all
206
+ create_new_settings
207
+ # Change the admin password so the mock will work
208
+ change_admin_password
209
+ gs = GrandStream.new
210
+
211
+ userlist = {
212
+ "192.168.1.25" => "John Doe1",
213
+ "192.168.1.26" => "John Doe2"
214
+ }
215
+
216
+ # Create some users
217
+ userlist.each do |ip,user|
218
+ gs.add_user(ip,user,rand(300).to_s,"000B820B0A7C")
219
+ end
220
+
221
+ # Make all of the files
222
+ gs.make_all
223
+
224
+ assert_nil gs.update_all # nil means no error
225
+
226
+ end
227
+
228
+
229
+ #####
230
+ # Help sections
231
+ #####
232
+ def test_help
233
+ create_new_settings
234
+ gs = GrandStream.new
235
+ help =<<EOHELP
236
+ Usage: COMMAND [options]
237
+
238
+ COMMANDS DESCRIPTION
239
+ new Add new user and setup their phone
240
+ add Adds a user to the phone database
241
+ make Generates a config file from the template
242
+ update Uploads the configuration file to the phone
243
+ reboot Reboots a phone
244
+ find Find the ip address in the configuration file
245
+
246
+ EOHELP
247
+
248
+ assert_equal help, gs.help
249
+ end
250
+
251
+ def test_help_new
252
+ create_new_settings
253
+ gs = GrandStream.new
254
+ help =<<EONEW
255
+ Usage: new
256
+
257
+ Goes through all the steps to setup a new phone:
258
+ "add", "make", "update", "reboot"
259
+
260
+ EONEW
261
+
262
+ assert_equal help, gs.help("new")
263
+ end
264
+
265
+ def test_help_add
266
+ create_new_settings
267
+ gs = GrandStream.new
268
+ help =<<EOADD
269
+ Usage: add IP_ADDRESS
270
+
271
+ Adds a user who has a phone at IP_ADDRESS
272
+
273
+ Ex:
274
+ add 192.168.1.200
275
+
276
+ EOADD
277
+
278
+ assert_equal help, gs.help("add")
279
+ end
280
+
281
+ def test_help_make
282
+ create_new_settings
283
+ gs = GrandStream.new
284
+ help =<<EOMAKE
285
+ Usage: make IP_ADDRESS
286
+
287
+ Creates the configuration file for the phone at IP_ADDRESS
288
+
289
+ Ex:
290
+ make 192.168.1.200
291
+
292
+ EOMAKE
293
+
294
+ assert_equal help, gs.help("make")
295
+ end
296
+
297
+ def test_help_update
298
+ create_new_settings
299
+ gs = GrandStream.new
300
+ help =<<EOUPDATE
301
+ Usage: update IP_ADDRESS [CURRENT_ADDRESS] [ADMIN_PASSWORD]
302
+
303
+ Sends the updated configuration file for IP_ADDRESS to the phone.
304
+
305
+ Optionally, a phone configuration can be sent to a phone that currently has
306
+ a different ip address by using CURRENT_ADDRESS
307
+
308
+ The admin password from the configuration file can also be overridden
309
+
310
+ Ex:
311
+ update 192.168.1.200
312
+ update 192.168.1.200 192.168.1.10 <= Send '200's update to the phone at '10'
313
+ update 192.168.1.200 192.168.1.10 admin <= Also uses the factory password
314
+
315
+
316
+ EOUPDATE
317
+
318
+ assert_equal help, gs.help("update")
319
+ end
320
+
321
+ def test_help_reboot
322
+ create_new_settings
323
+ gs = GrandStream.new
324
+ help =<<EOREBOOT
325
+ Usage: reboot COMMAND IP_ADDRESS
326
+
327
+ Reboots the phone at IP_ADDRESS.
328
+
329
+ CAUTION: Some firmware will allow the phone to be rebooted while it is in use!
330
+
331
+ Ex:
332
+ reboot 192.168.1.200
333
+
334
+ EOREBOOT
335
+
336
+ assert_equal help, gs.help("reboot")
337
+ end
338
+
339
+ def test_help_find
340
+ create_new_settings
341
+ gs = GrandStream.new
342
+ help =<<EOFIND
343
+ Usage: find
344
+
345
+ Searches the user.yml file to get the ipaddress of an extension.
346
+
347
+ EOFIND
348
+
349
+ assert_equal help, gs.help("find")
350
+ end
351
+
11
352
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: gs_phone
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.2
7
- date: 2007-03-23 00:00:00 -07:00
6
+ version: 0.0.3
7
+ date: 2007-03-25 00:00:00 -07:00
8
8
  summary: Application to mange and configure a group of Grandstream Voip phones
9
9
  require_paths:
10
10
  - lib