From f0f7a3f7d60b9282dd03db773205f56dfc783734 Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Mon, 11 Apr 2022 22:56:40 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=8C=20Scan=20proxies=20(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP Monitor.xcodeproj/project.pbxproj | 6 ++++ .../Parsers/NginxConfigurationTest.swift | 11 ++++++++ .../Nginx/NginxConfiguration.swift | 17 +++++++++-- .../Proxies/ProxyScanner/ProxyScanner.swift | 2 +- .../ProxyScanner/ValetProxyScanner.swift | 28 +++++++++++++++++++ .../Valet/Proxies/ValetProxy+Fake.swift | 2 -- .../Valet/Proxies/ValetProxy.swift | 10 +++++-- phpmon/Domain/Integrations/Valet/Valet.swift | 20 +++++++++++-- 8 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 phpmon/Domain/Integrations/Valet/Proxies/ProxyScanner/ValetProxyScanner.swift diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index 7e55fa2..8f191b5 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -124,6 +124,8 @@ C4811D2A22D70F9A00B5F6B3 /* MainMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4811D2922D70F9A00B5F6B3 /* MainMenu.swift */; }; C481F79726164A78004FBCFF /* PrefsVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5420395826135DC100FB00FA /* PrefsVC.swift */; }; C481F79A26164A7C004FBCFF /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5420395E2613607600FB00FA /* Preferences.swift */; }; + C484437B2804BB560041A78A /* ValetProxyScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C484437A2804BB560041A78A /* ValetProxyScanner.swift */; }; + C484437C2804BB560041A78A /* ValetProxyScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C484437A2804BB560041A78A /* ValetProxyScanner.swift */; }; C48D0C9025CC7FD000CC7490 /* StatsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C48D0C8F25CC7FD000CC7490 /* StatsView.xib */; }; C48D0C9325CC804200CC7490 /* XibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D0C9225CC804200CC7490 /* XibLoadable.swift */; }; C48D0C9625CC80B100CC7490 /* HeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D0C9525CC80B100CC7490 /* HeaderView.swift */; }; @@ -333,6 +335,7 @@ C476FF9722B0DD830098105B /* Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; C4811D2322D70A4700B5F6B3 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; C4811D2922D70F9A00B5F6B3 /* MainMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenu.swift; sourceTree = ""; }; + C484437A2804BB560041A78A /* ValetProxyScanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValetProxyScanner.swift; sourceTree = ""; }; C48D0C8F25CC7FD000CC7490 /* StatsView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StatsView.xib; sourceTree = ""; }; C48D0C9225CC804200CC7490 /* XibLoadable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XibLoadable.swift; sourceTree = ""; }; C48D0C9525CC80B100CC7490 /* HeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderView.swift; sourceTree = ""; }; @@ -816,6 +819,7 @@ isa = PBXGroup; children = ( C4C0E8E627F88B41002D32A9 /* ProxyScanner.swift */, + C484437A2804BB560041A78A /* ValetProxyScanner.swift */, ); path = ProxyScanner; sourceTree = ""; @@ -1131,6 +1135,7 @@ C4C8E81B276F54E5003AC782 /* PhpConfigWatcher.swift in Sources */, C417DC74277614690015E6EE /* Helpers.swift in Sources */, C415D3E82770F692005EF286 /* AppDelegate+InterApp.swift in Sources */, + C484437B2804BB560041A78A /* ValetProxyScanner.swift in Sources */, C41C1B3722B0097F00E7CF16 /* AppDelegate.swift in Sources */, C42759672627662800093CAE /* NSMenuExtension.swift in Sources */, C464ADAF275A7A69003FCD53 /* DomainListVC.swift in Sources */, @@ -1232,6 +1237,7 @@ C4068CAB27B0890D00544CD5 /* MenuBarIcons.swift in Sources */, C4F30B09278E1A0E00755FCE /* CustomPrefs.swift in Sources */, C415D3E92770F692005EF286 /* AppDelegate+InterApp.swift in Sources */, + C484437C2804BB560041A78A /* ValetProxyScanner.swift in Sources */, C4AF9F78275447F100D44ED0 /* ValetConfigurationTest.swift in Sources */, C4CE3BBC27B324250086CA49 /* ComposerWindow.swift in Sources */, C40B24F427A310830018C7D2 /* StatusMenu.swift in Sources */, diff --git a/phpmon-tests/Parsers/NginxConfigurationTest.swift b/phpmon-tests/Parsers/NginxConfigurationTest.swift index 9dcdb00..521a216 100644 --- a/phpmon-tests/Parsers/NginxConfigurationTest.swift +++ b/phpmon-tests/Parsers/NginxConfigurationTest.swift @@ -22,6 +22,17 @@ class NginxConfigurationTest: XCTestCase { return Bundle(for: Self.self).url(forResource: "nginx-proxy", withExtension: "test")! } + func testCanDetermineSiteNameAndTld() throws { + XCTAssertEqual( + "nginx-site", + NginxConfiguration(filePath: NginxConfigurationTest.regularUrl.path).domain + ) + XCTAssertEqual( + "test", + NginxConfiguration(filePath: NginxConfigurationTest.regularUrl.path).tld + ) + } + func testCanDetermineIsolation() throws { XCTAssertNil( NginxConfiguration(filePath: NginxConfigurationTest.regularUrl.path).isolatedVersion diff --git a/phpmon/Domain/Integrations/Nginx/NginxConfiguration.swift b/phpmon/Domain/Integrations/Nginx/NginxConfiguration.swift index 2d66dff..06c3c59 100644 --- a/phpmon/Domain/Integrations/Nginx/NginxConfiguration.swift +++ b/phpmon/Domain/Integrations/Nginx/NginxConfiguration.swift @@ -12,10 +12,23 @@ class NginxConfiguration { var contents: String! + var domain: String + var tld: String + init(filePath: String) { - self.contents = try! String(contentsOfFile: filePath - .replacingOccurrences(of: "~", with: "/Users/\(Paths.whoami)") + let path = filePath.replacingOccurrences( + of: "~", + with: "/Users/\(Paths.whoami)" ) + + self.contents = try! String(contentsOfFile: path) + + let domain = String(path.split(separator: "/").last!) + let tld = String(domain.split(separator: ".").last!) + + self.domain = domain + .replacingOccurrences(of: ".\(tld)", with: "") + self.tld = tld } /** diff --git a/phpmon/Domain/Integrations/Valet/Proxies/ProxyScanner/ProxyScanner.swift b/phpmon/Domain/Integrations/Valet/Proxies/ProxyScanner/ProxyScanner.swift index 1b0cb90..0fba5ab 100644 --- a/phpmon/Domain/Integrations/Valet/Proxies/ProxyScanner/ProxyScanner.swift +++ b/phpmon/Domain/Integrations/Valet/Proxies/ProxyScanner/ProxyScanner.swift @@ -10,6 +10,6 @@ import Foundation protocol ProxyScanner { - // TODO + func resolveProxies(directoryPath: String) -> [ValetProxy] } diff --git a/phpmon/Domain/Integrations/Valet/Proxies/ProxyScanner/ValetProxyScanner.swift b/phpmon/Domain/Integrations/Valet/Proxies/ProxyScanner/ValetProxyScanner.swift new file mode 100644 index 0000000..f0acef0 --- /dev/null +++ b/phpmon/Domain/Integrations/Valet/Proxies/ProxyScanner/ValetProxyScanner.swift @@ -0,0 +1,28 @@ +// +// ValetProxyScanner.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 11/04/2022. +// Copyright © 2022 Nico Verbruggen. All rights reserved. +// + +import Foundation + +class ValetProxyScanner: ProxyScanner +{ + func resolveProxies(directoryPath: String) -> [ValetProxy] + { + return try! FileManager + .default + .contentsOfDirectory(atPath: directoryPath) + .map { + return NginxConfiguration.init(filePath: "\(directoryPath)/\($0)") + } + .filter { + return $0.proxy != nil + } + .map { + return ValetProxy($0) + } + } +} diff --git a/phpmon/Domain/Integrations/Valet/Proxies/ValetProxy+Fake.swift b/phpmon/Domain/Integrations/Valet/Proxies/ValetProxy+Fake.swift index acef5f4..76a4584 100644 --- a/phpmon/Domain/Integrations/Valet/Proxies/ValetProxy+Fake.swift +++ b/phpmon/Domain/Integrations/Valet/Proxies/ValetProxy+Fake.swift @@ -10,6 +10,4 @@ import Foundation extension ValetProxy { - // - } diff --git a/phpmon/Domain/Integrations/Valet/Proxies/ValetProxy.swift b/phpmon/Domain/Integrations/Valet/Proxies/ValetProxy.swift index 248654d..acc394d 100644 --- a/phpmon/Domain/Integrations/Valet/Proxies/ValetProxy.swift +++ b/phpmon/Domain/Integrations/Valet/Proxies/ValetProxy.swift @@ -8,11 +8,15 @@ import Foundation -struct ValetProxy +class ValetProxy { var domain: String - var tld: String - var target: String + + init(_ configuration: NginxConfiguration) { + self.domain = configuration.domain + self.tld = configuration.tld + self.target = configuration.proxy! + } } diff --git a/phpmon/Domain/Integrations/Valet/Valet.swift b/phpmon/Domain/Integrations/Valet/Valet.swift index 529d0d2..014b3b0 100644 --- a/phpmon/Domain/Integrations/Valet/Valet.swift +++ b/phpmon/Domain/Integrations/Valet/Valet.swift @@ -35,10 +35,12 @@ class Valet { /// Various feature flags. Enabled based on the installed Valet version. var features: [FeatureFlag] = [] - /// When initialising the Valet singleton assume no sites loaded. We will load the version later. + /// When initialising the Valet singleton, assume no sites or proxies loaded. + /// We will load the version later. init() { self.version = nil self.sites = [] + self.proxies = [] } /** @@ -54,6 +56,10 @@ class Valet { return ValetSiteScanner() } + static var proxyScanner: ProxyScanner { + return ValetProxyScanner() + } + /** Check if a particular feature is enabled. */ @@ -176,7 +182,17 @@ class Valet { sites = Self.siteScanner .resolveSitesFrom(paths: config.paths) - .sorted { $0.absolutePath < $1.absolutePath } + .sorted { + $0.absolutePath < $1.absolutePath + } + + proxies = Self.proxyScanner + .resolveProxies( + directoryPath: FileManager.default + .homeDirectoryForCurrentUser + .appendingPathComponent(".config/valet/Nginx") + .path + ) if let defaultPath = Valet.shared.config.defaultSite, let site = ValetSiteScanner().resolveSite(path: defaultPath) {