Merge pull request #659 from cachethq/env-config-setup
Env config setup
This commit is contained in:
@@ -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'),
|
||||
'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',
|
||||
'success' => true,
|
||||
'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
@@ -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"
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user