mirror of
https://github.com/nicoverbruggen/phpmon.git
synced 2025-08-07 03:50:08 +02:00
✨ Ensure Valet configuration files exist
This commit is contained in:
@ -650,6 +650,10 @@
|
||||
C4D3661B291173EA006BD146 /* DictionaryExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D36619291173EA006BD146 /* DictionaryExtension.swift */; };
|
||||
C4D3661C291173EA006BD146 /* DictionaryExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D36619291173EA006BD146 /* DictionaryExtension.swift */; };
|
||||
C4D3661D291173EA006BD146 /* DictionaryExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D36619291173EA006BD146 /* DictionaryExtension.swift */; };
|
||||
C4D4CB3729C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D4CB3629C109CF00DB9F93 /* InternalSwitcher+Valet.swift */; };
|
||||
C4D4CB3829C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D4CB3629C109CF00DB9F93 /* InternalSwitcher+Valet.swift */; };
|
||||
C4D4CB3929C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D4CB3629C109CF00DB9F93 /* InternalSwitcher+Valet.swift */; };
|
||||
C4D4CB3A29C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D4CB3629C109CF00DB9F93 /* InternalSwitcher+Valet.swift */; };
|
||||
C4D5CFCA27E0F9CD00035329 /* NginxConfigurationFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D5CFC927E0F9CD00035329 /* NginxConfigurationFile.swift */; };
|
||||
C4D5CFCB27E0F9CD00035329 /* NginxConfigurationFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D5CFC927E0F9CD00035329 /* NginxConfigurationFile.swift */; };
|
||||
C4D8016622B1584700C6DA1B /* Startup.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D8016522B1584700C6DA1B /* Startup.swift */; };
|
||||
@ -972,6 +976,7 @@
|
||||
C4D3660F291140BE006BD146 /* TestableFileSystemTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestableFileSystemTest.swift; sourceTree = "<group>"; };
|
||||
C4D36614291160A1006BD146 /* WIP.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WIP.swift; sourceTree = "<group>"; };
|
||||
C4D36619291173EA006BD146 /* DictionaryExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DictionaryExtension.swift; sourceTree = "<group>"; };
|
||||
C4D4CB3629C109CF00DB9F93 /* InternalSwitcher+Valet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "InternalSwitcher+Valet.swift"; sourceTree = "<group>"; };
|
||||
C4D5CFC927E0F9CD00035329 /* NginxConfigurationFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NginxConfigurationFile.swift; sourceTree = "<group>"; };
|
||||
C4D8016522B1584700C6DA1B /* Startup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Startup.swift; sourceTree = "<group>"; };
|
||||
C4D89BC52783C99400A02B68 /* ComposerJson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerJson.swift; sourceTree = "<group>"; };
|
||||
@ -1771,6 +1776,7 @@
|
||||
children = (
|
||||
C4D9ADBE277610E1007277F4 /* PhpSwitcher.swift */,
|
||||
C4D9ADC7277611A0007277F4 /* InternalSwitcher.swift */,
|
||||
C4D4CB3629C109CF00DB9F93 /* InternalSwitcher+Valet.swift */,
|
||||
);
|
||||
path = Switcher;
|
||||
sourceTree = "<group>";
|
||||
@ -2256,6 +2262,7 @@
|
||||
03E36FE728D9219000636F7F /* ActiveShell.swift in Sources */,
|
||||
C4D9ADBF277610E1007277F4 /* PhpSwitcher.swift in Sources */,
|
||||
C45E76142854A65300B4FE0C /* ServicesManager.swift in Sources */,
|
||||
C4D4CB3729C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */,
|
||||
C46EBC4728DB9644007ACC74 /* RealShell.swift in Sources */,
|
||||
C4068CAA27B0890D00544CD5 /* MenuBarIcons.swift in Sources */,
|
||||
C44264C02850BD2A007400F1 /* VersionPopoverView.swift in Sources */,
|
||||
@ -2361,6 +2368,7 @@
|
||||
C471E84828F9BB650021E251 /* EnvironmentCheck.swift in Sources */,
|
||||
C471E84A28F9BB650021E251 /* AppVersion.swift in Sources */,
|
||||
C471E84B28F9BB650021E251 /* ServicesManager.swift in Sources */,
|
||||
C4D4CB3929C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */,
|
||||
C471E84C28F9BB650021E251 /* EnvironmentManager.swift in Sources */,
|
||||
C471E84D28F9BB650021E251 /* ActivePhpInstallation+Checks.swift in Sources */,
|
||||
C471E84E28F9BB650021E251 /* MainMenu.swift in Sources */,
|
||||
@ -2571,6 +2579,7 @@
|
||||
C471E8C928F9BB8F0021E251 /* WarningsWindowController.swift in Sources */,
|
||||
C41ADCEB2970CCC700120423 /* FSNotifier.swift in Sources */,
|
||||
C471E8CA28F9BB8F0021E251 /* OnboardingWindowController.swift in Sources */,
|
||||
C4D4CB3A29C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */,
|
||||
C471E8CB28F9BB8F0021E251 /* PreferencesWindowController.swift in Sources */,
|
||||
C471E8CC28F9BB8F0021E251 /* PreferencesWindowController+Hotkey.swift in Sources */,
|
||||
C471E8CD28F9BB8F0021E251 /* PrefsVC.swift in Sources */,
|
||||
@ -2853,6 +2862,7 @@
|
||||
C41C02AB27E61CB3009F26CB /* FakeValetSite.swift in Sources */,
|
||||
C4F780C925D80B75000DBC97 /* StringExtension.swift in Sources */,
|
||||
C4D9F24C280B69E100DCD39A /* AddProxyVC.swift in Sources */,
|
||||
C4D4CB3829C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */,
|
||||
C4B5853F2770FE3900DA4FBE /* Paths.swift in Sources */,
|
||||
C481F79A26164A7C004FBCFF /* Preferences.swift in Sources */,
|
||||
C4A6957728D23EE300A14CF8 /* EnvironmentManager.swift in Sources */,
|
||||
|
134
phpmon/Common/PHP/Switcher/InternalSwitcher+Valet.swift
Normal file
134
phpmon/Common/PHP/Switcher/InternalSwitcher+Valet.swift
Normal file
@ -0,0 +1,134 @@
|
||||
//
|
||||
// InternalSwitcher+Valet.swift
|
||||
// PHP Monitor
|
||||
//
|
||||
// Created by Nico Verbruggen on 14/03/2023.
|
||||
// Copyright © 2023 Nico Verbruggen. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
extension InternalSwitcher {
|
||||
|
||||
typealias FixApplied = Bool
|
||||
|
||||
public func ensureValetConfigurationIsValidForPhpVersion(_ version: String) async -> FixApplied {
|
||||
// Early exit if Valet is not installed
|
||||
if !Valet.installed {
|
||||
assertionFailure("Cannot ensure that Valet configuration is valid if Valet is not installed.")
|
||||
return false
|
||||
}
|
||||
|
||||
let corrections = [
|
||||
await self.disableDefaultPhpFpmPool(version),
|
||||
await self.ensureConfigurationFilesExist(version)
|
||||
]
|
||||
|
||||
return corrections.contains(true)
|
||||
}
|
||||
|
||||
// MARK: - PHP FPM pool
|
||||
|
||||
public func disableDefaultPhpFpmPool(_ version: String) async -> FixApplied {
|
||||
let pool = "\(Paths.etcPath)/php/\(version)/php-fpm.d/www.conf"
|
||||
|
||||
if FileSystem.fileExists(pool) {
|
||||
Log.info("A default `www.conf` file was found in the php-fpm.d directory for PHP \(version).")
|
||||
let existing = "\(Paths.etcPath)/php/\(version)/php-fpm.d/www.conf"
|
||||
let new = "\(Paths.etcPath)/php/\(version)/php-fpm.d/www.conf.disabled-by-phpmon"
|
||||
do {
|
||||
if FileSystem.fileExists(new) {
|
||||
Log.info("A moved `www.conf.disabled-by-phpmon` file was found for PHP \(version), "
|
||||
+ "cleaning up so the newer `www.conf` can be moved again.")
|
||||
try FileSystem.remove(new)
|
||||
}
|
||||
try FileSystem.move(from: existing, to: new)
|
||||
Log.info("Success: A default `www.conf` file was disabled for PHP \(version).")
|
||||
return true
|
||||
} catch {
|
||||
Log.err(error)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func getExpectedConfigurationFiles(for version: String) -> [ExpectedConfigurationFile] {
|
||||
return [
|
||||
ExpectedConfigurationFile(
|
||||
destination: "/php-fpm.d/valet-fpm.conf",
|
||||
source: "/cli/stubs/etc-phpfpm-valet.conf",
|
||||
replacements: [
|
||||
"VALET_USER": Paths.whoami,
|
||||
"VALET_HOME_PATH": "~/.config/valet".replacingTildeWithHomeDirectory,
|
||||
"valet.sock": "valet\(version.replacingOccurrences(of: ".", with: "")).sock"
|
||||
],
|
||||
applies: { Valet.shared.version!.major > 2 }
|
||||
),
|
||||
ExpectedConfigurationFile(
|
||||
destination: "/conf.d/error_log.ini",
|
||||
source: "/cli/stubs/etc-phpfpm-error_log.ini",
|
||||
replacements: [
|
||||
"VALET_USER": Paths.whoami,
|
||||
"VALET_HOME_PATH": "~/.config/valet".replacingTildeWithHomeDirectory
|
||||
],
|
||||
applies: { return true }
|
||||
),
|
||||
ExpectedConfigurationFile(
|
||||
destination: "/conf.d/php-memory-limits.ini",
|
||||
source: "/cli/stubs/php-memory-limits.ini",
|
||||
replacements: [:],
|
||||
applies: { return true }
|
||||
)
|
||||
]
|
||||
}
|
||||
|
||||
func ensureConfigurationFilesExist(_ version: String) async -> FixApplied {
|
||||
let files = self.getExpectedConfigurationFiles(for: version)
|
||||
|
||||
// For each of the files, attempt to fix anything that is wrong
|
||||
let outcomes = files.map { file in
|
||||
let configFileExists = FileSystem.fileExists("\(Paths.etcPath)/php/\(version)/" + file.destination)
|
||||
|
||||
if configFileExists {
|
||||
return false
|
||||
}
|
||||
|
||||
Log.info("Config file `\(file.destination)` does not exist, will attempt to automatically fix!")
|
||||
|
||||
if !file.applies() {
|
||||
return false
|
||||
}
|
||||
|
||||
do {
|
||||
var contents = try FileSystem.getStringFromFile("~/.composer/vendor/laravel/valet" + file.source)
|
||||
|
||||
for (original, replacement) in file.replacements {
|
||||
contents = contents.replacingOccurrences(of: original, with: replacement)
|
||||
}
|
||||
|
||||
try FileSystem.writeAtomicallyToFile(
|
||||
"\(Paths.etcPath)/php/\(version)" + file.destination,
|
||||
content: contents
|
||||
)
|
||||
} catch {
|
||||
Log.err("Automatically fixing \(file.destination) did not work.")
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// If any fixes were applied, return true
|
||||
return outcomes.contains(true)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public struct ExpectedConfigurationFile {
|
||||
let destination: String
|
||||
let source: String
|
||||
let replacements: [String: String]
|
||||
let applies: () -> Bool
|
||||
}
|
@ -27,7 +27,6 @@ class InternalSwitcher: PhpSwitcher {
|
||||
await withTaskGroup(of: String.self, body: { group in
|
||||
for available in PhpEnv.shared.availablePhpVersions {
|
||||
group.addTask {
|
||||
await self.disableDefaultPhpFpmPool(available)
|
||||
await self.unlinkAndStopPhpVersion(available)
|
||||
return available
|
||||
}
|
||||
@ -42,6 +41,11 @@ class InternalSwitcher: PhpSwitcher {
|
||||
Log.info("Linking the new version \(version)!")
|
||||
|
||||
for formula in versions {
|
||||
if Valet.installed {
|
||||
Log.info("Ensuring that the Valet configuration is valid...")
|
||||
_ = await self.ensureValetConfigurationIsValidForPhpVersion(formula)
|
||||
}
|
||||
|
||||
Log.info("Will start PHP \(version)... (primary: \(version == formula))")
|
||||
await self.linkAndStartPhpVersion(formula, primary: (version == formula))
|
||||
}
|
||||
@ -71,37 +75,6 @@ class InternalSwitcher: PhpSwitcher {
|
||||
return versions
|
||||
}
|
||||
|
||||
func requiresDisablingOfDefaultPhpFpmPool(_ version: String) -> Bool {
|
||||
let pool = "\(Paths.etcPath)/php/\(version)/php-fpm.d/www.conf"
|
||||
return FileSystem.fileExists(pool)
|
||||
}
|
||||
|
||||
func disableDefaultPhpFpmPool(_ version: String) async {
|
||||
if Valet.installed {
|
||||
Log.info("Skipping adjustment of php-fpm.d pools, because Valet is disabled or not installed.")
|
||||
Log.info("This behaviour may not be desirable with this system configuration.")
|
||||
return
|
||||
}
|
||||
|
||||
let pool = "\(Paths.etcPath)/php/\(version)/php-fpm.d/www.conf"
|
||||
if FileSystem.fileExists(pool) {
|
||||
Log.info("A default `www.conf` file was found in the php-fpm.d directory for PHP \(version).")
|
||||
let existing = "\(Paths.etcPath)/php/\(version)/php-fpm.d/www.conf"
|
||||
let new = "\(Paths.etcPath)/php/\(version)/php-fpm.d/www.conf.disabled-by-phpmon"
|
||||
do {
|
||||
if FileSystem.fileExists(new) {
|
||||
Log.info("A moved `www.conf.disabled-by-phpmon` file was found for PHP \(version), "
|
||||
+ "cleaning up so the newer `www.conf` can be moved again.")
|
||||
try FileSystem.remove(new)
|
||||
}
|
||||
try FileSystem.move(from: existing, to: new)
|
||||
Log.info("Success: A default `www.conf` file was disabled for PHP \(version).")
|
||||
} catch {
|
||||
Log.err(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func unlinkAndStopPhpVersion(_ version: String) async {
|
||||
let formula = (version == PhpEnv.brewPhpAlias) ? "php" : "php@\(version)"
|
||||
await brew("unlink \(formula)")
|
||||
|
@ -63,11 +63,11 @@ class HomebrewDiagnostics {
|
||||
It is possible to upgrade PHP, but forget running `valet install`.
|
||||
This results in a scenario where a rogue www.conf file exists.
|
||||
*/
|
||||
public static func checkForPhpFpmPoolConflicts() {
|
||||
Log.info("Checking for PHP-FPM pool conflicts...")
|
||||
public static func checkForValetMisconfiguration() async {
|
||||
Log.info("Checking for PHP-FPM issues with Valet...")
|
||||
|
||||
guard let install = PhpEnv.phpInstall else {
|
||||
Log.info("Will skip check for conflicts if no PHP version is linked.")
|
||||
Log.info("Will skip check for issues if no PHP version is linked.")
|
||||
return
|
||||
}
|
||||
|
||||
@ -76,22 +76,12 @@ class HomebrewDiagnostics {
|
||||
|
||||
// Versions to be handled
|
||||
let switcher = InternalSwitcher()
|
||||
var versions = switcher.getVersionsToBeHandled(primary)
|
||||
|
||||
versions = versions.filter { version in
|
||||
return switcher.requiresDisablingOfDefaultPhpFpmPool(version)
|
||||
}
|
||||
|
||||
if versions.isEmpty {
|
||||
Log.info("No PHP-FPM pools need to be fixed. All OK.")
|
||||
}
|
||||
|
||||
versions.forEach { version in
|
||||
Task { // Fix each pool concurrently (but perform the tasks sequentially)
|
||||
await switcher.disableDefaultPhpFpmPool(version)
|
||||
await switcher.unlinkAndStopPhpVersion(version)
|
||||
await switcher.linkAndStartPhpVersion(version, primary: version == primary)
|
||||
}
|
||||
for version in switcher.getVersionsToBeHandled(primary)
|
||||
where await switcher.ensureValetConfigurationIsValidForPhpVersion(version) {
|
||||
Log.info("One or more fixes were applied for PHP \(version)!")
|
||||
await switcher.unlinkAndStopPhpVersion(version)
|
||||
await switcher.linkAndStartPhpVersion(version, primary: version == primary)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -91,11 +91,11 @@ extension MainMenu {
|
||||
// Preload all sites
|
||||
await Valet.shared.startPreloadingSites()
|
||||
|
||||
// Check if PHP-FPM is broken
|
||||
await Valet.shared.notifyAboutBrokenPhpFpm()
|
||||
|
||||
// After preloading sites, check for PHP-FPM pool conflicts
|
||||
HomebrewDiagnostics.checkForPhpFpmPoolConflicts()
|
||||
await HomebrewDiagnostics.checkForValetMisconfiguration()
|
||||
|
||||
// Check if PHP-FPM is broken (should be fixed automatically if phpmon >= 6.0)
|
||||
await Valet.shared.notifyAboutBrokenPhpFpm()
|
||||
|
||||
// A non-default TLD is not officially supported since Valet 3.2.x
|
||||
Valet.notifyAboutUnsupportedTLD()
|
||||
|
Reference in New Issue
Block a user