mirror of
https://github.com/laravel/valet.git
synced 2026-02-05 00:20:08 +01:00
375 lines
11 KiB
PHP
Executable File
375 lines
11 KiB
PHP
Executable File
#!/usr/bin/env php
|
|
<?php
|
|
|
|
/**
|
|
* Load correct autoloader depending on install location.
|
|
*/
|
|
if (file_exists(__DIR__.'/../vendor/autoload.php')) {
|
|
require __DIR__.'/../vendor/autoload.php';
|
|
} elseif (file_exists(__DIR__.'/../../../autoload.php')) {
|
|
require __DIR__.'/../../../autoload.php';
|
|
} else {
|
|
require getenv('HOME').'/.composer/vendor/autoload.php';
|
|
}
|
|
|
|
use Silly\Application;
|
|
use Illuminate\Container\Container;
|
|
use function Valet\info;
|
|
use function Valet\output;
|
|
use function Valet\table;
|
|
use function Valet\warning;
|
|
|
|
/**
|
|
* Relocate config dir to ~/.config/valet/ if found in old location.
|
|
*/
|
|
if (is_dir(VALET_LEGACY_HOME_PATH) && !is_dir(VALET_HOME_PATH)) {
|
|
Configuration::createConfigurationDirectory();
|
|
}
|
|
|
|
/**
|
|
* Create the application.
|
|
*/
|
|
Container::setInstance(new Container);
|
|
|
|
$version = '2.3.4';
|
|
|
|
$app = new Application('Laravel Valet', $version);
|
|
|
|
/**
|
|
* Prune missing directories and symbolic links on every command.
|
|
*/
|
|
if (is_dir(VALET_HOME_PATH)) {
|
|
Configuration::prune();
|
|
|
|
Site::pruneLinks();
|
|
}
|
|
|
|
/**
|
|
* Allow Valet to be run more conveniently by allowing the Node proxy to run password-less sudo.
|
|
*/
|
|
$app->command('install', function () {
|
|
Nginx::stop();
|
|
|
|
Configuration::install();
|
|
Nginx::install();
|
|
PhpFpm::install();
|
|
DnsMasq::install(Configuration::read()['tld']);
|
|
Nginx::restart();
|
|
Valet::symlinkToUsersBin();
|
|
|
|
output(PHP_EOL.'<info>Valet installed successfully!</info>');
|
|
})->descriptions('Install the Valet services');
|
|
|
|
/**
|
|
* Most commands are available only if valet is installed.
|
|
*/
|
|
if (is_dir(VALET_HOME_PATH)) {
|
|
/**
|
|
* Upgrade helper: ensure the tld config exists
|
|
*/
|
|
if (empty(Configuration::read()['tld'])) {
|
|
Configuration::writeBaseConfiguration();
|
|
}
|
|
|
|
/**
|
|
* Get or set the TLD currently being used by Valet.
|
|
*/
|
|
$app->command('tld [tld]', function ($tld = null) {
|
|
if ($tld === null) {
|
|
return info(Configuration::read()['tld']);
|
|
}
|
|
|
|
DnsMasq::updateTld(
|
|
$oldTld = Configuration::read()['tld'], $tld = trim($tld, '.')
|
|
);
|
|
|
|
Configuration::updateKey('tld', $tld);
|
|
|
|
Site::resecureForNewTld($oldTld, $tld);
|
|
PhpFpm::restart();
|
|
Nginx::restart();
|
|
|
|
info('Your Valet TLD has been updated to ['.$tld.'].');
|
|
}, ['domain'])->descriptions('Get or set the TLD used for Valet sites.');
|
|
|
|
/**
|
|
* Add the current working directory to the paths configuration.
|
|
*/
|
|
$app->command('park [path]', function ($path = null) {
|
|
Configuration::addPath($path ?: getcwd());
|
|
|
|
info(($path === null ? "This" : "The [{$path}]") . " directory has been added to Valet's paths.");
|
|
})->descriptions('Register the current working (or specified) directory with Valet');
|
|
|
|
/**
|
|
* Remove the current working directory from the paths configuration.
|
|
*/
|
|
$app->command('forget [path]', function ($path = null) {
|
|
Configuration::removePath($path ?: getcwd());
|
|
|
|
info(($path === null ? "This" : "The [{$path}]") . " directory has been removed from Valet's paths.");
|
|
})->descriptions('Remove the current working (or specified) directory from Valet\'s list of paths');
|
|
|
|
/**
|
|
* Register a symbolic link with Valet.
|
|
*/
|
|
$app->command('link [name] [--secure]', function ($name, $secure) {
|
|
$linkPath = Site::link(getcwd(), $name = $name ?: basename(getcwd()));
|
|
|
|
info('A ['.$name.'] symbolic link has been created in ['.$linkPath.'].');
|
|
|
|
if ($secure) {
|
|
$this->runCommand('secure '.$name);
|
|
}
|
|
})->descriptions('Link the current working directory to Valet');
|
|
|
|
/**
|
|
* Display all of the registered symbolic links.
|
|
*/
|
|
$app->command('links', function () {
|
|
$links = Site::links();
|
|
|
|
table(['Site', 'SSL', 'URL', 'Path'], $links->all());
|
|
})->descriptions('Display all of the registered Valet links');
|
|
|
|
/**
|
|
* Unlink a link from the Valet links directory.
|
|
*/
|
|
$app->command('unlink [name]', function ($name) {
|
|
info('The ['.Site::unlink($name).'] symbolic link has been removed.');
|
|
})->descriptions('Remove the specified Valet link');
|
|
|
|
/**
|
|
* Secure the given domain with a trusted TLS certificate.
|
|
*/
|
|
$app->command('secure [domain]', function ($domain = null) {
|
|
$url = ($domain ?: Site::host(getcwd())).'.'.Configuration::read()['tld'];
|
|
|
|
Site::secure($url);
|
|
|
|
Nginx::restart();
|
|
|
|
info('The ['.$url.'] site has been secured with a fresh TLS certificate.');
|
|
})->descriptions('Secure the given domain with a trusted TLS certificate');
|
|
|
|
/**
|
|
* Stop serving the given domain over HTTPS and remove the trusted TLS certificate.
|
|
*/
|
|
$app->command('unsecure [domain]', function ($domain = null) {
|
|
$url = ($domain ?: Site::host(getcwd())).'.'.Configuration::read()['tld'];
|
|
|
|
Site::unsecure($url);
|
|
|
|
Nginx::restart();
|
|
|
|
info('The ['.$url.'] site will now serve traffic over HTTP.');
|
|
})->descriptions('Stop serving the given domain over HTTPS and remove the trusted TLS certificate');
|
|
|
|
/**
|
|
* Determine which Valet driver the current directory is using.
|
|
*/
|
|
$app->command('which', function () {
|
|
require __DIR__.'/drivers/require.php';
|
|
|
|
$driver = ValetDriver::assign(getcwd(), basename(getcwd()), '/');
|
|
|
|
if ($driver) {
|
|
info('This site is served by ['.get_class($driver).'].');
|
|
} else {
|
|
warning('Valet could not determine which driver to use for this site.');
|
|
}
|
|
})->descriptions('Determine which Valet driver serves the current working directory');
|
|
|
|
/**
|
|
* Display all of the registered paths.
|
|
*/
|
|
$app->command('paths', function () {
|
|
$paths = Configuration::read()['paths'];
|
|
|
|
if (count($paths) > 0) {
|
|
output(json_encode($paths, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
|
} else {
|
|
info('No paths have been registered.');
|
|
}
|
|
})->descriptions('Get all of the paths registered with Valet');
|
|
|
|
/**
|
|
* Open the current or given directory in the browser.
|
|
*/
|
|
$app->command('open [domain]', function ($domain = null) {
|
|
$url = "http://".($domain ?: Site::host(getcwd())).'.'.Configuration::read()['tld'];
|
|
CommandLine::runAsUser("open ".escapeshellarg($url));
|
|
})->descriptions('Open the site for the current (or specified) directory in your browser');
|
|
|
|
/**
|
|
* Generate a publicly accessible URL for your project.
|
|
*/
|
|
$app->command('share', function () {
|
|
warning("It looks like you are running `cli/valet.php` directly, please use the `valet` script in the project root instead.");
|
|
})->descriptions('Generate a publicly accessible URL for your project');
|
|
|
|
/**
|
|
* Echo the currently tunneled URL.
|
|
*/
|
|
$app->command('fetch-share-url', function () {
|
|
output(Ngrok::currentTunnelUrl());
|
|
})->descriptions('Get the URL to the current Ngrok tunnel');
|
|
|
|
/**
|
|
* Start the daemon services.
|
|
*/
|
|
$app->command('start', function () {
|
|
PhpFpm::restart();
|
|
|
|
Nginx::restart();
|
|
|
|
info('Valet services have been started.');
|
|
})->descriptions('Start the Valet services');
|
|
|
|
/**
|
|
* Restart the daemon services.
|
|
*/
|
|
$app->command('restart', function () {
|
|
PhpFpm::restart();
|
|
|
|
Nginx::restart();
|
|
|
|
info('Valet services have been restarted.');
|
|
})->descriptions('Restart the Valet services');
|
|
|
|
/**
|
|
* Stop the daemon services.
|
|
*/
|
|
$app->command('stop', function () {
|
|
PhpFpm::stop();
|
|
|
|
Nginx::stop();
|
|
|
|
info('Valet services have been stopped.');
|
|
})->descriptions('Stop the Valet services');
|
|
|
|
/**
|
|
* Uninstall Valet entirely.
|
|
*/
|
|
$app->command('uninstall', function () {
|
|
Nginx::uninstall();
|
|
|
|
info('Valet has been uninstalled.');
|
|
})->descriptions('Uninstall the Valet services');
|
|
|
|
/**
|
|
* Determine if this is the latest release of Valet.
|
|
*/
|
|
$app->command('on-latest-version', function () use ($version) {
|
|
if (Valet::onLatestVersion($version)) {
|
|
output('YES');
|
|
} else {
|
|
output('NO');
|
|
}
|
|
})->descriptions('Determine if this is the latest version of Valet');
|
|
|
|
/**
|
|
* Install the sudoers.d entries so password is no longer required.
|
|
*/
|
|
$app->command('trust', function () {
|
|
Brew::createSudoersEntry();
|
|
Valet::createSudoersEntry();
|
|
|
|
info('Sudoers entries have been added for Brew and Valet.');
|
|
})->descriptions('Add sudoers files for Brew and Valet to make Valet commands run without passwords');
|
|
|
|
/**
|
|
* Allow the user to change the version of php valet uses
|
|
*/
|
|
$app->command('use phpVersion', function ($phpVersion) {
|
|
PhpFpm::stopRunning();
|
|
|
|
$newVersion = PhpFpm::useVersion($phpVersion);
|
|
|
|
Nginx::restart();
|
|
info(sprintf('Valet is now using %s.', $newVersion));
|
|
})->descriptions('Change the version of php used by valet', [
|
|
'phpVersion' => 'The PHP version you want to use, e.g php@7.2',
|
|
]);
|
|
|
|
/**
|
|
* Tail log file.
|
|
*/
|
|
$app->command('log [-f|--follow] [-l|--lines=] [key]', function ($follow, $lines, $key = null) {
|
|
$defaultLogs = [
|
|
'php-fpm' => '/usr/local/var/log/php-fpm.log',
|
|
'nginx' => VALET_HOME_PATH.'/Log/nginx-error.log',
|
|
'mailhog' => '/usr/local/var/log/mailhog.log',
|
|
'redis' => '/usr/local/var/log/redis.log',
|
|
];
|
|
|
|
$configLogs = data_get(Configuration::read(), 'logs');
|
|
if (! is_array($configLogs)) {
|
|
$configLogs = [];
|
|
}
|
|
|
|
$logs = array_merge($defaultLogs, $configLogs);
|
|
ksort($logs);
|
|
|
|
if (! $key) {
|
|
info(implode(PHP_EOL, [
|
|
'In order to tail a log, pass the relevant log key (e.g. "nginx")',
|
|
'along with any optional tail parameters (e.g. "-f" for follow).',
|
|
null,
|
|
'For example: "valet log nginx -f --lines=3"',
|
|
null,
|
|
'Here are the logs you might be interested in.',
|
|
null,
|
|
]));
|
|
|
|
table(
|
|
['Keys', 'Files'],
|
|
collect($logs)->map(function ($file, $key) {
|
|
return [$key, $file];
|
|
})->toArray()
|
|
);
|
|
|
|
info(implode(PHP_EOL, [
|
|
null,
|
|
'Tip: Set custom logs by adding a "logs" key/file object',
|
|
'to your "'.Configuration::path().'" file.',
|
|
]));
|
|
|
|
exit;
|
|
}
|
|
|
|
if (! isset($logs[$key])) {
|
|
return warning('No logs found for ['.$key.'].');
|
|
}
|
|
|
|
$file = $logs[$key];
|
|
if (! file_exists($file)) {
|
|
return warning('Log path ['.$file.'] does not (yet) exist.');
|
|
}
|
|
|
|
$options = [];
|
|
if ($follow) {
|
|
$options[] = '-f';
|
|
}
|
|
if ((int) $lines) {
|
|
$options[] = '-n '.(int) $lines;
|
|
}
|
|
|
|
$command = implode(' ', array_merge(['tail'], $options, [$file]));
|
|
|
|
passthru($command);
|
|
})->descriptions('Tail log file');
|
|
}
|
|
|
|
/**
|
|
* Load all of the Valet extensions.
|
|
*/
|
|
foreach (Valet::extensions() as $extension) {
|
|
include $extension;
|
|
}
|
|
|
|
/**
|
|
* Run the application.
|
|
*/
|
|
$app->run();
|