2017-07-21 21:15:43 +00:00
|
|
|
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace JKingWeb\Arsse;
|
|
|
|
|
|
|
|
class CLI {
|
|
|
|
protected $args = [];
|
|
|
|
|
|
|
|
protected function usage(): string {
|
|
|
|
$prog = basename($_SERVER['argv'][0]);
|
|
|
|
return <<<USAGE_TEXT
|
|
|
|
Usage:
|
|
|
|
$prog daemon
|
|
|
|
$prog feed refresh <n>
|
2017-08-20 03:56:32 +00:00
|
|
|
$prog conf save-defaults <file>
|
2017-08-28 23:38:58 +00:00
|
|
|
$prog user add <username> [<password>]
|
2017-07-21 21:15:43 +00:00
|
|
|
$prog --version
|
|
|
|
$prog --help | -h
|
|
|
|
|
|
|
|
The Arsse command-line interface currently allows you to start the refresh
|
2017-08-28 23:38:58 +00:00
|
|
|
daemon, refresh a specific feed by numeric ID, add a user, or save default
|
|
|
|
configuration to a sample file.
|
2017-07-21 21:15:43 +00:00
|
|
|
USAGE_TEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
function __construct(array $argv = null) {
|
|
|
|
if(is_null($argv)) {
|
|
|
|
$argv = array_slice($_SERVER['argv'], 1);
|
|
|
|
}
|
|
|
|
$this->args = \Docopt::handle($this->usage(), [
|
|
|
|
'argv' => $argv,
|
|
|
|
'help' => true,
|
|
|
|
'version' => VERSION,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2017-08-20 03:56:32 +00:00
|
|
|
protected function loadConf(): bool {
|
|
|
|
// FIXME: this should be a method of the Conf class
|
|
|
|
Arsse::load(new Conf());
|
|
|
|
if(file_exists(BASE."config.php")) {
|
|
|
|
Arsse::$conf->importFile(BASE."config.php");
|
|
|
|
}
|
2017-08-28 23:38:58 +00:00
|
|
|
// command-line operations will never respect authorization
|
|
|
|
Arsse::$user->authorizationEnabled(false);
|
2017-08-20 03:56:32 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2017-07-21 21:15:43 +00:00
|
|
|
function dispatch(array $args = null): int {
|
|
|
|
// act on command line
|
|
|
|
if(is_null($args)) {
|
|
|
|
$args = $this->args;
|
|
|
|
}
|
2017-08-28 23:38:58 +00:00
|
|
|
if($this->command("daemon", $args)) {
|
2017-08-20 03:56:32 +00:00
|
|
|
$this->loadConf();
|
2017-07-21 21:15:43 +00:00
|
|
|
return $this->daemon();
|
2017-08-28 23:38:58 +00:00
|
|
|
} else if($this->command("feed refresh", $args)) {
|
2017-08-20 03:56:32 +00:00
|
|
|
$this->loadConf();
|
2017-07-21 21:15:43 +00:00
|
|
|
return $this->feedRefresh((int) $args['<n>']);
|
2017-08-28 23:38:58 +00:00
|
|
|
} else if($this->command("conf save-defaults", $args)) {
|
2017-08-20 03:56:32 +00:00
|
|
|
return $this->confSaveDefaults($args['<file>']);
|
2017-08-28 23:38:58 +00:00
|
|
|
} else if($this->command("user add", $args)) {
|
|
|
|
$this->loadConf();
|
|
|
|
return $this->userAdd($args['<username>'], $args['<password>']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function command($cmd, $args): bool {
|
|
|
|
foreach(explode(" ", $cmd) as $part) {
|
|
|
|
if(!$args[$part]) {
|
|
|
|
return false;
|
|
|
|
}
|
2017-07-21 21:15:43 +00:00
|
|
|
}
|
2017-08-28 23:38:58 +00:00
|
|
|
return true;
|
2017-07-21 21:15:43 +00:00
|
|
|
}
|
|
|
|
|
2017-08-28 23:38:58 +00:00
|
|
|
function daemon(bool $loop = true): int {
|
2017-07-21 21:15:43 +00:00
|
|
|
(new Service)->watch($loop);
|
|
|
|
return 0; // FIXME: should return the exception code of thrown exceptions
|
|
|
|
}
|
|
|
|
|
2017-08-28 23:38:58 +00:00
|
|
|
function feedRefresh(int $id): int {
|
2017-08-18 03:05:08 +00:00
|
|
|
return (int) !Arsse::$db->feedUpdate($id); // FIXME: exception error codes should be returned here
|
2017-07-21 21:15:43 +00:00
|
|
|
}
|
2017-08-20 03:56:32 +00:00
|
|
|
|
2017-08-28 23:38:58 +00:00
|
|
|
function confSaveDefaults(string $file): int {
|
2017-08-20 03:56:32 +00:00
|
|
|
return (int) !(new Conf)->exportFile($file, true);
|
|
|
|
}
|
2017-08-28 23:38:58 +00:00
|
|
|
|
|
|
|
function userAdd(string $user, string $password = null): int {
|
|
|
|
$passwd = Arsse::$user->add($user, $password);
|
|
|
|
if(is_null($password)) {
|
|
|
|
echo $passwd;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2017-07-21 21:15:43 +00:00
|
|
|
}
|