snmptrapd traphandle para o script php

1

Eu tenho que receber snmptraps no script php, então o que eu fiz é:

snmptrapd.conf

traphandle 1.3.6.1.4.1.3.1.1 /usr/home/user/trap/l.php

l.php

#!/usr/local/bin/php
<?php
$flow = fopen("php://stderr","r");
while(!feof($flow)){
    file_put_contents("out",fread($flow,1024)."\n", FILE_APPEND);
}
?>

então eu inicio o snmptrapd assim:

snmptrapd -Le -f

e gerou armadilhas como esta:

snmptrap -v 1 -c public localhost '' localhost 6 1 ''

snmptrapd me dá essa saída

2012-01-16 14:38:49 127.0.0.1(via UDP: [127.0.0.1]:11478->[0.0.0.0]:0) TRAP, SNMP v1, community public
        SNMPv2-SMI::enterprises.3.1.1 Enterprise Specific Trap (1) Uptime: 70 days, 1:03:57.00

parece funcionar ... mas o problema é que l.php não é executado, ou não há nada em stderr - não consigo perceber.

por favor, onde está o meu erro?

    
por k102 16.01.2012 / 11:49

1 resposta

1

php://stderr não é um fluxo que possa ser lido. É um canal para o STDERR para o próprio processo PHP, que é somente de gravação.

Você precisa acessar os dados via STDIN . Em vez de usar o wrapper php:// para acessar os fluxos STDIO, que são conhecidos como com bugs (consulte o manual ) você deve usar as constantes especiais STDOUT , STDERR e STDIN . Então, por exemplo, eu poderia escrever seu script PHP assim:

#!/usr/local/bin/php
<?php

  // The file we will be writing to. It's best to specify a full path, to avoid
  // any confusion over the current working directory
  $outFile = '/var/myuser/snmp.out';

  // First, we'll open our outfile...
  if (!$ofp = fopen($outFile, 'a')) exit("Oh No! I couldn't open my out file!");

  // ...and write the current timestamp to it, so we are certain the script was
  // invoked. You can remove this if you want, once you are sure it is working
  fwrite($ofp, "Process started at ".date('Y-m-d H:i:s')."\n");

  // Next we'll write all the trap data to the file
  // We could use stream_copy_to_stream() for this, but I don't know if it is
  // available on your server so I won't do it here
  fwrite($ofp,"Data:\n");
  while (!feof(STDIN)) {
    fwrite($ofp, fread(STDIN, 1024)."\n");
  }
  fwrite($ofp,"End Data\n");

  // We don't actually need a closing PHP tag and in many cases it is better
  // to omit it, to avoid unexpected whitespace being output.
    
por 16.01.2012 / 13:06