Guest

tripwire

By: a guest on Mar 29th, 2010  |  syntax: Bash  |  size: 5.30 KB  |  hits: 201  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. #!/bin/sh
  2.  
  3. #############################################################################################
  4. # Automation to check for new/changed files                                                 #
  5. # Author: Aimee Camaclang                                                                   #
  6. #                                                                                           #
  7. # Created: March 2010                                                                       #
  8. #                                                                                           #
  9. # Builds a database of pathnames and checksums in an attempt to discover changes to a       #
  10. # system. It does this by comparing results of a new run against the results of a previous  #
  11. # run. Files that appear in the new run but not the previous are flagged as new files;      #
  12. # files that appear in the previous run but not the new are flagged as deleted files.       #
  13. # Changed files are found using an md5sum check. All database and report files generated    #
  14. # by this script is chmod 600 for security.                                                 #
  15. #                                                                                           #
  16. # Use option --init when running this script on a path for the first time. It will simply   #
  17. # get and save the current state of files in the specified path.                            #
  18. # Use option --scan to compare results of the current run against the results of the        #
  19. # previous run.                                                                             #
  20. #############################################################################################
  21.  
  22. source /etc/a5.conf
  23.  
  24. #############################################################################################
  25. # deal with command line arguments
  26.  
  27. if [ "$1" != "--init" ] && [ "$1" != "--scan" ]; then
  28.   echo "Usage: `basename $0` [option]"
  29.   echo "Scan for new/changed files in path."
  30.   echo ""
  31.   echo "Options"
  32.   echo -e "--init\tinitialize database only"
  33.   echo -e "--scan\tscan for new/changed files"
  34.   echo "  Otherwise, this awesome help file."
  35.   echo ""
  36.   echo "Config file in /etc/a5.conf"
  37.   echo "Database files are savedstate.txt and savedstatemd5.txt"
  38.   echo ""
  39.   exit 1
  40. fi
  41.  
  42. #############################################################################################
  43. # get current state
  44.  
  45. # find command to walk through directory structure, write pathnames to file
  46. echo ""
  47. echo "Calculating pathnames database..."
  48. for dir in $dsearch
  49. do
  50.   if [ -d $dir ]; then
  51.     find $dir -type f >> $logdir/savedstate.txt
  52.   else
  53.     echo "Error: '$dir' does not exist!!"
  54.     echo "Skipping."
  55.   fi
  56. done
  57. chmod 600 $logdir/savedstate.txt
  58.  
  59. # find command to walk through directory structure, write checksums/pathname to file
  60. echo ""
  61. echo "Calculating md5 database..."
  62. for dir in $dsearch
  63. do
  64.   if [ -d $dir ]; then
  65.     find $dir -type f -print0 | xargs -0 md5sum >> $logdir/savedstatemd5.txt
  66.   else
  67.     echo "Error: '$dir' does not exist!!"
  68.     echo "Skipping."
  69.   fi
  70. done
  71. chmod 600 $logdir/savedstatemd5.txt
  72.  
  73. #############################################################################################
  74. # if scanning for changes
  75. if [ "$1" = "--scan" ];then
  76.  
  77.   ######################################
  78.   # parse results
  79.  
  80.   echo ""
  81.   echo "Parsing results..."
  82.  
  83.   touch $logdir/newfiles.txt
  84.   chmod 600 $logdir/newfiles.txt
  85.   touch $logdir/deletedfiles.txt
  86.   chmod 600 $logdir/deletedfiles.txt
  87.  
  88.   sort $logdir/savedstate.txt.bak > $logdir/savedstate-sort.txt.bak
  89.   sort $logdir/savedstate.txt > $logdir/savedstate-sort.txt
  90.  
  91.   # show pathnames that only exist in current state
  92.   comm -13 $logdir/savedstate-sort.txt.bak $logdir/savedstate-sort.txt > $logdir/newfiles.txt
  93.  
  94.   # show pathnames that only exist in previous state
  95.   comm -23 $logdir/savedstate-sort.txt.bak $logdir/savedstate-sort.txt > $logdir/deletedfiles.txt
  96.  
  97.   rm -f $logdir/savedstate-sort.txt
  98.   rm -f $logdir/savedstate-sort.txt.bak
  99.  
  100.   #######################################
  101.   # md5sum check files in savedstatemd5.txt.bak
  102.  
  103.   md5sum -c $logdir/savedstatemd5.txt.bak 2>&1 | grep -v 'OK$' &> $logdir/md5changes.txt
  104.  
  105.   chmod 600 $logdir/md5changes.txt
  106.  
  107.   #######################################
  108.   # display results
  109.  
  110.   echo ""
  111.   echo "Results:"
  112.  
  113.   if [ `cat $logdir/newfiles.txt|wc -l` -eq 0 ]
  114.   then
  115.     echo "No new files were detected. Cleaning up."
  116.     rm -f $logdir/newfiles.txt
  117.   else
  118.     echo "New files were detected. View $logdir/newfiles.txt for details."
  119.   fi
  120.  
  121.   if [ `cat $logdir/deletedfiles.txt|wc -l` -eq 0 ]
  122.   then
  123.     echo "No deleted files were detected. Cleaning up."
  124.     rm -f $logdir/deletedfiles.txt
  125.   else
  126.     echo "Deleted files were detected. View $logdir/deletedfiles.txt for details."
  127.   fi
  128.  
  129.   if [ `cat $logdir/md5changes.txt|wc -l` -eq 0 ]
  130.   then
  131.     echo "No file changes were detected. Cleaning up."
  132.     rm -f $logdir/md5changes.txt
  133.   else
  134.     echo "File changes were detected. View $logdir/md5changes.txt for details."
  135.   fi
  136.  
  137. fi
  138.  
  139. #############################################################################################
  140. # save current state
  141.  
  142. echo ""
  143. echo "Saving current state."
  144.  
  145. mv $logdir/savedstate.txt $logdir/savedstate.txt.bak
  146. mv $logdir/savedstatemd5.txt $logdir/savedstatemd5.txt.bak