Skip to content

Commit

Permalink
Improvements on local address
Browse files Browse the repository at this point in the history
  • Loading branch information
ErrorErrorError committed Jul 1, 2020
1 parent b6bec17 commit 50beb8e
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 13 deletions.
21 changes: 15 additions & 6 deletions HeliPort/Appearance/StatusMenu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -377,14 +377,23 @@ final class StatusMenu: NSMenu, NSMenuDelegate {
var staInfo = station_info_t()
if self.status == ITL80211_S_RUN && get_station_info(&staInfo) == KERN_SUCCESS {
let macAddress = String(self.macItem.title)
.replacingOccurrences(of: "Address: ", with: "", options: .regularExpression, range: nil)
let ipInfo = NetworkManager.getCurrentIpAddress(matchingMAC: macAddress)
.replacingOccurrences(of: NSLocalizedString("Address: ", comment: ""),
with: "",
options: .regularExpression, range: nil)
let ipAddress = NetworkManager.getLocalAddress(bsd: String(self.bsdItem.title)
.replacingOccurrences(of:
NSLocalizedString("Interface Name: ", comment: ""),
with: "",
options: .regularExpression,
range: nil))
let routerAddress = NetworkManager.getRouterAddress(matchingMAC: macAddress)
let isReachable = NetworkManager.checkConnectionReachability(station: staInfo)
Log.debug(String(format: "current rate=%03d", staInfo.rate))
disconnectName = String(cString: &staInfo.ssid.0)
ipAddr = ipInfo.0
routerAddr = ipInfo.1
internet = NetworkManager.checkConnectionReachability(station: staInfo) ? "Reachable" : "Unreachable"
security = "Unknown"
ipAddr = ipAddress ?? NSLocalizedString("Unknown", comment: "")
routerAddr = routerAddress ?? NSLocalizedString("Unknown", comment: "")
internet = NSLocalizedString(isReachable ? "Reachable" : "Unreachable", comment: "")
security = NSLocalizedString("Unknown", comment: "")
bssid = String(format: "%02x:%02x:%02x:%02x:%02x:%02x",
staInfo.bssid.0,
staInfo.bssid.1,
Expand Down
51 changes: 44 additions & 7 deletions HeliPort/NetworkInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -227,11 +227,11 @@ class NetworkManager {
}

// from https://stackoverflow.com/a/53130321
class func getCurrentIpAddress(matchingMAC: String) -> (String, String) {
class func getRouterAddress(matchingMAC: String) -> String? {
let cmd = "for i in $(ifconfig -lu); do if ifconfig $i | grep -q \"status: active\" ; then echo $i; fi; done"
let interfaceString = runCommand(cmd)
let interfaceArray = interfaceString.components(separatedBy: "\n")
var ipAndRouter = (NSLocalizedString("Unknown", comment: ""), NSLocalizedString("Unknown", comment: ""))
var addr: String?
for int in interfaceArray.indices {
if interfaceArray[int].hasPrefix("en") {
let mac = NetworkManager.runCommand(
Expand All @@ -241,21 +241,58 @@ class NetworkManager {
"cut -d\\ -f2"
).trimmingCharacters(in: .whitespacesAndNewlines)
if mac == matchingMAC {
let localIp = NetworkManager.runCommand("ipconfig getifaddr \(interfaceArray[int])")
.trimmingCharacters(in: .whitespacesAndNewlines)
let routerIp = NetworkManager.runCommand("netstat -rn | " +
"awk '$1 ~ /default/' | " +
"awk '$4 ~ /\(interfaceArray[int])/' | " +
"awk 'NR==1' | " +
"awk '{print $2}'"
).replacingOccurrences(of: "gateway:", with: "", options: .regularExpression, range: nil)
.trimmingCharacters(in: .whitespacesAndNewlines)
ipAndRouter.0 = localIp.isEmpty ? ipAndRouter.0 : localIp
ipAndRouter.1 = routerIp.isEmpty ? ipAndRouter.1 : routerIp
addr = routerIp
}
}
}
return ipAndRouter
return addr
}

// from https://stackoverflow.com/questions/30748480/swift-get-devices-wifi-ip-address/30754194#30754194
class func getLocalAddress(bsd: String) -> String? {
// Get list of all interfaces on the local machine:
var ifaddr: UnsafeMutablePointer<ifaddrs>?
guard getifaddrs(&ifaddr) == 0 else { return nil }
guard let firstAddr = ifaddr else { return nil }
var ipV4: String?
var ipV6: String?
// For each interface ...
for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
let interface = ifptr.pointee
// Check for IPv4 or IPv6 interface:
let addrFamily = interface.ifa_addr.pointee.sa_family
if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
// Check interface name:
let name = String(cString: interface.ifa_name)
if name == bsd {
// Convert interface address to a human readable string:
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len),
&hostname, socklen_t(hostname.count),
nil, socklen_t(0), NI_NUMERICHOST)
if addrFamily == UInt8(AF_INET) {
ipV4 = String(cString: hostname)
} else if addrFamily == UInt8(AF_INET6) {
ipV6 = String(cString: hostname)
}
}
}
}
freeifaddrs(ifaddr)
if ipV4 != nil {
return ipV4
} else if ipV6 != nil {
return ipV6
} else {
return nil
}
}

private class func runCommand(_ args: String) -> String {
Expand Down

0 comments on commit 50beb8e

Please sign in to comment.