json(['message' => ctrans('texts.self_update_not_available')], 403); } $this->testWritable(); // Get the new version available $versionAvailable = $updater->source()->getVersionAvailable(); // Create a release $release = $updater->source()->fetch($versionAvailable); $updater->source()->update($release); $cacheCompiled = base_path('bootstrap/cache/compiled.php'); if (file_exists($cacheCompiled)) { unlink ($cacheCompiled); } $cacheServices = base_path('bootstrap/cache/services.php'); if (file_exists($cacheServices)) { unlink ($cacheServices); } Artisan::call('clear-compiled'); Artisan::call('route:clear'); Artisan::call('view:clear'); Artisan::call('optimize'); return response()->json(['message' => 'Update completed'], 200); } private function testWritable() { $directoryIterator = new \RecursiveDirectoryIterator(base_path(), \RecursiveDirectoryIterator::SKIP_DOTS); foreach (new \RecursiveIteratorIterator($directoryIterator) as $file) { if(strpos($file->getPathname(), '.git') !== false) continue; // nlog($file->getPathname()); if ($file->isFile() && ! $file->isWritable()) { // throw new FilePermissionsFailure($file); nlog("Cannot update system because {$file->getFileName()} is not writable"); throw new FilePermissionsFailure("Cannot update system because {$file->getFileName()} is not writable"); return false; } } return true; } public function checkVersion() { return trim(file_get_contents(config('ninja.version_url'))); } private function getDownloadUrl() { $version = $this->checkVersion(); return "https://github.com/invoiceninja/invoiceninja/releases/download/v{$verion}/invoiceninja.zip" } }