wifi-wand 2.18.0 → 2.19.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3618e39101d073349d544a930672b436ed2da7d3c622689e9e8203424ddd44d
4
- data.tar.gz: c99cb63e34ff7823a7c56c95d0483e1483dcae26df62718fcf01f4cc00dd0ca8
3
+ metadata.gz: b9da3f2d69b3deb5046f7ea3394a43235733d9784c41bf372febdcca09c5d15d
4
+ data.tar.gz: 63f83f663cb0ad11f8fe5087aeda730e8dcd4a5108dad4b84c653d37cd2cd21e
5
5
  SHA512:
6
- metadata.gz: f07b8f1498aa244c54a1f8d5be2b78f14e3e4c83191426afd38dec01c735e023182bd5192dd7e64e08b1364620889d5d2a7b9b0d228be51dd51778f5f457c2e9
7
- data.tar.gz: 795b4bfba2b4a5b5d425caeef7875a68a76886f6672b694265c70caf835b624d38cbc10fd82a89835cf1b8efa19eed9cae523c35b4d5696f74b9743789711b51
6
+ metadata.gz: 0be501742d8ad2e8ac317bf622b6f448af53293a8b90e563768aba12cf49a79488b3e8897928300be1150c6d021aa531c2fb809db0e9ff1346813268b347693c
7
+ data.tar.gz: a645d6e65afb64c19bbca0dd3443fc1b92067084897384df8da330df876093bfd5906b754dc18826b59810aeab65050dc9a64918692a4f291361ada7f87a9b2c
data/RELEASE_NOTES.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## v2.19.1
2
+
3
+ * Fix connected_network_name when wifi is on but no network is connected.
4
+
5
+
6
+ ## v2.19.0
7
+
8
+ * Replace `networksetup` with Swift script for connecting to a network.
9
+ * For getting connected network name, replace `networksetup` with `ipconfig`.
10
+
11
+
1
12
  ## v2.18.0
2
13
 
3
14
  * Remove 'hotspot_login_required' informational item and logic (was not working correctly).
@@ -11,25 +11,6 @@ class BaseModel
11
11
 
12
12
  attr_accessor :wifi_interface, :verbose_mode
13
13
 
14
- class OsCommandError < RuntimeError
15
- attr_reader :exitstatus, :command, :text
16
-
17
- def initialize(exitstatus, command, text)
18
- @exitstatus = exitstatus
19
- @command = command
20
- @text = text
21
- end
22
-
23
- def to_s
24
- "#{self.class.name}: Error code #{exitstatus}, command = #{command}, text = #{text}"
25
- end
26
-
27
- def to_h
28
- { exitstatus: exitstatus, command: command, text: text }
29
- end
30
- end
31
-
32
-
33
14
  def initialize(options)
34
15
  @verbose_mode = options.verbose
35
16
 
@@ -274,5 +255,23 @@ class BaseModel
274
255
  def wifi_interface
275
256
  @wifi_interface ||= detect_wifi_interface
276
257
  end
258
+
259
+ class OsCommandError < RuntimeError
260
+ attr_reader :exitstatus, :command, :text
261
+
262
+ def initialize(exitstatus, command, text)
263
+ @exitstatus = exitstatus
264
+ @command = command
265
+ @text = text
266
+ end
267
+
268
+ def to_s
269
+ "#{self.class.name}: Error code #{exitstatus}, command = #{command}, text = #{text}"
270
+ end
271
+
272
+ def to_h
273
+ { exitstatus: exitstatus, command: command, text: text }
274
+ end
275
+ end
277
276
  end
278
277
  end
@@ -96,7 +96,7 @@ class MacOsModel < BaseModel
96
96
 
97
97
 
98
98
  # This method is called by BaseModel#connect to do the OS-specific connection logic.
99
- def os_level_connect(network_name, password = nil)
99
+ def os_level_connect_using_networksetup(network_name, password = nil)
100
100
  command = "networksetup -setairportnetwork #{wifi_interface} #{Shellwords.shellescape(network_name)}"
101
101
  if password
102
102
  command << ' ' << Shellwords.shellescape(password)
@@ -104,6 +104,17 @@ class MacOsModel < BaseModel
104
104
  run_os_command(command)
105
105
  end
106
106
 
107
+ def os_level_connect_using_swift(network_name, password = nil)
108
+ ensure_swift_and_corewlan_present
109
+ args = [Shellwords.shellescape(network_name)]
110
+ args << Shellwords.shellescape(password) if password
111
+ run_swift_command('WifiNetworkConnecter', *args)
112
+ end
113
+
114
+ def os_level_connect(network_name, password = nil)
115
+ os_level_connect_using_swift(network_name, password)
116
+ end
117
+
107
118
 
108
119
  # @return:
109
120
  # If the network is in the preferred networks list
@@ -151,10 +162,10 @@ class MacOsModel < BaseModel
151
162
  def connected_network_name
152
163
  return nil unless wifi_on? # no need to try
153
164
 
154
- command_output = run_os_command("networksetup -getairportnetwork #{wifi_interface}")
155
- connected_prefix = 'Current Wi-Fi Network: '
156
- connected = Regexp.new(connected_prefix).match?(command_output)
157
- connected ? command_output.split(connected_prefix).last.chomp : nil
165
+ command_output = run_os_command("ipconfig getsummary #{wifi_interface} | grep ' SSID :'", false)
166
+ return nil if command_output.empty?
167
+
168
+ command_output.split('SSID :').last.strip
158
169
  end
159
170
 
160
171
 
@@ -306,12 +317,12 @@ class MacOsModel < BaseModel
306
317
  system("swift -e 'import CoreWLAN' >/dev/null 2>&1")
307
318
  end
308
319
 
309
- def run_swift_command(basename)
320
+
321
+ def run_swift_command(basename, *args)
310
322
  ensure_swift_and_corewlan_present
311
- swift_filespec = File.join(
312
- File.dirname(__FILE__), "../../../swift/#{basename}.swift"
313
- )
314
- command = "swift #{swift_filespec}"
323
+ swift_filespec = File.absolute_path(File.join(File.dirname(__FILE__), "../../../swift/#{basename}.swift"))
324
+ argv = ['swift', swift_filespec] + args
325
+ command = argv.compact.join(' ')
315
326
  run_os_command(command)
316
327
  end
317
328
  end
@@ -1,3 +1,3 @@
1
1
  module WifiWand
2
- VERSION = '2.18.0' unless defined?(VERSION)
2
+ VERSION = '2.19.1' unless defined?(VERSION)
3
3
  end
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env swift
2
+
3
+ import Foundation
4
+ import CoreWLAN
5
+
6
+ // Function to connect to a network
7
+ func connectToNetwork(ssid: String, password: String?) -> Bool {
8
+ guard let interface = CWWiFiClient.shared().interface() else {
9
+ print("Error: Could not get WiFi interface")
10
+ exit(1)
11
+ }
12
+
13
+ do {
14
+ // Scan for networks
15
+ let networks = try interface.scanForNetworks(withSSID: ssid.data(using: .utf8))
16
+ guard let network = networks.first else {
17
+ print("Error: Network not found")
18
+ exit(1)
19
+ }
20
+
21
+ // Connect to the network
22
+ try interface.associate(to: network, password: password)
23
+ return true
24
+ } catch let error as NSError {
25
+ // Handle specific error cases
26
+ switch error.code {
27
+ case -3931: // Already connected
28
+ print("Already connected to network")
29
+ return true
30
+ case -3906: // Invalid password
31
+ print("Error: Invalid password")
32
+ case -3905: // Network not found
33
+ print("Error: Network not found")
34
+ case -3908: // Timeout
35
+ print("Error: Connection timeout")
36
+ case -3903: // Authentication failed
37
+ print("Error: Authentication failed - might require captive portal login")
38
+ default:
39
+ print("Error connecting: \(error.localizedDescription) (code: \(error.code))")
40
+ }
41
+ exit(1)
42
+ }
43
+ }
44
+
45
+ // Parse command line arguments
46
+ if CommandLine.arguments.count < 2 {
47
+ print("Usage: \(CommandLine.arguments[0]) SSID [password]")
48
+ exit(1)
49
+ }
50
+
51
+ let ssid = CommandLine.arguments[1]
52
+ let password = CommandLine.arguments.count > 2 ? CommandLine.arguments[2] : nil
53
+
54
+ if connectToNetwork(ssid: ssid, password: password) {
55
+ print("ok")
56
+ exit(0)
57
+ }
@@ -8,6 +8,6 @@ if let wifiInterface = CWWiFiClient.shared().interface() {
8
8
  print("ok")
9
9
  exit(0)
10
10
  } else {
11
- print("error")
11
+ print("Failed to disconnect. One possible reason: XCode not installed.")
12
12
  exit(1)
13
13
  }
data/wifi-wand.gemspec CHANGED
@@ -21,6 +21,9 @@ Gem::Specification.new do |spec|
21
21
  # spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
22
  spec.add_dependency('awesome_print', '>= 1.9.2', '< 2')
23
23
 
24
+ # ostruct will no longer be part of the default gems starting from Ruby 3.5.0.
25
+ spec.add_dependency('ostruct')
26
+
24
27
  # still on version 0, no need to exclude future versions, but need bug fix for pry not pry'ing
25
28
  # on last line of method:
26
29
  spec.add_dependency('pry', '>= 0.14.2')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wifi-wand
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.18.0
4
+ version: 2.19.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Bennett
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-09 00:00:00.000000000 Z
11
+ date: 2024-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print
@@ -30,6 +30,20 @@ dependencies:
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: ostruct
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: pry
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -135,6 +149,7 @@ files:
135
149
  - sample-available-networks.yaml
136
150
  - spec/wifi-wand/models/base_model_spec.rb
137
151
  - swift/AvailableWifiNetworkLister.swift
152
+ - swift/WifiNetworkConnecter.swift
138
153
  - swift/WifiNetworkDisconecter.swift
139
154
  - test-data/invalid-byte-sequence-network-names.txt
140
155
  - wifi-wand.gemspec
@@ -157,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
172
  - !ruby/object:Gem::Version
158
173
  version: '0'
159
174
  requirements: []
160
- rubygems_version: 3.5.9
175
+ rubygems_version: 3.5.23
161
176
  signing_key:
162
177
  specification_version: 4
163
178
  summary: Mac WiFi utility