PHP - PHP - Monitor de Archivos Hosting (md5, hash, texto plano)

 
Vista:
sin imagen de perfil

PHP - Monitor de Archivos Hosting (md5, hash, texto plano)

Publicado por Juan (3 intervenciones) el 07/10/2013 19:44:29
Saludos, estoy tratando de crear un script en php, sencillo que tenga las siguientes caracteristicas:

Escanear todo los archivos y capetas de forma recursiva apartir de un directorio, que calcule el md5 de cada archivo y lo almacene en un archivo plano, para que la proxima vez lo compare y que me avise por email si agregaron, borraron o modificaron algo.

Es una especie de monitor pero PHP (para usar el cron del Cpanel) para evitar el desconocimiento de un Deface o error en las paginas.

Gracias

PD: estube buscando, pero todos son sobre mysql ( que por cierto nunca me funciono ) y otro de SQLite, yo lo necesito la data en un archivo plano.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

PHP - Monitor de Archivos Hosting (md5, hash, texto plano)

Publicado por xve (6935 intervenciones) el 07/10/2013 20:20:42
Hola Juan, que parte del mismo tienes realizado? en que parte tienes el problema?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

PHP - Monitor de Archivos Hosting (md5, hash, texto plano)

Publicado por Juan (3 intervenciones) el 07/10/2013 23:06:55
ese es el detalle, soy novato en php, pero encontre lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
define('EMAIL', 'email@gmail.com');
define('DBPATH', '/home/usuario');
define('DBNAME', 'comments.idx');
define('CHECK_PATH', '/home/jnava/www');
define('CHECK_RECURSIVE', true);
define('DBFILE', DBPATH . '/' .DBNAME);
define('CHG_UNCHANGED', 'Sin Cambios');
define('CHG_ADDED', 'Nuevo Archivo');
define('CHG_CHANGED', 'Cambiado');
 
function createDb() {
  $db = new SQLiteDatabase(DBFILE);
  $db->queryExec("CREATE TABLE tbl_files (f_name TEXT, f_size INTEGER, PRIMARY KEY (f_name))");
}
 
function sendEmail($changesBody, $time) {
 
  if (empty($changesBody)) return;
 
  $headers  = "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/plain; charset=\"us-ascii\"\r\n";
  $headers .= "From: " . EMAIL . "\r\n";
  $headers .= "Reply-To: " . EMAIL . "\r\n";
  $headers .= 'X-Mailer: Change Detect and Alert';
 
  $message = $changesBody . "Job took from start to finish: " . $time;
 
  if (EMAIL != '') {
    // send email
    @mail(EMAIL,              // TO email
      'Server Change Alert',  // subject
      $message,               // email text
      $headers);              // headers
  }
}
 
function isChanged($filename) {
  if (strpos($filename, DBNAME) != FALSE) return '';
 
  $isChanged = CHG_UNCHANGED;
  $db = new SQLiteDatabase(DBFILE);
  $q = $db->query("SELECT f_size FROM tbl_files WHERE f_name = '$filename' ");
 
  $filesize_old = $q->fetchSingle();
  $filesize_new = filesize($filename);
 
  // not in db?
  if ($filesize_old === FALSE) {
    $isChanged = CHG_ADDED;
  }
  else if (filesize($filename) != $filesize_old) {
    $isChanged = CHG_CHANGED;
  }
  // update database
  if ($isChanged != CHG_UNCHANGED) {
    if ($isChanged == CHG_ADDED) {
      $db->queryExec("INSERT INTO tbl_files VALUES ('$filename', " . filesize($filename) . " )");
    }
    else if ($isChanged == CHG_CHANGED) {
      $db->queryExec("UPDATE tbl_files SET f_size = " . filesize($filename) . " WHERE f_name = '$filename'");
    }
  }
 
  if ($isChanged != CHG_UNCHANGED) {
    if (!empty($_GET['web'])) echo "$filename -- $isChanged (was:" . $filesize_old . '/is:' . $filesize_new . ")<br>";
    return "$filename -- $isChanged (was:" . $filesize_old . '/is:' . $filesize_new . ")\n";
  }
  else
    return "";
}
 
$changesBody = "";
 
function loopDir($dirname) {
  global $changesBody;
 
  $dir = opendir($dirname);
 
  while ($file = readdir($dir)) {
    if ($file != '.' && $file != '..') {
      if (is_dir($dirname.'/'.$file)) {
        if (CHECK_RECURSIVE) {
          loopDir($dirname.'/'.$file);
        }
      } else {
        $changesBody = $changesBody . isChanged($dirname.'/'.$file);
      }
    }
  }
}
 
if (!file_exists(DBFILE)) {
  createDb();
  sendEmail("No se encuentra base de Datos! Creando...", 0);
}
 
$stime = microtime(true);
loopDir(CHECK_PATH);
sendEmail($changesBody, microtime(true) - $stime);
 
echo "\nDONE";
?>

Como como veran es SQLite y lo necesito en texto plano.. :S
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

PHP - Monitor de Archivos Hosting (md5, hash, texto plano)

Publicado por Mari Carmen (145 intervenciones) el 08/10/2013 00:44:10
Tio no te compliques tanto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
//Archivo para salvar los cambios. Solo se creará la primera vez que ejecutes el script. El resto de veces hará comprobaciones sobre el sin escribirlo.
$save="cambios_save.txt";
 
//directorio de busqueda
$dir=".";
 
//Array con las direcciones de los archivos.
$archivos_tmp=sacndir_r($dir);
//Array donde estarán los datos de los archivos a comparar
$archivos_ant=array();
 
//Lo formateamos archivos para que se parezca a la  del archivo.
foreach($archivos_tmp as $archivo)
{
    $md5=md5_file($archivo);
    $archivos[]="$archivo-$md5\n";
}
 
//Si existe hacemos la comparación de arrays.
if(file_exists($save))
{
    //Vuelca el contenido del archivo en un array(lleva salto de linea).
    $archivos_ant=file($save);
 
    //Recoge las diferencias y te las muestra por pantalla.
    foreach(array_diff($archivos,$archivos_ant) as $archivo)
    {
        echo "$archivo"; //Ya lleva el salto de linea incorporado.
    }
}else
{
    //Si no existe el archivo se crea con los datos que se han encontrado.
    file_put_contents($save,$archivos);
}
 
 
/* 
 * Funcion que devuelve los archivos de un directorio y elimina los directorios . y ..
 * IN: string $dir.
 * OUT: array
 */
function ls($dir)
{
    return array_diff(scandir($dir,SCANDIR_SORT_DESCENDING),array(".",".."));
}
 
/* 
 * Funcion recursiva que devuelve las direcciones de los archivos de todas las subcarpetas.
 * IN: string $dir.
 * OUT: array 
 */
function sacndir_r($dir)
{
    $root = ls($dir);
    $result=array();
    foreach($root as $value) {
        $file="$dir/$value";
        if(is_file($file)) {
            $result[]=$file;
            continue;
        }
        foreach(sacndir_r($file) as $value) {
            $result[]=$value;
        }
    }
    return $result;
}

El resto de funciones de enviar emails y demás te los dejo a ti....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

PHP - Monitor de Archivos Hosting (md5, hash, texto plano)

Publicado por Juan (3 intervenciones) el 08/10/2013 01:06:49
Gracias .. es lo que buscaba, ahora, solo completare tu codigo con un parametro (Clave Secreta) para re escribir el archivo inicial, y le colocare funciones de notificacion.

al lo que este listo lo comparto con ustedes.

Saludos desde Venezuela.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

PHP - Monitor de Archivos Hosting (md5, hash, texto plano)

Publicado por Mari Carmen (145 intervenciones) el 08/10/2013 04:13:28
Un placer ayudar y más si eres tan agradecido.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

PHP - Monitor de Archivos Hosting (md5, hash, texto plano)

Publicado por Mari Carmen (145 intervenciones) el 07/10/2013 22:49:44
Si vas a la documentación de scandir() en http://php.net/manual/en/function.scandir.php podrás encontrar en uno de los comentarios una función recursiva que recoge todos los archivos de los subdirectorios y demás.

Luego solo has de hacer un foreach al arrray y un md5_file() para luego guardarlo en el archivo como pides.

Luego la comparación del md5 guardado con los que ya tienes es trivial.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar