#!/bin/bash #=============================================================================== # # DIRECTORY: # /home/*/.local/share/nautilus/scripts/ # OR # /home/*/.gnome2/nautilus-sctipts/ (deprecated) # # FILE: # .casualscripter_nautilus-scripts_functions.sh # # USAGE: # This is a library for some other nautilus sripts. # # OPTIONS: # none # # DESCRIPTION: # Global configuration and functions for the other nautilus scripts. # # REQUIREMENTS: # to much! ;-) # # BUGS: # --- # # NOTES: # Tested on # - Debian 8+ # - Arch Linux (work in progress) # # AUTHOR: # Patrick Neumann, patrick@neumannsland.de # # COMPANY: # (privately) # # VERSION: # 0.9 (beta) # # LINK TO THE MOST CURRENT VERSION: # https://... # # CREATED: # 21.03.2016 # # COPYRIGHT (C): # 2015-2020 - Patrick Neumann # # LICENSE: # This 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 3 of the License, or # (at your option) any later version. # # WARRANTY: # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # HISTORY: # 0.9 - Patrick Neumann - Initial (public) release # #=============================================================================== #=== FUNCTION ================================================================== # NAME: trim # DESCRIPTION: Remove leading and trailing whitespace characters from a string. # PARAMETER 1: string #------------------------------------------------------------------------------- # IMPORTANT: NEEDED FOR CONFIGURATION! #=============================================================================== trim() { local var="${1}" var="${var#"${var%%[![:space:]]*}"}" var="${var%"${var##*[![:space:]]}"}" echo -n "${var}" } #=== CONFIGURATION ============================================================= readonly WHICH_BIN="/usr/bin/which" # which has to be configured before (!): readonly AWK_BIN="$( ${WHICH_BIN} awk )" readonly BASE64_BIN="$( ${WHICH_BIN} base64 )" readonly BASENAME_BIN="$( ${WHICH_BIN} basename )" readonly BASH_BIN="$( ${WHICH_BIN} bash )" readonly BC_BIN="$( ${WHICH_BIN} bc )" readonly BINWALK_BIN="$( ${WHICH_BIN} binwalk )" readonly CAT_BIN="$( ${WHICH_BIN} cat )" readonly CURL_BIN="$( ${WHICH_BIN} curl )" readonly CUT_BIN="$( ${WHICH_BIN} cut )" readonly DATE_BIN="$( ${WHICH_BIN} date )" readonly DD_BIN="$( ${WHICH_BIN} dd )" readonly DC3DD_BIN="$( ${WHICH_BIN} dc3dd )" readonly DIRNAME_BIN="$( ${WHICH_BIN} dirname )" readonly EWFINFO_BIN="$( ${WHICH_BIN} ewfinfo )" readonly EWFVERIFY_BIN="$( ${WHICH_BIN} ewfverify )" readonly FCAT_BIN="$( ${WHICH_BIN} fcat )" readonly FILE_BIN="$( ${WHICH_BIN} file )" readonly FIND_BIN="$( ${WHICH_BIN} find )" readonly FLS_BIN="$( ${WHICH_BIN} fls )" readonly FRED_BIN="$( ${WHICH_BIN} fred )" readonly FSSTAT_BIN="$( ${WHICH_BIN} fsstat )" #readonly GKSU_BIN="$( ${WHICH_BIN} gksu )" # switched to pkexec! readonly GPG_BIN="$( ${WHICH_BIN} gpg )" readonly GPGSM_BIN="$( ${WHICH_BIN} gpgsm )" readonly GREP_BIN="$( ${WHICH_BIN} grep )" readonly GSETTINGS_BIN="$( ${WHICH_BIN} gsettings )" readonly GTERMINAL_BIN="$( ${WHICH_BIN} gnome-terminal )" readonly HASHCAT_BIN="$( ${WHICH_BIN} hashcat )" readonly HEAD_BIN="$( ${WHICH_BIN} head )" readonly HIVEXGET_BIN="$( ${WHICH_BIN} hivexget )" readonly HXREGEDIT_BIN="$( ${WHICH_BIN} hivexregedit )" readonly ICAT_BIN="$( ${WHICH_BIN} icat )" readonly IFIND_BIN="$( ${WHICH_BIN} ifind )" readonly ISTAT_BIN="$( ${WHICH_BIN} istat )" readonly KCPPY_BIN="$( ${WHICH_BIN} kcpass.py )" readonly KPARTX_BIN="$( ${WHICH_BIN} kpartx )" readonly LOSETUP_BIN="$( ${WHICH_BIN} losetup )" readonly MINISIGN_BIN="$( ${WHICH_BIN} minisign )" readonly MKDIR_BIN="$( ${WHICH_BIN} mkdir )" readonly MMLS_BIN="$( ${WHICH_BIN} mmls )" readonly MMSTAT_BIN="$( ${WHICH_BIN} mmstat )" readonly MOUNT_BIN="$( ${WHICH_BIN} mount )" readonly MSIGFIND_BIN="$( ${WHICH_BIN} multi_sigfind )" readonly MV_BIN="$( ${WHICH_BIN} mv )" readonly OPENSSL_BIN="$( ${WHICH_BIN} openssl )" readonly OPHCRACK_BIN="$( ${WHICH_BIN} ophcrack )" readonly PASSWD_BIN="$( ${WHICH_BIN} passwd )" readonly PGREP_BIN="$( ${WHICH_BIN} pgrep )" readonly PKEXEC_BIN="$( ${WHICH_BIN} pkexec )" readonly PLUTIL_BIN="$( ${WHICH_BIN} plistutil )" readonly PPEPY_BIN="$( ${WHICH_BIN} print_plist_entry.py )" readonly PRINTF_BIN="$( ${WHICH_BIN} printf )" readonly PSTAT_BIN="$( ${WHICH_BIN} pstat )" readonly PWDUMP_BIN="$( ${WHICH_BIN} pwdump.py )" readonly QEMUIMG_BIN="$( ${WHICH_BIN} qemu-img )" readonly QEMUSYS64_BIN="$( ${WHICH_BIN} qemu-system-x86_64 )" readonly RM_BIN="$( ${WHICH_BIN} rm )" readonly RMDIR_BIN="$( ${WHICH_BIN} rmdir )" readonly SED_BIN="$( ${WHICH_BIN} sed )" readonly SIGFIND_BIN="/usr/local/bin/sigfind" readonly SIGNIFY_BIN="$( ${WHICH_BIN} signify )" readonly SLEEP_BIN="$( ${WHICH_BIN} sleep )" readonly SORT_BIN="$( ${WHICH_BIN} sort )" readonly STRINGS_BIN="$( ${WHICH_BIN} strings )" readonly TAIL_BIN="$( ${WHICH_BIN} tail )" readonly TEE_BIN="$( ${WHICH_BIN} tee )" readonly TESTDISK_BIN="$( ${WHICH_BIN} testdisk )" # TRACKER_BIN is defined after the call of check_osr! readonly TR_BIN="$( ${WHICH_BIN} tr )" readonly UNBUFFER_BIN="$( ${WHICH_BIN} unbuffer )" readonly UMOUNT_BIN="$( ${WHICH_BIN} umount )" readonly VINAGRE_BIN="$( ${WHICH_BIN} vinagre )" readonly XMOUNT_BIN="$( ${WHICH_BIN} xmount )" readonly XXD_BIN="$( ${WHICH_BIN} xxd )" readonly ZCAT_BIN="$( ${WHICH_BIN} zcat )" readonly ZENITY_BIN="$( ${WHICH_BIN} zenity )" readonly ZGREP_BIN="$( ${WHICH_BIN} zgrep )" # needs configured sudo (!): readonly SUDO_BIN="$( ${WHICH_BIN} sudo )" readonly CHNTPW_BIN="$( ${SUDO_BIN} ${WHICH_BIN} chntpw )" readonly PARTED_BIN="$( ${SUDO_BIN} ${WHICH_BIN} parted )" if [ -z "${SUPPORTED_OSR:+x}" ] ; then readonly SUPPORTED_OSR="debian8" else readonly SUPPORTED_OSR="debian8 $( trim "${SUPPORTED_OSR}" )" fi if [ -n "${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS}" ] ; then # Remove the final "newline"! readonly SOURCE="${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS%?}" else readonly SOURCE="${1}" fi if ${GREP_BIN} --fixed-strings --line-regexp "${PWD// /\\040}" \ <( ${CUT_BIN} -d " " -f 2 /proc/mounts ) \ > /dev/null 2>&1 ; then DIRNAME="$( ${DIRNAME_BIN} "${SOURCE}" )" readonly DIRNAME="${DIRNAME%/*}" else readonly DIRNAME="$( ${DIRNAME_BIN} "${SOURCE}" )" fi #=== FUNCTIONS ================================================================= #=== FUNCTION ================================================================== # NAME: error_exit # DESCRIPTION: Display error message with "zenity" and exit. # PARAMETER 1: message (string) #=============================================================================== function error_exit () { ${ZENITY_BIN} --error \ --width="240" \ --height="120" \ --text \ "ERROR: ${1}... EXIT!!!" exit 1 } #=== FUNCTION ================================================================== # NAME: hint # DESCRIPTION: Display hint message with "zenity". # PARAMETER 1: message (string) #=============================================================================== function hint () { ${ZENITY_BIN} --info \ --width="240" \ --height="120" \ --text \ "HINT: ${1}." } #=== FUNCTION ================================================================== # NAME: success # DESCRIPTION: Display succes message with "zenity". # PARAMETER 1: message (string) #=============================================================================== function success () { ${ZENITY_BIN} --info \ --width="240" \ --height="120" \ --text \ "SUCCESS: ${1}!" } #=== FUNCTION ================================================================== # NAME: check_osr # DESCRIPTION: Check os release id and version. # PARAMETER 1: space seperated "list" (string) of all # supported os releases (id+version_id), # e. g.: "debian7 debian8 arch ubuntu14.04". #=============================================================================== function check_osr () { if [ ! -f "/etc/os-release" ] ; then error_exit "sorry, your distribution is not supported" fi source <( ${GREP_BIN} --fixed-strings \ --regexp="ID=" \ --regexp="VERSION_ID=" \ --regexp="PRETTY_NAME=" \ "/etc/os-release" \ | ${SED_BIN} "s/^/OR_/" ) supported=0 for os in ${1} ; do if echo "${os}" \ | ${GREP_BIN} --quiet \ --fixed-strings \ "${OR_ID}${OR_VERSION_ID}" ; then supported=1 fi done if [ ${supported} -eq 0 ] ; then error_exit "sorry, ${OR_PRETTY_NAME} is not supported" fi } #=== FUNCTION ================================================================== # NAME: check_dep # DESCRIPTION: Check dependencies. # PARAMETER 1: path+binary, e. g.: "/usr/bin/ewfinfo". # PARAMETER 2: package (deb), e. g.: "ewf-tools". #=============================================================================== function check_dep () { if [ ! -x "${1}" ] ; then error_exit "please install ${2}" fi } #=== FUNCTION ================================================================== # NAME: check_xmount_version # DESCRIPTION: Check if xmount version is 0.7.0 or higher. # PARAMETERS: none #=============================================================================== check_xmount_version () { readonly XMOUNT_VERSION="$( ${XMOUNT_BIN} --version \ | ${AWK_BIN} '/^xmount[[:space:]]v[0-9\.]*[[:space:]].*/ { print $2; }' \ | ${GREP_BIN} --extended-regexp \ --only-matching "[[:digit:]\.]*" )" if (( "$( ${BC_BIN} <<< "${XMOUNT_VERSION%.*} < 0.7" )" == "1" )) ; then error_exit "please upgrade xmount to version 0.7.0 or newer" fi } check_user_allow_other () { if ! ${GREP_BIN} --extended-regexp "^user_allow_other.*" /etc/fuse.conf > /dev/null 2>&1 ; then error_exit "user_allow_other is not configured in /etc/fuse.conf" fi } #=== FUNCTION ================================================================== # NAME: check_ext # DESCRIPTION: Check file extension. # PARAMETER 1: path+file.ext (may be a variable!?). # PARAMETER 2: file extension (without dot). #=============================================================================== function check_ext () { if [ ! -f "${1}" ] ; then error_exit "please select a regular file" fi if ! [[ "${1##*.}" =~ ${2} ]] ; then error_exit "please select a file ending with .${2}" fi } #=== FUNCTION ================================================================== # NAME: check_file # DESCRIPTION: Check if param is a regular file with given name. # PARAMETER 1: path+filename (may be a variable!?). # PARAMETER 2: expected name. #=============================================================================== function check_file () { if [ ! -f "${1}" ] ; then error_exit "please select a regular file" fi if ! [[ "${1##*/}" =~ ${2} ]] ; then error_exit "please select a file named \"${2}\"" fi } #=== FUNCTION ================================================================== # NAME: check_dir # DESCRIPTION: Check if param is a directory with given name. # PARAMETER 1: path+directory (may be a variable!?). # PARAMETER 2: expected name. #=============================================================================== function check_dir () { if [ ! -d "${1}" ] ; then error_exit "please select a directory" fi if ! [[ "${1##*/}" =~ ${2} ]] ; then error_exit "please select a directory named \"${2}\"" fi } #=== FUNCTION ================================================================== # NAME: check_tmp # DESCRIPTION: Check if tmp directory is present and provide it as variable. #=============================================================================== function check_tmp () { if [ ! -d "${DIRNAME}/tmp" ] ; then if ! ${MKDIR_BIN} "${DIRNAME}/tmp" ; then error_exit "was not able to create tmp directory" fi fi TMP="${DIRNAME}/tmp" } #=== FUNCTION ================================================================== # NAME: source_is_mounted # DESCRIPTION: Probe if a "device" (or image) is mounted. # PARAMETERS: none #=============================================================================== function source_is_mounted () { if ${GREP_BIN} --fixed-strings --line-regexp "${SOURCE// /\\040}" \ <( ${CUT_BIN} -d " " -f 1 /proc/mounts ) \ > /dev/null 2>&1 ; then return 0 else return 1 fi } #=== FUNCTION ================================================================== # NAME: check_if_source_is_not_mounted # DESCRIPTION: Check if a "device" (or image) is NOT mounted. # PARAMETERS: none #=============================================================================== function check_if_source_is_not_mounted () { if source_is_mounted ; then error_exit "partition of the image is not mounted - mount it first" fi } #=== FUNCTION ================================================================== # NAME: check_if_source_is_mounted # DESCRIPTION: Check if a "device" (or image) IS mounted. # PARAMETERS: none #=============================================================================== function check_if_source_is_mounted () { if ! source_is_mounted ; then error_exit "partition of the image is still mounted - u(n)mount it first" fi } #=== FUNCTION ================================================================== # NAME: pwd_used_as_mountpoint # DESCRIPTION: Probe if the current working directory is a used mountpoint, eg. # an image is mounted through xmount. # PARAMETERS: none #=============================================================================== function pwd_used_as_mountpoint () { if ${GREP_BIN} --fixed-strings --line-regexp "${PWD// /\\040}" \ <( ${CUT_BIN} -d " " -f 2 /proc/mounts ) \ > /dev/null 2>&1 ; then return 0 else return 1 fi } #=== FUNCTION ================================================================== # NAME: check_if_pwd_is_not_used_as_mountpoint # DESCRIPTION: Check if the current working directory is NOT a used mountpoint. # (To avoid unintended changes!) # PARAMETERS: none #=============================================================================== function check_if_pwd_is_not_used_as_mountpoint () { if pwd_used_as_mountpoint ; then error_exit "trough xmounted RAW images are not supported" fi } #=== FUNCTION ================================================================== # NAME: check_if_pwd_is_used_as_mountpoint # DESCRIPTION: Check if the current working directory IS a used mountpoint. # (To avoid unintended changes!) # PARAMETERS: none #=============================================================================== function check_if_pwd_is_used_as_mountpoint () { if ! pwd_used_as_mountpoint ; then error_exit "only xmounted RAW images are supported" fi } #=== FUNCTION ================================================================== # NAME: check_if_is_looped # DESCRIPTION: Check if directory is a part of a xmounted image with losetup. # PARAMETERS: none #=============================================================================== function check_if_is_looped () { if ! ${GREP_BIN} --extended-regexp "^/dev/loop[[:digit:]]{1,2}[[:space:]]${SOURCE}" /proc/mounts > /dev/null 2>&1 ; then error_exit "only with losetup mounted parts of with xmount mounted images are supported" fi } #=== FUNCTION ================================================================== # NAME: disable_gnome_automount # DESCRIPTION: Disable automounting in gnome. # PARAMETERS: none #=============================================================================== function disable_gnome_automount () { readonly MEDIA_HANDLING="org.gnome.desktop.media-handling" if [ "$( ${GSETTINGS_BIN} get ${MEDIA_HANDLING} automount-open )" != "false" ] ; then ${GSETTINGS_BIN} set "${MEDIA_HANDLING}" automount-open false fi if [ "$( ${GSETTINGS_BIN} get ${MEDIA_HANDLING} automount )" != "false" ] ; then ${GSETTINGS_BIN} set "${MEDIA_HANDLING}" automount false fi if [ "$( ${GSETTINGS_BIN} get ${MEDIA_HANDLING} autorun-never )" != "true" ] ; then ${GSETTINGS_BIN} set "${MEDIA_HANDLING}" autorun-never true fi } #=== FUNCTION ================================================================== # NAME: disable_tracker_miner # DESCRIPTION: Disable Tracker Miner (may interfere with later umount). # PARAMETERS: none #=============================================================================== function kill_all_tracker_processes () { if ${PGREP_BIN} "tracker-" > /dev/null 2>&1 ; then ${TRACKER} --kill=all fi } #=== FUNCTION ================================================================== # NAME: xmount_out_format # DESCRIPTION: Ask the user for the output format for xmount. # PARAMETERS: none #=============================================================================== xmount_out_format() { ${ZENITY_BIN} --list \ --text "Please select the output image format!" \ --radiolist \ --column "" \ --column "Output image formats (--out):" TRUE raw FALSE vdi FALSE vmdk \ --width="320" \ --height="320" } #=== FUNCTION ================================================================== # NAME: choose_partiton # DESCRIPTION: Ask the user for a partition of an image. # PARAMETER 1: image file (absolute path) # PARAMETER 2: "mmls" (default) or "parted" #=============================================================================== choose_partition() { if [ "${2}" = "parted" ] ; then PARTITIONS="$( ${PARTED_BIN} -s -m "${1}" unit b print )" else PARTITIONS="$( ${MMLS_BIN} -aM "${1}" )" fi readonly PARTITIONS="$( echo "${PARTITIONS}" \ | ${GREP_BIN} --extended-regexp "^[[:digit:]]" \ | ${TR_BIN} -s " " "_" \ | ${AWK_BIN} 'NR == 1 { print "TRUE", $0; }; NR > 1 { print "FALSE", $0; }' \ | ${TR_BIN} "\n" " " )" if [ -z "${PARTITIONS}" ] ; then error_exit "no valid partition table found" fi readonly CHOICE="$( ${ZENITY_BIN} --list \ --text "Please select a partition!" \ --radiolist \ --column "Pick" \ --column "Partitions" \ ${PARTITIONS} \ --width="800" \ --height="400" )" if [ -z "${CHOICE}" ] ; then error_exit "no partition selected" fi echo -n "${CHOICE}" } #=== FUNCTION ================================================================== # NAME: display_resultfile # DESCRIPTION: Display the resultfile if present or after generating it. # PARAMETERS: Path and filename of the resultfile #=============================================================================== display_resultfile() { if [ -f "${1}" ] ; then ${ZENITY_BIN} --text-info \ --title "$( ${BASENAME_BIN} "${1}" )" \ --width="800" \ --height="400" \ --filename="${1}" else error_exit "$( ${BASENAME_BIN} "${1}" ) is missing" fi } #=== GLOBAL CHECKS ============================================================= #------------------------------------------------------------------------------- # Check supported operating system release. #------------------------------------------------------------------------------- check_osr "${SUPPORTED_OSR}" case "${OR_ID}${OR_VERSION_ID}" in debian8) TRACKER_BIN="$( ${WHICH_BIN} tracker-control )" ;; arch) TRACKER_BIN="$( ${WHICH_BIN} tracker ) daemon" ;; *) error_exit "sorry, ${OR_PRETTY_NAME} is not supported" esac #------------------------------------------------------------------------------- # Check, if only one file is selectet (only from nautilus!). #------------------------------------------------------------------------------- if [ -n "${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS}" ] ; then if [[ "${#}" -gt "1" ]] ; then error_exit "please select only one file" fi fi #------------------------------------------------------------------------------- # Check for absolute path. #------------------------------------------------------------------------------- if [[ "${SOURCE}" != /* ]] ; then error_exit "please use an absolute path" fi #------------------------------------------------------------------------------- # Check, if image exist. #------------------------------------------------------------------------------- if [ ! -e "${SOURCE}" ] ; then error_exit "image/mountpoint does not exist" fi # Do not use "exit" at the end of an sources shell script/library! # exit 0