gs_phone 0.0.2 → 0.0.3

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