Change Detect and Alert

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Change Detect and Alert

    Purpose: detect filesystem changes on a (web)server and send list of changed or added files via email. Can send a kind of alert as SMS if your mobile network operator supports email to sms gateway. Tip: see Wikipedia for "List of SMS gateways".

    Usage:

    Change script settings (in file) according to your needs
    Upload to your (web)server
    Setup cron job to run it periodically;
    - via PHP "php -q /home/serverpath/script/change-detect-alert.php"
    - via cURL "curl http://www.example.com/path/to/change-detect-alert.php"


    Notes: script checks file size only, will possibly add date and contents comparison later if needed; invoking via PHP is preferred; you may need to specify absolute path to php or curl
    Requirements: Change Detect and Alert is a script which is supposed to be run on a server with PHP and SQLite3 installed.




    PHP Code:




    // Specify your email here. Use comma as delimiter if you want to sent to multiple emails
    define('EMAIL''youremail@example.com');

    // Specify path from the root folder where script will store its database, NO ENDING SLASH
    define('DBPATH''/usr/home/my-site/www');

    // Filename of database (no path)
    define('DBNAME''comments.idx');

    // folder being tracked, NO ENDING SLASH
    define('CHECK_PATH''/usr/home/my-site/www/uploads');

    // true - check all subfolders of CHECK_PATH
    // false - do not check subfolders
    define('CHECK_RECURSIVE'true);

    ###############################################################
    ## YOU DO NOT HAVE TO CHANGE ANYTHING BELOW UNLESS YOU KNOW WHAT YOU ARE DOING
    ###############################################################

    define('DBFILE'DBPATH '/' .DBNAME);
    define('CHG_UNCHANGED''UNCHANGED');
    define('CHG_ADDED''ADDED');
    define('CHG_CHANGED''CHANGED');

    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;

      
    // set email headers
      
    $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($filenameDBNAME) != 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("Database file not found! Creating."0);
    }

    $stime microtime(true);
    loopDir(CHECK_PATH);
    sendEmail($changesBodymicrotime(true) - $stime);

    echo 
    "\nDONE";
    ?> 
    I use it to detect ebook uploads on my ftp server. The only change i made: invoke external program in addition to chnages email. Really helpful...
    Last edited by BioBeo; 28.05.11, 15:41.

    #2
    again this helps...

    Comment

    Working...
    X