mac-wifi 2.2.0 → 2.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 364ab612e99d7957d20949e0cce4800d0b2f433f9bc3d57eddc489ca2646a569
4
- data.tar.gz: f0b2a0ba504546d73f399a551e2ea0f5164befbc58f7570687bcdf7109529841
3
+ metadata.gz: '0049361c430c1be60db595012b1e54844e16ad90df26064c059ba42a9f48fd05'
4
+ data.tar.gz: 8947e8e004eec02b3a2ca8bf9bc1b24c94a477ccdff7819d8e142e5d7095521a
5
5
  SHA512:
6
- metadata.gz: 67f5d51bc48331beee215aeffc2896e679ca61edf94a8b614758de5658babd0820de21ef816cadfea06b0001209149e59042bc27c410448240efcdd016f33333
7
- data.tar.gz: 40e35d2036816e00ea4791287557055028c7e9be1b7b0a9973e211808ceb5ec0b6d0dfa9f24addb52001c41da86c6815ce4759991226e93d2e34331eb1359ee6
6
+ metadata.gz: b8ac9a874c181bf0b32a4dd59edaaa2d3000a2f0197ba54e43a4425e725a18d115ae63640ed4ba2471cc7277acd70fdd5d61b3c2c0ca4ece4dc1063c3a8aaa46
7
+ data.tar.gz: cf18aeb2d52e73ddd9acb0444e5196b8c7126a55c6ad11314da9fabce123e5a2da70c26253944de68d10119582256cd266787da25257dc3b7cf33f69a8630428
data/README.md CHANGED
@@ -28,8 +28,7 @@ output at the time of this writing:
28
28
  ```
29
29
  $ mac-wifi h
30
30
 
31
-
32
- Command Line Switches: [mac-wifi version 2.2.0]
31
+ Command Line Switches: [mac-wifi version 2.3.0]
33
32
 
34
33
  -o[i,j,p,y] - outputs data in inspect, JSON, puts, or YAML format when not in shell mode
35
34
  -s - run in shell mode
@@ -49,11 +48,11 @@ n[etwork_name] - name (SSID) of currently connected network
49
48
  on - turns wifi on
50
49
  of[f] - turns wifi off
51
50
  pa[ssword] network-name - password for preferred network-name
52
- pu[blic-ip-show] - opens https://www.whatismyip.com/ in a browser window to show public address info
53
51
  pr[ef_nets] - preferred (not necessarily available) networks
54
52
  q[uit] - exits this program (interactive shell mode only) (see also 'x')
55
53
  r[m_pref_nets] network-name - removes network-name from the preferred networks list
56
54
  (can provide multiple names separated by spaces)
55
+ ro[pen] - open resource ('ipc' (IP Chicken), 'ipw' (What is My IP), 'spe' (Speed Test), 'this' (mac-wifi Home Page))
57
56
  t[ill] - returns when the desired Internet connection state is true. Options:
58
57
  1) 'on'/:on, 'off'/:off, 'conn'/:conn, or 'disc'/:disc
59
58
  2) wait interval, in seconds (optional, defaults to 0.5 seconds)
@@ -1,3 +1,14 @@
1
+ ## v2.3.0
2
+
3
+ * Add public IP address info to info hash (https://github.com/keithrbennett/macwifi/issues/3).
4
+ * Add nameserver information to info hash (issue at https://github.com/keithrbennett/macwifi/issues/5).
5
+ * Made all info hash keys same data type to be less confusing; made them all String's.
6
+ * Replace 'public-ip-show' with 'ropen', and provide additional targets ipchicken.com,
7
+ speedtest.net, and the Github page for this project
8
+ * Speed up retrieval of network name
9
+ * Remove BaseModel#run_os_command private restriction.
10
+
11
+
1
12
  ## v2.2.0
2
13
 
3
14
  * Add pu[blic-wifi-show] command to open https://www.whatismyip.com/ to show public IP address info.
@@ -1,3 +1,4 @@
1
+ require 'json'
1
2
  require 'tempfile'
2
3
  require_relative '../mac-wifi'
3
4
 
@@ -31,7 +32,6 @@ class BaseModel
31
32
  end
32
33
  output
33
34
  end
34
- private :run_os_command
35
35
 
36
36
 
37
37
  # This method returns whether or not there is a working Internet connection.
@@ -217,5 +217,25 @@ class BaseModel
217
217
  end
218
218
  nil
219
219
  end
220
+
221
+
222
+ # Reaches out to ipinfo.io to get public IP address information
223
+ # in the form of a hash.
224
+ # You may need to enclose this call in a begin/rescue.
225
+ def public_ip_address_info
226
+ JSON.parse(`curl -s ipinfo.io`)
227
+ end
228
+
229
+
230
+ # @return array of nameserver IP addresses from /etc/resolv.conf, or nil if not found
231
+ # Though this is strictly *not* OS-agnostic, it will be used by most OS's,
232
+ # and can be overridden by subclasses (e.g. Windows).
233
+ def nameservers
234
+ begin
235
+ File.readlines('/etc/resolv.conf').grep(/^nameserver /).map { |line| line.split.last }
236
+ rescue Errno::ENOENT
237
+ nil
238
+ end
239
+ end
220
240
  end
221
241
  end
@@ -4,17 +4,47 @@ module MacWifi
4
4
 
5
5
  class CommandLineInterface
6
6
 
7
- attr_reader :model, :interactive_mode, :options
7
+ attr_reader :interactive_mode, :model, :open_resources, :options
8
+
8
9
 
9
10
  class Command < Struct.new(:min_string, :max_string, :action); end
10
11
 
11
12
 
13
+ class OpenResource < Struct.new(:code, :resource, :description)
14
+
15
+ # Ex: "'ipw' (What is My IP)"
16
+ def help_string
17
+ "'#{code}' (#{description})"
18
+ end
19
+ end
20
+
21
+
22
+ class OpenResources < Array
23
+
24
+ def find_by_code(code)
25
+ detect { |resource| resource.code == code }
26
+ end
27
+
28
+ # Ex: "('ipc' (IP Chicken), 'ipw' (What is My IP), 'spe' (Speed Test))"
29
+ def help_string
30
+ map(&:help_string).join(', ')
31
+ end
32
+ end
33
+
34
+
12
35
  class BadCommandError < RuntimeError
13
36
  def initialize(error_message)
14
37
  super
15
38
  end
16
39
  end
17
40
 
41
+ OPEN_RESOURCES = OpenResources.new([
42
+ OpenResource.new('ipc', 'https://ipchicken.com/', 'IP Chicken'),
43
+ OpenResource.new('ipw', 'https://www.whatismyip.com', 'What is My IP'),
44
+ OpenResource.new('spe', 'http://speedtest.net/', 'Speed Test'),
45
+ OpenResource.new('this', 'https://github.com/keithrbennett/macwifi', 'mac-wifi Home Page'),
46
+ ])
47
+
18
48
 
19
49
  # Help text to be used when requested by 'h' command, in case of unrecognized or nonexistent command, etc.
20
50
  HELP_TEXT = "
@@ -38,11 +68,11 @@ n[etwork_name] - name (SSID) of currently connected network
38
68
  on - turns wifi on
39
69
  of[f] - turns wifi off
40
70
  pa[ssword] network-name - password for preferred network-name
41
- pu[blic-ip-show] - opens https://www.whatismyip.com/ in a browser window to show public address info
42
71
  pr[ef_nets] - preferred (not necessarily available) networks
43
72
  q[uit] - exits this program (interactive shell mode only) (see also 'x')
44
73
  r[m_pref_nets] network-name - removes network-name from the preferred networks list
45
74
  (can provide multiple names separated by spaces)
75
+ ro[pen] - open resource (#{OPEN_RESOURCES.help_string})
46
76
  t[ill] - returns when the desired Internet connection state is true. Options:
47
77
  1) 'on'/:on, 'off'/:off, 'conn'/:conn, or 'disc'/:disc
48
78
  2) wait interval, in seconds (optional, defaults to 0.5 seconds)
@@ -269,7 +299,7 @@ When in interactive shell mode:
269
299
 
270
300
 
271
301
  def cmd_n
272
- name = model.connected_network_name
302
+ name = model.current_network
273
303
  if interactive_mode
274
304
  name
275
305
  else
@@ -289,6 +319,16 @@ When in interactive shell mode:
289
319
  end
290
320
 
291
321
 
322
+ # Use Mac OS 'open' command line utility
323
+ def cmd_ro(*resource_codes)
324
+ resource_codes.each do |code|
325
+ resource = OPEN_RESOURCES.find_by_code(code)
326
+ if resource
327
+ model.run_os_command("open #{resource.resource}")
328
+ end
329
+ end
330
+ end
331
+
292
332
  def cmd_pa(network)
293
333
  password = model.preferred_network_password(network)
294
334
 
@@ -371,9 +411,9 @@ When in interactive shell mode:
371
411
  Command.new('n', 'network_name', -> (*_options) { cmd_n }),
372
412
  Command.new('of', 'off', -> (*_options) { cmd_of }),
373
413
  Command.new('on', 'on', -> (*_options) { cmd_on }),
414
+ Command.new('ro', 'ropen', -> (*options) { cmd_ro(*options) }),
374
415
  Command.new('pa', 'password', -> (*options) { cmd_pa(*options) }),
375
416
  Command.new('pr', 'pref_nets', -> (*_options) { cmd_pr }),
376
- Command.new('pu', 'public_ip_show',-> (*_options) { cmd_pu }),
377
417
  Command.new('q', 'quit', -> (*_options) { cmd_q }),
378
418
  Command.new('r', 'rm_pref_nets', -> (*options) { cmd_r(*options) }),
379
419
  Command.new('t', 'till', -> (*options) { cmd_t(*options) }),
@@ -181,11 +181,6 @@ class MacOsModel < BaseModel
181
181
  end
182
182
 
183
183
 
184
- def connected_network_name
185
- wifi_info['SSID']
186
- end
187
-
188
-
189
184
  # This method is called by BaseModel#connect to do the OS-specific connection logic.
190
185
  def os_level_connect(network_name, password = nil)
191
186
  command = "networksetup -setairportnetwork #{wifi_hardware_port} " + "#{Shellwords.shellescape(network_name)}"
@@ -256,17 +251,27 @@ class MacOsModel < BaseModel
256
251
  def wifi_info
257
252
 
258
253
  info = {
259
- wifi_on: wifi_on?,
260
- internet_on: connected_to_internet?,
261
- port: wifi_hardware_port,
262
- network: current_network,
263
- ip_address: ip_address,
264
- timestamp: Time.now,
254
+ 'wifi_on' => wifi_on?,
255
+ 'internet_on' => connected_to_internet?,
256
+ 'port' => wifi_hardware_port,
257
+ 'network' => current_network,
258
+ 'ip_address' => ip_address,
259
+ 'nameservers' => nameservers,
260
+ 'timestamp' => Time.now,
265
261
  }
266
262
  more_output = run_os_command(AIRPORT_CMD + " -I")
267
263
  more_info = colon_output_to_hash(more_output)
268
264
  info.merge!(more_info)
269
265
  info.delete('AirPort') # will be here if off, but info is already in wifi_on key
266
+
267
+ if info['wifi_on']
268
+ begin
269
+ info['public_ip'] = public_ip_address_info
270
+ rescue => e
271
+ puts "Error obtaining public IP address info, proceeding with everything else:"
272
+ puts e.to_s
273
+ end
274
+ end
270
275
  info
271
276
  end
272
277
 
@@ -1,5 +1,5 @@
1
1
  module MacWifi
2
2
 
3
- VERSION = '2.2.0'
3
+ VERSION = '2.3.0'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mac-wifi
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Bennett
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-22 00:00:00.000000000 Z
11
+ date: 2018-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler