mac-wifi 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/README.md +84 -30
- data/RELEASE_NOTES.md +10 -0
- data/{bin → exe}/mac-wifi +166 -105
- data/mac-wifi.gemspec +8 -7
- metadata +49 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24a41565844a201ee4416a7a5452d8859526ed7c
|
4
|
+
data.tar.gz: 8cfe9206c6164351d4b98b825a89543e98932719
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41ba590f1fe37986621d1fee3f5c8d93af431de56b24bedf8988f2f740f20ed8e1a49ad7aeab8b2ed412e068b39ee0b9da3e0372a7821260279e6af988a61f35
|
7
|
+
data.tar.gz: 7e8cb0afeb5f413ff444cf1602170671976ef1a464624c58846ec6b7dc86bf09b349caa0cb889d973790d0d818d92b6a61ebbba360bbcd57f24c1ce073b9c17e
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -17,34 +17,38 @@ Available commands can be seen by using the `h` (or `help`) option. Here is its
|
|
17
17
|
output at the time of this writing:
|
18
18
|
|
19
19
|
```
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
20
|
+
$ mac-wifi h
|
21
|
+
|
22
|
+
|
23
|
+
mac-wifi version 1.3.0 -- Available commands are:
|
24
|
+
|
25
|
+
a[vailnets] - array of names of the available networks
|
26
|
+
ci - connected to Internet (not just wifi on)?
|
27
|
+
co[nnect] network-name - turns wifi on, connects to network-name
|
28
|
+
cy[cle] - turns wifi off, then on, preserving network selection
|
29
|
+
d[isconnect] - disconnects from current network, does not turn off wifi
|
30
|
+
h[elp] - prints this help
|
31
|
+
i[nfo] - a hash of wifi-related information
|
32
|
+
l[savailnets] - details about available networks
|
33
|
+
n[etwork_name] - name (SSID) of currently connected network
|
34
|
+
on - turns wifi on
|
35
|
+
of[f] - turns wifi off
|
36
|
+
pa[ssword] network-name - password for preferred network-name
|
37
|
+
pr[efnets] - preferred (not necessarily available) networks
|
38
|
+
q[uit] - exits this program (interactive shell mode only) (see also 'x')
|
39
|
+
r[mprefnets] network-name - removes network-name from the preferred networks list
|
40
|
+
(can provide multiple names separated by spaces)
|
41
|
+
s[hell] - opens an interactive pry shell (command line only)
|
42
|
+
t[ill] - returns when the desired Internet connection state is true. Options:
|
43
|
+
1) 'on'/:on, 'off'/:off, 'conn'/:conn, or 'disc'/:disc
|
44
|
+
2) wait interval, in seconds (optional, defaults to 0.5 seconds)
|
45
|
+
w[ifion] - is the wifi on?
|
46
|
+
x[it] - exits this program (interactive shell mode only) (see also 'q')
|
44
47
|
|
45
48
|
When in interactive shell mode:
|
46
49
|
* use quotes for string parameters such as method names.
|
47
50
|
* for pry commands, use prefix `%`.
|
51
|
+
|
48
52
|
```
|
49
53
|
|
50
54
|
Internally, it uses several Mac command line utilities. This is not ideal,
|
@@ -63,6 +67,25 @@ This is accomplished by the following command:
|
|
63
67
|
`gem install awesome_print`
|
64
68
|
|
65
69
|
|
70
|
+
### JSON and YAML Output
|
71
|
+
|
72
|
+
For now, JSON and YAML processing are only available in the interactive mode shell, in the way
|
73
|
+
you would usually use them in Ruby code. Their respective libraries are automatically
|
74
|
+
`require`d for your convenience. If you want them in non-interactive mode,
|
75
|
+
you can work around this limitation by redirecting the shell's input, e.g.:
|
76
|
+
|
77
|
+
```
|
78
|
+
echo "File.write('available_networks.json', availnets.pretty_inspect)" | mac-wifi s
|
79
|
+
```
|
80
|
+
|
81
|
+
This will create a file `available_networks.json` with content looking something like this:
|
82
|
+
|
83
|
+
```bash
|
84
|
+
["....MMobile 2.4G",
|
85
|
+
".@ 3BB_WiFi",
|
86
|
+
".@ AIS SUPER WiFi"]
|
87
|
+
```
|
88
|
+
|
66
89
|
### Seeing the Underlying OS Commands and Output
|
67
90
|
|
68
91
|
If you would like to see the Mac OS commands and their output, you can do so by setting the
|
@@ -119,7 +142,7 @@ session. It can be useful when:
|
|
119
142
|
|
120
143
|
There are a couple of things (that may be surprising) to keep in mind
|
121
144
|
when using the shell. They relate to the fact that local variables
|
122
|
-
and method calls use the same notation in Ruby (use of parentheses
|
145
|
+
and method calls use the same notation in Ruby (since use of parentheses
|
123
146
|
in a method call is optional):
|
124
147
|
|
125
148
|
1) In Ruby, when both a method and a local variable have the same name,
|
@@ -187,8 +210,9 @@ constants or instance variables if you want to create variables in your shell.
|
|
187
210
|
|
188
211
|
```
|
189
212
|
mac-wifi i # prints out wifi info
|
190
|
-
mac-wifi
|
191
|
-
mac-wifi
|
213
|
+
mac-wifi a # prints out names of available networks
|
214
|
+
mac-wifi lsa # prints available networks detailed information
|
215
|
+
mac-wifi pr # prints preferred networks
|
192
216
|
mac-wifi cy # cycles the wifi off and on
|
193
217
|
mac-wifi co a-network a-password # connects to a network requiring a password
|
194
218
|
mac-wifi co a-network # connects to a network _not_ requiring a password
|
@@ -197,6 +221,36 @@ mac-wifi t on && say "Internet connected" # Play audible message when Internet b
|
|
197
221
|
|
198
222
|
#### Interactive Shell Commands
|
199
223
|
|
224
|
+
When in shell mode, commands generally return the target object (e.g. the array of
|
225
|
+
available networks) rather than outputting a nicely formatted string. This may result
|
226
|
+
in the shell outputting that returned value in an ugly way.
|
227
|
+
|
228
|
+
If you don't need the return value but just want to display the value nicely,
|
229
|
+
you can use the `fancy_puts` method to output it nicely. An alias `fp` has been
|
230
|
+
provided for your convenience. You're welcome! For example:
|
231
|
+
|
232
|
+
```
|
233
|
+
[5] pry(#<MacWifi::CommandLineInterface>)> fp pr.first(3)
|
234
|
+
[
|
235
|
+
[0] " AIS SMART Login",
|
236
|
+
[1] " BubblesLive",
|
237
|
+
[2] "#HKAirport Free WiFi"
|
238
|
+
]
|
239
|
+
```
|
240
|
+
|
241
|
+
If you want to surpress output altogether (e.g. if you are using the value in an
|
242
|
+
expression and don't need to print it out, you can simply append `;nil` to the expression
|
243
|
+
and that will be value output to the console. For example:
|
244
|
+
|
245
|
+
```
|
246
|
+
[10] pry(#<MacWifi::CommandLineInterface>)> available_networks = availnets; nil
|
247
|
+
=> nil
|
248
|
+
[11] pry(#<MacWifi::CommandLineInterface>)> availnets.size
|
249
|
+
=> 32
|
250
|
+
```
|
251
|
+
|
252
|
+
**More Examples**
|
253
|
+
|
200
254
|
(For brevity, semicolons are used here to put multiple commands on one line,
|
201
255
|
but these commands could also each be specified on a line of its own.)
|
202
256
|
|
@@ -216,15 +270,15 @@ i
|
|
216
270
|
> @i = i; puts "You are connected on port #{@i[:port]} to #{@i[:network]} on IP address #{@i[:ip_address]}."
|
217
271
|
You are connected on port en0 to .@ AIS SUPER WiFi on IP address 172.27.145.225.
|
218
272
|
|
219
|
-
> puts "There are #{
|
273
|
+
> puts "There are #{pr.size} preferred networks."
|
220
274
|
There are 341 preferred networks.
|
221
275
|
|
222
276
|
# Delete all preferred networks whose names begin with "TOTTGUEST", the hard way:
|
223
|
-
>
|
277
|
+
> pr.grep(/^TOTTGUEST/).each { |n| rm(n) }
|
224
278
|
|
225
279
|
# Delete all preferred networks whose names begin with "TOTTGUEST", the easy way.
|
226
280
|
# rm can take multiple network names, but they must be specified as separate parameters; thus the '*'.
|
227
|
-
> rm(*
|
281
|
+
> rm(*pr.grep(/^TOTTGUEST/))
|
228
282
|
|
229
283
|
# Define a method to wait for the Internet connection to be active.
|
230
284
|
# (This functionality is included in the `till` command.)
|
data/RELEASE_NOTES.md
CHANGED
@@ -1,9 +1,19 @@
|
|
1
|
+
## v1.3.0
|
2
|
+
|
3
|
+
* Add partial JSON and YAML support.
|
4
|
+
* Script moved from bin to exe directory.
|
5
|
+
* Provide `fp` fancy print alias for convenience in shell.
|
6
|
+
* Command renames: 'lsp' -> 'prefnets', 'rm' -> 'rmprefnets'
|
7
|
+
* Add 'availnets' command for list of unique available network names.
|
8
|
+
|
9
|
+
|
1
10
|
## v1.2.0
|
2
11
|
|
3
12
|
* Fix: protect against using command strings shorter than minimum length
|
4
13
|
(e.g. 'c', when more chars are necessary to disambiguate multiple commands).
|
5
14
|
* Improvements in help text and readme.
|
6
15
|
|
16
|
+
|
7
17
|
## v1.1.0
|
8
18
|
|
9
19
|
* Sort available networks alphabetically, left justify ssid's.
|
data/{bin → exe}/mac-wifi
RENAMED
@@ -19,14 +19,13 @@
|
|
19
19
|
# License: MIT License
|
20
20
|
|
21
21
|
|
22
|
-
|
23
22
|
require 'shellwords'
|
24
23
|
require 'tempfile'
|
25
24
|
|
26
25
|
module MacWifi
|
27
26
|
|
28
27
|
# This version must be kept in sync with the version in the gemspec file.
|
29
|
-
VERSION = '1.
|
28
|
+
VERSION = '1.3.0'
|
30
29
|
|
31
30
|
|
32
31
|
class BaseModel
|
@@ -184,11 +183,16 @@ class BaseModel
|
|
184
183
|
|
185
184
|
|
186
185
|
# Waits for the Internet connection to be in the desired state.
|
187
|
-
# @param
|
188
|
-
# @param wait_interval_in_secs sleeps this interval between retries
|
186
|
+
# @param target_status must be in [:conn, :disc, :off, :on]; waits for that state
|
187
|
+
# @param wait_interval_in_secs sleeps this interval between retries; if nil or absent,
|
188
|
+
# a default will be provided
|
189
189
|
#
|
190
|
-
def till(
|
190
|
+
def till(target_status, wait_interval_in_secs = nil)
|
191
191
|
|
192
|
+
# One might ask, why not just put the 0.5 up there as the default argument.
|
193
|
+
# We could do that, but we'd still need the line below in case nil
|
194
|
+
# was explicitly specified. The default argument of nil above emphasizes that
|
195
|
+
# the absence of an argument and a specification of nil will behave identically.
|
192
196
|
wait_interval_in_secs ||= 0.5
|
193
197
|
|
194
198
|
finished_predicates = {
|
@@ -198,10 +202,11 @@ class BaseModel
|
|
198
202
|
off: -> { ! wifi_on? }
|
199
203
|
}
|
200
204
|
|
201
|
-
finished_predicate = finished_predicates[
|
205
|
+
finished_predicate = finished_predicates[target_status]
|
202
206
|
|
203
207
|
if finished_predicate.nil?
|
204
|
-
raise ArgumentError.new(
|
208
|
+
raise ArgumentError.new(
|
209
|
+
"Option must be one of #{finished_predicates.keys.inspect}. Was: #{target_status.inspect}")
|
205
210
|
end
|
206
211
|
|
207
212
|
loop do
|
@@ -280,10 +285,21 @@ class MacOsModel < BaseModel
|
|
280
285
|
return [reformat_line.(header_line)] + data_lines
|
281
286
|
end
|
282
287
|
end
|
288
|
+
|
289
|
+
|
283
290
|
raise "Unable to get available network information after #{max_attempts} attempts."
|
284
291
|
end
|
285
292
|
|
286
293
|
|
294
|
+
# @return an array of unique available network names only, sorted alphabetically
|
295
|
+
def available_network_names
|
296
|
+
available_network_info[1..-1] \
|
297
|
+
.map { |line| line[0..32].rstrip } \
|
298
|
+
.uniq \
|
299
|
+
.sort { |s1, s2| s1.casecmp(s2) }
|
300
|
+
end
|
301
|
+
|
302
|
+
|
287
303
|
# Returns data pertaining to "preferred" networks, many/most of which will probably not be available.
|
288
304
|
def preferred_networks
|
289
305
|
lines = run_os_command("networksetup -listpreferredwirelessnetworks #{wifi_hardware_port}").split("\n")
|
@@ -445,7 +461,7 @@ end
|
|
445
461
|
|
446
462
|
class CommandLineInterface
|
447
463
|
|
448
|
-
attr_reader :model
|
464
|
+
attr_reader :model, :interactive_mode
|
449
465
|
|
450
466
|
class Command < Struct.new(:min_string, :max_string, :action); end
|
451
467
|
|
@@ -461,26 +477,28 @@ class CommandLineInterface
|
|
461
477
|
HELP_TEXT = "
|
462
478
|
mac-wifi version #{VERSION} -- Available commands are:
|
463
479
|
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
n[etwork_name]
|
473
|
-
on
|
474
|
-
of[f]
|
475
|
-
pa[ssword] network-name
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
480
|
+
a[vailnets] - array of names of the available networks
|
481
|
+
ci - connected to Internet (not just wifi on)?
|
482
|
+
co[nnect] network-name - turns wifi on, connects to network-name
|
483
|
+
cy[cle] - turns wifi off, then on, preserving network selection
|
484
|
+
d[isconnect] - disconnects from current network, does not turn off wifi
|
485
|
+
h[elp] - prints this help
|
486
|
+
i[nfo] - a hash of wifi-related information
|
487
|
+
l[savailnets] - details about available networks
|
488
|
+
n[etwork_name] - name (SSID) of currently connected network
|
489
|
+
on - turns wifi on
|
490
|
+
of[f] - turns wifi off
|
491
|
+
pa[ssword] network-name - password for preferred network-name
|
492
|
+
pr[efnets] - preferred (not necessarily available) networks
|
493
|
+
q[uit] - exits this program (interactive shell mode only) (see also 'x')
|
494
|
+
r[mprefnets] network-name - removes network-name from the preferred networks list
|
495
|
+
(can provide multiple names separated by spaces)
|
496
|
+
s[hell] - opens an interactive pry shell (command line only)
|
497
|
+
t[ill] - returns when the desired Internet connection state is true. Options:
|
498
|
+
1) 'on'/:on, 'off'/:off, 'conn'/:conn, or 'disc'/:disc
|
499
|
+
2) wait interval, in seconds (optional, defaults to 0.5 seconds)
|
500
|
+
w[ifion] - is the wifi on?
|
501
|
+
x[it] - exits this program (interactive shell mode only) (see also 'q')
|
484
502
|
|
485
503
|
When in interactive shell mode:
|
486
504
|
* use quotes for string parameters such as method names.
|
@@ -495,6 +513,8 @@ When in interactive shell mode:
|
|
495
513
|
end
|
496
514
|
|
497
515
|
|
516
|
+
# Until command line option parsing is added, the only way to specify
|
517
|
+
# verbose mode is in the environment variable MAC_WIFI_OPTS.
|
498
518
|
def verbose_mode
|
499
519
|
/-v/.match(ENV['MAC_WIFI_OPTS'])
|
500
520
|
end
|
@@ -505,9 +525,10 @@ When in interactive shell mode:
|
|
505
525
|
end
|
506
526
|
|
507
527
|
|
528
|
+
# @return true if awesome_print is available (after requiring it), else false after requiring 'pp'.
|
508
529
|
# We'd like to use awesome_print if it is available, but not require it.
|
509
|
-
# So, we try to require it, but if that fails, we fall back to using pp (pretty print)
|
510
|
-
#
|
530
|
+
# So, we try to require it, but if that fails, we fall back to using pp (pretty print),
|
531
|
+
# which is included in Ruby distributions without the need to install a gem.
|
511
532
|
def awesome_print_available?
|
512
533
|
if @awesome_print_available.nil? # first time here
|
513
534
|
begin
|
@@ -523,8 +544,19 @@ When in interactive shell mode:
|
|
523
544
|
end
|
524
545
|
|
525
546
|
|
547
|
+
def fancy_string(object)
|
548
|
+
awesome_print_available? ? object.ai : object.pretty_inspect
|
549
|
+
end
|
550
|
+
|
551
|
+
|
526
552
|
def fancy_puts(object)
|
527
|
-
|
553
|
+
puts fancy_string(object)
|
554
|
+
end
|
555
|
+
alias_method :fp, :fancy_puts
|
556
|
+
|
557
|
+
|
558
|
+
def puts_unless_interactive(string)
|
559
|
+
puts(string) unless interactive_mode
|
528
560
|
end
|
529
561
|
|
530
562
|
|
@@ -549,13 +581,17 @@ When in interactive shell mode:
|
|
549
581
|
# Runs a pry session in the context of this object.
|
550
582
|
# Commands and options specified on the command line can also be specified in the shell.
|
551
583
|
def run_shell
|
552
|
-
if
|
584
|
+
if interactive_mode
|
553
585
|
puts "Already in shell."
|
554
586
|
return
|
555
587
|
end
|
556
588
|
|
557
589
|
@interactive_mode = true
|
558
590
|
|
591
|
+
# For conveniently calling to_json or to_yaml on an object:
|
592
|
+
require 'json'
|
593
|
+
require 'yaml'
|
594
|
+
|
559
595
|
begin
|
560
596
|
require 'pry'
|
561
597
|
rescue LoadError
|
@@ -579,22 +615,14 @@ When in interactive shell mode:
|
|
579
615
|
end
|
580
616
|
|
581
617
|
|
582
|
-
def output_network_password(network_name, password)
|
583
|
-
output = %Q{Preferred network "#{network_name}" }
|
584
|
-
output << (password ? %Q{stored password is: "#{password}".} : "has no stored password.")
|
585
|
-
puts output
|
586
|
-
password
|
587
|
-
end
|
588
|
-
|
589
|
-
|
590
618
|
# For use by the shell; when typing a command and options, it is passed to process_command_line
|
591
619
|
def method_missing(method_name, *options)
|
592
620
|
method_name = method_name.to_s
|
593
|
-
|
594
|
-
if
|
621
|
+
method_exists = !! find_command_action(method_name)
|
622
|
+
if method_exists
|
595
623
|
process_command_line(method_name, options)
|
596
624
|
else
|
597
|
-
puts(%Q{"#{method_name}" is not a valid command or option. If you intend for this to be a string literal, use quotes.})
|
625
|
+
puts(%Q{"#{method_name}" is not a valid command or option. If you intend for this to be a string literal, use quotes or %q/Q{}.})
|
598
626
|
end
|
599
627
|
end
|
600
628
|
|
@@ -602,9 +630,9 @@ When in interactive shell mode:
|
|
602
630
|
# Processes the command (ARGV[0]) and any relevant options (ARGV[1..-1]).
|
603
631
|
#
|
604
632
|
# CAUTION! In interactive mode, any strings entered (e.g. a network name) MUST
|
605
|
-
# be in a form that Ruby will recognize as a string,
|
606
|
-
# %q, %Q, etc.
|
607
|
-
# method_missing!
|
633
|
+
# be in a form that the Ruby interpreter will recognize as a string,
|
634
|
+
# i.e. single or double quotes, %q, %Q, etc.
|
635
|
+
# Otherwise it will assume it's a method name and pass it to method_missing!
|
608
636
|
def process_command_line(command, options)
|
609
637
|
action = find_command_action(command)
|
610
638
|
if action
|
@@ -618,7 +646,7 @@ When in interactive shell mode:
|
|
618
646
|
|
619
647
|
|
620
648
|
def quit
|
621
|
-
if
|
649
|
+
if interactive_mode
|
622
650
|
exit(0)
|
623
651
|
else
|
624
652
|
puts "This command can only be run in shell mode."
|
@@ -626,9 +654,16 @@ When in interactive shell mode:
|
|
626
654
|
end
|
627
655
|
|
628
656
|
|
657
|
+
def cmd_a
|
658
|
+
info = model.available_network_names
|
659
|
+
puts_unless_interactive(fancy_string(info))
|
660
|
+
info
|
661
|
+
end
|
662
|
+
|
663
|
+
|
629
664
|
def cmd_ci
|
630
665
|
connected = model.connected_to_internet?
|
631
|
-
|
666
|
+
puts_unless_interactive("Connected to Internet: #{connected}")
|
632
667
|
connected
|
633
668
|
end
|
634
669
|
|
@@ -655,30 +690,21 @@ When in interactive shell mode:
|
|
655
690
|
|
656
691
|
def cmd_i
|
657
692
|
info = model.wifi_info
|
658
|
-
|
693
|
+
puts_unless_interactive(fancy_string(info))
|
659
694
|
info
|
660
695
|
end
|
661
696
|
|
662
697
|
|
663
698
|
def cmd_lsa
|
664
699
|
info = model.available_network_info
|
665
|
-
|
700
|
+
puts_unless_interactive(fancy_string(info))
|
666
701
|
info
|
667
702
|
end
|
668
703
|
|
669
704
|
|
670
|
-
def cmd_lsp
|
671
|
-
networks = model.preferred_networks
|
672
|
-
puts networks unless @interactive_mode
|
673
|
-
networks
|
674
|
-
end
|
675
|
-
|
676
|
-
|
677
705
|
def cmd_n
|
678
706
|
name = model.connected_network_name
|
679
|
-
|
680
|
-
puts "Network (SSID) name: #{name ? name : '[none]'}"
|
681
|
-
end
|
707
|
+
puts_unless_interactive("Network (SSID) name: #{name ? name : '[none]'}")
|
682
708
|
name
|
683
709
|
end
|
684
710
|
|
@@ -695,11 +721,24 @@ When in interactive shell mode:
|
|
695
721
|
|
696
722
|
def cmd_pa(network)
|
697
723
|
password = model.preferred_network_password(network)
|
698
|
-
|
724
|
+
|
725
|
+
unless interactive_mode
|
726
|
+
output = %Q{Preferred network "#{network_name}" }
|
727
|
+
output << (password ? %Q{stored password is: "#{password}".} : "has no stored password.")
|
728
|
+
puts output
|
729
|
+
end
|
730
|
+
|
699
731
|
password
|
700
732
|
end
|
701
733
|
|
702
734
|
|
735
|
+
def cmd_pr
|
736
|
+
networks = model.preferred_networks
|
737
|
+
puts_unless_interactive(fancy_string(networks))
|
738
|
+
networks
|
739
|
+
end
|
740
|
+
|
741
|
+
|
703
742
|
def cmd_q
|
704
743
|
quit
|
705
744
|
end
|
@@ -724,7 +763,7 @@ When in interactive shell mode:
|
|
724
763
|
|
725
764
|
def cmd_w
|
726
765
|
on = model.wifi_on?
|
727
|
-
|
766
|
+
puts_unless_interactive("Wifi on: #{on}")
|
728
767
|
on
|
729
768
|
end
|
730
769
|
|
@@ -736,20 +775,21 @@ When in interactive shell mode:
|
|
736
775
|
|
737
776
|
def commands
|
738
777
|
@commands_ ||= [
|
778
|
+
Command.new('a', 'availnets', -> (*_options) { cmd_a }),
|
739
779
|
Command.new('ci', 'ci', -> (*_options) { cmd_ci }),
|
740
780
|
Command.new('co', 'connect', -> (*options) { cmd_co(*options) }),
|
741
781
|
Command.new('cy', 'cycle', -> (*_options) { cmd_cy }),
|
742
782
|
Command.new('d', 'disconnect', -> (*_options) { cmd_d }),
|
743
783
|
Command.new('h', 'help', -> (*_options) { cmd_h }),
|
744
784
|
Command.new('i', 'info', -> (*_options) { cmd_i }),
|
745
|
-
Command.new('
|
746
|
-
Command.new('lsp', 'lspreferred', -> (*_options) { cmd_lsp }),
|
785
|
+
Command.new('l', 'lsavailnets', -> (*_options) { cmd_lsa }),
|
747
786
|
Command.new('n', 'network_name', -> (*_options) { cmd_n }),
|
748
787
|
Command.new('of', 'off', -> (*_options) { cmd_of }),
|
749
788
|
Command.new('on', 'on', -> (*_options) { cmd_on }),
|
750
789
|
Command.new('pa', 'password', -> (*options) { cmd_pa(*options) }),
|
790
|
+
Command.new('pr', 'prefnets', -> (*_options) { cmd_pr }),
|
751
791
|
Command.new('q', 'quit', -> (*_options) { cmd_q }),
|
752
|
-
Command.new('r', '
|
792
|
+
Command.new('r', 'rmprefnets', -> (*options) { cmd_r(*options) }),
|
753
793
|
Command.new('s', 'shell', -> (*_options) { cmd_s }),
|
754
794
|
Command.new('t', 'till', -> (*options) { cmd_t(*options) }),
|
755
795
|
Command.new('w', 'wifion', -> (*_options) { cmd_w }),
|
@@ -774,65 +814,86 @@ When in interactive shell mode:
|
|
774
814
|
begin
|
775
815
|
process_command_line(ARGV[0], ARGV[1..-1])
|
776
816
|
rescue BadCommandError => error
|
777
|
-
separator_line = "#{'
|
817
|
+
separator_line = "! #{'-' * 75} !\n"
|
778
818
|
puts '' << separator_line << error.to_s << "\n" << separator_line
|
779
819
|
exit(-1)
|
780
820
|
end
|
781
821
|
end
|
782
822
|
end
|
783
|
-
end
|
784
823
|
|
785
824
|
|
825
|
+
class Main
|
786
826
|
|
787
|
-
# @return true if this file is being run as a script, else false
|
788
|
-
#
|
789
|
-
# This file could be called as a script in either of these two ways:
|
790
|
-
#
|
791
|
-
# 1) by loading this file directly, or
|
792
|
-
# 2) by running as a gem executable's binstub, in (relatively) '../../../
|
793
|
-
#
|
794
|
-
# For example, I get this when running this file as a gem:
|
795
|
-
#
|
796
|
-
# $0
|
797
|
-
#
|
827
|
+
# @return true if this file is being run as a script, else false
|
828
|
+
#
|
829
|
+
# This file could be called as a script in either of these two ways:
|
830
|
+
#
|
831
|
+
# 1) by loading this file directly, or
|
832
|
+
# 2) by running as a gem executable's binstub, in (relatively) '../../../exe'
|
833
|
+
#
|
834
|
+
# For example, I get this when running this file as a gem and running:
|
835
|
+
#
|
836
|
+
# puts "$0: #{$0}"
|
837
|
+
# puts "__FILE__: #{__FILE__}"
|
838
|
+
# puts "GEM_PATH: #{ENV['GEM_PATH']}"
|
839
|
+
#
|
840
|
+
# $0: /Users/kbennett/.rvm/gems/ruby-2.4.1/bin/mac-wifi
|
841
|
+
# __FILE__: /Users/kbennett/.rvm/gems/ruby-2.4.1/gems/mac-wifi-1.2.0/exe/mac-wifi
|
842
|
+
# GEM_PATH: /Users/kbennett/.rvm/gems/ruby-2.4.1:/Users/kbennett/.rvm/gems/ruby-2.4.1@global
|
798
843
|
|
799
|
-
def running_as_script?
|
800
844
|
|
801
|
-
|
802
|
-
main_file = File.expand_path($0)
|
845
|
+
def running_as_script?
|
803
846
|
|
804
|
-
|
805
|
-
|
847
|
+
this_source_file = File.expand_path(__FILE__)
|
848
|
+
called_file = File.expand_path($0)
|
849
|
+
return true if called_file == this_source_file
|
806
850
|
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
# puts "GEM_PATH = #{ENV['GEM_PATH']}"
|
851
|
+
this_source_file_basename = File.basename(this_source_file)
|
852
|
+
called_file_basename = File.basename(called_file)
|
853
|
+
return false if called_file_basename != this_source_file_basename
|
811
854
|
|
812
|
-
|
813
|
-
|
855
|
+
# If here, then filespecs are different but have the same basename.
|
856
|
+
gem_roots = ENV['GEM_PATH'].split(File::PATH_SEPARATOR)
|
857
|
+
as_script = gem_roots.any? do |gem_root|
|
858
|
+
binstub_candidate_name = File.join(gem_root, 'bin', called_file_basename)
|
859
|
+
up_4_from_this_source_file = File.expand_path(File.join(this_source_file, '..', '..', '..', '..'))
|
860
|
+
found = ($0 == binstub_candidate_name) && (gem_root == up_4_from_this_source_file)
|
861
|
+
found
|
862
|
+
end
|
814
863
|
|
815
|
-
|
816
|
-
gem_paths = ENV['GEM_PATH'].split(File::PATH_SEPARATOR)
|
817
|
-
gem_paths.any? do |path|
|
818
|
-
path_plus_basename = File.join(path, 'bin', main_file_basename)
|
819
|
-
__file__up_4 = File.expand_path(File.join(this_file, '..', '..', '..', '..'))
|
820
|
-
($0 == path_plus_basename) && (path == __file__up_4)
|
864
|
+
as_script
|
821
865
|
end
|
822
|
-
end
|
823
866
|
|
824
867
|
|
825
|
-
def assert_os_is_mac_os
|
826
|
-
|
827
|
-
|
868
|
+
def assert_os_is_mac_os
|
869
|
+
host_os = RbConfig::CONFIG["host_os"]
|
870
|
+
unless /darwin/.match(host_os) # e.g. "darwin16.4.0"
|
871
|
+
raise "This program currently works only on Mac OS. Platform is '#{host_os}'."
|
872
|
+
end
|
828
873
|
end
|
829
|
-
end
|
830
874
|
|
831
|
-
assert_os_is_mac_os
|
832
875
|
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
876
|
+
def call
|
877
|
+
assert_os_is_mac_os
|
878
|
+
|
879
|
+
# If this file is being called as a script, run it.
|
880
|
+
# Else, it may be loaded to use the model in a different way.
|
881
|
+
if running_as_script?
|
882
|
+
begin
|
883
|
+
MacWifi::CommandLineInterface.new.call
|
884
|
+
rescue => error
|
885
|
+
puts error
|
886
|
+
stack_trace_filename = './mac-wifi-error-stack-trace.txt'
|
887
|
+
File.write(stack_trace_filename, caller.join("\n"))
|
888
|
+
puts "Exiting. Stack trace written to '#{File.expand_path(stack_trace_filename)}'."
|
889
|
+
exit(-1)
|
890
|
+
end
|
891
|
+
end
|
892
|
+
end
|
837
893
|
end
|
838
894
|
|
895
|
+
|
896
|
+
end # module MacWifi
|
897
|
+
|
898
|
+
|
899
|
+
MacWifi::Main.new.call
|
data/mac-wifi.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# When changing the version, also change the version and the help text in the README.
|
3
|
-
VERSION = '1.
|
3
|
+
VERSION = '1.3.0'
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "mac-wifi"
|
@@ -13,13 +13,14 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.license = "MIT"
|
14
14
|
|
15
15
|
spec.files = `git ls-files`.split($/)
|
16
|
-
spec.
|
17
|
-
spec.
|
18
|
-
spec.
|
16
|
+
spec.bindir = 'exe'
|
17
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
|
+
# spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
# spec.require_paths = ['lib']
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
23
24
|
|
24
25
|
end
|
25
26
|
|
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mac-wifi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Bennett
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
12
|
-
dependencies:
|
11
|
+
date: 2017-12-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
13
55
|
description: A command line interface for managing wifi on a Mac.
|
14
56
|
email:
|
15
57
|
- keithrbennett@gmail.com
|
@@ -23,7 +65,7 @@ files:
|
|
23
65
|
- LICENSE.txt
|
24
66
|
- README.md
|
25
67
|
- RELEASE_NOTES.md
|
26
|
-
-
|
68
|
+
- exe/mac-wifi
|
27
69
|
- mac-wifi.gemspec
|
28
70
|
- spec/mac-wifi_spec.rb
|
29
71
|
homepage: https://github.com/keithrbennett/mac-wifi
|
@@ -46,9 +88,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
46
88
|
version: '0'
|
47
89
|
requirements: []
|
48
90
|
rubyforge_project:
|
49
|
-
rubygems_version: 2.6.
|
91
|
+
rubygems_version: 2.6.14
|
50
92
|
signing_key:
|
51
93
|
specification_version: 4
|
52
94
|
summary: Mac wifi utility
|
53
|
-
test_files:
|
54
|
-
- spec/mac-wifi_spec.rb
|
95
|
+
test_files: []
|