Merge pull request #505 from cuneytsenturk/1.3-dev
Improve the update process
This commit is contained in:
		| @@ -6,8 +6,10 @@ use App\Http\Controllers\Controller; | ||||
| use App\Events\UpdateFinished; | ||||
| use App\Utilities\Updater; | ||||
| use App\Utilities\Versions; | ||||
| use Illuminate\Http\Request; | ||||
| use Artisan; | ||||
| use Module; | ||||
| use File; | ||||
|  | ||||
| class Updates extends Controller | ||||
| { | ||||
| @@ -80,15 +82,20 @@ class Updates extends Controller | ||||
|      */ | ||||
|     public function update($alias, $version) | ||||
|     { | ||||
|         set_time_limit(600); // 10 minutes | ||||
|         if ($alias == 'core') { | ||||
|             $name = 'Akaunting v' . $version; | ||||
|  | ||||
|         if (Updater::update($alias, $version)) { | ||||
|             return redirect('install/updates/post/' . $alias . '/' . version('short') . '/' . $version); | ||||
|             $installed = version('short'); | ||||
|         } else { | ||||
|             // Get module instance | ||||
|             $module = Module::findByAlias($alias); | ||||
|  | ||||
|             $name = $module->get('name'); | ||||
|  | ||||
|             $installed = $module->get('version'); | ||||
|         } | ||||
|  | ||||
|         flash(trans('updates.error'))->error()->important(); | ||||
|  | ||||
|         return redirect()->back(); | ||||
|         return view('install.updates.edit', compact('alias', 'name', 'installed', 'version')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -117,4 +124,231 @@ class Updates extends Controller | ||||
|  | ||||
|         return redirect('install/updates'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the form for viewing the specified resource. | ||||
|      * | ||||
|      * @param  $request | ||||
|      * | ||||
|      * @return Response | ||||
|      */ | ||||
|     public function steps(Request $request) | ||||
|     { | ||||
|         $this->checkApiToken(); | ||||
|  | ||||
|         $json = []; | ||||
|         $json['step'] = []; | ||||
|  | ||||
|         $name = $request['name']; | ||||
|         $version = $request['version']; | ||||
|  | ||||
|         // Download | ||||
|         $json['step'][] = [ | ||||
|             'text' => trans('modules.installation.download', ['module' => $name]), | ||||
|             'url'  => url('install/updates/download') | ||||
|         ]; | ||||
|  | ||||
|         // Unzip | ||||
|         $json['step'][] = [ | ||||
|             'text' => trans('modules.installation.unzip', ['module' => $name]), | ||||
|             'url'  => url('install/updates/unzip') | ||||
|         ]; | ||||
|  | ||||
|         // File Copy | ||||
|         $json['step'][] = [ | ||||
|             'text' => trans('modules.installation.file_copy', ['module' => $name]), | ||||
|             'url'  => url('install/updates/file-copy') | ||||
|         ]; | ||||
|  | ||||
|         // Migrate DB and trigger event UpdateFinish event | ||||
|         $json['step'][] = [ | ||||
|             'text' => trans('modules.installation.migrate', ['module' => $name]), | ||||
|             'url'  => url('install/updates/migrate') | ||||
|         ]; | ||||
|  | ||||
|         // redirect update page | ||||
|         $json['step'][] = [ | ||||
|             'text' => trans('modules.installation.finish'), | ||||
|             'url'  => url('install/updates/finish') | ||||
|         ]; | ||||
|  | ||||
|         return response()->json($json); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the form for viewing the specified resource. | ||||
|      * | ||||
|      * @param  $request | ||||
|      * | ||||
|      * @return Response | ||||
|      */ | ||||
|     public function download(Request $request) | ||||
|     { | ||||
|         set_time_limit(600); // 10 minutes | ||||
|  | ||||
|         $status = true; | ||||
|  | ||||
|         if ($request['alias'] != 'core') { | ||||
|             $this->checkApiToken(); | ||||
|         } | ||||
|  | ||||
|         // Download file | ||||
|         if (!$data = Updater::download($request['alias'], $request['version'])) { | ||||
|             $status = false; | ||||
|  | ||||
|             $message = trans('modules.errors.download', ['module' => $request['name']]); | ||||
|         } | ||||
|  | ||||
|         // Create temp directory | ||||
|         $path = 'temp-' . md5(mt_rand()); | ||||
|         $temp_path = storage_path('app/temp') . '/' . $path; | ||||
|  | ||||
|         if (!File::isDirectory($temp_path)) { | ||||
|             File::makeDirectory($temp_path); | ||||
|         } | ||||
|  | ||||
|         $file = $temp_path . '/upload.zip'; | ||||
|  | ||||
|         // Add content to the Zip file | ||||
|         $uploaded = is_int(file_put_contents($file, $data)) ? true : false; | ||||
|  | ||||
|         if (!$uploaded) { | ||||
|             return false; | ||||
|  | ||||
|             $message = trans('modules.errors.upload', ['module' => $request['name']]); | ||||
|         } | ||||
|  | ||||
|         $json = [ | ||||
|             'success' => ($status) ? true : false, | ||||
|             'errors' => (!$status) ? $message : false, | ||||
|             'data' => [ | ||||
|                 'path' => $path | ||||
|             ] | ||||
|         ]; | ||||
|  | ||||
|         return response()->json($json); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the form for viewing the specified resource. | ||||
|      * | ||||
|      * @param  $request | ||||
|      * | ||||
|      * @return Response | ||||
|      */ | ||||
|     public function unzip(Request $request) | ||||
|     { | ||||
|         set_time_limit(600); // 10 minutes | ||||
|  | ||||
|         if ($request['alias'] != 'core') { | ||||
|             $this->checkApiToken(); | ||||
|         } | ||||
|  | ||||
|         $path = storage_path('app/temp') . '/' . $request['path']; | ||||
|  | ||||
|         $file =  $path . '/upload.zip'; | ||||
|  | ||||
|         $result = Updater::unzip($file, $path); | ||||
|  | ||||
|         $json = [ | ||||
|             'success' => ($result) ? true : false, | ||||
|             'errors' => (!$result) ? trans('modules.errors.unzip', ['module' => $request['name']]) : false, | ||||
|             'data' => [ | ||||
|                 'path' => $request['path'] | ||||
|             ] | ||||
|         ]; | ||||
|  | ||||
|         return response()->json($json); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the form for viewing the specified resource. | ||||
|      * | ||||
|      * @param  $request | ||||
|      * | ||||
|      * @return Response | ||||
|      */ | ||||
|     public function fileCopy(Request $request) | ||||
|     { | ||||
|         set_time_limit(600); // 10 minutes | ||||
|  | ||||
|         if ($request['alias'] != 'core') { | ||||
|             $this->checkApiToken(); | ||||
|         } | ||||
|  | ||||
|         $path = storage_path('app/temp') . '/' . $request['path']; | ||||
|  | ||||
|         $result = Updater::fileCopy($request['alias'], $path, $request['version']); | ||||
|  | ||||
|         $json = [ | ||||
|             'success' => ($result) ? true : false, | ||||
|             'errors' => (!$result) ? trans('modules.errors.file_copy', ['module' => $request['name']]) : false, | ||||
|             'data' => [ | ||||
|                 'path' => $request['path'] | ||||
|             ] | ||||
|         ]; | ||||
|  | ||||
|         return response()->json($json); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the form for viewing the specified resource. | ||||
|      * | ||||
|      * @param  $request | ||||
|      * | ||||
|      * @return Response | ||||
|      */ | ||||
|     public function migrate(Request $request) | ||||
|     { | ||||
|         // Check if the file mirror was successful | ||||
|         if (($request['alias'] == 'core') && (version('short') != $request['version'])) { | ||||
|             $json = [ | ||||
|                 'success' => false, | ||||
|                 'errors' => trans('modules.errors.migrate core', ['module' => $request['name']]), | ||||
|                 'data' => [] | ||||
|             ]; | ||||
|  | ||||
|             return response()->json($json); | ||||
|         } | ||||
|  | ||||
|         // Clear cache after update | ||||
|         Artisan::call('cache:clear'); | ||||
|  | ||||
|         try { | ||||
|             event(new UpdateFinished($request['alias'], $request['installed'], $request['version'])); | ||||
|  | ||||
|             $json = [ | ||||
|                 'success' => true, | ||||
|                 'errors' => false, | ||||
|                 'data' => [] | ||||
|             ]; | ||||
|         } catch (\Exception $e) { | ||||
|             $json = [ | ||||
|                 'success' => false, | ||||
|                 'errors' => trans('modules.errors.migrate', ['module' => $request['name']]), | ||||
|                 'data' => [] | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return response()->json($json); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show the form for viewing the specified resource. | ||||
|      * | ||||
|      * @param  $request | ||||
|      * | ||||
|      * @return Response | ||||
|      */ | ||||
|     public function finish(Request $request) | ||||
|     { | ||||
|         $json =  [ | ||||
|             'success' => true, | ||||
|             'errors' => false, | ||||
|             'redirect' => url("install/updates"), | ||||
|             'data' => [], | ||||
|         ]; | ||||
|  | ||||
|         return response()->json($json); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -121,6 +121,56 @@ class Updater | ||||
|         return $file; | ||||
|     } | ||||
|  | ||||
|     public static function unzip($file, $temp_path) | ||||
|     { | ||||
|         // Unzip the file | ||||
|         $zip = new ZipArchive(); | ||||
|  | ||||
|         if (($zip->open($file) !== true) || !$zip->extractTo($temp_path)) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         $zip->close(); | ||||
|  | ||||
|         // Delete zip file | ||||
|         File::delete($file); | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     public static function fileCopy($alias, $temp_path, $version) | ||||
|     { | ||||
|         if ($alias == 'core') { | ||||
|             // Move all files/folders from temp path | ||||
|             if (!File::copyDirectory($temp_path, base_path())) { | ||||
|                 return false; | ||||
|             } | ||||
|         } else { | ||||
|             // Get module instance | ||||
|             $module = Module::findByAlias($alias); | ||||
|             $model = Model::where('alias', $alias)->first(); | ||||
|  | ||||
|             // Move all files/folders from temp path | ||||
|             if (!File::copyDirectory($temp_path, module_path($module->get('name')))) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             // Add history | ||||
|             ModelHistory::create([ | ||||
|                 'company_id' => session('company_id'), | ||||
|                 'module_id' => $model->id, | ||||
|                 'category' => $module->get('category'), | ||||
|                 'version' => $version, | ||||
|                 'description' => trans('modules.history.updated', ['module' => $module->get('name')]), | ||||
|             ]); | ||||
|         } | ||||
|  | ||||
|         // Delete temp directory | ||||
|         File::deleteDirectory($temp_path); | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     public static function all() | ||||
|     { | ||||
|         // Get data from cache | ||||
| @@ -159,4 +209,4 @@ class Updater | ||||
|  | ||||
|         return $data; | ||||
|     } | ||||
| } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user