From e05592d7973462d78c40802968d8af1ec81d1868 Mon Sep 17 00:00:00 2001 From: "martin.mattel@diemattels.at" Date: Tue, 26 Jan 2016 18:42:03 +0100 Subject: occ scan:files Adding more details in the base print out (II) Use proper method name Fixed the interruption logic Checks the availability of the pcntl_signal function Fixed typo crtl-c --> ctrl-c one overseen crtl-c typo --- apps/files/command/scan.php | 109 +++++++++++++++++++++++++++++--------------- 1 file changed, 71 insertions(+), 38 deletions(-) (limited to 'apps') diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php index da387f40c48..4a68429897a 100644 --- a/apps/files/command/scan.php +++ b/apps/files/command/scan.php @@ -49,6 +49,9 @@ class Scan extends Command { protected $filesCounter = 0; /** @var bool */ protected $interrupted = false; + /** @var bool */ + protected $php_pcntl_signal = true; + public function __construct(\OC\User\Manager $userManager) { @@ -93,15 +96,22 @@ class Scan extends Command { protected function scanFiles($user, $path, $verbose, OutputInterface $output) { $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); + # check on each file/folder if there was a user interrupt (ctrl-c) and throw an exeption # printout and count if ($verbose) { $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) { - $output->writeln("Scanning file $path"); + $output->writeln("\tFile $path"); $this->filesCounter += 1; + if ($this->hasBeenInterrupted()) { + throw new \Exception('ctrl-c'); + } }); $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) { - $output->writeln("Scanning folder $path"); + $output->writeln("\tFolder $path"); $this->foldersCounter += 1; + if ($this->hasBeenInterrupted()) { + throw new \Exception('ctrl-c'); + } }); $scanner->listen('\OC\Files\Utils\Scanner', 'StorageNotAvailable', function (StorageNotAvailableException $e) use ($output) { $output->writeln("Error while scanning, storage not available (" . $e->getMessage() . ")"); @@ -110,9 +120,15 @@ class Scan extends Command { } else { $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) { $this->filesCounter += 1; + if ($this->hasBeenInterrupted()) { + throw new \Exception('ctrl-c'); + } }); $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) { $this->foldersCounter += 1; + if ($this->hasBeenInterrupted()) { + throw new \Exception('ctrl-c'); + } }); } @@ -121,6 +137,9 @@ class Scan extends Command { } catch (ForbiddenException $e) { $output->writeln("Home storage for user $user not writable"); $output->writeln("Make sure you're running the scan command only as the user the web server runs as"); + } catch (\Exception $e) { + # exit the function if ctrl-c has been pressed + return; } } @@ -137,11 +156,6 @@ class Scan extends Command { $users = $input->getArgument('user_id'); } - if (count($users) === 0) { - $output->writeln("Please specify the user id to scan, \"--all\" to scan for all users or \"--path=...\""); - return; - } - # no messaging level option means: no full printout but statistics # $quiet means no print at all # $verbose means full printout including statistics @@ -159,18 +173,38 @@ class Scan extends Command { $verbose = false; } + # check quantity of users to be process and show it on the command line + $users_total = count($users); + if ($users_total === 0) { + $output->writeln("Please specify the user id to scan, \"--all\" to scan for all users or \"--path=...\""); + return; + } else { + if ($users_total > 1) { + $output->writeln("\nScanning files for $users_total users"); + } + } + $this->initTools(); + $user_count = 0; foreach ($users as $user) { if (is_object($user)) { $user = $user->getUID(); } $path = $inputPath ? $inputPath : '/' . $user; + $user_count += 1; if ($this->userManager->userExists($user)) { + # add an extra line when verbose is set to optical seperate users + if ($verbose) {$output->writeln(""); } + $output->writeln("Starting scan for user $user_count out of $users_total ($user)"); # full: printout data if $verbose was set $this->scanFiles($user, $path, $verbose, $output); } else { - $output->writeln("Unknown user $user"); + $output->writeln("Unknown user $user_count $user"); + } + # check on each user if there was a user interrupt (ctrl-c) and exit foreach + if ($this->hasBeenInterrupted()) { + break; } } @@ -182,17 +216,6 @@ class Scan extends Command { } - /** - * Checks if the command was interrupted by ctrl-c - */ - protected function checkForInterruption($output) { - if ($this->hasBeenInterrupted()) { - $this->presentResults($output); - exit; - } - } - - /** * Initialises some useful tools for the Command */ @@ -202,14 +225,19 @@ class Scan extends Command { // Convert PHP errors to exceptions set_error_handler([$this, 'exceptionErrorHandler'], E_ALL); - // Collect interrupts and notify the running command - pcntl_signal(SIGTERM, [$this, 'cancelOperation']); - pcntl_signal(SIGINT, [$this, 'cancelOperation']); + // check if the php pcntl_signal functions are accessible + if (function_exists('pcntl_signal')) { + // Collect interrupts and notify the running command + pcntl_signal(SIGTERM, [$this, 'cancelOperation']); + pcntl_signal(SIGINT, [$this, 'cancelOperation']); + } else { + $this->php_pcntl_signal = false; + } } /** - * Changes the status of the command to "interrupted" + * Changes the status of the command to "interrupted" if ctrl-c has been pressed * * Gives a chance to the command to properly terminate what it's doing */ @@ -218,6 +246,24 @@ class Scan extends Command { } + /** + * @return bool + */ + protected function hasBeenInterrupted() { + // return always false if pcntl_signal functions are not accessible + if ($this->php_pcntl_signal) { + pcntl_signal_dispatch(); + if ($this->interrupted) { + return true; + } else { + return false; + } + } else { + return false; + } + } + + /** * Processes PHP errors as exceptions in order to be able to keep track of problems * @@ -239,20 +285,6 @@ class Scan extends Command { } - /** - * @return bool - */ - protected function hasBeenInterrupted() { - $cancelled = false; - pcntl_signal_dispatch(); - if ($this->interrupted) { - $cancelled = true; - } - - return $cancelled; - } - - /** * @param OutputInterface $output */ @@ -300,7 +332,8 @@ class Scan extends Command { */ protected function formatExecTime() { list($secs, $tens) = explode('.', sprintf("%.1f", ($this->execTime))); - $niceDate = date('H:i:s', $secs) . '.' . $tens; + # add the following to $niceDate if you want to have microsecons added: . '.' . $tens; + $niceDate = date('H:i:s', $secs); return $niceDate; } -- cgit v1.2.3