Commit desde el servidor

parent 5e455b9d
Pipeline #670 canceled with stages
<?php
namespace App\Http\Controllers;
use App\Consts\AppVersion;
use App\Repositories\InstallerRepository;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class InstallerController extends Controller
{
protected $installer;
public function __construct(InstallerRepository $installer)
{
$this->installer = $installer;
}
public function index(Request $request)
{
if ($request->getSchemeAndHttpHost() . '/' . $request->route()->uri == $request->url()) $sub_directory = 'false';
else $sub_directory = 'true';
return view('vendor.installer.installer', ['sub_directory' => $sub_directory, 'app_version' => AppVersion::VERSION, 'timezones' => json_encode(timezone_identifiers_list()), 'host' => str_replace("install", "", $request->url())]);
}
public function requirements()
{
$phpSupportInfo = $this->installer->checkPHPversion(
config('installer.core.minPhpVersion')
);
$requirements = $this->installer->check(
config('installer.requirements')
);
$html = view('vendor.installer.requirements', compact('requirements', 'phpSupportInfo'))->render();
$status = false;
if (!isset($requirements['errors']) && $phpSupportInfo['supported']) {
$status = true;
}
return response()->json(['html' => $html, 'status' => $status]);
}
public function permissions()
{
$permissions = $this->installer->checkPermission(
config('installer.permissions')
);
$html = view('vendor.installer.permissions', compact('permissions'))->render();
$status = false;
if (!isset($permissions['errors'])) $status = true;
return response()->json(['html' => $html, 'status' => $status]);
}
public function environmentWizard()
{
$envConfig = $this->installer->getEnvContent();
return view('vendor.installer.environment-wizard', compact('envConfig'));
}
public function saveWizard(Request $request)
{
$data = $request->all();
$rules = config('installer.environment.form.rules');
try {
$request->validate($rules);
$this->validateCustomerData($data['customer_details']);
$app_url = str_replace("environment/save", "", $request->url());
$res = $this->installer->saveFileWizard($request->all(), $app_url);
$data['customer_details']['host'] = $app_url;
$same_directory = false;
if ($request->getSchemeAndHttpHost() . '/' . $request->route()->uri == $request->url()) $same_directory = true;
if ($res['results']) {
$outputLog = $this->installer->migrateAndSeed();
if ($outputLog['message'] == 'error') return response()->json(['status_code' => 500, 'errors' => $outputLog['status']]);
$final = $this->installer->finish($same_directory, $data['customer_details'], $data['app_timezone']);
} else return response()->json(['status_code' => 500, 'errors' => $res['message']]);
} catch (\Exception $e) {
if ($e instanceof \Illuminate\Validation\ValidationException) {
$errors = $e->errors();
return response()->json(['status_code' => 422, 'errors' => $errors,]);
}
return response()->json(['status_code' => 500, 'errors' => 'something went wrong']);
}
return response()->json(['status_code' => 200, 'dbOutputLog' => $outputLog['dbOutputLog'], 'final' => $final]);
}
public function testDBConnection(Request $request)
{
try {
$request->validate([
'database_connection' => 'required',
'database_hostname' => 'required',
'database_port' => 'required',
'database_name' => 'required',
'database_user_name' => 'required',
'database_password' => 'nullable'
]);
$database = config('database.connections.' . $request->database_connection);
$database["host"] = $request->database_hostname;
$database["port"] = $request->database_port;
$database["database"] = $request->database_name;
$database["username"] = $request->database_user_name;
$database["password"] = $request->database_password;
config(['database.connections.test_connection' => $database]);
DB::connection('test_connection')->getPdo();
} catch (\Exception $e) {
if ($e instanceof \Illuminate\Validation\ValidationException) {
$errors = $e->errors();
return response()->json(['status_code' => 422, 'errors' => $errors, 'message' => 'something went wrong']);
}
return response()->json(['status_code' => 500, 'errors' => null, 'message' => 'connection does not exists']);
}
return response()->json(['status_code' => 200, 'data' => null, 'message' => 'success']);
}
public function validateCustomerData($data)
{
validator($data, [
'purchase_code' => 'bail|required',
'name' => 'bail|required',
'company_name' => 'bail|required',
'email' => 'email|bail|required',
'phone' => 'bail|required',
'city' => 'bail|required',
'country' => 'bail|required',
'username' => 'bail|required',
])->validate();
}
}
<?php
namespace App\Repositories;
use App\Models\Setting;
use Exception;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Symfony\Component\Console\Output\BufferedOutput;
use Throwable;
class InstallerRepository
{
protected $results = [];
public function __construct()
{
$this->envPath = base_path('.env');
$this->envExamplePath = base_path('.env.example');
}
public function checkPHPversion(string $minPhpVersion = null)
{
$minVersionPhp = $minPhpVersion;
$currentPhpVersion = $this->getPhpVersionInfo();
$supported = false;
if ($minPhpVersion == null) {
$minVersionPhp = $this->getMinPhpVersion();
}
if (version_compare($currentPhpVersion['version'], $minVersionPhp) >= 0) {
$supported = true;
}
$phpStatus = [
'full' => $currentPhpVersion['full'],
'current' => $currentPhpVersion['version'],
'minimum' => $minVersionPhp,
'supported' => $supported,
];
return $phpStatus;
}
private static function getPhpVersionInfo()
{
$currentVersionFull = PHP_VERSION;
preg_match("#^\d+(\.\d+)*#", $currentVersionFull, $filtered);
$currentVersion = $filtered[0];
return [
'full' => $currentVersionFull,
'version' => $currentVersion,
];
}
protected function getMinPhpVersion()
{
return $this->_minPhpVersion;
}
public function check(array $requirements)
{
$results = [];
foreach ($requirements as $type => $requirement) {
switch ($type) {
// check php requirements
case 'php':
foreach ($requirements[$type] as $requirement) {
$results['requirements'][$type][$requirement] = true;
if (!extension_loaded($requirement)) {
$results['requirements'][$type][$requirement] = false;
$results['errors'] = true;
}
}
break;
// check apache requirements
case 'apache':
foreach ($requirements[$type] as $requirement) {
// if function doesn't exist we can't check apache modules
if (function_exists('apache_get_modules')) {
$results['requirements'][$type][$requirement] = true;
if (!in_array($requirement, apache_get_modules())) {
$results['requirements'][$type][$requirement] = false;
$results['errors'] = true;
}
}
}
break;
}
}
return $results;
}
public function checkPermission(array $folders)
{
foreach ($folders as $folder => $permission) {
if (!($this->getPermission($folder) >= $permission)) {
$this->addFileAndSetErrors($folder, $permission, false);
} else {
$this->addFile($folder, $permission, true);
}
}
return $this->results;
}
private function getPermission($folder)
{
return substr(sprintf('%o', fileperms(base_path($folder))), -4);
}
/**
* Add the file to the list of results.
*
* @param $folder
* @param $permission
* @param $isSet
*/
private function addFile($folder, $permission, $isSet)
{
if (!isset($this->results['permissions'])) $this->results['permissions'] = [];
array_push($this->results['permissions'], [
'folder' => $folder,
'permission' => $permission,
'isSet' => $isSet,
]);
}
/**
* Add the file and set the errors.
*
* @param $folder
* @param $permission
* @param $isSet
*/
private function addFileAndSetErrors($folder, $permission, $isSet)
{
$this->addFile($folder, $permission, $isSet);
$this->results['errors'] = true;
}
public function getEnvContent()
{
if (!file_exists($this->envPath)) {
if (file_exists($this->envExamplePath)) {
copy($this->envExamplePath, $this->envPath);
} else {
touch($this->envPath);
}
}
return file_get_contents($this->envPath);
}
public function saveFileWizard($request, $app_url)
{
$results = true;
$message = 'Your .env file settings have been saved.';
$envFileData =
'APP_NAME=\'' . $request['app_name'] . "'\n" .
'APP_ENV=local' . "\n" .
'APP_KEY=' . 'base64:' . base64_encode(Str::random(32)) . "\n" .
'APP_DEBUG=true' . "\n" .
'APP_LOG_LEVEL=debug' . "\n" .
'APP_URL=' . $app_url . "\n\n" .
'DB_CONNECTION=' . $request['database_connection'] . "\n" .
'DB_HOST=' . $request['database_hostname'] . "\n" .
'DB_PORT=' . $request['database_port'] . "\n" .
'DB_DATABASE=' . $request['database_name'] . "\n" .
'DB_USERNAME=' . $request['database_username'] . "\n" .
'DB_PASSWORD=' . $request['database_password'] . "\n\n";
try {
file_put_contents($this->envPath, $envFileData);
$database = config('database.connections.' . $request['database_connection']);
$database["host"] = $request['database_hostname'];
$database["port"] = $request['database_port'];
$database["database"] = $request['database_name'];
$database["username"] = $request['database_username'];
$database["password"] = $request['database_password'];
config(['database.connections.' . $request['database_connection'] => $database]);
} catch (Exception $e) {
$results = false;
$message = 'Unable to save the .env file, Please create it manually.';
}
return ['results' => $results, 'message' => $message];
}
public function migrateAndSeed()
{
$outputLog = new BufferedOutput();
return $this->migrate($outputLog);
}
private function migrate(BufferedOutput $outputLog)
{
try {
Artisan::call('optimize:clear');
Artisan::call('optimize');
Artisan::call('migrate', ['--force' => true], $outputLog);
} catch (Exception $e) {
return $this->response($e->getMessage(), 'error', $outputLog);
}
return $this->seed($outputLog);
}
private function seed(BufferedOutput $outputLog)
{
try {
Artisan::call('db:seed', ['--force' => true], $outputLog);
} catch (Exception $e) {
return $this->response($e->getMessage(), 'error', $outputLog);
}
return $this->response('Successfully Completed', 'success', $outputLog);
}
private function response($message, $status, BufferedOutput $outputLog)
{
return [
'status' => $status,
'message' => $message,
'dbOutputLog' => $outputLog->fetch(),
];
}
public function finish($same_directory, $customer_details, $timezone)
{
$finalMessages = $this->runFinal($same_directory);
$this->setTimezone($timezone);
$this->setCustomerDetails($customer_details);
$this->updateInstalledStatus();
$finalStatusMessage = $this->create();
$finalEnvFile = $this->getEnvContent();
return ['finalMessages' => $finalMessages, 'finalStatusMessage' => $finalStatusMessage, 'finalEnvFile' => $finalEnvFile];
}
public function runFinal($same_directory)
{
$outputLog = new BufferedOutput;
$this->generateKey($outputLog);
$this->publishVendorAssets($outputLog);
$this->linkStorage($outputLog);
if (!$same_directory) $this->clearRoute($outputLog);
$this->createFile();
return $outputLog->fetch();
}
private static function publishVendorAssets(BufferedOutput $outputLog)
{
try {
if (config('installer.final.publish')) {
Artisan::call('vendor:publish', ['--all' => true], $outputLog);
}
} catch (Exception $e) {
return static::response('error', $e->getMessage(), $outputLog);
}
return $outputLog;
}
private static function generateKey(BufferedOutput $outputLog)
{
try {
if (config('installer.final.key')) {
Artisan::call('key:generate', ['--force' => true], $outputLog);
}
} catch (Exception $e) {
return static::response('error', $e->getMessage(), $outputLog);
}
return $outputLog;
}
private static function linkStorage(BufferedOutput $outputLog)
{
try {
if (config('installer.final.key')) {
Artisan::call('storage:link');
}
} catch (Exception $e) {
return null;
}
return $outputLog;
}
private static function updateInstalledStatus()
{
$settings = Setting::first();
$settings->installed = 1;
$settings->save();
return $settings;
}
private static function setTimezone($timezone)
{
try {
$settings = Setting::first();
$settings->timezone = $timezone;
$settings->save();
} catch (Throwable $th) {
return null;
}
return true;
}
private static function clearRoute(BufferedOutput $outputLog)
{
try {
if (config('installer.final.key')) {
Artisan::call('route:clear');
}
} catch (Exception $e) {
return null;
}
return $outputLog;
}
private static function createFile()
{
$data = [];
Storage::put('public/tokens_for_callpage.json', json_encode($data));
Storage::put('public/tokens_for_display.json', json_encode($data));
}
public function create()
{
// $installedLogFile = storage_path('installed');
// $dateStamp = date('Y/m/d h:i:sa');
//if (!file_exists($installedLogFile)) {
$message = 'JL Token Installer successfully INSTALLED on' . date('Y/m/d h:i:sa') . "\n";
// file_put_contents($installedLogFile, $message);
// } else {
// $message = 'JL Token Installer successfully UPDATED on' . $dateStamp;
// file_put_contents($installedLogFile, $message . PHP_EOL, FILE_APPEND | LOCK_EX);
// }
return $message;
}
public function setCustomerDetails($data)
{
try {
$response = Http::withoutVerifying()
->withOptions(["verify" => false])
->post(config('services.key_verification.set_customer_details'), $data);
if ($response->successful() && isset($response->collect()['status_code']) && $response->collect()['status_code'] == 200) {
return 'Success';
}
throw new Exception('verification api error');
} catch (\Throwable $th) {
throw new Exception('verification api error');
}
}
}
<?php
return [
/*
|--------------------------------------------------------------------------
| Server Requirements
|--------------------------------------------------------------------------
|
| This is the default Laravel server requirements, you can add as many
| as your application require, we check if the extension is enabled
| by looping through the array and run "extension_loaded" on it.
|
*/
'core' => [
'minPhpVersion' => '7.3.0',
],
'final' => [
'key' => true,
'publish' => false,
],
'requirements' => [
'php' => [
'openssl',
'pdo',
'mbstring',
'tokenizer',
'JSON',
'cURL',
'bcmath',
'ctype',
'fileinfo',
'xml',
],
'apache' => [
'mod_rewrite',
],
],
/*
|--------------------------------------------------------------------------
| Folders Permissions
|--------------------------------------------------------------------------
|
| This is the default Laravel folders permissions, if your application
| requires more permissions just add them to the array list bellow.
|
*/
'permissions' => [
'storage/framework/' => '775',
'storage/app/' => '775',
'storage/logs/' => '775',
'bootstrap/cache/' => '775',
],
/*
|--------------------------------------------------------------------------
| Environment Form Wizard Validation Rules & Messages
|--------------------------------------------------------------------------
|
| This are the default form field validation rules. Available Rules:
| https://laravel.com/docs/5.4/validation#available-validation-rules
|
*/
'environment' => [
'form' => [
'rules' => [
'app_name' => 'required|string|max:50',
'database_connection' => 'required|string|max:50',
'database_hostname' => 'required|string|max:50',
'database_port' => 'required|numeric',
'database_name' => 'required|string|max:50',
'database_username' => 'required|string|max:50',
'database_password' => 'nullable|string|max:50',
'customer_details' => 'required',
'app_timezone' => 'required'
],
],
],
/*
|--------------------------------------------------------------------------
| Installed Middleware Options
|--------------------------------------------------------------------------
| Different available status switch configuration for the
| canInstall middleware located in `canInstall.php`.
|
*/
'installed' => [
'redirectOptions' => [
'route' => [
'name' => 'welcome',
'data' => [],
],
'abort' => [
'type' => '404',
],
'dump' => [
'data' => 'Dumping a not found message.',
],
],
],
/*
|--------------------------------------------------------------------------
| Selected Installed Middleware Option
|--------------------------------------------------------------------------
| The selected option fo what happens when an installer instance has been
| Default output is to `/resources/views/error/404.blade.php` if none.
| The available middleware options include:
| route, abort, dump, 404, default, ''
|
*/
'installedAlreadyAction' => '',
/*
|--------------------------------------------------------------------------
| Updater Enabled
|--------------------------------------------------------------------------
| Can the application run the '/update' route with the migrations.
| The default option is set to False if none is present.
| Boolean value
|
*/
'updaterEnabled' => 'true',
];
<?php
use App\Http\Controllers\InstallerController;
use Illuminate\Support\Facades\Route;
Route::get('/install', [InstallerController::class, 'index'])->name('install');
Route::get('/requirements', [InstallerController::class, 'requirements'])->name('requirements');
Route::get('/permissions', [InstallerController::class, 'permissions'])->name('permissions');
Route::get('/environment', [InstallerController::class, 'environmentWizard'])->name('environment');
Route::post('/test-connection', [InstallerController::class, 'testDBConnection'])->name('test-connection');
Route::post('/environment/save', [InstallerController::class, 'saveWizard'])->name('set-env');
\ No newline at end of file
*
!public/
!.gitignore
compiled.php
config.php
down
events.scanned.php
maintenance.php
routes.php
routes.scanned.php
schedule-*
services.json
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment