141 lines
3.3 KiB
PHP
Executable File
141 lines
3.3 KiB
PHP
Executable File
#!/usr/bin/php
|
|
|
|
<?php
|
|
|
|
require_once __DIR__.'/../../include/php/const';
|
|
|
|
|
|
function globalstate_update(){
|
|
|
|
|
|
/* [1] Fetch global state
|
|
=========================================================*/
|
|
$GLOBAL_STATE = [];
|
|
|
|
/* (1) Fetch from file */
|
|
$f_gstate = @file_get_contents(STATE_CONF);
|
|
|
|
/* (2) Manage errors */
|
|
if( $f_gstate === false ){
|
|
slog('Cannot access GLOBAL STATE file', 'global-state:update', 'daemon');
|
|
return 127;
|
|
}
|
|
|
|
/* (3) Remove surrounding spaces */
|
|
$f_gstate = preg_replace('@^\s+@', '', $f_gstate);
|
|
$f_gstate = preg_replace('@\s+$@', '', $f_gstate);
|
|
|
|
/* (4) Extract */
|
|
$GLOBAL_STATE = $f_gstate;
|
|
|
|
|
|
/* [2] Cache global state to chip states
|
|
=========================================================*/
|
|
$CHIP_STATE = null;
|
|
|
|
/* (1) Fetch from file */
|
|
$f_cstates = new SplFileObject(STATES_CONF, 'r');
|
|
|
|
/* (2) Section Title */
|
|
if( $f_cstates === false ){
|
|
slog('Cannot access GLOBAL/CHIP STATES file', 'global-state:update', 'daemon');
|
|
return 127;
|
|
}
|
|
|
|
/* (3) Parse line by line */
|
|
while( !$f_cstates->eof() ){
|
|
|
|
// {1} Try to parse current line //
|
|
$parsed = json_decode($f_cstates->fgets(), true);
|
|
|
|
// {2} If cannot parse, go to next //
|
|
if( is_null($parsed) )
|
|
continue;
|
|
|
|
// {3} Check if GLOBAL STATE matches CURRENT state //
|
|
$failed = false;
|
|
|
|
for( $c = 0 ; $c < strlen($GLOBAL_STATE) || $c < strlen($parsed[0]) ; $c++ ){
|
|
// {3.1} If 'X' -> whatever state //
|
|
if( $parsed[0][$c] == 'X' )
|
|
continue;
|
|
|
|
// {3.2} Else, if different -> fail //
|
|
else if( $parsed[0][$c] != $GLOBAL_STATE[$c] ){
|
|
$failed = true;
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
// {4} If not failed -> state to keep //
|
|
if( !$failed ){
|
|
slog("Current state '$GLOBAL_STATE' matches '{$parsed[0]}'", 'global-state:update', 'daemon');
|
|
$CHIP_STATE = $parsed[1];
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
/* (4) If no CHIP_STATE set -> abort */
|
|
if( is_null($CHIP_STATE) ){
|
|
slog("Cannot find a chip_state for the current global state '{$GLOBAL_STATE}'", 'global-state', 'daemon');
|
|
return 127;
|
|
}
|
|
|
|
|
|
|
|
|
|
/* [2] Update chips
|
|
=========================================================*/
|
|
/* (1) Get file handler */
|
|
$f_chips = new SplFileObject(CHIPS_CONF, 'r');
|
|
|
|
/* (2) Parse line by line */
|
|
while( !$f_chips->eof() ){
|
|
|
|
// {1} Try to parse current line //
|
|
$parsed = json_decode($f_chips->fgets(), true);
|
|
|
|
// {2} If cannot parse, go to next //
|
|
if( is_null($parsed) )
|
|
continue;
|
|
|
|
// {3} Check if position available in GLOBAL_STATE //
|
|
if( isset($CHIP_STATE[$parsed[0]]) ){
|
|
|
|
/* (1) If CHIP STATE value is 'x' -> do nothing */
|
|
if( $CHIP_STATE[$parsed[0]] == 'x' )
|
|
continue;
|
|
|
|
/* (2) If state does not exist -> go to next chip */
|
|
if( !isset($parsed[2][$CHIP_STATE[$parsed[0]]]) )
|
|
continue;
|
|
|
|
/* (3) Use variables to be more human-readable */
|
|
$position = $parsed[0];
|
|
$state = $CHIP_STATE[$parsed[0]];
|
|
|
|
/* (3) Set state */
|
|
$updated = syscall(SOURCE_DIR."/lib/global-state/set {$position} {$state}");
|
|
|
|
/* (4) If error */
|
|
if( $updated === false )
|
|
slog("Cannot set ${position} chip to state {$state}", 'global-state:update', 'daemon');
|
|
|
|
}
|
|
}
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
/* [3] Launch main script
|
|
=========================================================*/
|
|
$exec = globalstate_update();
|
|
|
|
echo $exec;
|
|
die($exec);
|
|
?>
|
|
|