#!/bin/bash

ABSOLUTE_PATH=false

function print_help {
	echo "npcapmove - (C) 2025 ntop"
	echo "Move a pcap file with its index file and timeline links to a new storage"
	echo ""
	echo "Usage: $0 [-a] <pcap path> <new storage path> <new timeline path>"
	echo ""
	echo "Options:"
	echo "[-a]    Produce absolute instead of relative links for the timeline"
	echo ""
	echo "Example: $0 /storage/1.pcap /external-storage /external-storage/timeline"
	exit -1
}

if [ -z "${1}" ] || [ -z "${2}" ] || [ -z "${3}" ]; then
	print_help
fi

function check_file {
	if [ ! -f $1 ]; then
		echo "$1 not found!"
		exit -1
	fi
}

if [ "${1}" = "-a" ]; then
	shift 1
	if [ -z "${3}" ]; then
		print_help
	fi
	ABSOLUTE_PATH=true
fi

PCAP_PATH=$1
NEW_STORAGE_PATH=$2
NEW_TIMELINE_PATH=$3

check_file $PCAP_PATH
check_file $PCAP_PATH.idx
check_file $PCAP_PATH.timeline
check_file $PCAP_PATH.idx.timeline

PCAP_NAME=$(basename $PCAP_PATH)

TIMELINE_PCAP_PATH=$(readlink $PCAP_PATH.timeline)

check_file $TIMELINE_PCAP_PATH
check_file $TIMELINE_PCAP_PATH.idx

TIMELINE_REL_PCAP_PATH=$(echo $TIMELINE_PCAP_PATH | rev | cut -d '/' -f-6 | rev)
TIMELINE_REL_PATH=$(dirname $TIMELINE_REL_PCAP_PATH)
OLD_TIMELINE_PATH=$(echo $TIMELINE_PCAP_PATH | rev | cut -d '/' -f6- | rev)

rm $PCAP_PATH.timeline $PCAP_PATH.idx.timeline $TIMELINE_PCAP_PATH $TIMELINE_PCAP_PATH.idx

mkdir -p $NEW_STORAGE_PATH
mkdir -p $NEW_TIMELINE_PATH/$TIMELINE_REL_PATH 

mv $PCAP_PATH	 $NEW_STORAGE_PATH/$PCAP_NAME
mv $PCAP_PATH.idx $NEW_STORAGE_PATH/$PCAP_NAME.idx

if [ "${ABSOLUTE_PATH}" = "true" ]; then
	# Absolute paths
	ln -s $NEW_STORAGE_PATH/$PCAP_NAME	 $NEW_TIMELINE_PATH/$TIMELINE_REL_PCAP_PATH
	ln -s $NEW_STORAGE_PATH/$PCAP_NAME.idx $NEW_TIMELINE_PATH/$TIMELINE_REL_PCAP_PATH.idx
	ln -s $NEW_TIMELINE_PATH/$TIMELINE_REL_PCAP_PATH	 $NEW_STORAGE_PATH/$PCAP_NAME.timeline
	ln -s $NEW_TIMELINE_PATH/$TIMELINE_REL_PCAP_PATH.idx $NEW_STORAGE_PATH/$PCAP_NAME.idx.timeline
else
	# Relative paths
	ln -sr $NEW_STORAGE_PATH/$PCAP_NAME	 $NEW_TIMELINE_PATH/$TIMELINE_REL_PCAP_PATH
	ln -sr $NEW_STORAGE_PATH/$PCAP_NAME.idx $NEW_TIMELINE_PATH/$TIMELINE_REL_PCAP_PATH.idx
	if [ `realpath --help | grep relative-to | wc -l` -gt 0 ]; then
		ln -s `realpath --relative-to=$NEW_STORAGE_PATH $NEW_TIMELINE_PATH/$TIMELINE_REL_PATH/`/$PCAP_NAME	 $NEW_STORAGE_PATH/$PCAP_NAME.timeline
		ln -s `realpath --relative-to=$NEW_STORAGE_PATH $NEW_TIMELINE_PATH/$TIMELINE_REL_PATH/`/$PCAP_NAME.idx $NEW_STORAGE_PATH/$PCAP_NAME.idx.timeline
	else
		RELATIVE=$(perl -MFile::Spec -e "print File::Spec->abs2rel(q($NEW_TIMELINE_PATH/$TIMELINE_REL_PCAP_PATH), q($NEW_STORAGE_PATH))")
		ln -s $RELATIVE	 $NEW_STORAGE_PATH/$PCAP_NAME.timeline
		ln -s $RELATIVE.idx $NEW_STORAGE_PATH/$PCAP_NAME.idx.timeline
	fi
fi

find $OLD_TIMELINE_PATH -type d -empty -delete

echo "Files moved to:"

ls $NEW_STORAGE_PATH/$PCAP_NAME*
ls $NEW_TIMELINE_PATH/$TIMELINE_REL_PCAP_PATH*

exit 0

