#!/bin/bash
#
# (c)2023 Marek Uher <marek@uher.info>
#
# Visit http://uher.info/debian/tools/
#
# v0.1	2023/04/02	Initial release
#

#
# Define variables
#
SYS_CON_CONFIG="/etc/sys-con.cfg"
SYS_CON_BASENAME=`basename $0`
SYS_CON_ERROR_CODE=0
SYS_CON_SYMLINKS="sys-filesystems-balance sys-filesystems-defragment sys-filesystems-du sys-filesystems-hwinfo sys-filesystems-lsblk sys-filesystems-lsscsi sys-filesystems-scrub sys-filesystems-stat sys-filesystems-sync sys-snapshots-clean-all sys-snapshots-clean-all-apt sys-snapshots-clean-all-boot sys-snapshots-clean-all-force sys-snapshots-clean-all-regular sys-snapshots-clean-all-timeline sys-snapshots-clean-regular sys-snapshots-clean-timeline sys-snapshots-list sys-snapshots-list-force sys-system-clean-var-log"

#
# Load sys-con configuration file
#
__sys_con_load_config ( )
{
	if [ -f ${SYS_CON_CONFIG} ] ; then
		source ${SYS_CON_CONFIG}
	else
		SYS_CON_ERROR_CODE=1
		echo "sys-con: exit code [${SYS_CON_ERROR_CODE}] - configuration file ${SYS_CON_CONFIG} was not found."
		exit ${SYS_CON_ERROR_CODE}
	fi
}

#
# Install symlinks to sys-con
#
__sys_con_install ( )
{
	echo
	if [ -d ${SYS_CON_BASE_DIR} ]; then
		cd ${SYS_CON_BASE_DIR}
		for SYS_CON_SYMLINK in ${SYS_CON_SYMLINKS}; do
			echo "sys-con: creating symlink \"${SYS_CON_SYMLINK} -> sys-con\""
			if [ -s ${SYS_CON_SYMLINK} ]; then
				echo "sys-con: symlink \"${SYS_CON_SYMLINK} -> sys-con\" already exists, skipping ..."
				echo
			else
				if [ -x sys-con ]; then
					ln -s sys-con ${SYS_CON_SYMLINK}
				else
					echo "sys-con: sys-con binary not found in the directory ${SYS_CON_BASE_DIR}."
					SYS_CON_ERROR_CODE=253
					exit ${SYS_CON_ERROR_CODE}
				fi
				echo
			fi
		done
	else
		SYS_CON_ERROR_CODE=254
		echo "sys-con: base dir \"${SYS_CON_BASE_DIR}\" not found."
		exit ${SYS_CON_ERROR_CODE}
	fi
}

#
# Uninstall symlinks to sys-con
#
__sys_con_uninstall ( )
{
	echo
	if [ -d ${SYS_CON_BASE_DIR} ]; then
		cd ${SYS_CON_BASE_DIR}
		for SYS_CON_SYMLINK in ${SYS_CON_SYMLINKS}; do
			echo "sys-con: removing symlink \"${SYS_CON_SYMLINK} -> sys-con\""
			if [ -s ${SYS_CON_SYMLINK} ]; then
				rm ${SYS_CON_SYMLINK}
				echo
			else
				echo "sys-con: symlink ${SYS_CON_SYMLINK} not found, skipping ..."
				echo
			fi
		done
	else
		SYS_CON_ERROR_CODE=254
		echo "sys-con: base dir \"${SYS_CON_BASE_DIR}\" not found."
		exit ${SYS_CON_ERROR_CODE}
	fi
}


#
# Print help message
#
__sys_con_print_help_message ( )
{
	echo
	echo "sys-con: options / parameters:"
	echo
	echo -e "\thelp | -help | --help\t\t\t... print this help"
	echo -e "\tinstall | -install | --install\t\t... install symlink to sys-con"
	echo -e "\tuninstall | -uninstall | --uninstall\t... uninstall symlink to sys-con"
	echo -e "\tsys-filesystems-balance\t\t\t... balance btrfs file systems"
	echo -e "\tsys-filesystems-defragment\t\t... defragment btrfs file systems"
	echo -e "\tsys-filesystems-du\t\t\t... display file systems usage"
	echo -e "\tsys-filesystems-hwinfo\t\t\t... display disk device HW info"
	echo -e "\tsys-filesystems-lsblk\t\t\t... display file systems block devices"
	echo -e "\tsys-filesystems-lsscsi\t\t\t... display SCSI devices"
	echo -e "\tsys-filesystems-scrub\t\t\t... scrub btrfs file systems"
	echo -e "\tsys-filesystems-stat\t\t\t... display btrfs file systems stats"
	echo -e "\tsys-filesystems-sync\t\t\t... sync btrfs file systems"
	echo -e "\tsys-snapshots-clean-all\t\t\t... clean all snapshots"
	echo -e "\tsys-snapshots-clean-all-apt\t\t... clean all APT snapshots on root file system"
	echo -e "\tsys-snapshots-clean-all-boot\t\t... clean all boot snapshots on root file system"
	echo -e "\tsys-snapshots-clean-all-force\t\t... force clean all snapshots"
	echo -e "\tsys-snapshots-clean-all-regular\t\t... clean all regular backup snapshots"
	echo -e "\tsys-snapshots-clean-all-timeline\t... clean all timeline backup snapshots"
	echo -e "\tsys-snapshots-clean-regular\t\t... clean regular backup snapshots, but keep last ${SYS_CON_SNAPPER_KEEP_REGULAR_SNAPSHOTS}"
	echo -e "\tsys-snapshots-clean-timeline\t\t... clean time snapshots, but keep last ${SYS_CON_SNAPPER_KEEP_TIMELINE_SNAPSHOTS}"
	echo -e "\tsys-snapshots-list\t\t\t... list all snapshots"
	echo -e "\tsys-snapshots-list-force\t\t... force list all snapshots"
	echo -e "\tsys-system-clean-var-log\t\t... clean old files (*.1 and *.gz) in /var directory"
	echo
	echo "sys-con: config file:"
	echo
	echo -e "\t${SYS_CON_CONFIG}"
	echo
}

#
# Print error message and help
#
__sys_con_print_error_message ( )
{

	echo
	echo "sys-con: exit code [${SYS_CON_ERROR_CODE}] - unknown option(s) \"$@\""
	__sys_con_print_help_message
}

#
# Balance btrfs file systems
#
__sys_con_filesystems_balance ( )
{
	SYS_CON_TMP_ERROR_CODE=0

	for MOUNT_POINT in ${SYS_CON_BTRFS_MOUNT_POINTS} ; do
		for USAGE in ${SYS_CON_BTRFS_DATA_USAGE} ; do 
			echo "sys-con: balancing block groups on a btrfs filesystem, mount point: ${MOUNT_POINT}, blocks: data, usage: ${USAGE}%."
			echo "sys-con: btrfs balance start -v -dusage=${USAGE} ${MOUNT_POINT}"
			btrfs balance start -v -dusage=${USAGE} ${MOUNT_POINT}
			SYS_CON_TMP_ERROR_CODE=$?
			if [ "${SYS_CON_TMP_ERROR_CODE}" -ne 0 ]; then
				SYS_CON_ERROR_CODE=${SYS_CON_TMP_ERROR_CODE}
			fi
			echo "sys-con: exit code [${SYS_CON_TMP_ERROR_CODE}] - mount point: ${MOUNT_POINT}, blocks: metadata, usage: ${USAGE}%."
			echo
		done
	done

	for MOUNT_POINT in ${SYS_CON_BTRFS_MOUNT_POINTS} ; do
		for USAGE in ${SYS_CON_BTRFS_METADATA_USAGE} ; do 
			echo "sys-con: balancing block groups on a btrfs filesystem, mount point: ${MOUNT_POINT}, blocks: metadata, usage: ${USAGE}%."
			echo "sys-con: btrfs balance start -v -musage=${USAGE} ${MOUNT_POINT}"
			btrfs balance start -v -musage=${USAGE} ${MOUNT_POINT}
			SYS_CON_TMP_ERROR_CODE=$?
			if [ "${SYS_CON_TMP_ERROR_CODE}" -ne 0 ]; then
				SYS_CON_ERROR_CODE=${SYS_CON_TMP_ERROR_CODE}
			fi
			echo "sys-con: exit code [${SYS_CON_TMP_ERROR_CODE}] - mount point: ${MOUNT_POINT}, blocks: metadata, usage: ${USAGE}%."
			echo
		done
	done
}

#
# Defragment btrfs file systems
#
__sys_con_filesystems_defragment ( )
{
	#SYS_CON_BTRFS_MOUNT_POINTS="`findmnt -lo target -t btrfs | egrep -v "(TARGET|snapshots|rollbacks|__file_domains)" | sort`"

	for MOUNT_POINT in ${SYS_CON_BTRFS_MOUNT_POINTS} ; do
		echo "sys-con: defragmenting a btrfs filesystem, mount point: ${MOUNT_POINT}."
		echo "sys-con: btrfs filesystem defragment -r ${MOUNT_POINT}"
		btrfs filesystem defragment -r ${MOUNT_POINT}
		SYS_CON_ERROR_CODE=$?
			echo "sys-con: exit code [${SYS_CON_ERROR_CODE}] - mount point: ${MOUNT_POINT}."
	done
}

#
# Display file systems usage
#
__sys_con_filesystems_du ( )
{
	duf --all -width `tput cols`
	SYS_CON_ERROR_CODE=$?
}

#
# Display disk device HW info
#
__sys_con_filesystems_hwinfo ( )
{
	hwinfo --disk --short
	SYS_CON_ERROR_CODE=$?
}

#
# Display file systems block devices
#
__sys_con_filesystems_lsblk ( )
{
	lsblk --output NAME,FSTYPE,LABEL,MOUNTPOINT,MODE
	SYS_CON_ERROR_CODE=$?
}

#
# Display SCSI info
#
__sys_con_filesystems_lsscsi ( )
{
	lsscsi
	SYS_CON_ERROR_CODE=$?
}

#
# Scrub btrfs file systems
#
__sys_con_filesystems_scrub ( )
{
	echo
	for MOUNT_POINT in ${SYS_CON_BTRFS_MOUNT_POINTS} ; do
		echo "sys-con: scrub a btrfs filesystem, mount point: ${MOUNT_POINT}."
		echo "sys-con: btrfs scrub start -Bd ${MOUNT_POINT}"
		btrfs scrub start -Bd ${MOUNT_POINT}
		SYS_CON_ERROR_CODE=$?
		echo
		echo "sys-con: exit code [${SYS_CON_ERROR_CODE}] - mount point: ${MOUNT_POINT}."
	done
	echo
}

#
# Display btrfs file systems stats
#
__sys_con_filesystems_stat ( )
{

	echo
	for MOUNT_POINT in ${SYS_CON_BTRFS_MOUNT_POINTS}; do
		echo "sys-con: btrfs file system ${MOUNT_POINT} stat"
		echo "sys-con: btrfs device stat ${MOUNT_POINT}"
		echo "----------------------------------------------------------------------------------"
		btrfs device stat ${MOUNT_POINT}
		echo
	done
}

#
# Sync btrfs file systems
#
__sys_con_filesystems_sync ( )
{

	SYS_CON_TMP_ERROR_CODE=0

	echo
	for MOUNT_POINT in ${SYS_CON_BTRFS_MOUNT_POINTS} ; do
		echo "sys-con: file system ${MOUNT_POINT} sync"
		echo "sys-con: btrfs filesystem sync ${MOUNT_POINT}"
		btrfs filesystem sync ${MOUNT_POINT}
		SYS_CON_TMP_ERROR_CODE=$?
		if [ "${SYS_CON_TMP_ERROR_CODE}" -ne 0 ]; then
			SYS_CON_ERROR_CODE=${SYS_CON_TMP_ERROR_CODE}
		fi
		echo "sys-con: exit code [${SYS_CON_TMP_ERROR_CODE}] - mount point: ${MOUNT_POINT} sync"
		echo
	done
}

#
# Clean all snapshots
#
__sys_con_snapshots_clean_all ( )
{
	__sys_con_snapshots_clean_all_apt
	__sys_con_snapshots_clean_all_boot
	__sys_snapshots_clean_all_regular
	__sys_snapshots_clean_all_timeline

	if [ -f /etc/default/snapper ] ; then
		source /etc/default/snapper
	fi

	for CONFIG in $SNAPPER_CONFIGS ; do

		NUMBER_CLEANUP="no"
		TIMELINE_CLEANUP="no"
		EMPTY_PRE_POST_CLEANUP="no"

		if [ -f /etc/snapper/configs/$CONFIG ] ; then
			source /etc/snapper/configs/$CONFIG

			if [ "$NUMBER_CLEANUP" = "yes" ] ; then
				snapper --config=$CONFIG --quiet cleanup number
			fi

			if [ "$TIMELINE_CLEANUP" = "yes" ] ; then
				snapper --config=$CONFIG --quiet cleanup timeline
			fi

			if [ "$EMPTY_PRE_POST_CLEANUP" = "yes" ] ; then
				snapper --config=$CONFIG --quiet cleanup empty-pre-post
			fi
		fi

	done
}

#
# Clean all APT snapshots on root file system
#
__sys_con_snapshots_clean_all_apt ( )
{
	SNAPPER_CONFIG="root"

	SNAPSHOTS_TO_DELETE=`snapper -c ${SNAPPER_CONFIG} list | awk '/ apt /{ print $1 }'`
	if [ "${SNAPSHOTS_TO_DELETE}" != "" ]; then
		echo
		echo "sys-con: snapper -c ${SNAPPER_CONFIG} delete ${SNAPSHOTS_TO_DELETE}"
		snapper -c ${SNAPPER_CONFIG} delete "${SNAPSHOTS_TO_DELETE}"
		echo
	else
		echo
		echo "sys-con: no APT snapshot found and deleted."
		echo
	fi
}

#
# Clean all boot snapshots on root file system
#
__sys_con_snapshots_clean_all_boot ( )
{
	SNAPPER_CONFIG="root"

	SNAPSHOTS_TO_DELETE=`snapper -c ${SNAPPER_CONFIG} list | awk '/ boot /{ print $1 }'`
	if [ "${SNAPSHOTS_TO_DELETE}" != "" ]; then
		echo
		echo "sys-con: snapper -c ${SNAPPER_CONFIG} delete ${SNAPSHOTS_TO_DELETE}"
		snapper -c ${SNAPPER_CONFIG} delete "${SNAPSHOTS_TO_DELETE}"
		echo
	else
		echo
		echo "sys-con: no boot snapshot found and deleted."
		echo
	fi
}

#
# Force clean all snapshots
#
__sys_con_snapshots_clean_all_force ( )
{
	for SNAPSHOT_SUBVOL in `df | grep snapshot | awk '{ print $6}'` ; do
		cd ${SNAPSHOT_SUBVOL}
		SNAPPER_CONFIG=`pwd | awk -F '/' '{ printf "%s_%s\n" ,  $2 , $3 }' | sed 's/_\.snapshots//g' | sed 's/\.snapshots_/root/g'`
		SNAPSHOTS_TO_DELETE=`ls | tr "\n" " " | sed 's/ $//g'`
		if [ "${SNAPSHOTS_TO_DELETE}" != "" ]; then
			echo
			echo "sys-con: snapper -c ${SNAPPER_CONFIG} delete ${SNAPSHOTS_TO_DELETE}"
			snapper -c ${SNAPPER_CONFIG} delete "${SNAPSHOTS_TO_DELETE}"
			SYS_CON_TMP_ERROR_CODE=$?
			if [ "${SYS_CON_TMP_ERROR_CODE}" -ne 0 ]; then
				SYS_CON_ERROR_CODE=${SYS_CON_TMP_ERROR_CODE}
			fi
			echo "sys-con: exit code [${SYS_CON_TMP_ERROR_CODE}] - snapper clean ${SNAPSHOT_SUBVOL}."
		else
			echo
			echo "sys-con: snapper clean ${SNAPSHOT_SUBVOL} no snapshot found and deleted."
		fi
	done
	echo
}

#
# Clean all regular backup snapshots
#
__sys_snapshots_clean_all_regular ( )
{
	SNAPPER_CONFIG=""
	SNAPPER_SNAPSHOT_TAG="Regular system backup"
	SNAPPER_CONFIGS=`snapper list-configs | egrep -v "(^Config|^-)" | awk '{ print $1 }'`

	echo
	echo "sys-con: snapper cleaning all regular backup snapshot(s)."

	for SNAPPER_CONFIG in ${SNAPPER_CONFIGS}; do
		SNAPSHOTS_LIST=`snapper -c ${SNAPPER_CONFIG} list | awk '/'"${SNAPPER_SNAPSHOT_TAG}"'/{ print $1 }'`
		if [ "${SNAPSHOTS_LIST}" != "" ]; then
			for SNAPPER_SNAPSHOT in ${SNAPSHOTS_LIST}; do
				echo "sys-con: snapper config \"${SNAPPER_CONFIG}\" - deleting regular backup snapshots ${SNAPPER_SNAPSHOT}"
				snapper -c ${SNAPPER_CONFIG} delete ${SNAPPER_SNAPSHOT}
				SYS_CON_TMP_ERROR_CODE=$?
				if [ "${SYS_CON_TMP_ERROR_CODE}" -ne 0 ]; then
					SYS_CON_ERROR_CODE=${SYS_CON_TMP_ERROR_CODE}
				fi
				echo "sys-con: result [${SYS_CON_TMP_ERROR_CODE}]"
				echo
			done
		else
			echo
			echo "sys-con: snapper config \"${SNAPPER_CONFIG}\" - deleting regular backup snapshots"
			echo "sys-con: no snapshots deleted"
		fi
	done
	echo
}

#
# Clean all timeline snapshots
#
__sys_snapshots_clean_all_timeline ( )
{
	SNAPPER_CONFIG=""
	SNAPPER_SNAPSHOT_TAG="timeline"
	SNAPPER_CONFIGS=`snapper list-configs | egrep -v "(^Config|^-)" | awk '{ print $1 }'`

	echo
	echo "sys-con: snapper cleaning all regular backup snapshot(s)."

	for SNAPPER_CONFIG in ${SNAPPER_CONFIGS}; do
		SNAPSHOTS_LIST=`snapper -c ${SNAPPER_CONFIG} list | awk '/'"${SNAPPER_SNAPSHOT_TAG}"'/{ print $1 }'`
		if [ "${SNAPSHOTS_LIST}" != "" ]; then
			for SNAPPER_SNAPSHOT in ${SNAPSHOTS_LIST}; do
				echo "sys-con: snapper config \"${SNAPPER_CONFIG}\" - deleting timeline snapshots ${SNAPPER_SNAPSHOT}"
				snapper -c ${SNAPPER_CONFIG} delete ${SNAPPER_SNAPSHOT}
				SYS_CON_TMP_ERROR_CODE=$?
				if [ "${SYS_CON_TMP_ERROR_CODE}" -ne 0 ]; then
					SYS_CON_ERROR_CODE=${SYS_CON_TMP_ERROR_CODE}
				fi
				echo "sys-con: result [${SYS_CON_TMP_ERROR_CODE}]"
				echo
			done
		else
			echo
			echo "sys-con: snapper config \"${SNAPPER_CONFIG}\" - deleting timeline snapshots"
			echo "sys-con: no snapshots deleted"
		fi
	done
	echo
}

#
# Clean regular backup snapshots, but keeping last ${SYS_CON_SNAPPER_KEEP_REGULAR_SNAPSHOTS}
#
__sys_con_snapshots_clean_regular ( )
{
	SNAPPER_CONFIG=""
	SNAPPER_SNAPSHOT_TAG="Regular system backup"
	SNAPPER_CONFIGS=`snapper list-configs | egrep -v "(^Config|^-)" | awk '{ print $1 }'`

	echo
	echo "sys-con: snapper keeping last ${SYS_CON_SNAPPER_KEEP_REGULAR_SNAPSHOTS} regular backup snapshot(s)."

	for SNAPPER_CONFIG in ${SNAPPER_CONFIGS}; do
		SNAPSHOTS_TO_DELETE=`snapper -c ${SNAPPER_CONFIG} list | grep "${SNAPPER_SNAPSHOT_TAG}" | wc -l`
		SNAPSHOTS_TO_DELETE=`expr ${SNAPSHOTS_TO_DELETE} - ${SYS_CON_SNAPPER_KEEP_REGULAR_SNAPSHOTS}`
		if [ "${SNAPSHOTS_TO_DELETE}" -lt "${SYS_CON_SNAPPER_KEEP_REGULAR_SNAPSHOTS}" ]; then SNAPSHOTS_TO_DELETE=0 ; fi
		SNAPSHOTS_LIST=`snapper -c ${SNAPPER_CONFIG} list | grep "${SNAPPER_SNAPSHOT_TAG}" | head -n "${SNAPSHOTS_TO_DELETE}" | awk '{ print $1 }'` 
		if [ "${SNAPSHOTS_LIST}" != "" ]; then
			for SNAPPER_SNAPSHOT in ${SNAPSHOTS_LIST}; do
				echo
				echo "sys-con: snapper config \"${SNAPPER_CONFIG}\" - deleting regular backup snapshots ${SNAPPER_SNAPSHOT}"
				snapper -c ${SNAPPER_CONFIG} delete ${SNAPPER_SNAPSHOT}
				SYS_CON_TMP_ERROR_CODE=$?
				if [ "${SYS_CON_TMP_ERROR_CODE}" -ne 0 ]; then
					SYS_CON_ERROR_CODE=${SYS_CON_TMP_ERROR_CODE}
				fi
				echo "sys-con: result [${SYS_CON_TMP_ERROR_CODE}]"
			done
		else
			echo
			echo "sys-con: snapper config \"${SNAPPER_CONFIG}\" - deleting regular backup snapshots"
			echo "sys-con: no snapshots deleted"
		fi
	done
	echo
}

#
# Clean timeline snapshots, but keeping last ${SYS_CON_SNAPPER_KEEP_TIMELINE_SNAPSHOTS}
#
__sys_con_snapshots_clean_timeline ( )
{
	SNAPPER_CONFIG=""
	SNAPPER_SNAPSHOT_TAG="timeline"
	SNAPPER_CONFIGS=`snapper list-configs | egrep -v "(^Config|^-)" | awk '{ print $1 }'`

	echo
	echo "sys-con: snapper keeping last ${SYS_CON_SNAPPER_KEEP_TIMELINE_SNAPSHOTS} timeline snapshot(s)."

	for SNAPPER_CONFIG in ${SNAPPER_CONFIGS}; do
		SNAPSHOTS_TO_DELETE=`snapper -c ${SNAPPER_CONFIG} list | grep "${SNAPPER_SNAPSHOT_TAG}" | wc -l`
		SNAPSHOTS_TO_DELETE=`expr ${SNAPSHOTS_TO_DELETE} - ${SYS_CON_SNAPPER_KEEP_TIMELINE_SNAPSHOTS}`
		if [ "${SNAPSHOTS_TO_DELETE}" -lt "${SYS_CON_SNAPPER_KEEP_TIMELINE_SNAPSHOTS}" ]; then SNAPSHOTS_TO_DELETE=0 ; fi
		SNAPSHOTS_LIST=`snapper -c ${SNAPPER_CONFIG} list | grep "${SNAPPER_SNAPSHOT_TAG}" | head -n "${SNAPSHOTS_TO_DELETE}" | awk '{ print $1 }'` 
		if [ "${SNAPSHOTS_LIST}" != "" ]; then
			for SNAPPER_SNAPSHOT in ${SNAPSHOTS_LIST}; do
				echo
				echo "sys-con: snapper config \"${SNAPPER_CONFIG}\" - deleting timeline snapshots ${SNAPPER_SNAPSHOT}"
				snapper -c ${SNAPPER_CONFIG} delete ${SNAPPER_SNAPSHOT}
				SYS_CON_TMP_ERROR_CODE=$?
				if [ "${SYS_CON_TMP_ERROR_CODE}" -ne 0 ]; then
					SYS_CON_ERROR_CODE=${SYS_CON_TMP_ERROR_CODE}
				fi
				echo "sys-con: result [${SYS_CON_TMP_ERROR_CODE}]"
			done
		else
			echo
			echo "sys-con: snapper config \"${SNAPPER_CONFIG}\" - deleting timeline snapshots"
			echo "sys-con: no snapshots deleted"
		fi
	done
	echo
}

#
# List all snapshots
#
__sys_con_snapshots_list ( )
{
	echo
	for CONF in `snapper list-configs | egrep -v "(^C|^-)" | awk '{ print $1 }'`; do echo $CONF ; snapper -c $CONF list ; echo "" ; done

}

#
# Force list all snapshots
#
__sys_con_snapshots_list_force ( )
{
	for SNAP_DIR in `mount | grep "\.snapshots" | awk '{ print $3 }'`; do
		echo
		echo "sys-con: snapper snapshots in mount point ${SNAP_DIR}"
		echo
		cd ${SNAP_DIR}
		SNAPSHOTS=`ls | tr "\n" " " | sed 's/ $//g'`
		if [ "${SNAPSHOTS}" != "" ]; then
			echo -e "\t${SNAPSHOTS}"
		else
			echo -e "\tno snapshots found"
		fi
		echo
	done
	echo
}

#
# Clean old files in /var/log
#
__sys_con_system_clean_var_log ( )
{

	VARL_LOG_DIR="/var/log"

	cd ${VARL_LOG_DIR}
	for FILES_TO_REMOVE_SUFFIX in gz 1; do
		find . -name \*.${FILES_TO_REMOVE_SUFFIX} | xargs rm -f
	done
}

#
# Load sys-con configuration file
#
__sys_con_load_config

#
# Parse basename options
#
case "${SYS_CON_BASENAME}" in

	sys-con)
		#
		# Do nothing and continue
		#
		;;

	sys-filesystems-balance)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_balance
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-defragment)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_defragment
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-du)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_du
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-hwinfo)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_hwinfo
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-lsblk)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_lsblk
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-lsscsi)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_lsscsi
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-scrub)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_scrub
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-stat)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_stat
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-sync)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_sync
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_all
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-apt)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_all_apt
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-boot)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_all_boot
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-force)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_all_force
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-regular)
		SYS_CON_ERROR_CODE=0
		__sys_snapshots_clean_all_regular
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-timeline)
		SYS_CON_ERROR_CODE=0
		__sys_snapshots_clean_all_timeline
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-regular)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_regular
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-timeline)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_timeline
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-list)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_list
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-list-force)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_list_force
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-system-clean-var-log)
		SYS_CON_ERROR_CODE=0
		__sys_con_system_clean_var_log
		exit ${SYS_CON_ERROR_CODE}
        	;;

	*)
		SYS_CON_ERROR_CODE=255
		__sys_con_print_help_message $0
		exit ${SYS_CON_ERROR_CODE}
		;;

esac

#
# Parse command line options
#
case "$1" in

	help | -help | --help | -h | --h)
		SYS_CON_ERROR_CODE=0
		__sys_con_print_help_message $@
		exit ${SYS_CON_ERROR_CODE}
		;;

	install | -install | --install | -i | --i)
		SYS_CON_ERROR_CODE=0
		__sys_con_install
		exit ${SYS_CON_ERROR_CODE}
		;;

	uninstall | -uninstall | --uninstall | -u | --u)
		SYS_CON_ERROR_CODE=0
		__sys_con_uninstall
		exit ${SYS_CON_ERROR_CODE}
		;;

	sys-filesystems-balance)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_balance
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-defragment)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_defragment
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-du)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_du
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-hwinfo)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_hwinfo
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-lsblk)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_lsblk
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-lsscsi)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_lsscsi
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-scrub)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_scrub
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-stat)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_stat
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-filesystems-sync)
		SYS_CON_ERROR_CODE=0
		__sys_con_filesystems_sync
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_all
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-apt)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_all_apt
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-boot)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_all_boot
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-force)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_all_force
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-regular)
		SYS_CON_ERROR_CODE=0
		__sys_snapshots_clean_all_regular
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-all-timeline)
		SYS_CON_ERROR_CODE=0
		__sys_snapshots_clean_all_timeline
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-regular)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_regular
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-clean-timeline)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_clean_timeline
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-list)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_list
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-snapshots-list-force)
		SYS_CON_ERROR_CODE=0
		__sys_con_snapshots_list_force
		exit ${SYS_CON_ERROR_CODE}
        	;;

	sys-system-clean-var-log)
		SYS_CON_ERROR_CODE=0
		__sys_con_system_clean_var_log
		exit ${SYS_CON_ERROR_CODE}
        	;;

	*)
		SYS_CON_ERROR_CODE=255
		__sys_con_print_error_message $@
		exit ${SYS_CON_ERROR_CODE}
		;;

esac

# /* End of file: sys-con */ 
