modifs.mineures sans commentaires
This commit is contained in:
parent
a099261b58
commit
fe5ed584b4
|
@ -8,7 +8,7 @@
|
||||||
<sourceFolder url="file://$MODULE_DIR$/nur_src" isTestSource="false" packagePrefix="nur\" />
|
<sourceFolder url="file://$MODULE_DIR$/nur_src" isTestSource="false" packagePrefix="nur\" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/nur_tests" isTestSource="true" packagePrefix="nur\" />
|
<sourceFolder url="file://$MODULE_DIR$/nur_tests" isTestSource="true" packagePrefix="nur\" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/wip" isTestSource="false" packagePrefix="nur\sery\wip\" />
|
<sourceFolder url="file://$MODULE_DIR$/wip" isTestSource="false" packagePrefix="nur\sery\wip\" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/wip_app" isTestSource="false" packagePrefix="nur\sery\app\" />
|
<sourceFolder url="file://$MODULE_DIR$/wip_app" isTestSource="false" packagePrefix="nur\sery\" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/vendor" />
|
<excludeFolder url="file://$MODULE_DIR$/vendor" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
|
|
|
@ -50,8 +50,7 @@
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"nur\\sery\\wip\\": "wip",
|
"nur\\sery\\wip\\": "wip",
|
||||||
"nur\\sery\\app\\": "wip_app",
|
"nur\\sery\\": ["wip_app", "src"],
|
||||||
"nur\\sery\\": "src",
|
|
||||||
"nur\\": "nur_src"
|
"nur\\": "nur_src"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
|
|
|
@ -9,25 +9,18 @@ use nur\config\ArrayConfig;
|
||||||
use nur\msg;
|
use nur\msg;
|
||||||
use nur\os;
|
use nur\os;
|
||||||
use nur\path;
|
use nur\path;
|
||||||
use nur\sery\app\launcher;
|
|
||||||
use nur\sery\app\RunFile;
|
|
||||||
use nur\sery\cl;
|
|
||||||
use nur\sery\app;
|
use nur\sery\app;
|
||||||
|
use nur\sery\app\RunFile;
|
||||||
|
use nur\sery\output\console as nconsole;
|
||||||
use nur\sery\output\log as nlog;
|
use nur\sery\output\log as nlog;
|
||||||
use nur\sery\output\msg as nmsg;
|
use nur\sery\output\msg as nmsg;
|
||||||
use nur\sery\output\console as nconsole;
|
|
||||||
use nur\sery\output\std\StdMessenger;
|
use nur\sery\output\std\StdMessenger;
|
||||||
|
use nur\yaml;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Application: application de base
|
* Class Application: application de base
|
||||||
*/
|
*/
|
||||||
abstract class Application {
|
abstract class Application {
|
||||||
protected static ?array $internal_use_app_params = null;
|
|
||||||
|
|
||||||
static function internal_use_set_app_params($params) {
|
|
||||||
self::$internal_use_app_params = $params;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var string répertoire du projet (celui qui contient composer.json */
|
/** @var string répertoire du projet (celui qui contient composer.json */
|
||||||
const PROJDIR = null;
|
const PROJDIR = null;
|
||||||
|
|
||||||
|
@ -46,6 +39,13 @@ abstract class Application {
|
||||||
*/
|
*/
|
||||||
const APPCODE = null;
|
const APPCODE = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null identifiant d'un groupe auquel l'application appartient.
|
||||||
|
* les applications du même groupe enregistrent leur fichiers de controle au
|
||||||
|
* même endroit $VARDIR/$APPGROUP
|
||||||
|
*/
|
||||||
|
const APPGROUP = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string code de l'application, utilisé pour inférer le nom de certains
|
* @var string code de l'application, utilisé pour inférer le nom de certains
|
||||||
* fichiers spécifiques à l'application.
|
* fichiers spécifiques à l'application.
|
||||||
|
@ -78,7 +78,74 @@ abstract class Application {
|
||||||
const USE_RUNLOCK = false;
|
const USE_RUNLOCK = false;
|
||||||
|
|
||||||
/** @var bool faut-il installer le gestionnaire de signaux? */
|
/** @var bool faut-il installer le gestionnaire de signaux? */
|
||||||
const USE_SIGNAL_HANDLER = false;
|
const INSTALL_SIGNAL_HANDLER = false;
|
||||||
|
|
||||||
|
private static function _info(string $message, int $ec=0): int {
|
||||||
|
fwrite(STDERR, "INFO: $message\n");
|
||||||
|
return $ec;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function _error(string $message, int $ec=1): int {
|
||||||
|
fwrite(STDERR, "ERROR: $message\n");
|
||||||
|
return $ec;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function _manage_runfile(int &$argc, array &$argv, RunFile $runfile): void {
|
||||||
|
if ($argc <= 1 || $argv[1] !== "//") return;
|
||||||
|
array_splice($argv, 1, 1); $argc--;
|
||||||
|
$ec = 0;
|
||||||
|
switch ($argv[1] ?? "infos") {
|
||||||
|
case "help":
|
||||||
|
self::_info(<<<EOT
|
||||||
|
Valid commands:
|
||||||
|
infos
|
||||||
|
dump
|
||||||
|
reset
|
||||||
|
release
|
||||||
|
start
|
||||||
|
kill
|
||||||
|
|
||||||
|
EOT);
|
||||||
|
break;
|
||||||
|
case "infos":
|
||||||
|
case "i":
|
||||||
|
$desc = $runfile->getDesc();
|
||||||
|
if ($runfile->isRunning()) {
|
||||||
|
$actionDesc = $runfile->getActionDesc();
|
||||||
|
if ($actionDesc !== null) $actionDesc = "\n$actionDesc";
|
||||||
|
echo "$desc$actionDesc\n";
|
||||||
|
} else {
|
||||||
|
echo "$desc\n";
|
||||||
|
$ec = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "dump":
|
||||||
|
case "d":
|
||||||
|
yaml::dump($runfile->read());
|
||||||
|
break;
|
||||||
|
case "reset":
|
||||||
|
case "z":
|
||||||
|
if (!$runfile->isRunning()) $runfile->reset();
|
||||||
|
else $ec = self::_error("cannot reset while running");
|
||||||
|
break;
|
||||||
|
case "release":
|
||||||
|
case "rl":
|
||||||
|
$runfile->release();
|
||||||
|
break;
|
||||||
|
case "start":
|
||||||
|
case "s":
|
||||||
|
array_splice($argv, 1, 1); $argc--;
|
||||||
|
return;
|
||||||
|
case "kill":
|
||||||
|
case "k":
|
||||||
|
if ($runfile->isRunning()) $runfile->wfKill();
|
||||||
|
else $ec = self::_error("not running");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$ec = self::_error("$argv[1]: unexpected command", app::EC_BAD_COMMAND);
|
||||||
|
}
|
||||||
|
exit($ec);
|
||||||
|
}
|
||||||
|
|
||||||
protected static function _app_init(): void {
|
protected static function _app_init(): void {
|
||||||
config::set_fact(config::FACT_CLI_APP);
|
config::set_fact(config::FACT_CLI_APP);
|
||||||
|
@ -108,7 +175,7 @@ abstract class Application {
|
||||||
if ($projdir == "/") break;
|
if ($projdir == "/") break;
|
||||||
}
|
}
|
||||||
|
|
||||||
app::init(static::class, self::$internal_use_app_params);
|
app::init(static::class);
|
||||||
nmsg::set_messenger(new StdMessenger([
|
nmsg::set_messenger(new StdMessenger([
|
||||||
"min_level" => nmsg::DEBUG,
|
"min_level" => nmsg::DEBUG,
|
||||||
]));
|
]));
|
||||||
|
@ -146,7 +213,7 @@ abstract class Application {
|
||||||
static function run(?Application $app=null): void {
|
static function run(?Application $app=null): void {
|
||||||
$unlock = false;
|
$unlock = false;
|
||||||
$stop = false;
|
$stop = false;
|
||||||
$shutdownHandler = function () use (&$unlock, &$stop) {
|
$shutdown = function () use (&$unlock, &$stop) {
|
||||||
if ($unlock) {
|
if ($unlock) {
|
||||||
app::get()->getRunfile()->release();
|
app::get()->getRunfile()->release();
|
||||||
$unlock = false;
|
$unlock = false;
|
||||||
|
@ -156,29 +223,19 @@ abstract class Application {
|
||||||
$stop = false;
|
$stop = false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
register_shutdown_function($shutdownHandler);
|
register_shutdown_function($shutdown);
|
||||||
if (static::USE_SIGNAL_HANDLER) {
|
app::install_signal_handler(static::INSTALL_SIGNAL_HANDLER);
|
||||||
$signalHandler = function(int $signo, $siginfo) {
|
|
||||||
self::exit(255);
|
|
||||||
};
|
|
||||||
pcntl_signal(SIGHUP, $signalHandler);
|
|
||||||
pcntl_signal(SIGINT, $signalHandler);
|
|
||||||
pcntl_signal(SIGQUIT, $signalHandler);
|
|
||||||
pcntl_signal(SIGTERM, $signalHandler);
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
static::_app_init();
|
static::_app_init();
|
||||||
if (static::USE_RUNFILE) {
|
$useRunfile = static::USE_RUNFILE;
|
||||||
|
$useRunlock = static::USE_RUNLOCK;
|
||||||
|
if ($useRunfile) {
|
||||||
$runfile = app::get()->getRunfile();
|
$runfile = app::get()->getRunfile();
|
||||||
|
|
||||||
global $argc, $argv;
|
global $argc, $argv;
|
||||||
if ($argc === 2 && ($argv[1] === "--Application-release-runlock" || $argv[1] === "--ARL")) {
|
self::_manage_runfile($argc, $argv, $runfile);
|
||||||
$runfile->release();
|
if ($useRunlock && $runfile->warnIfLocked()) exit(app::EC_LOCKED);
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
$useRunlock = static::USE_RUNLOCK;
|
|
||||||
if ($useRunlock && $runfile->warnIfLocked()) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
$runfile->wfStart();
|
$runfile->wfStart();
|
||||||
$stop = true;
|
$stop = true;
|
||||||
if ($useRunlock) {
|
if ($useRunlock) {
|
||||||
|
@ -393,15 +450,4 @@ abstract class Application {
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract function main();
|
abstract function main();
|
||||||
|
|
||||||
const BGLAUNCH_SCRIPT = null;
|
|
||||||
static function runfile(): RunFile {
|
|
||||||
$callerParams = app::get()->getParams();
|
|
||||||
return app::with(static::class, $callerParams)->getRunfile();
|
|
||||||
}
|
|
||||||
static function bglaunch(?array $args=null) {
|
|
||||||
launcher::launch(static::class, cl::merge([
|
|
||||||
static::BGLAUNCH_SCRIPT,
|
|
||||||
], $args));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
namespace nur\sery;
|
namespace nur\sery;
|
||||||
|
|
||||||
|
use nur\cli\Application as nur_Application;
|
||||||
use nur\sery\app\cli\Application;
|
use nur\sery\app\cli\Application;
|
||||||
use nur\sery\app\LockFile;
|
use nur\sery\app\LockFile;
|
||||||
use nur\sery\app\RunFile;
|
use nur\sery\app\RunFile;
|
||||||
|
@ -11,7 +12,8 @@ use nur\sery\php\func;
|
||||||
class app {
|
class app {
|
||||||
private static function isa_Application($app): bool {
|
private static function isa_Application($app): bool {
|
||||||
if (!is_string($app)) return false;
|
if (!is_string($app)) return false;
|
||||||
return $app === Application::class || is_subclass_of($app, Application::class);
|
return $app === Application::class || is_subclass_of($app, Application::class)
|
||||||
|
|| $app === nur_Application::class || is_subclass_of($app, nur_Application::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function get_params($app): array {
|
private static function get_params($app): array {
|
||||||
|
@ -525,9 +527,8 @@ class app {
|
||||||
* afficher une erreur et quitter l'application
|
* afficher une erreur et quitter l'application
|
||||||
*/
|
*/
|
||||||
static function check_bgapplication_enabled(bool $forceEnabled=false): void {
|
static function check_bgapplication_enabled(bool $forceEnabled=false): void {
|
||||||
if (self::$bgapplication_enabled === null) return;
|
if (self::$bgapplication_enabled === null || $forceEnabled) return;
|
||||||
$enabled = boolval(self::$bgapplication_enabled->invoke());
|
if (!self::$bgapplication_enabled->invoke()) {
|
||||||
if (!$forceEnabled && !$enabled) {
|
|
||||||
throw new ExitError(self::EC_DISABLED, "Planifications désactivées. La tâche n'a pas été lancée");
|
throw new ExitError(self::EC_DISABLED, "Planifications désactivées. La tâche n'a pas été lancée");
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue