Kwestia jest taka:
Nie moża wykorzystać formularza do odczytywania danych z czytnika.
Sentinel musi siedzieć w tle, nie wyświeltając żadnego okienka ani nic. Po prostu uruchomiony z autostartu lub Crona skrypt, którego nie widać.
Otwiera on jakis sposób odczytu tego, co przechodzi przez port klawiatury, miesza wewnętrzny bufor i jeśli zawartośc bufora jest zgodna z wzorcem, to zapisuje zdażenie (dla uproszczenia poprzez error_log() );
W żaden sposób nie ingeruje w dane z klawiatury, tylko je analizuje.
Operator stanowiska może w tym czasie nawet układąc pasjansa, albo robić inne cuda - dlatego
Sentinel musi pozostać w trybie "Stealth".
Jeśli do końca tygodnia nic nie wymyślę, będę sie musiał zakopać w Javę, ale wolałbym to zrobić w php (chyba, ze ktoś mi udowodni, że się nie da).
Po drobnych modyfikacjach kod skrytpu wygląda tak:
<?php
/**
* Sentinel
* Modul pakietu DoorKeeper
*
* @package DoorKeeper
* @author Grzegorz 'scanner' Tlołka
* @date 2004/10/15
* @update 2004/10/15
* @version 0.0.1dev
*/
// Proces dziala w tle jako usluga stala)
//ignore_user_abort( true );
$Sentinel = new Sentinel( 13 );
$Sentinel->run();
/** Abstract **/
abstract class ASentinel
{
abstract public function __construct( $iBufferLen );
abstract public function run();
abstract private function openInput();
abstract private function addBuffer();
abstract private function testBuffer();
abstract private function writeEvent( $sMessage );
abstract private function getKey();
}
/** Implementation */
class Sentinel extends ASentinel
{
private $hInput;
private $aBuffer;
private $iBufferLen;
private $sBufferPattern;
function __construct( $iBufferLen )
{
$this->iBufferLen = intval( $iBufferLen ); $this->sBufferPattern = \"#(d){\".$this->iBufferLen.\",}#\";
$this->openInput();
$this->aBuffer = array( null ); }
function run()
{
while ( true )
{
$this->addBuffer();
$this->testBuffer();
}
}
function openInput()
{
$this->hInput = fopen( 'php://stdin', 'r'); $this->writeEvent( 'Opening input...' );
}
function addBuffer()
{
if( array_push( $this->aBuffer, $this->getKey() ) > $this->iBufferLen ) {
}
}
function getKey()
{
// TODO
//$sChar = chr( rand( 48, 60 ) );
$sChar = fgetc( $this->hInput ); return $sChar;
}
function testBuffer()
{
$sTest = join( $this->aBuffer ); {
$this->writeEvent( $sTest );
}
}
function writeEvent( $sMessage )
{
error_log( date( '[Y-m-d H:i:s] ' ).$sMessage.\"n\", 3, 'Sentinel.log' ); }
}
?>
Ale niezaleznie od tego, czy go uruchomię w linii poleceń, czy z przeglądarki po prostu nie działa...
Czytałem o socketach, ale nie wiem, jak można by je zastosować.
null wspominał coś o strumieniach, ale tez jeszcze sie tym nie bawiłem, wiec nie wiem co i jak...
Osoba, która pomoże mi w rozwiązaniu tego problemu może liczyć na gratyfikację po oddaniu projektu zleceniodawcy.
P.S. Przenoszę do PHP5, żeby ktoś nie pomyślał, że piszę to w php4