diff --git a/core/Command/SetupChecks.php b/core/Command/SetupChecks.php
index c8f7aa4c51d26..e655222d7d9ba 100644
--- a/core/Command/SetupChecks.php
+++ b/core/Command/SetupChecks.php
@@ -11,6 +11,7 @@
use OCP\RichObjectStrings\IRichTextFormatter;
use OCP\SetupCheck\ISetupCheckManager;
+use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@@ -29,12 +30,44 @@ protected function configure(): void {
$this
->setName('setupchecks')
->setDescription('Run setup checks and output the results')
+ ->addArgument(
+ 'category',
+ InputArgument::OPTIONAL,
+ 'Category of setup checks to run ' . "\n" . '(e.g. "network" to run all the network-related checks)',
+ ''
+ )
+ ->addArgument(
+ 'class',
+ InputArgument::OPTIONAL,
+ 'Class of setup checks to run ' . "\n" . '(e.g. "OCA\\Settings\\SetupChecks\\InternetConnectivity" to run only the InternetConnectivity check)',
+ ''
+ )
;
}
#[\Override]
protected function execute(InputInterface $input, OutputInterface $output): int {
- $results = $this->setupCheckManager->runAll();
+ $filterByCategory = $input->getArgument('category');
+ $filterByClass = $input->getArgument('class');
+
+ if (!is_string($filterByCategory) || !is_string($filterByClass)) {
+ $output->writeln('Invalid type specified');
+ return self::FAILURE;
+ }
+
+ if ($filterByCategory !== '' && $filterByClass !== '') {
+ $output->writeln('Please specify only one of category or class');
+ return self::FAILURE;
+ }
+
+ if ($filterByCategory !== '') {
+ $results = $this->setupCheckManager->runByCategory($filterByCategory);
+ } elseif ($filterByClass !== '') {
+ $results = $this->setupCheckManager->runByClass($filterByClass);
+ } else {
+ $results = $this->setupCheckManager->runAll();
+ }
+
switch ($input->getOption('output')) {
case self::OUTPUT_FORMAT_JSON:
case self::OUTPUT_FORMAT_JSON_PRETTY:
diff --git a/lib/private/SetupCheck/SetupCheckManager.php b/lib/private/SetupCheck/SetupCheckManager.php
index 6ce4094f616ed..36ff25b481b17 100644
--- a/lib/private/SetupCheck/SetupCheckManager.php
+++ b/lib/private/SetupCheck/SetupCheckManager.php
@@ -18,18 +18,43 @@
class SetupCheckManager implements ISetupCheckManager {
public function __construct(
- private Coordinator $coordinator,
- private LoggerInterface $logger,
+ readonly private Coordinator $coordinator,
+ readonly private LoggerInterface $logger,
) {
}
+ #[\Override]
+ public function runByClass(string $filterByClass): array {
+ if (str_starts_with($filterByClass, '\\')) {
+ $filterByClass = substr($filterByClass, 1);
+ }
+ return $this->run(filterByClass: $filterByClass);
+ }
+
+ #[\Override]
+ public function runByCategory(string $filterByCategory): array {
+ return $this->run(filterByCategory: $filterByCategory);
+ }
+
#[\Override]
public function runAll(): array {
+ return $this->run();
+ }
+
+ private function run(?string $filterByCategory = null, ?string $filterByClass = null): array {
$results = [];
$setupChecks = $this->coordinator->getRegistrationContext()->getSetupChecks();
foreach ($setupChecks as $setupCheck) {
/** @var ISetupCheck $setupCheckObject */
$setupCheckObject = Server::get($setupCheck->getService());
+ if ($filterByCategory !== null && $filterByCategory !== $setupCheckObject->getCategory()) {
+ continue;
+ }
+
+ if ($filterByClass !== null && $filterByClass !== get_class($setupCheckObject)) {
+ continue;
+ }
+
$this->logger->debug('Running check ' . get_class($setupCheckObject));
try {
$setupResult = $setupCheckObject->run();
diff --git a/lib/public/SetupCheck/ISetupCheckManager.php b/lib/public/SetupCheck/ISetupCheckManager.php
index 6245be3933a6f..f0b18ea942e8b 100644
--- a/lib/public/SetupCheck/ISetupCheckManager.php
+++ b/lib/public/SetupCheck/ISetupCheckManager.php
@@ -14,8 +14,28 @@
*/
interface ISetupCheckManager {
/**
+ * Run all setup checks and return the results.
+ *
* @since 28.0.0
* @return array> Result of each check, first level key is category, second level key is title
*/
public function runAll(): array;
+
+ /**
+ * Run all tests from one specific category and return the results.
+ *
+ * @param string $filterByCategory - The id of the category to run.
+ * @return array> Result of each check, first level key is category, second level key is title
+ * @since 35.0.0
+ */
+ public function runByCategory(string $filterByCategory): array;
+
+ /**
+ * Run all tests from one specific class and return the results.
+ *
+ * @param string $filterByClass - The class to run.
+ * @return array> Result of each check, first level key is category, second level key is title
+ * @since 35.0.0
+ */
+ public function runByClass(string $filterByClass): array;
}