Witam. Wykorzystałem skrypt zrobiony przez BzikOS'a który jest rewelacyjny. Sprawdza on czy dany użytkownik sieci lan jest dostępny czy nie. I wszystko chodzi lecz mam problem z firewallem. Gdy użytkownik posiada firewalla skrytp pokazuje go jako offline.
<?php
// *********************
// Konfiguracja
//
/* OS na ktorym bedzie uruchamiany skrypt
windows - dziala _tylko_ metoda ping
unix - dziala zarowno ping jak i nmap (jezeli jest w systemie) */
$config['os'] = 'unix';
/* Metoda sprawdzania hostow
ping
nmap - wymaga nmapa w systemie*/
$config['scanMethod'] = 'nmap';
/* IPki do sprawdzenia */
$ipsArray['192.168.0.1'] = "Host1";
$ipsArray['192.168.0.2'] = "Host2";
/* Tablica ipkow majacych dostep do strony (jezeli pusta - wszyscy maja dostep) */
//$allowArray[] = "127.0.0.1";
// *********************
// Sprawdzenie uprawnien
// dostepu do strony
{
if( in_array( $_SERVER['REMOTE_ADDR'], $allowArray ) == False) {
}
}
// *********************
// Szablon
$tblBegin = '<table border="0" cellpadding="0" cellspacing="2" summary="">
<tr>
<td colspan="3" class="title">Status komputerów w sieci lokalnej</td>
</tr>
<tr>
<td colspan="3" class="separator"></td>
</tr>
<tr>
<td class="cell2">Status</td>
<td class="cell2">Host/ksywa/imię</td>
<td class="cell2">Adres IP</td>
</tr>';
$tblRow = '<tr>
<td class="cell" style="text-align: center"><img src="comp{STATUS}.gif"></td>
<td class="cell">{HOST}</td>
<td class="cell">{IP}</td>
</tr>';
$tblEnd = '<tr height="55" valign="center">
<td class="cell3" colspan="3">W sumie: <img src="compon.gif" align="absmiddle"> {SUMAON} <img src="compoff.gif" align="absmiddle"> {SUMAOFF} </td>
</tr>
</table>';
// *********************
// Sprawdzenie komputerow
$time_start = getmicrotime();
$compOn = $compOff = 0;
foreach( $ipsArray as $ip => $host )
{
$compStatus = scan( $ip );
($compStatus == "on") ? $compOn++ : $compOff++;
$row = $tblRow;
$rows .= $row;
}
$page = $tblBegin . $rows . $end;
$time_end = getmicrotime();
$stoper = $time_end - $time_start;
function scan( &$ip )
{
if( $config['scanMethod'] == 'nmap' )
{
$cmd = shell_exec( "nmap -sP -max_rtt_timeout 10 $ip" ); Return ( strpos( $cmd, '1 host up' ) === False ) ?
'off' : 'on'; }
elseif( $config['scanMethod'] == 'ping' )
{
if( $config['os'] == 'windows' )
{
Return ( strpos( $cmd, '(100%' ) === False ) ?
'on' : 'off'; }
else
{
$pingResult = explode( ",", $cmd );
Return ( strpos( $pingResult[1], '1' ) === False ) ?
'off' : 'on'; }
}
else
{
Return "off";
}
}
function getmicrotime()
{
return( (float)$usec + (float)$sec );
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<style type="text/css">
body {
margin: 15px;
font: 11px Verdana;
color: #515151;
}
table {
text-align: center;
border: 1px solid gray;
}
a, a:link, a:visited {
text-decoration: none;
color: #515151;
}
a:hover {
text-decoration: underline;
color: black;
}
td, tr {
font: 11px Verdana;
color: #515151;
}
.title {
padding: 5px;
background-color: #e5e5e5;
color: black;
text-align: center;
font-weight: bold;
}
.cell {
padding: 5px;
background-color: #F5F5F5;
text-align: left;
}
.cell2 {
padding: 5px;
background-color: #F5F5F5;
font-weight: bold;
text-align: center;
}
.cell3 {
padding: 5px;
background-color: #F5F5F5;
font-weight: bold;
text-align: right;
}
.separator {
height: 2px;
background-color: #D2D2D2;
}
.stopka {
font: 9px Verdana;
color: #a5a5a5;
}
</style>
<title>Status komputerów w sieci lokalnej</title>
</head>
<body>
<?
print( '<p class="stopka">' ); print( 'scan method: <b>' . $config['scanMethod'] . '</b><br>' ); printf( 'generated in <b>%0.2f sec.</b><br>', $stoper ); print( 'code by <b>BzikOS</b></p>' ); ?>
</body>
</html>
Do tego już podano rozwiązanie na ten problem ale według mnie nie działa:
" Ok. Tym, którzy cierpią na kłopoty związane z użyciem przez userów firewalla, polecam poniższą modyfikację jednej z funkcji:
<?php
function scan( &$ip )
{
if( $config['scanMethod'] == 'nmap' )
{
$cmd = shell_exec( "nmap -sP -max_rtt_timeout 20 $ip" ); Return ( strpos( $cmd, '1 host up' ) === False ) ?
'off' : 'on';
}
elseif( $config['scanMethod'] == 'arping' )
{
if ( ereg ( 'received 1 response', $cmd ) ) {
Return "on";
}
else
{
Return "off";
}
}
elseif( $config['scanMethod'] == 'arplog' )
{
{
Return "on";
}
else
{
Return "off";
}
}
else
{
Return "off";
}
}
?>
Nie zapomnijcie zmodyfikować zmiennej $config['scanMethod']. Dwie nowe metody to arplog oraz arping. Miłej zabawy! A! W przypadku arpinga zastosowałem dostęp do owego dla użytkownika nobody (pracuje na nim apache) poprzez sudo. Odpowiednia konfiguracja pliku sudo (/etc/sudoers) wyglada tak:
nobody ALL=NOPASSWD:/sbin/arping "
Używam metody ping bo urachamiam to na windzie. Może ktoś pomoże rozwiązac mój problem...
Pozdrawiam