2021-04-06 16:34:12 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
include_once 'core/core.php';
|
2021-04-09 16:05:36 +02:00
|
|
|
require_once 'core/datetime.php';
|
2021-04-06 20:31:52 +02:00
|
|
|
include_once 'core/constants.php';
|
2021-04-06 16:34:12 +02:00
|
|
|
|
2021-04-07 00:03:14 +02:00
|
|
|
use Configuration\Configuration;
|
2021-04-06 20:31:52 +02:00
|
|
|
use Configuration\DatabaseScript;
|
2021-04-08 19:08:05 +02:00
|
|
|
use Driver\SQL\Column\Column;
|
|
|
|
use Driver\SQL\Condition\Compare;
|
|
|
|
use Driver\SQL\Condition\CondIn;
|
2021-04-08 19:48:04 +02:00
|
|
|
use Driver\SQL\Expression\DateSub;
|
2021-04-06 16:34:12 +02:00
|
|
|
use Objects\ConnectionData;
|
2021-04-07 00:03:14 +02:00
|
|
|
use Objects\User;
|
2021-04-06 16:34:12 +02:00
|
|
|
|
2021-04-07 00:03:14 +02:00
|
|
|
function printLine(string $line = "") {
|
|
|
|
echo $line . PHP_EOL;
|
|
|
|
}
|
|
|
|
|
|
|
|
function _exit(string $line = "") {
|
|
|
|
printLine($line);
|
2021-04-06 16:34:12 +02:00
|
|
|
die();
|
|
|
|
}
|
|
|
|
|
2021-04-09 12:37:24 +02:00
|
|
|
if (!is_cli()) {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Can only be executed via CLI");
|
|
|
|
}
|
|
|
|
|
2021-04-06 16:34:12 +02:00
|
|
|
function getDatabaseConfig(): ConnectionData {
|
|
|
|
$configClass = "\\Configuration\\Database";
|
|
|
|
$file = getClassPath($configClass);
|
|
|
|
if (!file_exists($file) || !is_readable($file)) {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Database configuration does not exist or is not readable");
|
2021-04-06 16:34:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
include_once $file;
|
|
|
|
return new $configClass();
|
|
|
|
}
|
|
|
|
|
2021-04-09 12:37:24 +02:00
|
|
|
function getUser(): ?User {
|
2021-04-07 00:03:14 +02:00
|
|
|
$config = new Configuration();
|
|
|
|
$user = new User($config);
|
|
|
|
if (!$user->getSQL() || !$user->getSQL()->isConnected()) {
|
2021-04-09 12:37:24 +02:00
|
|
|
printLine("Could not establish database connection");
|
|
|
|
return null;
|
2021-04-06 16:34:12 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:03:14 +02:00
|
|
|
return $user;
|
2021-04-06 16:34:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function printHelp() {
|
2021-04-06 23:05:02 +02:00
|
|
|
// TODO: help
|
2021-04-06 16:34:12 +02:00
|
|
|
}
|
|
|
|
|
2021-04-09 12:37:24 +02:00
|
|
|
function applyPatch(\Driver\SQL\SQL $sql, string $patchName): bool {
|
|
|
|
$class = str_replace('/', '\\', $patchName);
|
|
|
|
$className = "\\Configuration\\$class";
|
|
|
|
$classPath = getClassPath($className);
|
|
|
|
if (!file_exists($classPath) || !is_readable($classPath)) {
|
|
|
|
printLine("Database script file does not exist or is not readable");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
include_once $classPath;
|
|
|
|
$obj = new $className();
|
|
|
|
if (!($obj instanceof DatabaseScript)) {
|
|
|
|
printLine("Not a database script");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$queries = $obj->createQueries($sql);
|
|
|
|
foreach ($queries as $query) {
|
|
|
|
if (!$query->execute($sql)) {
|
|
|
|
printLine($sql->getLastError());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2021-04-07 00:03:14 +02:00
|
|
|
function handleDatabase(array $argv) {
|
2021-04-06 16:34:12 +02:00
|
|
|
$action = $argv[2] ?? "";
|
|
|
|
|
2021-04-06 20:59:55 +02:00
|
|
|
if ($action === "migrate") {
|
|
|
|
$class = $argv[3] ?? null;
|
|
|
|
if (!$class) {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Usage: cli.php db migrate <class name>");
|
2021-04-06 20:59:55 +02:00
|
|
|
}
|
|
|
|
|
2021-04-09 12:37:24 +02:00
|
|
|
$user = getUser() or die();
|
2021-04-07 00:03:14 +02:00
|
|
|
$sql = $user->getSQL();
|
2021-04-09 12:37:24 +02:00
|
|
|
applyPatch($sql, $class);
|
2021-04-06 20:59:55 +02:00
|
|
|
} else if ($action === "export" || $action === "import") {
|
|
|
|
|
|
|
|
// database config
|
|
|
|
$config = getDatabaseConfig();
|
|
|
|
$dbType = $config->getProperty("type") ?? null;
|
|
|
|
$user = $config->getLogin();
|
|
|
|
$password = $config->getPassword();
|
|
|
|
$database = $config->getProperty("database");
|
|
|
|
$host = $config->getHost();
|
|
|
|
$port = $config->getPort();
|
|
|
|
|
|
|
|
// subprocess config
|
|
|
|
$env = [];
|
|
|
|
$options = array_slice($argv, 3);
|
|
|
|
$dataOnly = in_array("--data-only", $options) || in_array("-d", $options);
|
|
|
|
$descriptorSpec = [STDIN, STDOUT, STDOUT];
|
|
|
|
$inputData = null;
|
|
|
|
|
|
|
|
// argument config
|
|
|
|
if ($action === "import") {
|
|
|
|
$file = $argv[3] ?? null;
|
|
|
|
if (!$file) {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Usage: cli.php db import <path>");
|
2021-04-06 20:31:52 +02:00
|
|
|
}
|
|
|
|
|
2021-04-06 20:59:55 +02:00
|
|
|
if (!file_exists($file) || !is_readable($file)) {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("File not found or not readable");
|
2021-04-06 20:31:52 +02:00
|
|
|
}
|
|
|
|
|
2021-04-06 20:59:55 +02:00
|
|
|
$inputData = file_get_contents($file);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($dbType === "mysql") {
|
|
|
|
$command_args = ["-u", $user, '-h', $host, '-P', $port, "--password=$password"];
|
|
|
|
if ($action === "export") {
|
|
|
|
$command_bin = "mysqldump";
|
|
|
|
if ($dataOnly) {
|
|
|
|
$command_args[] = "--skip-triggers";
|
|
|
|
$command_args[] = "--compact";
|
|
|
|
$command_args[] = "--no-create-info";
|
2021-04-06 20:31:52 +02:00
|
|
|
}
|
2021-04-06 20:59:55 +02:00
|
|
|
} else if ($action === "import") {
|
|
|
|
$command_bin = "mysql";
|
|
|
|
$descriptorSpec[0] = ["pipe", "r"];
|
2021-04-06 20:31:52 +02:00
|
|
|
}
|
2021-04-06 20:59:55 +02:00
|
|
|
} else if ($dbType === "postgres") {
|
2021-04-06 20:31:52 +02:00
|
|
|
|
2021-04-06 20:59:55 +02:00
|
|
|
$env["PGPASSWORD"] = $password;
|
|
|
|
$command_args = ["-U", $user, '-h', $host, '-p', $port];
|
2021-04-06 19:01:20 +02:00
|
|
|
|
2021-04-06 20:59:55 +02:00
|
|
|
if ($action === "export") {
|
|
|
|
$command_bin = "/usr/bin/pg_dump";
|
|
|
|
if ($dataOnly) {
|
|
|
|
$command_args[] = "--data-only";
|
2021-04-06 19:01:20 +02:00
|
|
|
}
|
2021-04-06 20:59:55 +02:00
|
|
|
} else if ($action === "import") {
|
|
|
|
$command_bin = "/usr/bin/psql";
|
|
|
|
$descriptorSpec[0] = ["pipe", "r"];
|
2021-04-06 16:34:12 +02:00
|
|
|
}
|
|
|
|
|
2021-04-06 20:59:55 +02:00
|
|
|
} else {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Unsupported database type");
|
2021-04-06 20:59:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($database) {
|
|
|
|
$command_args[] = $database;
|
|
|
|
}
|
|
|
|
|
|
|
|
$command = array_merge([$command_bin], $command_args);
|
|
|
|
$process = proc_open($command, $descriptorSpec, $pipes, null, $env);
|
|
|
|
|
|
|
|
if (is_resource($process)) {
|
|
|
|
if ($action === "import" && $inputData && count($pipes) > 0) {
|
|
|
|
fwrite($pipes[0], $inputData);
|
|
|
|
fclose($pipes[0]);
|
2021-04-06 16:34:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
proc_close($process);
|
2021-04-06 20:59:55 +02:00
|
|
|
}
|
2021-04-08 19:08:05 +02:00
|
|
|
} else if ($action === "clean") {
|
2021-04-09 12:37:24 +02:00
|
|
|
$user = getUser() or die();
|
2021-04-08 19:08:05 +02:00
|
|
|
$sql = $user->getSQL();
|
|
|
|
|
|
|
|
printLine("Deleting user related data older than 90 days...");
|
|
|
|
|
|
|
|
// 1st: Select all related tables and entities
|
|
|
|
$tables = [];
|
|
|
|
$res = $sql->select("entityId", "tableName")
|
|
|
|
->from("EntityLog")
|
2021-04-08 19:48:04 +02:00
|
|
|
->where(new Compare("modified", new DateSub($sql->now(), new Column("lifetime"), "DAY"), "<="))
|
|
|
|
->dump()
|
2021-04-08 19:08:05 +02:00
|
|
|
->execute();
|
|
|
|
|
|
|
|
$success = ($res !== false);
|
|
|
|
if (!$success) {
|
|
|
|
_exit("Error querying data: " . $sql->getLastError());
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($res as $row) {
|
|
|
|
$tableName = $row["tableName"];
|
|
|
|
$uid = $row["entityId"];
|
|
|
|
if (!isset($tables[$tableName])) {
|
|
|
|
$tables[$tableName] = [];
|
|
|
|
}
|
|
|
|
$tables[$tableName][] = $uid;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 2nd: delete!
|
|
|
|
foreach ($tables as $table => $uids) {
|
|
|
|
$success = $sql->delete($table)
|
|
|
|
->where(new CondIn("uid", $uids))
|
|
|
|
->execute();
|
|
|
|
|
|
|
|
if (!$success) {
|
|
|
|
printLine("Error deleting data: " . $sql->getLastError());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
printLine("Done!");
|
2021-04-06 23:05:02 +02:00
|
|
|
} else {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Usage: cli.php db <migrate|import|export> [options...]");
|
2021-04-06 23:05:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-07 13:09:50 +02:00
|
|
|
function findPullBranch(array $output): ?string {
|
|
|
|
foreach ($output as $line) {
|
|
|
|
$parts = preg_split('/\s+/', $line);
|
|
|
|
if (count($parts) >= 3 && $parts[2] === '(fetch)') {
|
|
|
|
$remoteName = $parts[0];
|
|
|
|
$url = $parts[1];
|
|
|
|
if (endsWith($url, "@github.com:rhergenreder/web-base.git") ||
|
|
|
|
endsWith($url, "@romanh.de:Projekte/web-base.git") ||
|
|
|
|
$url === 'https://github.com/rhergenreder/web-base.git' ||
|
|
|
|
$url === 'https://git.romanh.de/Projekte/web-base.git') {
|
|
|
|
return "$remoteName/master";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2021-04-07 00:03:14 +02:00
|
|
|
function onMaintenance(array $argv) {
|
2021-04-06 23:05:02 +02:00
|
|
|
$action = $argv[2] ?? "status";
|
|
|
|
$maintenanceFile = "MAINTENANCE";
|
|
|
|
$isMaintenanceEnabled = file_exists($maintenanceFile);
|
|
|
|
|
|
|
|
if ($action === "status") {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Maintenance: " . ($isMaintenanceEnabled ? "on" : "off"));
|
2021-04-06 23:05:02 +02:00
|
|
|
} else if ($action === "on") {
|
2021-04-07 00:03:14 +02:00
|
|
|
$file = fopen($maintenanceFile, 'w') or _exit("Unable to create maintenance file");
|
2021-04-06 23:05:02 +02:00
|
|
|
fclose($file);
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Maintenance enabled");
|
2021-04-06 23:05:02 +02:00
|
|
|
} else if ($action === "off") {
|
|
|
|
if (file_exists($maintenanceFile)) {
|
|
|
|
if (!unlink($maintenanceFile)) {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Unable to delete maintenance file");
|
2021-04-06 23:05:02 +02:00
|
|
|
}
|
|
|
|
}
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Maintenance disabled");
|
2021-04-07 00:55:53 +02:00
|
|
|
} else if ($action === "update") {
|
|
|
|
|
2021-04-09 12:37:24 +02:00
|
|
|
$oldPatchFiles = glob('core/Configuration/Patch/*.php');
|
2021-04-07 13:09:50 +02:00
|
|
|
printLine("$ git remote -v");
|
|
|
|
exec("git remote -v", $gitRemote, $ret);
|
|
|
|
if ($ret !== 0) {
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
|
|
|
|
$pullBranch = findPullBranch($gitRemote);
|
|
|
|
if ($pullBranch === null) {
|
|
|
|
$pullBranch = 'origin/master';
|
|
|
|
printLine("Unable to find remote update branch. Make sure, you are still in a git repository, and one of the remote branches " .
|
|
|
|
"have the original fetch url");
|
|
|
|
printLine("Trying to continue with '$pullBranch'");
|
|
|
|
} else {
|
|
|
|
printLine("Using remote update branch: $pullBranch");
|
|
|
|
}
|
2021-04-07 00:55:53 +02:00
|
|
|
|
|
|
|
printLine("$ git fetch " . str_replace("/", " ", $pullBranch));
|
|
|
|
exec("git fetch " . str_replace("/", " ", $pullBranch), $gitFetch, $ret);
|
|
|
|
if ($ret !== 0) {
|
2021-04-07 01:00:52 +02:00
|
|
|
die();
|
2021-04-07 00:55:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printLine("$ git log HEAD..$pullBranch --oneline");
|
|
|
|
exec("git log HEAD..$pullBranch --oneline", $gitLog, $ret);
|
|
|
|
if ($ret !== 0) {
|
2021-04-07 01:00:52 +02:00
|
|
|
die();
|
2021-04-07 00:55:53 +02:00
|
|
|
} else if (count($gitLog) === 0) {
|
|
|
|
_exit("Already up to date.");
|
|
|
|
}
|
|
|
|
|
|
|
|
printLine("Found updates, checking repository state");
|
|
|
|
printLine("$ git diff-index --quiet HEAD --"); // check for any uncommitted changes
|
|
|
|
exec("git diff-index --quiet HEAD --", $gitDiff, $ret);
|
|
|
|
if ($ret !== 0) {
|
|
|
|
_exit("You have uncommitted changes. Please commit them before updating.");
|
|
|
|
}
|
|
|
|
|
|
|
|
// enable maintenance mode if it wasn't turned on before
|
|
|
|
if (!$isMaintenanceEnabled) {
|
|
|
|
printLine("Turning on maintenance mode");
|
2021-04-07 01:00:52 +02:00
|
|
|
$file = fopen($maintenanceFile, 'w') or _exit("Unable to create maintenance file");
|
|
|
|
fclose($file);
|
2021-04-07 00:55:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printLine("Ready to update, pulling and merging");
|
2021-04-07 01:00:52 +02:00
|
|
|
printLine("$ git pull " . str_replace("/", " ", $pullBranch) . " --no-ff");
|
|
|
|
exec("git pull " . str_replace("/", " ", $pullBranch) . " --no-ff", $gitPull, $ret);
|
2021-04-07 00:55:53 +02:00
|
|
|
if ($ret !== 0) {
|
2021-04-07 01:00:52 +02:00
|
|
|
printLine();
|
2021-04-07 12:57:00 +02:00
|
|
|
printLine("Update could not be applied, check the git output.");
|
2021-04-07 00:55:53 +02:00
|
|
|
printLine("Follow the instructions and afterwards turn off the maintenance mode again using:");
|
|
|
|
printLine("cli.php maintenance off");
|
2021-04-09 12:37:24 +02:00
|
|
|
printLine("Also don't forget to apply new database patches using: cli.php db migrate");
|
2021-04-07 01:00:52 +02:00
|
|
|
die();
|
2021-04-07 00:55:53 +02:00
|
|
|
}
|
|
|
|
|
2021-04-09 12:37:24 +02:00
|
|
|
$newPatchFiles = glob('core/Configuration/Patch/*.php');
|
|
|
|
$newPatchFiles = array_diff($newPatchFiles, $oldPatchFiles);
|
|
|
|
if (count($newPatchFiles) > 0) {
|
|
|
|
printLine("Applying new database patches");
|
|
|
|
$user = getUser();
|
|
|
|
if ($user) {
|
|
|
|
$sql = $user->getSQL();
|
|
|
|
foreach ($newPatchFiles as $patchFile) {
|
|
|
|
if (preg_match("/core\/Configuration\/(Patch\/.*)\.class\.php/", $patchFile, $match)) {
|
|
|
|
$patchName = $match[1];
|
|
|
|
applyPatch($sql, $patchName);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-07 00:55:53 +02:00
|
|
|
// disable maintenance mode again
|
|
|
|
if (!$isMaintenanceEnabled) {
|
|
|
|
printLine("Turning off maintenance mode");
|
2021-04-07 01:00:52 +02:00
|
|
|
if (file_exists($maintenanceFile)) {
|
|
|
|
if (!unlink($maintenanceFile)) {
|
|
|
|
_exit("Unable to delete maintenance file");
|
|
|
|
}
|
|
|
|
}
|
2021-04-07 00:55:53 +02:00
|
|
|
}
|
2021-04-07 00:03:14 +02:00
|
|
|
} else {
|
2021-04-07 00:55:53 +02:00
|
|
|
_exit("Usage: cli.php maintenance <status|on|off|update>");
|
2021-04-07 00:03:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function printTable(array $head, array $body) {
|
|
|
|
|
|
|
|
$columns = [];
|
|
|
|
foreach ($head as $key) {
|
|
|
|
$columns[$key] = strlen($key);
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($body as $row) {
|
|
|
|
foreach ($head as $key) {
|
|
|
|
$value = $row[$key] ?? "";
|
|
|
|
$length = strlen($value);
|
|
|
|
$columns[$key] = max($columns[$key], $length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// print table
|
|
|
|
foreach ($head as $key) {
|
|
|
|
echo str_pad($key, $columns[$key]) . ' ';
|
|
|
|
}
|
|
|
|
printLine();
|
|
|
|
|
|
|
|
foreach ($body as $row) {
|
|
|
|
foreach ($head as $key) {
|
|
|
|
echo str_pad($row[$key] ?? "", $columns[$key]) . ' ';
|
|
|
|
}
|
|
|
|
printLine();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: add missing api functions (should be all internal only i guess)
|
|
|
|
function onRoutes(array $argv) {
|
|
|
|
|
2021-04-09 12:37:24 +02:00
|
|
|
$user = getUser() or die();
|
2021-04-07 00:03:14 +02:00
|
|
|
$action = $argv[2] ?? "list";
|
|
|
|
|
|
|
|
if ($action === "list") {
|
|
|
|
$req = new Api\Routes\Fetch($user);
|
|
|
|
$success = $req->execute();
|
|
|
|
if (!$success) {
|
|
|
|
_exit("Error fetching routes: " . $req->getLastError());
|
|
|
|
} else {
|
|
|
|
$routes = $req->getResult()["routes"];
|
|
|
|
$head = ["uid", "request", "action", "target", "extra", "active"];
|
|
|
|
|
|
|
|
// strict boolean
|
|
|
|
foreach ($routes as &$route) {
|
|
|
|
$route["active"] = $route["active"] ? "true" : "false";
|
|
|
|
}
|
|
|
|
|
|
|
|
printTable($head, $routes);
|
|
|
|
}
|
|
|
|
} else if ($action === "add") {
|
|
|
|
if (count($argv) < 6) {
|
|
|
|
_exit("Usage: cli.php routes add <request> <action> <target> [extra]");
|
|
|
|
}
|
|
|
|
|
|
|
|
$params = array(
|
|
|
|
"request" => $argv[3],
|
|
|
|
"action" => $argv[4],
|
|
|
|
"target" => $argv[5],
|
|
|
|
"extra" => $argv[6] ?? ""
|
|
|
|
);
|
|
|
|
|
|
|
|
$req = new Api\Routes\Add($user);
|
|
|
|
$success = $req->execute($params);
|
|
|
|
if (!$success) {
|
|
|
|
_exit($req->getLastError());
|
|
|
|
} else {
|
|
|
|
_exit("Route added successfully");
|
2021-04-07 12:57:00 +02:00
|
|
|
}
|
2021-04-07 00:03:14 +02:00
|
|
|
} else if (in_array($action, ["remove","modify","enable","disable"])) {
|
|
|
|
$uid = $argv[3] ?? null;
|
|
|
|
if ($uid === null || ($action === "modify" && count($argv) < 7)) {
|
|
|
|
if ($action === "modify") {
|
|
|
|
_exit("Usage: cli.php routes $action <uid> <request> <action> <target> [extra]");
|
|
|
|
} else {
|
|
|
|
_exit("Usage: cli.php routes $action <uid>");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$params = ["uid" => $uid];
|
|
|
|
if ($action === "remove") {
|
|
|
|
$input = null;
|
|
|
|
do {
|
|
|
|
if ($input === "n") {
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
echo "Remove route #$uid? (y|n): ";
|
|
|
|
} while(($input = trim(fgets(STDIN))) !== "y");
|
|
|
|
|
2021-04-07 12:57:00 +02:00
|
|
|
$req = new Api\Routes\Remove($user);
|
2021-04-07 00:03:14 +02:00
|
|
|
} else if ($action === "enable") {
|
2021-04-07 12:57:00 +02:00
|
|
|
$req = new Api\Routes\Enable($user);
|
2021-04-07 00:03:14 +02:00
|
|
|
} else if ($action === "disable") {
|
2021-04-07 12:57:00 +02:00
|
|
|
$req = new Api\Routes\Disable($user);
|
2021-04-07 00:03:14 +02:00
|
|
|
} else if ($action === "modify") {
|
2021-04-07 12:57:00 +02:00
|
|
|
$req = new Api\Routes\Update($user);
|
2021-04-07 00:03:14 +02:00
|
|
|
$params["request"] = $argv[4];
|
|
|
|
$params["action"] = $argv[5];
|
|
|
|
$params["target"] = $argv[6];
|
|
|
|
$params["extra"] = $argv[7] ?? "";
|
|
|
|
} else {
|
|
|
|
_exit("Unsupported action");
|
|
|
|
}
|
|
|
|
|
|
|
|
$success = $req->execute($params);
|
|
|
|
if (!$success) {
|
|
|
|
_exit($req->getLastError());
|
|
|
|
} else {
|
|
|
|
_exit("Route updated successfully");
|
|
|
|
}
|
2021-04-06 23:05:02 +02:00
|
|
|
} else {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Usage: cli.php routes <list|enable|disable|add|remove|modify> [options...]");
|
2021-04-06 16:34:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-09 12:37:24 +02:00
|
|
|
function onTest($argv) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-04-09 16:05:36 +02:00
|
|
|
function onMail($argv) {
|
|
|
|
$action = $argv[2] ?? null;
|
|
|
|
if ($action === "sync") {
|
|
|
|
$user = getUser() or die();
|
|
|
|
if (!$user->getConfiguration()->getSettings()->isMailEnabled()) {
|
|
|
|
_exit("Mails are not configured yet.");
|
|
|
|
}
|
|
|
|
|
|
|
|
$req = new Api\Mail\Sync($user);
|
|
|
|
printLine("Syncing emails…");
|
|
|
|
if (!$req->execute()) {
|
|
|
|
_exit("Error syncing mails: " . $req->getLastError());
|
|
|
|
}
|
|
|
|
|
|
|
|
_exit("Done.");
|
|
|
|
} else {
|
|
|
|
_exit("Usage: cli.php mail <sync> [options...]");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-06 16:34:12 +02:00
|
|
|
$argv = $_SERVER['argv'];
|
|
|
|
if (count($argv) < 2) {
|
2021-04-07 00:03:14 +02:00
|
|
|
_exit("Usage: cli.php <db|routes|settings|maintenance> [options...]");
|
2021-04-06 16:34:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
$command = $argv[1];
|
|
|
|
switch ($command) {
|
|
|
|
case 'help':
|
|
|
|
printHelp();
|
|
|
|
exit;
|
|
|
|
case 'db':
|
|
|
|
handleDatabase($argv);
|
|
|
|
break;
|
|
|
|
case 'routes':
|
2021-04-07 00:03:14 +02:00
|
|
|
onRoutes($argv);
|
2021-04-06 23:05:02 +02:00
|
|
|
break;
|
|
|
|
case 'maintenance':
|
|
|
|
onMaintenance($argv);
|
2021-04-06 16:34:12 +02:00
|
|
|
break;
|
2021-04-09 12:37:24 +02:00
|
|
|
case 'test':
|
|
|
|
onTest($argv);
|
|
|
|
break;
|
2021-04-09 16:05:36 +02:00
|
|
|
case 'mail':
|
|
|
|
onMail($argv);
|
|
|
|
break;
|
2021-04-06 16:34:12 +02:00
|
|
|
default:
|
2021-04-07 00:03:14 +02:00
|
|
|
printLine("Unknown command '$command'");
|
|
|
|
printLine();
|
2021-04-06 16:34:12 +02:00
|
|
|
printHelp();
|
|
|
|
exit;
|
|
|
|
}
|