setName('app:remove') ->setDescription('remove an app') ->addArgument( 'app-id', InputArgument::REQUIRED, 'remove the specified app' ) ->addOption( 'keep-data', null, InputOption::VALUE_NONE, 'keep app data and do not remove them' ); } protected function execute(InputInterface $input, OutputInterface $output): int { $appId = $input->getArgument('app-id'); // Check if the app is enabled if (!$this->manager->isEnabledForAnyone($appId)) { $output->writeln($appId . ' is not enabled'); return 1; } // Removing shipped apps is not possible, therefore we pre-check that // before trying to remove it if ($this->manager->isShipped($appId)) { $output->writeln($appId . ' could not be removed as it is a shipped app'); return 1; } // If we want to keep the data of the app, we simply don't disable it here. // App uninstall tasks are being executed when disabled. More info: PR #11627. if (!$input->getOption('keep-data')) { try { $this->manager->disableApp($appId); $output->writeln($appId . ' disabled'); } catch (Throwable $e) { $output->writeln('Error: ' . $e->getMessage() . ''); $this->logger->error($e->getMessage(), [ 'app' => 'CLI', 'exception' => $e, ]); return 1; } } // Let's try to remove the app... try { $result = $this->installer->removeApp($appId); } catch (Throwable $e) { $output->writeln('Error: ' . $e->getMessage() . ''); $this->logger->error($e->getMessage(), [ 'app' => 'CLI', 'exception' => $e, ]); return 1; } if ($result === false) { $output->writeln($appId . ' could not be removed'); return 1; } $appVersion = $this->manager->getAppVersion($appId); $output->writeln($appId . ' ' . $appVersion . ' removed'); return 0; } /** * @param string $optionName * @param CompletionContext $context * @return string[] */ public function completeOptionValues($optionName, CompletionContext $context): array { return []; } /** * @param string $argumentName * @param CompletionContext $context * @return string[] */ public function completeArgumentValues($argumentName, CompletionContext $context): array { if ($argumentName === 'app-id') { return $this->manager->getEnabledApps(); } return []; } } lue='addAllToGroupBy'>addAllToGroupBy Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Updater/ReleaseMetadata.php
blob: 665847037e78c9ebb7f2d06bc9fd2ed8c5a81699 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php

declare(strict_types=1);

/**
 * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
namespace OC\Updater;

use Exception;
use JsonException;
use OC\Updater\Exceptions\ReleaseMetadataException;
use OCP\Http\Client\IClientService;

/** retrieve releases metadata from official servers
 *
 * @since 30.0.0
 */
class ReleaseMetadata {
	public function __construct(
		private readonly IClientService $clientService,
	) {
	}

	/**
	 * returns metadata based on release version
	 *
	 * - version is a stable release, metadata is downloaded from official releases folder
	 * - version is not a table release, metadata is downloaded from official prereleases folder
	 * - version is a major version (30, 31, 32, ...), latest metadata are downloaded
	 *
	 * @param string $version
	 *
	 * @return array
	 * @throws ReleaseMetadataException
	 * @since 30.0.0
	 */
	public function getMetadata(string $version): array {
		if (!str_contains($version, '.')) {
			$url = 'https://download.nextcloud.com/server/releases/latest-' . $version . '.metadata';
		} else {
			[,,$minor] = explode('.', $version);
			if (ctype_digit($minor)) {
				$url = 'https://download.nextcloud.com/server/releases/nextcloud-' . $version . '.metadata';
			} else {
				$url = 'https://download.nextcloud.com/server/prereleases/nextcloud-' . $version . '.metadata';
			}
		}
		return $this->downloadMetadata($url);
	}

	/**
	 * download Metadata from a link
	 *
	 * @param string $url
	 *
	 * @return array
	 * @throws ReleaseMetadataException
	 * @since 30.0.0
	 */
	public function downloadMetadata(string $url): array {
		$client = $this->clientService->newClient();
		try {
			$response = $client->get($url, [
				'timeout' => 10,
				'connect_timeout' => 10
			]);
		} catch (Exception $e) {
			throw new ReleaseMetadataException('could not reach metadata at ' . $url, previous: $e);
		}

		try {
			return json_decode($response->getBody(), true, flags: JSON_THROW_ON_ERROR);
		} catch (JsonException) {
			throw new ReleaseMetadataException('remote document is not valid');
		}
	}
}