From 832b79626d96fc2e05fea880104399a91927bad7 Mon Sep 17 00:00:00 2001 From: Patrick Neumann Date: Fri, 27 Nov 2020 23:54:05 +0100 Subject: [PATCH] nautilus scripts library --- ...sualscripter_nautilus-scripts_functions.sh | 592 ++++++++++++++++++ 1 file changed, 592 insertions(+) create mode 100755 home/lucifer/.local/share/nautilus/scripts/.casualscripter_nautilus-scripts_functions.sh diff --git a/home/lucifer/.local/share/nautilus/scripts/.casualscripter_nautilus-scripts_functions.sh b/home/lucifer/.local/share/nautilus/scripts/.casualscripter_nautilus-scripts_functions.sh new file mode 100755 index 0000000..a900ffb --- /dev/null +++ b/home/lucifer/.local/share/nautilus/scripts/.casualscripter_nautilus-scripts_functions.sh @@ -0,0 +1,592 @@ +#!/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