. */ namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\Storage; class Install extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'application:install {-u|--unattended: Install non-interactively (currently unused: WIP)}'; /** * The console command description. * * @var string */ protected $description = 'Installs the application and prepares for production use.'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { $basePath = base_path(); if (Storage::disk('local')->missing('INSTALLED')) { $this->info('[!! Welcome to Rasberry Teams !!]'); $this->info('>> Installing...'); $this->call('down'); copy($basePath.'/.env.example', $basePath.'/.env'); $this->call('key:generate'); $this->info('>> Installing and preparing dependencies. This may take a while, depending on your computer.'); $npmOut = 0; $npmMessages = []; $npmBuildOut = 0; $npmBuildMessages = []; exec('cd '.$basePath.' && npm install --silent', $npmBuildOut, $npmOut); exec('cd '.$basePath.'&& npm run dev --silent', $npmBuildMessages, $npmBuildOut); if ($npmOut !== 0 && $npmBuildOut !== 0) { $this->error('[!] One or more errors have ocurred whilst attempting to install dependencies.'); $this->error('[!] It is recommended to run this command again, and report a bug if it keeps happening.'); return false; } $settings = []; $this->info('>> Configuring application - We\'re going to ask a few questions here!'); do { $this->info('== Database Settings (1/6) =='); $settings['DB_USERNAME'] = $this->ask('Database username'); $settings['DB_PASSWORD'] = $this->secret('Database password (Input won\'t be seen)'); $settings['DB_DATABASE'] = $this->ask('Database name'); $settings['DB_PORT'] = $this->ask('Database port'); $settings['DB_HOST'] = $this->ask('Database hostname'); $this->info('== Antispam Settings (2/6) (Recaptcha v2) =='); $settings['RECAPTCHA_SITE_KEY'] = $this->ask('Site key'); $settings['RECAPTCHA_PRIVATE_KEY'] = $this->ask('Private site key'); $this->info('== IP Geolocation Settings (3/6) (refer to README.md) =='); $settings['IPGEO_API_KEY'] = $this->ask('API Key'); $this->info('== Notification Settings (4/6) (Email) =='); $settings['MAIL_USERNAME'] = $this->ask('SMTP Username'); $settings['MAIL_PASSWORD'] = $this->secret('SMTP Password (Input won\'t be seen)'); $settings['MAIL_PORT'] = $this->ask('SMTP Server Port'); $settings['MAIL_HOST'] = $this->ask('SMTP Server Hostname'); $settings['MAIL_FROM'] = $this->ask('E-mail address to send from: '); $this->info('== Notification Settings (5/6) (Slack) =='); $settings['SLACK_INTEGRATION_WEBHOOK'] = $this->ask('Integration webhook URL'); $this->info('== Web Settings (6/6) =='); $settings['APP_URL'] = $this->ask('Application\'s URL (ex. https://where.you.installed.theapp.com): '); $settings['APP_LOGO'] = $this->ask('App logo (Link to an image): '); $settings['APP_SITEHOMEPAGE'] = $this->ask('Site homepage (appears in the main header): '); } while (! $this->confirm('Are you sure you want to save these settings? You can always go back and try again.')); foreach ($settings as $keyname => $value) { $this->call('environment:modify', [ 'key' => $keyname, 'value' => $value, ]); } $this->info('>> Saved configuration settings!'); $this->info('>> Preparing database...'); $this->callSilent('config:cache'); $this->call('migrate'); $this->call('db:seed'); touch($basePath.'/INSTALLED'); $this->call('up'); $this->info('>> All done! Visit '.$basePath.' to start using your brand new installation of Raspberry Teams!'); } else { $this->error('[!] The application is already installed!'); } } }