]> source.dussan.org Git - nextcloud-server.git/commitdiff
add command to get a file from the filesystem
authorRobin Appelman <robin@icewind.nl>
Fri, 21 Apr 2023 15:25:18 +0000 (17:25 +0200)
committerRobin Appelman <robin@icewind.nl>
Thu, 4 May 2023 16:21:55 +0000 (18:21 +0200)
Signed-off-by: Robin Appelman <robin@icewind.nl>
core/Command/Info/Get.php [new file with mode: 0644]
core/register_command.php

diff --git a/core/Command/Info/Get.php b/core/Command/Info/Get.php
new file mode 100644 (file)
index 0000000..a432349
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Core\Command\Info;
+
+
+use OCP\Files\File;
+use OCP\Util;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Get extends Command {
+       private FileUtils $fileUtils;
+
+       public function __construct(FileUtils $fileUtils) {
+               $this->fileUtils = $fileUtils;
+               parent::__construct();
+       }
+
+       protected function configure(): void {
+               $this
+                       ->setName('info:file:get')
+                       ->setDescription('Get the contents of a file')
+                       ->addArgument('file', InputArgument::REQUIRED, "File id or path")
+                       ->addOption('output', 'o', InputOption::VALUE_REQUIRED, "Target file to output to");
+       }
+
+       public function execute(InputInterface $input, OutputInterface $output): int {
+               $fileInput = $input->getArgument('file');
+               $outputName = $input->getOption('output');
+               $node = $this->fileUtils->getNode($fileInput);
+
+               if ($node instanceof File) {
+                       $isTTY = stream_isatty(STDOUT);
+                       if ($outputName === null && $isTTY && $node->getMimePart() !== 'text') {
+                               $output->writeln([
+                                       "<error>Warning: Binary output can mess up your terminal</error>",
+                                       "         Use '--output STDOUT' to output it to the terminal anyway",
+                                       "         Or '--output <FILE>' to save to a file instead"
+                               ]);
+                               return 1;
+                       }
+                       $source = $node->fopen('r');
+                       $target = (!$outputName || strtolower($outputName) === 'stdout') ? STDOUT : fopen($outputName, 'w');
+                       stream_copy_to_stream($source, $target);
+                       return 0;
+               } else {
+                       $output->writeln("<error>$fileInput is a directory</error>");
+                       return 1;
+               }
+       }
+
+}
index 8f600d7b8948865e242e89a8d1c004011f756796..a93acc2797e65e45de49919d5e5552d422bab94c 100644 (file)
@@ -105,6 +105,7 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
 
        $application->add(\OC::$server->get(OC\Core\Command\Info\File::class));
        $application->add(\OC::$server->get(OC\Core\Command\Info\Space::class));
+       $application->add(\OC::$server->get(OC\Core\Command\Info\Get::class));
 
        $application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory(\OC::$server->getSystemConfig())));
        $application->add(new OC\Core\Command\Db\ConvertMysqlToMB4(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection(), \OC::$server->getURLGenerator(), \OC::$server->get(LoggerInterface::class)));