text: #!/bin/bash
  ##############################################################################
  ## nmap_scan_cron
  ## Written by: Matt Pascoe <matt@opennetadmin.com>
  ##
  ## License:
  ##  nmap_scan_cron (hereafter referred to as "program") is free software;
  ##  you can redistribute it and/or modify it under the terms of the GNU General
  ##  Public License as published by the Free Software Foundation; either version
  ##  2 of the License, or (at your option) any later version.
  ##  Note that when redistributing modified versions of this source code, you
  ##  must ensure that this disclaimer and the above coder's names are included
  ##  VERBATIM in the modified code.
  ##
  ## Disclaimer:
  ##  This program is provided with no warranty of any kind, either expressed or
  ##  implied.  It is the responsibility of the user (you) to fully research and
  ##  comprehend the usage of this program.  As with any tool, it can be misused,
  ##  either intentionally (you're a vandal) or unintentionally (you're a moron).
  ##  THE AUTHOR(S) IS(ARE) NOT RESPONSIBLE FOR ANYTHING YOU DO WITH THIS PROGRAM
  ##  or anything that happens because of your use (or misuse) of this program,
  ##  including but not limited to anything you, your lawyers, or anyone else
  ##  can dream up.  And now, a relevant quote directly from the GPL:
  ##
  ## NO WARRANTY
  ##
  ##  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  ##  FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
  ##  OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  ##  PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  ##  OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  ##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
  ##  TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
  ##  PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  ##  REPAIR OR CORRECTION.
  ##
  ## The GNU GPL can be found at http://www.fsf.org/copyleft/gpl.html
  ##
  ##############################################################################
  ##
  ## Description
  ## Subversion info: $Id$
  ##
  ## This tool is meant to run via cron and will run nmap scans on all subnets
  ## in the ONA database that do not have the nmap_scan custom attribute set to N.
  ## The output of each scan will be stored in the local filesystem under
  ## $ONABASE/www/local/nmap_scans/subnets/<baseip>.xml.
  ##
  ## If you choose to send the -u flag, it will update the "last response" column
  ## in the interface table for each IP that shows as "up".
  ##
  ##
  ##############################################################################
  # Get the config info
  [ ! -r /etc/onabase ] && echo "[$0] ERROR: Unable to read /etc/onabase." && exit 1
  ONABASE=`cat /etc/onabase`
  
  # Define the default sql script to use
  SQLFILE=nmap_subnets_only_yes.sql
  
  #### Process the commandline options
  function USAGE {
  cat <<-EOF
  
  Usage: `basename $0` [-u] [-l] [-n x.x.x.x/NN] [-a]
  
    -u:  Update the last response timestamp for IPs that are up.
    -l:  Display a list of subnets generated from the database
    -n:  Specify a single subnet to scan. I.E. 10.1.1.0/24
    -a:  Scan all subnets in DB not flagged as 'N'
  
  Description:
    This tool is meant to run via cron and by default will run nmap scans
  only on subnets in the ONA database that have the nmap_scan custom
  attribute set to Y.  If you wish to run the scan on any subnet in the
  database not marked as N, then use the -a flag.  The output of each
  scan will be stored in the local filesystem under
  $ONABASE/www/local/nmap_scans/subnets/<baseip>.xml.
  
    If you choose to send the -u flag, it will update the "last response" column
  in the interface table for each IP that shows as "up".
  
  EOF
  }
  
  #if [ $# -eq 0 ]; then
  #    USAGE
  #    exit 1
  #fi
  
  while getopts "n:ula" options; do
    case $options in
      u) UPDATE_LAST_RESPONSE=1;;
      l ) LISTFLAG=1;;
      n ) NETENTRY=$OPTARG;;
      a ) SQLFILE=nmap_subnets.sql;;
      \? ) USAGE
           exit 1;;
      * ) USAGE
           exit 1;;
    esac
  done
  
  # Path to the nmap utility
  NMAPCOMMAND=/usr/bin/nmap
  
  # Path to the DCM commandline utility
  DCM_CMD="$ONABASE/bin/dcm.pl"
  
  NMAP_OUTPUT_DIR="$ONABASE/www/local/nmap_scans/subnets"
  
  if [ ! -d $NMAP_OUTPUT_DIR ]
  then
      echo "ERROR => Unable to find directory $NMAP_OUTPUT_DIR. Try 'mkdir -p $NMAP_OUTPUT_DIR'"
      exit 1
  fi
  
  
  #If they specify a single subnet to scan then go for it. otherwise get the list from the database
  if [ -n "$NETENTRY" ]
  then
      NETLIST=$NETENTRY
  else
      # Get a list of subnets from the database using the nmap_subnets.sql query
      NETLIST=`$DCM_CMD -r ona_sql header=no sql=$SQLFILE`
      if [[ $NETLIST == *"no records"* ]]
      then
          echo "ERROR => Unable to retrieve subnet list using $SQLFILE query."
          exit 1
      fi
  fi
  
  # If they just want the list, show it and exit
  if [ -n "$LISTFLAG" ]
  then
      echo "$NETLIST"
      exit 0
  fi
  
  # Loop through each entry in the list and run a scan on it
  for NETENTRY in $NETLIST
  do
      NETCLEAN=`echo $NETENTRY|sed "s/\//-/"`
      echo "INFO => Running NMAP ping only scan on $NETENTRY..."
      $NMAPCOMMAND --stylesheet nmap.xsl -sP -R -oX - $NETENTRY > $NMAP_OUTPUT_DIR/$NETCLEAN.xml
  
      if [ -n "$UPDATE_LAST_RESPONSE" ]
      then
          [ -f $NMAP_OUTPUT_DIR/$NETCLEAN.xml ] && $DCM_CMD -r report_run name=ona_nmap_scans file=$NMAP_OUTPUT_DIR/$NETCLEAN.xml update_response 2>&1 > /dev/null
      fi
  done
  
  exit 0
  