Allow changing of some env variable during setup.

This commit is contained in:
James Brooks
2015-05-23 10:35:28 +01:00
committed by Graham Campbell
parent 5709995b13
commit 6dbd15d272
7 changed files with 163 additions and 44 deletions

View File

@@ -14,6 +14,7 @@ namespace CachetHQ\Cachet\Http\Controllers;
use CachetHQ\Cachet\Models\Setting;
use CachetHQ\Cachet\Models\User;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Request;
@@ -24,6 +25,17 @@ use Illuminate\Support\Facades\View;
class SetupController extends AbstractController
{
/**
* Array of cache drivers.
*
* @var string[]
*/
protected $cacheDrivers = [
'apc' => 'APC(u)',
// 'file' => 'File',
// 'database' => 'Database',
];
/**
* Create a new setup controller instance.
*/
@@ -41,13 +53,20 @@ class SetupController extends AbstractController
{
segment_page('Setup');
// If we've copied the .env.example file, then we should try and reset it ready for Segment to kick in.
if (getenv('APP_KEY') === 'SomeRandomString') {
Artisan::call('key:generate');
}
return View::make('setup')->with([
'pageTitle' => trans('setup.setup'),
'cacheDrivers' => $this->cacheDrivers,
'appUrl' => Request::root(),
]);
}
/**
* Handles validation on step one of setup form.
* Handles validation on step one of the setup form.
*
* @return \Illuminate\Http\Response
*/
@@ -55,16 +74,9 @@ class SetupController extends AbstractController
{
$postData = Binput::all();
segment_track('Setup', [
'step' => '1',
]);
$v = Validator::make($postData, [
'settings.app_name' => 'required',
'settings.app_domain' => 'required',
'settings.app_timezone' => 'required',
'settings.app_locale' => 'required',
'settings.show_support' => 'boolean',
'env.cache_driver' => 'required|in:'.implode(',', array_keys($this->cacheDrivers)),
'env.session_driver' => 'required|in:'.implode(',', array_keys($this->cacheDrivers)),
]);
if ($v->passes()) {
@@ -76,7 +88,6 @@ class SetupController extends AbstractController
return Response::json(['status' => 1]);
} else {
// No good, let's try that again.
segment_track('Setup', [
'event' => 'Step 1',
'success' => false,
@@ -87,25 +98,60 @@ class SetupController extends AbstractController
}
/**
* Handles the actual app setup.
* Handles validation on step two of the setup form.
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response
* @return \Illuminate\Http\Response
*/
public function postStep2()
{
$postData = Binput::all();
segment_track('Setup', [
'step' => '2',
]);
$v = Validator::make($postData, [
'env.cache_driver' => 'required|in:'.implode(',', array_keys($this->cacheDrivers)),
'env.session_driver' => 'required|in:'.implode(',', array_keys($this->cacheDrivers)),
'settings.app_name' => 'required',
'settings.app_domain' => 'required',
'settings.app_timezone' => 'required',
'settings.app_locale' => 'required',
'settings.show_support' => 'boolean',
'user.username' => 'alpha_num|required',
]);
if ($v->passes()) {
segment_track('Setup', [
'event' => 'Step 2',
'success' => true,
]);
return Response::json(['status' => 1]);
} else {
// No good, let's try that again.
segment_track('Setup', [
'event' => 'Step 2',
'success' => false,
]);
return Response::json(['errors' => $v->messages()], 400);
}
}
/**
* Handles the actual app setup, including user, settings and env.
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response
*/
public function postStep3()
{
$postData = Binput::all();
$v = Validator::make($postData, [
'env.cache_driver' => 'required|in:'.implode(',', array_keys($this->cacheDrivers)),
'env.session_driver' => 'required|in:'.implode(',', array_keys($this->cacheDrivers)),
'settings.app_name' => 'required',
'settings.app_domain' => 'required',
'settings.app_timezone' => 'required',
'settings.app_locale' => 'required',
'settings.show_support' => 'boolean',
'user.username' => ['required', 'regex:/\A(?!.*[:;]-\))[ -~]+\z/'],
'user.email' => 'email|required',
'user.password' => 'required',
]);
@@ -123,7 +169,7 @@ class SetupController extends AbstractController
Auth::login($user);
$settings = array_get($postData, 'settings');
$settings = array_pull($postData, 'settings');
foreach ($settings as $settingName => $settingValue) {
Setting::create([
@@ -132,11 +178,20 @@ class SetupController extends AbstractController
]);
}
$envData = array_pull($postData, 'env');
// Write the env to the .env file.
foreach ($envData as $envKey => $envValue) {
$this->writeEnv($envKey, $envValue);
}
Session::flash('setup.done', true);
segment_track('Setup', [
'event' => 'Step 2',
'event' => 'Step 3',
'success' => true,
'cache_driver' => $envData['cache_driver'],
'session_driver' => $envData['session_driver'],
]);
if (Request::ajax()) {
@@ -146,7 +201,7 @@ class SetupController extends AbstractController
return Redirect::to('dashboard');
} else {
segment_track('Setup', [
'event' => 'Step 2',
'event' => 'Step 3',
'success' => false,
]);
@@ -158,4 +213,24 @@ class SetupController extends AbstractController
return Redirect::back()->withInput()->with('errors', $v->messages());
}
}
/**
* Writes to the .env file with given parameters.
*
* @param string $key
* @param mixed $value
*
* @return void
*/
protected function writeEnv($key, $value)
{
static $path = null;
if ($path === null || ($path !== null && file_exists($path))) {
$path = base_path('.env');
file_put_contents($path, str_replace(
getenv(strtoupper($key)), $value, file_get_contents($path)
));
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
{
"dist/css/all.css": "dist/css/all-85d5201e.css",
"dist/css/all.css": "dist/css/all-a7da06ae.css",
"dist/js/all.js": "dist/js/all-6b8a6e2b.js"
}

View File

@@ -10,7 +10,7 @@
border-radius: 2px 2px 0 0;
margin-bottom: 20px;
.step {
@extend .col-xs-4;
@extend .col-xs-3;
padding: 20px 0;
text-align: center;
position: relative;

View File

@@ -21,6 +21,8 @@ return [
'site_timezone' => 'Select your timezone',
'site_locale' => 'Select your language',
'enable_google2fa' => 'Enable Google Two Factor Authentication',
'cache_driver' => 'Cache Driver',
'session_driver' => 'Session Driver',
],
// Login form fields

View File

@@ -13,6 +13,7 @@ return [
'setup' => 'Setup',
'title' => 'Setup Cachet',
'service_details' => 'Service Details',
'env_setup' => 'Environment Setup',
'status_page_setup' => 'Status Page Setup',
'show_support' => 'Show support for Cachet?',
'admin_account' => 'Administrator Account',

View File

@@ -10,6 +10,10 @@
<div class="col-xs-12 col-xs-offset-0 col-sm-8 col-sm-offset-2">
<div class="steps">
<div class="step active">
{{ trans('setup.env_setup') }}
<span></span>
</div>
<div class="step">
{{ trans('setup.status_page_setup') }}
<span></span>
</div>
@@ -24,24 +28,58 @@
</div>
<div class="clearfix"></div>
<form class="form-horizontal" name="SetupForm" method="POST" id="setup-form" role="form">
<div class="step block-1 show">
<div class="step block-1">
<fieldset>
<div class="form-group">
<label class="sr-only">{{ trans('forms.site_name') }}</label>
<input type="text" name="settings[app_name]" class="form-control" placeholder="{{ trans('forms.setup.site_name') }}" value="{{ Input::old('settings.app_name', '') }}" required >
<label>{{ trans('forms.setup.cache_driver') }}</label>
<select name="env[cache_driver]" class="form-control" required>
<option disabled>{{ trans('forms.setup.cache_driver') }}</option>
@foreach($cacheDrivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Input::old('env.cache_driver') == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.cache_driver'))
<span class="text-danger">{{ $errors->first('env.cache_driver') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.session_driver') }}</label>
<select name="env[session_driver]" class="form-control" required>
<option disabled>{{ trans('forms.setup.session_driver') }}</option>
@foreach($cacheDrivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Input::old('env.session_driver') == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.session_driver'))
<span class="text-danger">{{ $errors->first('env.session_driver') }}</span>
@endif
</div>
</fieldset>
<hr>
<div class="form-group text-center">
<span class="wizard-next btn btn-success" data-current-block="1" data-next-block="2" data-loading-text="<i class='icon ion-load-c'></i>">
{{ trans('pagination.next') }}
</span>
</div>
</div>
<div class="step block-2 hidden">
<fieldset>
<div class="form-group">
<label>{{ trans('forms.setup.site_name') }}</label>
<input type="text" name="settings[app_name]" class="form-control" placeholder="{{ trans('forms.setup.site_name') }}" value="{{ Input::old('settings.app_name', '') }}" required>
@if($errors->has('settings.app_name'))
<span class="text-danger">{{ $errors->first('settings.app_name') }}</span>
@endif
</div>
<div class="form-group">
<label class="sr-only">{{ trans('forms.site_domain') }}</label>
<input type="text" name="settings[app_domain]" class="form-control" placeholder="{{ trans('forms.setup.site_domain') }}" value="{{ Input::old('settings.app_domain', url()) }}" required >
<label>{{ trans('forms.setup.site_domain') }}</label>
<input type="text" name="settings[app_domain]" class="form-control" placeholder="{{ trans('forms.setup.site_domain') }}" value="{{ Input::old('settings.app_domain', url()) }}" required>
@if($errors->has('settings.app_domain'))
<span class="text-danger">{{ $errors->first('settings.app_domain') }}</span>
@endif
</div>
<div class="form-group">
<label class="sr-only">{{ trans('forms.site_timezone') }}</label>
<label>{{ trans('forms.setup.site_timezone') }}</label>
<select name="settings[app_timezone]" class="form-control" required>
<option value="">Select Timezone</option>
@foreach($timezones as $region => $list)
@@ -59,7 +97,7 @@
@endif
</div>
<div class="form-group">
<label class="sr-only">{{ trans('forms.site_locale') }}</label>
<label>{{ trans('forms.setup.site_locale') }}</label>
<select name="settings[app_locale]" class="form-control" required>
<option value="">Select Language</option>
@foreach($langs as $lang => $name)
@@ -86,31 +124,34 @@
</div>
<hr>
<div class="form-group text-center">
<span class="wizard-next btn btn-success" data-current-block="1" data-next-block="2" data-loading-text="<i class='icon ion-load-c'></i>">
<span class="wizard-next btn btn-info" data-current-block="2" data-next-block="1">
{{ trans('pagination.previous') }}
</span>
<span class="wizard-next btn btn-success" data-current-block="2" data-next-block="3" data-loading-text="<i class='icon ion-load-c'></i>">
{{ trans('pagination.next') }}
</span>
</div>
</fieldset>
</div>
<div class="step block-2 hidden">
<div class="step block-3 hidden">
<fieldset>
<div class="form-group">
<label class="sr-only">{{ trans("forms.username") }}</label>
<input type="text" name="user[username]" class="form-control" placeholder="{{ trans('forms.setup.username') }}" value="{{ Input::old('user.username', '') }}" required >
<label>{{ trans("forms.setup.username") }}</label>
<input type="text" name="user[username]" class="form-control" placeholder="{{ trans('forms.setup.username') }}" value="{{ Input::old('user.username', '') }}" required>
@if($errors->has('user.username'))
<span class="text-danger">{{ $errors->first('user.username') }}</span>
@endif
</div>
<div class="form-group">
<label class="sr-only">{{ trans("forms.email") }}</label>
<input type="text" name="user[email]" class="form-control" placeholder="{{ trans('forms.setup.email') }}" value="{{ Input::old('user.email', '') }}" required >
<label>{{ trans("forms.setup.email") }}</label>
<input type="text" name="user[email]" class="form-control" placeholder="{{ trans('forms.setup.email') }}" value="{{ Input::old('user.email', '') }}" required>
@if($errors->has('user.email'))
<span class="text-danger">{{ $errors->first('user.email') }}</span>
@endif
</div>
<div class="form-group">
<label class="sr-only">{{ trans("forms.password") }}</label>
<input type="password" name="user[password]" class="form-control" placeholder="{{ trans('forms.setup.password') }}" value="{{ Input::old('user.password', '') }}" required >
<label>{{ trans("forms.setup.password") }}</label>
<input type="password" name="user[password]" class="form-control" placeholder="{{ trans('forms.setup.password') }}" value="{{ Input::old('user.password', '') }}" required>
@if($errors->has('user.password'))
<span class="text-danger">{{ $errors->first('user.password') }}</span>
@endif
@@ -119,15 +160,15 @@
<hr >
<div class="form-group text-center">
<input type="hidden" name="settings[app_incident_days]" value="7" >
<span class="wizard-next btn btn-info" data-current-block="2" data-next-block="1">
<span class="wizard-next btn btn-info" data-current-block="3" data-next-block="2">
{{ trans('pagination.previous') }}
</span>
<span class="wizard-next btn btn-success" data-current-block="2" data-next-block="3" data-loading-text="<i class='icon ion-load-c'></i>">
<span class="wizard-next btn btn-success" data-current-block="3" data-next-block="4" data-loading-text="<i class='icon ion-load-c'></i>">
{{ trans("setup.complete_setup") }}
</span>
</div>
</div>
<div class="step block-3 hidden">
<div class="step block-4 hidden">
<div class="setup-success">
<i class="ion-checkmark-circled"></i>
<h3>