1
0
Fork 0
mirror of synced 2024-06-02 19:04:49 +12:00
appwrite/app/cli.php

188 lines
5.6 KiB
PHP
Raw Normal View History

2020-07-29 07:48:51 +12:00
<?php
2022-05-24 02:54:50 +12:00
require_once __DIR__ . '/init.php';
require_once __DIR__ . '/controllers/general.php';
2020-07-29 07:48:51 +12:00
2022-12-14 00:16:12 +13:00
use Appwrite\Event\Certificate;
2024-03-07 06:34:21 +13:00
use Appwrite\Event\Delete;
2022-11-16 07:13:17 +13:00
use Appwrite\Event\Func;
2022-11-14 23:29:10 +13:00
use Appwrite\Platform\Appwrite;
2022-11-14 23:46:11 +13:00
use Utopia\Cache\Adapter\Sharding;
2022-10-28 16:36:20 +13:00
use Utopia\Cache\Cache;
2024-03-07 06:34:21 +13:00
use Utopia\CLI\CLI;
use Utopia\CLI\Console;
2022-11-14 23:46:11 +13:00
use Utopia\Config\Config;
2022-10-28 16:36:20 +13:00
use Utopia\Database\Database;
2022-11-14 23:46:11 +13:00
use Utopia\Database\Document;
2024-03-07 06:34:21 +13:00
use Utopia\Database\Validator\Authorization;
2022-10-28 21:56:45 +13:00
use Utopia\Logger\Log;
2024-03-07 06:34:21 +13:00
use Utopia\Platform\Service;
2022-11-14 23:46:11 +13:00
use Utopia\Pools\Group;
2022-12-21 00:07:49 +13:00
use Utopia\Queue\Connection;
2022-10-28 21:49:05 +13:00
use Utopia\Registry\Registry;
2024-04-02 00:02:47 +13:00
use Utopia\System\System;
2022-04-10 21:38:22 +12:00
Authorization::disable();
2020-07-29 07:48:51 +12:00
2024-03-07 06:34:21 +13:00
CLI::setResource('register', fn () => $register);
2022-10-28 16:36:20 +13:00
2022-11-14 23:46:11 +13:00
CLI::setResource('cache', function ($pools) {
$list = Config::getParam('pools-cache', []);
$adapters = [];
foreach ($list as $value) {
$adapters[] = $pools
->get($value)
->pop()
->getResource()
;
}
return new Cache(new Sharding($adapters));
}, ['pools']);
CLI::setResource('pools', function (Registry $register) {
return $register->get('pools');
2022-10-28 21:49:05 +13:00
}, ['register']);
2022-10-28 16:36:20 +13:00
2022-11-14 23:46:11 +13:00
CLI::setResource('dbForConsole', function ($pools, $cache) {
2022-11-19 05:48:27 +13:00
$sleep = 3;
$maxAttempts = 5;
$attempts = 0;
$ready = false;
do {
$attempts++;
try {
// Prepare database connection
$dbAdapter = $pools
->get('console')
->pop()
->getResource();
2022-10-28 16:36:20 +13:00
2022-11-19 05:48:27 +13:00
$dbForConsole = new Database($dbAdapter, $cache);
$dbForConsole
->setNamespace('_console')
->setMetadata('host', \gethostname())
->setMetadata('project', 'console');
2022-10-28 16:36:20 +13:00
2022-11-19 05:48:27 +13:00
// Ensure tables exist
$collections = Config::getParam('collections', [])['console'];
2022-11-19 05:48:27 +13:00
$last = \array_key_last($collections);
2022-10-28 16:36:20 +13:00
2023-12-15 02:32:06 +13:00
if (!($dbForConsole->exists($dbForConsole->getDatabase(), $last))) { /** TODO cache ready variable using registry */
2022-11-19 05:48:27 +13:00
throw new Exception('Tables not ready yet.');
}
$ready = true;
} catch (\Throwable $err) {
2022-11-19 05:48:27 +13:00
Console::warning($err->getMessage());
$pools->get('console')->reclaim();
sleep($sleep);
}
} while ($attempts < $maxAttempts && !$ready);
2022-11-19 05:48:27 +13:00
if (!$ready) {
throw new Exception("Console is not ready yet. Please try again later.");
}
return $dbForConsole;
2022-11-14 23:46:11 +13:00
}, ['pools', 'cache']);
CLI::setResource('getProjectDB', function (Group $pools, Database $dbForConsole, $cache) {
2022-11-16 02:34:13 +13:00
$databases = []; // TODO: @Meldiron This should probably be responsibility of utopia-php/pools
2022-11-16 02:30:19 +13:00
2023-06-06 04:13:00 +12:00
return function (Document $project) use ($pools, $dbForConsole, $cache, &$databases) {
2022-11-14 23:46:11 +13:00
if ($project->isEmpty() || $project->getId() === 'console') {
return $dbForConsole;
}
2022-11-16 02:30:19 +13:00
$databaseName = $project->getAttribute('database');
2022-11-16 02:35:13 +13:00
if (isset($databases[$databaseName])) {
2022-11-17 08:39:35 +13:00
$database = $databases[$databaseName];
$database->setNamespace('_' . $project->getInternalId());
return $database;
2022-11-16 02:30:19 +13:00
}
2022-11-16 01:54:54 +13:00
$dbAdapter = $pools
2022-11-16 02:30:19 +13:00
->get($databaseName)
2022-11-16 01:54:54 +13:00
->pop()
->getResource();
2022-11-14 23:46:11 +13:00
$database = new Database($dbAdapter, $cache);
2022-11-16 02:30:19 +13:00
$databases[$databaseName] = $database;
$database
->setNamespace('_' . $project->getInternalId())
->setMetadata('host', \gethostname())
->setMetadata('project', $project->getId());
2022-11-17 08:39:35 +13:00
2022-11-16 01:54:54 +13:00
return $database;
2022-11-14 23:46:11 +13:00
};
}, ['pools', 'dbForConsole', 'cache']);
2022-10-28 16:36:20 +13:00
2022-12-21 00:07:49 +13:00
CLI::setResource('queue', function (Group $pools) {
return $pools->get('queue')->pop()->getResource();
2022-11-16 07:13:17 +13:00
}, ['pools']);
2023-10-17 16:44:36 +13:00
CLI::setResource('queueForFunctions', function (Connection $queue) {
return new Func($queue);
2023-10-19 10:35:15 +13:00
}, ['queue']);
2022-12-21 05:11:30 +13:00
CLI::setResource('queueForDeletes', function (Connection $queue) {
2022-12-21 00:07:49 +13:00
return new Delete($queue);
}, ['queue']);
2022-12-21 05:11:30 +13:00
CLI::setResource('queueForCertificates', function (Connection $queue) {
return new Certificate($queue);
}, ['queue']);
2022-10-28 22:00:59 +13:00
CLI::setResource('logError', function (Registry $register) {
return function (Throwable $error, string $namespace, string $action) use ($register) {
2022-10-28 21:56:45 +13:00
$logger = $register->get('logger');
if ($logger) {
2024-04-02 00:02:47 +13:00
$version = System::getEnv('_APP_VERSION', 'UNKNOWN');
2022-10-28 21:56:45 +13:00
$log = new Log();
$log->setNamespace($namespace);
$log->setServer(\gethostname());
$log->setVersion($version);
$log->setType(Log::TYPE_ERROR);
$log->setMessage($error->getMessage());
$log->addTag('code', $error->getCode());
$log->addTag('verboseType', get_class($error));
$log->addExtra('file', $error->getFile());
$log->addExtra('line', $error->getLine());
$log->addExtra('trace', $error->getTraceAsString());
$log->addExtra('detailedTrace', $error->getTrace());
$log->setAction($action);
2024-04-02 00:02:47 +13:00
$isProduction = System::getEnv('_APP_ENV', 'development') === 'production';
2022-10-28 21:56:45 +13:00
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
$responseCode = $logger->addLog($log);
Console::info('Usage stats log pushed with status code: ' . $responseCode);
}
Console::warning("Failed: {$error->getMessage()}");
Console::warning($error->getTraceAsString());
};
2022-10-30 18:38:22 +13:00
}, ['register']);
2022-10-28 21:56:45 +13:00
2022-11-14 23:29:10 +13:00
$platform = new Appwrite();
$platform->init(Service::TYPE_CLI);
2022-07-13 18:26:22 +12:00
2022-11-14 23:29:10 +13:00
$cli = $platform->getCli();
2022-11-17 04:28:15 +13:00
$cli
->error()
->inject('error')
2022-11-17 08:39:35 +13:00
->action(function (Throwable $error) {
2022-11-17 04:28:15 +13:00
Console::error($error->getMessage());
});
2022-07-13 18:26:22 +12:00
$cli->run();