Compare commits
1 Commits
659216dbd0
...
9b65cb00a3
Author | SHA1 | Date | |
---|---|---|---|
9b65cb00a3 |
@ -11,11 +11,11 @@
|
||||
<namespace>OCCWeb</namespace>
|
||||
<category>tools</category>
|
||||
<website>https://git.adphi.net/Adphi/OCCWeb</website>
|
||||
<screenshot>https://git.adphi.net/Adphi/OCCWeb/raw/master/appinfo/screenshot.png</screenshot>
|
||||
<repository>https://git.adphi.net/Adphi/OCCWeb</repository>
|
||||
<bugs>https://git.adphi.net/Adphi/OCCWeb/issues</bugs>
|
||||
<repository>https://git.adphi.net/Adphi/OCCWeb</repository>
|
||||
<screenshot>https://git.adphi.net/Adphi/OCCWeb/raw/master/appinfo/screenshot.png</screenshot>
|
||||
<dependencies>
|
||||
<nextcloud min-version="13" max-version="16"/>
|
||||
<nextcloud min-version="13" max-version="18"/>
|
||||
</dependencies>
|
||||
<navigations>
|
||||
<navigation role="admin">
|
||||
|
Binary file not shown.
Binary file not shown.
20
lib/Controller/FakeRequest.php
Normal file
20
lib/Controller/FakeRequest.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace OCA\OCCWeb\Controller;
|
||||
|
||||
|
||||
use OC\AppFramework\Http\Request;
|
||||
|
||||
class FakeRequest extends Request {
|
||||
public $server = array(
|
||||
'argv' => ["occ"],
|
||||
);
|
||||
|
||||
/**
|
||||
* FakeRequest constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
}
|
||||
|
||||
}
|
@ -1,225 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
* @author Miha Frangez <miha.frangez@gmail.com>
|
||||
* @author Morris Jobke <hey@morrisjobke.de>
|
||||
* @author noveens <noveen.sachdeva@research.iiit.ac.in>
|
||||
* @author Robin Appelman <robin@icewind.nl>
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
* @author Victor Dubiniuk <dubiniuk@owncloud.com>
|
||||
*
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
namespace OCA\OCCWeb\Controller;
|
||||
|
||||
//use OC\MemoryInfo;
|
||||
use OC\NeedsUpdateException;
|
||||
use OC_App;
|
||||
use OCP\AppFramework\QueryException;
|
||||
use OCP\Console\ConsoleEvent;
|
||||
use OCP\IConfig;
|
||||
use OCP\ILogger;
|
||||
use Symfony\Component\Console\Application as SymfonyApplication;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Output\ConsoleOutputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
|
||||
class OCCApplication {
|
||||
/** @var IConfig */
|
||||
private $config;
|
||||
/** @var EventDispatcherInterface */
|
||||
private $dispatcher;
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
// /** @var MemoryInfo */
|
||||
// private $memoryInfo;
|
||||
|
||||
/**
|
||||
* @param IConfig $config
|
||||
* @param EventDispatcherInterface $dispatcher
|
||||
* @param ILogger $logger
|
||||
* @param MemoryInfo $memoryInfo
|
||||
*/
|
||||
public function __construct(IConfig $config,
|
||||
EventDispatcherInterface $dispatcher,
|
||||
ILogger $logger/*,
|
||||
MemoryInfo $memoryInfo*/) {
|
||||
$defaults = \OC::$server->getThemingDefaults();
|
||||
$this->config = $config;
|
||||
$this->application = new SymfonyApplication($defaults->getName(), \OC_Util::getVersionString());
|
||||
$this->dispatcher = $dispatcher;
|
||||
$this->logger = $logger;
|
||||
// $this->memoryInfo = $memoryInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param ConsoleOutputInterface $output
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function loadCommands(
|
||||
InputInterface $input,
|
||||
ConsoleOutputInterface $output
|
||||
) {
|
||||
// $application is required to be defined in the register_command scripts
|
||||
$application = $this->application;
|
||||
$inputDefinition = $application->getDefinition();
|
||||
$inputDefinition->addOption(
|
||||
new InputOption(
|
||||
'no-warnings',
|
||||
null,
|
||||
InputOption::VALUE_NONE,
|
||||
'Skip global warnings, show command output only',
|
||||
null
|
||||
)
|
||||
);
|
||||
try {
|
||||
$input->bind($inputDefinition);
|
||||
} catch (\RuntimeException $e) {
|
||||
//expected if there are extra options
|
||||
}
|
||||
if ($input->getOption('no-warnings')) {
|
||||
$output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
|
||||
}
|
||||
|
||||
// if ($this->memoryInfo->isMemoryLimitSufficient() === false) {
|
||||
// $output->getErrorOutput()->writeln(
|
||||
// '<comment>The current PHP memory limit ' .
|
||||
// 'is below the recommended value of 512MB.</comment>'
|
||||
// );
|
||||
// }
|
||||
|
||||
try {
|
||||
require_once \OC::$SERVERROOT . '/core/register_command.php';
|
||||
if ($this->config->getSystemValue('installed', false)) {
|
||||
if (\OCP\Util::needUpgrade()) {
|
||||
throw new NeedsUpdateException();
|
||||
} elseif ($this->config->getSystemValue('maintenance', false)) {
|
||||
$this->writeMaintenanceModeInfo($input, $output);
|
||||
} else {
|
||||
OC_App::loadApps();
|
||||
foreach (\OC::$server->getAppManager()->getInstalledApps() as $app) {
|
||||
$appPath = \OC_App::getAppPath($app);
|
||||
if ($appPath === false) {
|
||||
continue;
|
||||
}
|
||||
// load commands using info.xml
|
||||
$info = \OC_App::getAppInfo($app);
|
||||
if (isset($info['commands'])) {
|
||||
$this->loadCommandsFromInfoXml($info['commands']);
|
||||
}
|
||||
// load from register_command.php
|
||||
\OC_App::registerAutoloading($app, $appPath);
|
||||
$file = $appPath . '/appinfo/register_command.php';
|
||||
if (file_exists($file)) {
|
||||
try {
|
||||
require $file;
|
||||
} catch (\Exception $e) {
|
||||
$this->logger->logException($e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if ($input->getArgument('command') !== '_completion' && $input->getArgument('command') !== 'maintenance:install') {
|
||||
$output->writeln("Nextcloud is not installed - only a limited number of commands are available");
|
||||
}
|
||||
} catch(NeedsUpdateException $e) {
|
||||
if ($input->getArgument('command') !== '_completion') {
|
||||
$output->writeln("Nextcloud or one of the apps require upgrade - only a limited number of commands are available");
|
||||
$output->writeln("You may use your browser or the occ upgrade command to do the upgrade");
|
||||
}
|
||||
}
|
||||
|
||||
if ($input->getFirstArgument() !== 'check') {
|
||||
$errors = \OC_Util::checkServer(\OC::$server->getSystemConfig());
|
||||
if (!empty($errors)) {
|
||||
foreach ($errors as $error) {
|
||||
$output->writeln((string)$error['error']);
|
||||
$output->writeln((string)$error['hint']);
|
||||
$output->writeln('');
|
||||
}
|
||||
throw new \Exception("Environment not properly prepared.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a maintenance mode info.
|
||||
* The commands "_completion" and "maintenance:mode" are excluded.
|
||||
*
|
||||
* @param InputInterface $input The input implementation for reading inputs.
|
||||
* @param ConsoleOutputInterface $output The output implementation
|
||||
* for writing outputs.
|
||||
* @return void
|
||||
*/
|
||||
private function writeMaintenanceModeInfo(
|
||||
InputInterface $input, ConsoleOutputInterface $output
|
||||
) {
|
||||
if ($input->getArgument('command') !== '_completion'
|
||||
&& $input->getArgument('command') !== 'maintenance:mode') {
|
||||
$errOutput = $output->getErrorOutput();
|
||||
$errOutput->writeln(
|
||||
'<comment>Nextcloud is in maintenance mode - ' .
|
||||
'no apps have been loaded</comment>' . PHP_EOL
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether to automatically exit after a command execution or not.
|
||||
*
|
||||
* @param bool $boolean Whether to automatically exit after a command execution or not
|
||||
*/
|
||||
public function setAutoExit($boolean) {
|
||||
$this->application->setAutoExit($boolean);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function run(InputInterface $input = null, OutputInterface $output = null) {
|
||||
$this->dispatcher->dispatch(ConsoleEvent::EVENT_RUN, new ConsoleEvent(
|
||||
ConsoleEvent::EVENT_RUN,
|
||||
['occ']
|
||||
));
|
||||
return $this->application->run($input, $output);
|
||||
}
|
||||
|
||||
private function loadCommandsFromInfoXml($commands) {
|
||||
foreach ($commands as $command) {
|
||||
try {
|
||||
$c = \OC::$server->query($command);
|
||||
} catch (QueryException $e) {
|
||||
if (class_exists($command)) {
|
||||
$c = new $command();
|
||||
} else {
|
||||
throw new \Exception("Console command '$command' is unknown and could not be loaded");
|
||||
}
|
||||
}
|
||||
|
||||
$this->application->add($c);
|
||||
}
|
||||
}
|
||||
}
|
@ -2,6 +2,10 @@
|
||||
|
||||
namespace OCA\OCCWeb\Controller;
|
||||
|
||||
use Exception;
|
||||
use OC;
|
||||
use OC\Console\Application;
|
||||
use OC\MemoryInfo;
|
||||
use OCP\IRequest;
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
use OCP\AppFramework\Http\DataResponse;
|
||||
@ -18,49 +22,42 @@ class OccController extends Controller
|
||||
private $application;
|
||||
private $output;
|
||||
|
||||
public $server;
|
||||
|
||||
public function __construct(ILogger $logger, $AppName, IRequest $request, $UserId)
|
||||
public function __construct(ILogger $logger, $AppName, IRequest $request, $userId)
|
||||
{
|
||||
parent::__construct($AppName, $request);
|
||||
$this->logger = $logger;
|
||||
$this->userId = $UserId;
|
||||
$this->userId = $userId;
|
||||
|
||||
$this->server = array(
|
||||
'argv' => ["occ"],
|
||||
);
|
||||
$this->application = new OCCApplication(
|
||||
\OC::$server->getConfig(),
|
||||
\OC::$server->getEventDispatcher(),
|
||||
\OC::$server->getLogger()/*,
|
||||
\OC::$server->query(\OC\MemoryInfo::class)*/
|
||||
$this->application = new Application(
|
||||
OC::$server->getConfig(),
|
||||
OC::$server->getEventDispatcher(),
|
||||
new FakeRequest(),
|
||||
OC::$server->getLogger(),
|
||||
OC::$server->query(MemoryInfo::class)
|
||||
);
|
||||
$this->application->setAutoExit(false);
|
||||
// $this->output = new OCCOutput();
|
||||
$this->output = new OccOutput(OutputInterface::VERBOSITY_NORMAL, true);
|
||||
$this->application->loadCommands(new StringInput(""), $this->output);
|
||||
}
|
||||
|
||||
/**
|
||||
* CAUTION: the @Stuff turns off security checks; for this page no admin is
|
||||
* required and no CSRF check. If you don't know what CSRF is, read
|
||||
* it up in the docs or you might create a security hole. This is
|
||||
* basically the only required method to add this exemption, don't
|
||||
* add it to any other method if you don't exactly know what it does
|
||||
*
|
||||
* @NoCSRFRequired
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return new TemplateResponse('occweb', 'index'); // templates/index.php
|
||||
return new TemplateResponse('occweb', 'index');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $input
|
||||
* @return string
|
||||
*/
|
||||
private function run($input)
|
||||
{
|
||||
try {
|
||||
$this->application->run($input, $this->output);
|
||||
return $this->output->fetch();
|
||||
} catch (\Exception $ex) {
|
||||
} catch (Exception $ex) {
|
||||
exceptionHandler($ex);
|
||||
} catch (Error $ex) {
|
||||
exceptionHandler($ex);
|
||||
@ -68,20 +65,15 @@ class OccController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
* @param string $command
|
||||
* @return DataResponse
|
||||
*/
|
||||
public function cmd($command)
|
||||
{
|
||||
|
||||
$this->logger->info($command);
|
||||
$this->logger->debug($command);
|
||||
$input = new StringInput($command);
|
||||
// TODO : Interactive ?
|
||||
$response = $this->run($input);
|
||||
// $this->logger->info($response);
|
||||
// $converter = new AnsiToHtmlConverter();
|
||||
// return new DataResponse($converter->convert($response));
|
||||
$this->logger->debug($response);
|
||||
return new DataResponse($response);
|
||||
}
|
||||
|
||||
|
@ -1,18 +1,16 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: philippe-adrien
|
||||
* Date: 2019-01-18
|
||||
* Time: 19:08
|
||||
*/
|
||||
|
||||
namespace OCA\OCCWeb\Controller;
|
||||
|
||||
|
||||
use Symfony\Component\Console\Output\BufferedOutput;
|
||||
use Symfony\Component\Console\Output\ConsoleOutputInterface;
|
||||
use Symfony\Component\Console\Output\ConsoleSectionOutput;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
/**
|
||||
* @method ConsoleSectionOutput section()
|
||||
*/
|
||||
class OccOutput extends BufferedOutput implements ConsoleOutputInterface
|
||||
{
|
||||
|
||||
@ -31,4 +29,8 @@ class OccOutput extends BufferedOutput implements ConsoleOutputInterface
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function __call($name, $arguments) {
|
||||
// TODO: Implement @method ConsoleSectionOutput section()
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user