#!/bin/bash 
# 
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 

METRON_VERSION=0.6.0
METRON_HOME=${METRON_HOME:-"/usr/metron/$METRON_VERSION"}
DATE_FORMAT=${DATE_FORMAT:-"yyyyMMdd"}
USER=$(whoami)
USER_HOMEDIR=${USER_HOMEDIR:-`hdfs getconf -confKey dfs.user.home.dir.prefix`/$USER}
QUERY_HOME=${QUERY_HOME:-"$USER_HOMEDIR/queries"}
WEBHDFS_HOSTNAME=${WEBHDFS_HOSTNAME:-`hdfs getconf -confKey dfs.namenode.http-address`}
QUERY=${QUERY:-$1}
START_TIME=${START_TIME:-$2}
END_TIME=${END_TIME:-$3}
RECORDS_PER_FILE=${RECORDS_PER_FILE:-10000}
NUMBER_OF_REDUCERS=${NUMBER_OF_REDUCERS:-10}
PCAP_DATA_PATH=${PCAP_DATA_PATH:-/apps/metron/pcap}
if [ -z "$QUERY" ]; then
  echo "You must specify a query."
  exit 1
fi
if [ -z "$START_TIME" ]; then
  echo "You must specify a start time."
  exit 2
fi
TIMESTAMP_EPOCH=$(date +%s%N | cut -b1-13)
if [ -f /proc/sys/kernel/random/uuid ];then
  UUID=$(cat /proc/sys/kernel/random/uuid | sed 's/-//g')
  PREFIX="$TIMESTAMP_EPOCH-$UUID"
else
  QUERY_HASH=$(echo $QUERY | md5sum | awk '{print $1}')
  PREFIX="$TIMESTAMP_EPOCH-$QUERY_HASH"
fi
if [ -z "$END_TIME" ]; then
  CMD=$($METRON_HOME/bin/pcap_query.sh query --prefix "$PREFIX" --query "$QUERY" -st "$START_TIME" -df "$DATE_FORMAT" -rpf "$RECORDS_PER_FILE" -nr "$NUMBER_OF_REDUCERS" -bp "$PCAP_DATA_PATH" \"2>&1)
  SUMMARY="Packets conforming to $QUERY starting at $START_TIME ending now"
else
  CMD=$($METRON_HOME/bin/pcap_query.sh query --prefix "$PREFIX" --query "$QUERY" -st "$START_TIME" -et "$END_TIME" -df "$DATE_FORMAT" -rpf "$RECORDS_PER_FILE" -nr "$NUMBER_OF_REDUCERS" -bp "$PCAP_DATA_PATH" 2>&1)
  SUMMARY="Packets conforming to $QUERY starting at $START_TIME ending at $END_TIME"
fi

FAILED=$(echo $CMD | grep "Unable to complete query due to errors")
if [ -z "$FAILED" ];then
  PATTERN="pcap-data-$PREFIX"
  hadoop fs -mkdir -p $QUERY_HOME/$PATTERN && hadoop fs -put $PATTERN* $QUERY_HOME/$PATTERN 
  FAILED=$?
  if [ $FAILED -eq 0 ];then
    echo "%html"
    echo "<h4>$SUMMARY</h4>"
    echo "<ul>"
    for i in $(ls $PATTERN*.pcap | sort -n);do
      FILENAME=$(echo $i | sed 's/+/%2B/g')
      SIZE=$(du -h $i | awk '{print $1}')
      echo "<li><a href=\"http://$WEBHDFS_HOSTNAME/webhdfs/v1$QUERY_HOME/$PATTERN/$FILENAME?op=OPEN\">$i</a> ($SIZE)</li>"
      rm $i
    done
    echo "</ul>"
    echo "<small>NOTE: There are $RECORDS_PER_FILE records per file</small>"
  else
    echo "Unable to create $QUERY_HOME/$PATTERN"
    exit 3
  fi
else
  echo "%html <pre>FAILED JOB:"
  echo "QUERY: $QUERY"
  echo "START_TIME: $START_TIME"
  echo "DATE_FORMAT: $DATE_FORMAT"
  echo "METRON_HOME: $METRON_HOME"
  echo "DATE_FORMAT: $DATE_FORMAT"
  echo "Output:"
  echo "$CMD"
  echo "</pre>"
fi
