23 Commits

Author SHA1 Message Date
Geoffray Levasseur-Brandin
9b2c764181 typos 2025-06-19 14:50:46 +02:00
Geoffray Levasseur-Brandin
3d5a5e7718 typos 2025-06-19 14:50:21 +02:00
Geoffray Levasseur-Brandin
47e89b3b09 compress.sh: multiple correction and securisation 2025-06-19 14:49:49 +02:00
Geoffray Levasseur-Brandin
f0f80e2924 better display implementation 2025-06-19 14:47:14 +02:00
Geoffray Levasseur-Brandin
b08e457146 version bump 2025-06-19 14:42:14 +02:00
Geoffray Levasseur-Brandin
56e34bc346 few varaible securisation, new alias hdu 2025-06-19 14:41:31 +02:00
Geoffray Levasseur-Brandin
e9e9993dfc finished profile_uprade implementation 2025-06-19 14:40:02 +02:00
Geoffray Levasseur-Brandin
ff4c6702b7 secured rmhost 2025-06-19 14:39:10 +02:00
Geoffray Levasseur-Brandin
87dea45295 fixed some variable declarations 2025-06-19 14:38:18 +02:00
Geoffray Levasseur-Brandin
0abf481cf6 various improvement and securisation 2025-06-19 14:37:32 +02:00
Geoffray Levasseur-Brandin
a75299f7b4 non gnu date compatible, use local vars where possible 2025-06-19 14:36:13 +02:00
Geoffray Levasseur-Brandin
eeb87c5bfc make delay parametrable 2025-06-19 14:34:22 +02:00
Geoffray Levasseur-Brandin
4879b418db factorized code / thiner implementation 2025-06-19 14:33:36 +02:00
Geoffray Levasseur-Brandin
f944271488 added file_stats function 2025-06-19 14:32:29 +02:00
Geoffray Levasseur-Brandin
4be2e5ea87 add url encode / secure isipv4 2025-06-19 14:31:19 +02:00
Geoffray Levasseur-Brandin
9d528a6491 fix kt function 2025-06-19 14:30:38 +02:00
Geoffray Levasseur-Brandin
bef205ae84 bugfix, esthetic cleanup, better comments, version bump 2024-06-21 16:19:44 +02:00
Geoffray Levasseur
9e49e3e4d7 fixed url and redirection 2023-10-06 12:52:15 +02:00
94e7e79c76 Merge branch 'master' of https://git.geoffray-levasseur.org/fatalerrors/profile 2023-10-06 11:36:14 +02:00
55e88bd018 partial commit for profile upgrade 2023-10-06 11:35:40 +02:00
Geoffray Levasseur
18f1bc1543 fix bash/zsh test, some cosmetics 2023-10-06 11:22:10 +02:00
fatalerrors
0d7c7e9ab7 minor correction 2023-09-08 20:25:04 +02:00
root
64fecf16fb make profile path configurable as autodetection is too unprecise so far 2023-04-19 21:15:33 +00:00
18 changed files with 982 additions and 615 deletions

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -34,90 +35,94 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Smartly uncompress archives (zip only) # Smartly uncompress archives (zip only for now)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
utaz() utaz()
{ {
for opt in $@ ; do for opt in $@; do
case $opt in case $opt in
"-h"|"--help") "-h" | "--help")
echo "utaz: uncompress all the given files and/or the ones found in the given" echo "utaz: uncompress all the given files and/or the ones found in the given"
echo " directories creating an host directory where needed." echo " directories creating an host directory where needed."
echo echo
echo "Usage: utaz [option] [directorie(s)|file(s)]" echo "Usage: utaz [option] [directorie(s)|file(s)]"
echo echo
echo "Options:" echo "Options:"
echo " -h, --help Display that help screen" echo " -h, --help Display that help screen"
echo " -d, --delete If decompression succeeded, delete the source file" echo " -d, --delete If decompression succeeded, delete the source file"
echo " -c, --create-dir Always create a host directory" echo " -c, --create-dir Always create a host directory"
echo " -n, --no-dir Never create a host directory" echo " -n, --no-dir Never create a host directory"
echo echo
return 0 return 0
;; ;;
"-d"|"--delete") "-d" | "--delete")
local willrm=1 local willrm=1
;; ;;
"-c"|"--create-dir") "-c" | "--create-dir")
local createdir=1 local createdir=1
;; ;;
"-n"|"--no-dir") "-n" | "--no-dir")
local nodir=1 local nodir=1
;; ;;
"-"*) "-"*)
disp E "Invalid option, use \"utaz --help\" to display options list" disp E "Invalid option, use \"utaz --help\" to display options list"
echo echo
return 1 return 1
;; ;;
*) *)
# The ${opt%/} writing is to remove trailing / if any # The ${opt%/} writing is to remove trailing / if any
local LIST="$LIST ${opt%/}" local LIST="$LIST ${opt%/}"
;; ;;
esac esac
done done
[[ $createdir && $nodir ]] && disp E "The --create-dir and --no-dir options are mutually exclusive." [[ $createdir && $nodir ]] && \
disp E "The --create-dir and --no-dir options are mutually exclusive."
[[ ! $LIST ]] && local LIST="." [[ ! $LIST ]] && local LIST="."
for zitem in $LIST; do for zitem in $LIST; do
[[ $(ls $zitem/*.zip 2> /dev/null | wc -l) -eq 0 ]] && shopt -s nullglob
disp W "$zitem contains no supported archive file, skipping." && local zips=("$zitem"/*.zip)
shopt -u nullglob
[[ ${#zips[@]} -eq 0 ]] && \
disp W "$zitem contains no supported archive file, skipping." && \
continue continue
for f in $zitem/*.zip; do for f in "$zitem"/*.zip; do
disp I "Processing archive $zitem/$f... " disp I "Processing archive $f... "
local dir=${f::-4} local dir=${f::-4}
mkdir -p $dir mkdir -p "$dir"
[[ $? -gt 0 ]] && [[ $? -gt 0 ]] &&
disp E "The filesystem can't create directories, exit!" && disp E "The filesystem can't create directories, exit!" &&
return 1 return 1
unzip -o $f -d $dir > /dev/null 2>&1 unzip -o "$f" -d "$dir" >/dev/null 2>&1
case $? in case $? in
0) 0)
[[ $willrm ]] && rm -f $f && disp I "File $zitem/$f deleted." [[ $willrm ]] && rm -f "$f" && disp I "File $zitem/$f deleted."
;; ;;
1) 1)
disp W "Compression program returned a warning: deletion canceled." disp W "Compression program returned a warning: deletion canceled."
;; ;;
*) *)
disp E "The zip file seems corrupted, failed." disp E "The zip file seems corrupted, failed."
rm -rf $dir > /dev/null 2>&1 rm -rf "$dir" >/dev/null 2>&1
continue continue
;; ;;
esac esac
if [[ $createdir ]]; then if [[ $createdir ]]; then
disp I "Archive extracted successfully in subdirectory." disp I "Archive extracted successfully in subdirectory."
elif [[ $nodir ]]; then elif [[ $nodir ]]; then
mv ./$dir/* ./ && rmdir $dir mv "./$dir/"* ./ && rmdir "$dir"
disp I "Archive extracted successfully, no subdirectory needed." disp I "Archive extracted successfully, no subdirectory needed."
else else
subdirs=$(find $dir -maxdepth 1 | wc -l) subdirs=$(find $dir -maxdepth 1 | wc -l)
@@ -136,7 +141,7 @@ export -f utaz
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Compress directories or files into one or more archive # Compress directories or files into one or more archive
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
taz () taz()
{ {
_doxz() _doxz()
{ {
@@ -151,7 +156,7 @@ taz ()
disp W "xz format is not suited for long term archiving." disp W "xz format is not suited for long term archiving."
disp I "See https://www.nongnu.org/lzip/xz_inadequate.html for details." disp I "See https://www.nongnu.org/lzip/xz_inadequate.html for details."
# Compresse to xz (lzma2) - Deprecated # Compresse to xz (lzma2) - Deprecated
xz $verb --compress --keep -$3 -T $2 $1 xz $verb --compress --keep -$3 -T $2 $1
return $? return $?
} }
@@ -166,11 +171,11 @@ taz ()
disp E "Program 'plzip' or 'lzip' are not installed, aborting." disp E "Program 'plzip' or 'lzip' are not installed, aborting."
return 127 return 127
} }
local command=lzip command=lzip
local procopt="" local procopt=""
[[ $2 -gt 1 ]] && [[ $2 -gt 1 ]] &&
disp W "lzip doesn't support multithreading, falling back to 1 thread." && disp W "lzip doesn't support multithreading, falling back to 1 thread." &&
disp W "Consitder installing plzip to obtain multithreading abilities." disp W "Consider installing plzip to obtain multithreading abilities."
} }
[[ $4 ]] && local verb="-vv" [[ $4 ]] && local verb="-vv"
@@ -194,7 +199,7 @@ taz ()
local procopt="" local procopt=""
[[ $2 -gt 1 ]] && [[ $2 -gt 1 ]] &&
disp W "gzip doesn't support multithreading, falling back to 1 thread." && disp W "gzip doesn't support multithreading, falling back to 1 thread." &&
disp W "Consitder installing pigz to obtain multithreading abilities." disp W "Consider installing pigz to obtain multithreading abilities."
} }
[[ $4 ]] && local verb="--verbose" [[ $4 ]] && local verb="--verbose"
@@ -218,7 +223,7 @@ taz ()
local procopt="" local procopt=""
[[ $2 -gt 1 ]] && [[ $2 -gt 1 ]] &&
disp W "bzip2 doesn't support multithreading, falling back to 1 thread." && disp W "bzip2 doesn't support multithreading, falling back to 1 thread." &&
disp W "Consitder installing pbzip2 to obtain multithreading abilities." disp W "Consider installing pbzip2 to obtain multithreading abilities."
} }
[[ $4 ]] && local verb="-v" [[ $4 ]] && local verb="-v"
@@ -243,85 +248,85 @@ taz ()
return $? return $?
} }
for opt in $@ ; do for opt in $@; do
case $opt in case $opt in
"-h"|"--help") "-h" | "--help")
echo "taz: archive all files of a directory." echo "taz: archive all files of a directory."
echo
echo "Usage: taz [option] [--parallel=<n>] [--format=<format>] [directory1 ... directoryN]"
echo
echo "Options:"
echo " -h, --help Display that help screen"
echo " -d, --delete Delete source file or directory after success"
echo " -f, --format Chose archive format in the given list. If several format are"
echo " given, the smalest is kept"
echo " -p, --parallel Number of threads to use (if allowed by underlying utility)"
echo " -v, --verbose Display progress where possible"
echo " -q, --quiet Display less messages (only errors and warnings)"
echo " -1, .., -9 Compression level to use [1=fast/biggest, 9=slow/smallest]"
echo
echo "Supported archive format:"
echo " Param.| programs | Algo. | Description"
echo " ------+---------------+-------+----------------------------------------"
echo " lz | plzip, lzip | lzma | Safe efficient default format"
echo " xz | xz | lzma2 | Unsafe, not for long term"
echo " bz2 | pbzip2, bzip2 | bzip2 | Historical but less efficient than lz"
echo " gz | pigz, gzip | lz77 | Historical, safe, fast"
echo " lzo | lzop | lzo | Very fast but no multithread"
echo " tar | tar | tar | No compression"
echo
return 0
;;
"-d" | "--delete")
local willrm=1
;;
"-f"?* | "--format"?*)
local compform=$(echo "$opt" | cut -f 2- -d '=')
;;
"-p"?* | "--parallel"?*)
local nproc=$(echo "$opt" | cut -f 2- -d '=')
;;
"-v" | "--verbose")
local verbose=1
;;
"-q" | "--quiet")
local quiet=1
;;
"-"*)
local complevel=$(echo $opt | sed 's/-//')
if ! [[ $complevel =~ ^[1-9]+$ ]]; then
disp E "Invalid option, use taz --help to display options list"
echo echo
echo "Usage: taz [option] [--parallel=<n>] [--format=<format>] [directory1 ... directoryN]" return 1
echo fi
echo "Options:" ;;
echo " -h, --help Display that help screen"
echo " -d, --delete Delete source file or directory after success"
echo " -f, --format Chose archive format in the given list. If several format are"
echo " given, the smalest is kept"
echo " -p, --parallel Number of threads to use (if allowed by underlying utility)"
echo " -v, --verbose Display progress where possible"
echo " -q, --quiet Display less messages (only errors and warnings)"
echo " -1, .., -9 Compression level to use [1=fast/biggest, 9=slow/smallest]"
echo
echo "Supported archive format:"
echo " Param.| programs | Algo. | Description"
echo " ------+---------------+-------+----------------------------------------"
echo " lz | plzip, lzip | lzma | Safe efficient default format"
echo " xz | xz | lzma2 | Unsafe, not for long term"
echo " bz2 | pbzip2, bzip2 | bzip2 | Historical but less efficient than lz"
echo " gz | pigz, gzip | lz77 | Historical, safe, fast"
echo " lzo | lzop | lzo | Very fast but no multithread"
echo " tar | tar | tar | No compression"
echo
return 0
;;
"-d"|"--delete") *)
local willrm=1 local LIST="$LIST ${opt%/}"
;; ;;
"-f"?*|"--format"?*)
local compform=$(echo "$opt" | cut -f 2- -d '=')
;;
"-p"?*|"--parallel"?*)
local nproc=$(echo "$opt" | cut -f 2- -d '=')
;;
"-v"|"--verbose")
local verbose=1
;;
"-q"|"--quiet")
QUIET=1
;;
"-"*)
local complevel=$(echo $opt | sed 's/-//')
if ! [[ $complevel =~ ^[1-9]+$ ]]; then
disp E "Invalid option, use taz --help to display options list"
echo
return 1
fi
;;
*)
local LIST="$LIST ${opt%/}"
;;
esac esac
done done
[[ ! $compform ]] && compform=lz # safe and efficient (unless data are already compressed) [[ ! $compform ]] && compform=lz # safe and efficient (unless data are already compressed)
[[ ! $nproc ]] && nproc=1 [[ ! $nproc ]] && nproc=1
[[ ! $complevel ]] && complevel=6 [[ ! $complevel ]] && complevel=6
[[ $verbose -gt 1 && $QUIET -gt 1 ]] && [[ $verbose -gt 1 && $quiet -gt 1 ]] &&
disp E "The --verbose and --quiet options can't be used together." disp E "The --verbose and --quiet options can't be used together."
for item in $LIST; do for item in $LIST; do
local donetar=0 local donetar=0
disp I "Processing $item..." disp I "Processing $item..."
if [[ -d $item ]]; then if [[ -d "$item" ]]; then
disp I "\t Creating $item.tar... " disp I "\t Creating $item.tar... "
tar -cf $item{.tar,} tar -cf "$item.tar" "$item"
if [[ ! $? -eq 0 ]]; then if [[ ! $? -eq 0 ]]; then
disp E "tar file creation failed, skipping to next item." disp E "tar file creation failed, skipping to next item."
continue continue
@@ -336,26 +341,29 @@ taz ()
# Skip compression part if tar is asked # Skip compression part if tar is asked
if [[ $compform != "tar" ]]; then if [[ $compform != "tar" ]]; then
disp I "\t Compressing archive..." disp I "\t Compressing archive..."
_do$compform $fname $nproc $complevel $verbose _do$compform "$fname" "$nproc" "$complevel" "$verbose"
[[ ! $? -eq 0 ]] && case $? in [[ ! $? -eq 0 ]] && case $? in
127) 127)
disp E "Compression program unavailable, aborting." disp E "Compression program unavailable, aborting."
return 127 return 127
;; ;;
*) *)
disp E "Compression program returned an error, not deleting anything if asked, skipping to next item." disp E "Compression program returned an error, not deleting anything if asked, skipping to next item."
continue continue
;; ;;
esac esac
[[ $donetar -gt 0 ]] && rm $fname [[ $donetar -gt 0 ]] && rm "$fname"
fi fi
if [[ $willrm ]]; then if [[ $willrm ]]; then
disp I "\t Deleting original source as asked... " disp I "\t Deleting original source as asked... "
rm -r $item rm -r "$item"
fi fi
done done
unset QUIET unset quiet
} }
export -f taz export -f taz
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/bin/bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -36,16 +37,16 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Display a backtrace # Display a backtrace
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
function backtrace () function backtrace()
{ {
echo "========= Call stack =========" echo "========= Call stack ========="
typeset -i i=0 typeset -i i=0
local func= local func=
for func in "${FUNCNAME[@]}"; do for func in "${FUNCNAME[@]}"; do
if [[ $i -ne 0 ]]; then if [[ $i -ne 0 ]]; then
printf '%15s() %s:%d\n' \ printf '%15s() %s:%d\n' \
"$func" "${BASH_SOURCE[$i]}" "${BASH_LINENO[ (( $i - 1)) ]}" "$func" "${BASH_SOURCE[$i]}" "${BASH_LINENO[(($i - 1))]}"
fi fi
let i++ || true let i++ || true
done done
@@ -56,52 +57,54 @@ function backtrace ()
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Function to be trapped for errors investigation # Function to be trapped for errors investigation
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
function error () function error()
{ {
local errcode=$? local errcode=$?
backtrace backtrace
return $errcode return $errcode
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Activate or deactivate error trapping to display backtrace # Activate or deactivate error trapping to display backtrace
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
settrace () settrace()
{ {
local status="off" local status="off"
[[ $(trap -p ERR) ]] && status="on" [[ $(trap -p ERR) ]] && status="on"
#trap -p ERR #trap -p ERR
for opt in $@ ; do for opt in $@; do
case $opt in case $opt in
"-h"|"--help") "-h" | "--help")
echo "Try to activate backtrace display for script debugging." echo "Try to activate backtrace display for script debugging."
echo echo
echo "Options:" echo "Options:"
echo " --on Activate backtrace generation" echo " --on Activate backtrace generation"
echo " --off Deactivate backtrace generation" echo " --off Deactivate backtrace generation"
echo echo
echo "That function active a trap event on error. If the script you want to" echo "That function active a trap event on error. If the script you want to"
echo "debug overload the ERR bash trap, it will not work." echo "debug overload the ERR bash trap, it will not work."
echo echo
;; ;;
"--on") "--on")
if [[ $status == "on" ]]; then if [[ $status == "on" ]]; then
disp W "ERR signal trap is already set, replacing previous trap!" disp W "ERR signal trap is already set, replacing previous trap!"
fi fi
trap "error" ERR trap "error" ERR
;; ;;
"--off") "--off")
if [[ $status != "on" ]]; then if [[ $status != "on" ]]; then
disp W "ERR signal trap is already unset!" disp W "ERR signal trap is already unset!"
fi fi
trap - ERR trap - ERR
;; ;;
"--status") "--status")
disp "ERR trap signal is ${status}." disp "ERR trap signal is ${status}."
;; ;;
esac esac
done done
unset status unset status
} }
export -f settrace export -f settrace
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/bin/bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -40,6 +41,7 @@
export DEFAULTFG="\e[0;39m" export DEFAULTFG="\e[0;39m"
export DEFAULTBG="\e[0;49m" export DEFAULTBG="\e[0;49m"
export DEFAULTCOL=${DEFAULTBG}${DEFAULTFG} export DEFAULTCOL=${DEFAULTBG}${DEFAULTFG}
export RESETCOL=$'\e[0m'
# Regular Colors # Regular Colors
export Black='\e[0;30m' export Black='\e[0;30m'
@@ -111,38 +113,40 @@ export On_IPurple='\e[0;105m'
export On_ICyan='\e[0;106m' export On_ICyan='\e[0;106m'
export On_IWhite='\e[0;107m' export On_IWhite='\e[0;107m'
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Display a message # Display a message
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
disp() disp()
{ {
case $1 in case $1 in
"I") "I")
local heads="[ ${IGreen}info${DEFAULTFG} ]" local heads="[ ${IGreen}info${DEFAULTFG} ]"
shift shift
[[ -z $QUIET || $QUIET -ne 1 ]] && echo -e "${heads} $@" [[ -z $QUIET || $QUIET -ne 1 ]] && \
;; printf "%b\n" "${heads} $*${RESETCOL}"
"W") ;;
local heads="[ ${IYellow}Warning${DEFAULTFG} ]" "W")
shift local heads="[ ${IYellow}Warning${DEFAULTFG} ]"
echo -e "${heads} $@" >&2 shift
;; printf "%b\n" "${heads} $*${RESETCOL}" >&2
"E") ;;
local heads="[ ${IRed}ERROR${DEFAULTFG} ]" "E")
shift local heads="[ ${IRed}ERROR${DEFAULTFG} ]"
echo -e "${heads} $@" >&2 shift
;; printf "%b\n" "${heads} $*${RESETCOL}" >&2
"D") ;;
local heads"[ ${ICyan}debug${DEFAULTFG} ]" "D")
shift local heads="[ ${ICyan}debug${DEFAULTFG} ]"
[[ -n $DEBUG && $DEBUG -gt 1 ]] && echo -e "${heads} $@" shift
;; [[ -n $DEBUG && $DEBUG -gt 1 ]] && \
"*") printf "%b\n" "${heads} $*${RESETCOL}"
local heads="" ;;
[[ -z $QUIET || $QUIET -ne 1 ]] && echo -e "$@" * )
;; [[ -z $QUIET || $QUIET -ne 1 ]] && \
printf "%b\n" "$*"
;;
esac esac
unset heads
} }
export -f disp export -f disp
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -47,49 +48,48 @@ expandlist()
echo $result echo $result
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Clean a directory or a tree from temporary or backup files # Clean a directory or a tree from temporary or backup files
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
clean () clean()
{ {
for opt in $@ ; do for opt in $@; do
case $opt in case $opt in
"-r"|"--recurs") "-r" | "--recurs")
local recursive=1 local recursive=1
;; ;;
"-h"|"--help") "-h" | "--help")
echo "clean: erase backup files in the given directories." echo "clean: erase backup files in the given directories."
echo echo
echo "Usage: clean [option] [directory1] [...[directoryX]]" echo "Usage: clean [option] [directory1] [...[directoryX]]"
echo echo
echo "Options:" echo "Options:"
echo " -h, --help Display that help screen" echo " -h, --help Display that help screen"
echo " -r, --recurs Do a recursive cleaning" echo " -r, --recurs Do a recursive cleaning"
echo " -f, --force Do not ask for confirmation (use with care)" echo " -f, --force Do not ask for confirmation (use with care)"
echo " -s, --shell Do nothing and display what will be executed" echo " -s, --shell Do nothing and display what will be executed"
echo echo
return 0 return 0
;; ;;
"-s"|"--shell") "-s" | "--shell")
local outshell=1 local outshell=1
;; ;;
"-f"|"--force") "-f" | "--force")
local force=1 local force=1
;; ;;
"-"*) "-"*)
disp E "Invalid option, use \"clean --help\" to display usage." disp E "Invalid option, use \"clean --help\" to display usage."
echo echo
return 1 return 1
;; ;;
*) *)
local dirlist="$dirlist $opt" local dirlist="$dirlist $opt"
;; ;;
esac esac
done done
@@ -100,7 +100,7 @@ clean ()
unset recursive force unset recursive force
for dir in $dirlist; do for dir in $dirlist; do
local dellist=$(find $dir $findopt -type f -name "*~" -o -name "#*#" \ local dellist=$(find "$dir" $findopt -type f -name "*~" -o -name "#*#" \
-o -name "*.bak" -o -name ".~*#") -o -name "*.bak" -o -name ".~*#")
for f in $dellist; do for f in $dellist; do
if [[ ! $outshell ]]; then if [[ ! $outshell ]]; then
@@ -114,73 +114,71 @@ clean ()
} }
export -f clean export -f clean
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Create a directory then goes inside # Create a directory then goes inside
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
mcd () mcd()
{ {
if [[ ! $# -eq 1 ]] ; then if [[ ! $# -eq 1 ]]; then
disp E "Create a directory then goes inside." disp E "Create a directory then goes inside."
disp E "Usage: mcd <directory>" disp E "Usage: mcd <directory>"
return 1 return 1
fi fi
mkdir -pv $1 && cd $1 mkdir -pv "$1" && cd "$1" || echo "Failed create or change directory."
} }
export -f mcd export -f mcd
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Rename all files in current directory to replace spaces with _ # Rename all files in current directory to replace spaces with _
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
rmspc () rmspc()
{ {
local lst="" local lst=""
for opt in $@ ; do for opt in $@; do
case $opt in case $opt in
"-h"|"--help") "-h" | "--help")
echo "rmspc: remove spaces from all filenames in current directories" echo "rmspc: remove spaces from all filenames in current directories"
echo echo
echo "Usage: rmspc [option]" echo "Usage: rmspc [option]"
echo echo
echo "Options:" echo "Options:"
echo " -h, --help Display that help screen" echo " -h, --help Display that help screen"
echo " -r, --recursive Treat subdirectories of the given directory" echo " -r, --recursive Treat subdirectories of the given directory"
echo " -c, --subst-char Change the replacement character (default is underscore)" echo " -c, --subst-char Change the replacement character (default is underscore)"
echo " -v, --verbose Display more details (recursive mode only)" echo " -v, --verbose Display more details (recursive mode only)"
echo " -s, --shell Do nothing and display commands that would be executed" echo " -s, --shell Do nothing and display commands that would be executed"
echo echo
echo "Note: if the --subst-char option is given without parameters, spaces will be" echo "Note: if the --subst-char option is given without parameters, spaces will be"
echo " replaced with nothing (concatenation)." echo " replaced with nothing (concatenation)."
echo echo
return 0 return 0
;; ;;
"-r"|"--recursive") "-r" | "--recursive")
local recurs=1 local recurs=1
;; ;;
"-c"?*|"--subst-char"?*) "-c"?* | "--subst-char"?*)
if [[ $(echo $opt | grep "=") ]]; then if [[ $(echo $opt | grep "=") ]]; then
local substchar=$(echo "$opt" | cut -f 2- -d '=') local substchar=$(echo "$opt" | cut -f 2- -d '=')
else else
local substchar='none' local substchar='none'
fi fi
;; ;;
"-v"|"--verbose") "-v" | "--verbose")
local verb=1 local verb=1
;; ;;
"-s"|"--shell") "-s" | "--shell")
local shell=1 local shell=1
;; ;;
*) *)
disp E "Invalid parameter, use \"rmspc --help\" to display options list" disp E "Invalid parameter, use \"rmspc --help\" to display options list"
echo echo
return 1 return 1
;; ;;
esac esac
done done
@@ -191,14 +189,14 @@ rmspc ()
for f in *; do for f in *; do
[[ $recurs ]] && [[ -d "$f" ]] && ( [[ $recurs ]] && [[ -d "$f" ]] && (
[[ $verb ]] && disp I "Entering directory $(pwd)/$f ..." [[ $verb ]] && disp I "Entering directory $(pwd)/$f ..."
local lastdir=$f local lastdir=$f
pushd "$f" > /dev/null pushd "$f" >/dev/null
rmspc $@ rmspc $@
popd > /dev/null popd >/dev/null
[[ $verb ]] && disp I "Leaving directory $(pwd)/$lastdir" [[ $verb ]] && disp I "Leaving directory $(pwd)/$lastdir"
unset lastdir unset lastdir
) )
if [[ $(echo $f | grep " ") ]]; then if [[ $(echo $f | grep " ") ]]; then
local newf="${f// /${substchar}}" local newf="${f// /${substchar}}"
local command="mv $mvopt \"$f\" \"$newf\"" local command="mv $mvopt \"$f\" \"$newf\""
@@ -209,6 +207,137 @@ rmspc ()
fi fi
fi fi
done done
unset lst substchar verb shell newf command mvopt unset lst substchar verb shell newf command mvopt
} }
export -f rmspc export -f rmspc
# ------------------------------------------------------------------------------
# display stats about a file structure
# ------------------------------------------------------------------------------
file_stats()
{
local human=0 details=0 only_avg=0 only_med=0 only_count=0 only_total=0
local path="." show_all=1 ext_filter="" ext_list="" min_size="" max_size=""
local OPTIND opt
# Analyse options
while [[ "$1" =~ ^- ]]; do
case "$1" in
-H) human=1 ;;
-d) details=1 ;;
-m) only_avg=1; show_all=0 ;;
-M) only_med=1; show_all=0 ;;
-c) only_count=1; show_all=0 ;;
-t) only_total=1; show_all=0 ;;
-a) human=1; details=1 ;;
-x) ext_filter="${2#.}"; shift ;;
-X) ext_list="${2}"; shift ;;
--min) min_size="$2"; shift ;;
--max) max_size="$2"; shift ;;
--) shift; break ;;
-*) echo "Usage: file_stats [-h] [-d] [-mMctaxX --min N --max N] [path]"; return 1 ;;
esac
shift
done
[ -n "$1" ] && path="$1"
# Prepare find filters
local find_cmd=(find "$path" -type f)
# Extension simple
if [[ -n "$ext_filter" ]]; then
find_cmd+=(-iname "*.$ext_filter")
fi
# Extension liste
if [[ -n "$ext_list" ]]; then
IFS=',' read -ra exts <<< "$ext_list"
find_cmd+=('(')
for i in "${!exts[@]}"; do
[[ $i -ne 0 ]] && find_cmd+=(-o)
find_cmd+=(-iname "*.${exts[$i]}")
done
find_cmd+=(')')
fi
# Taille min/max (à évaluer en octets)
if [[ -n "$min_size" ]]; then
find_cmd+=(-size +"$(numfmt --from=iec "$min_size")"c)
fi
if [[ -n "$max_size" ]]; then
find_cmd+=(-size -"$(( $(numfmt --from=iec "$max_size") + 1 ))"c)
fi
# Exécution
"${find_cmd[@]}" -printf "%s\n" 2>/dev/null | sort -n | awk -v human="$human" -v details="$details" -v only_avg="$only_avg" -v only_med="$only_med" -v only_count="$only_count" -v only_total="$only_total" -v show_all="$show_all" -v path="$path" '
function human_readable(x) {
split("B KiB MiB GiB TiB", units)
for (i=1; x>=1024 && i<5; i++) x /= 1024
return sprintf("%.2f %s", x, units[i])
}
{
sizes[NR] = $1
total += $1
if (min == "" || $1 < min) min = $1
if (max == "" || $1 > max) max = $1
if ($1 == 0) bucket[0]++
else {
b = int(log($1)/log(1024))
bucket[b]++
}
}
END {
count = NR
if (count == 0) {
print "Aucun fichier trouvé."; exit
}
moyenne = total / count
if (count % 2 == 1)
mediane = sizes[(count + 1) / 2]
else
mediane = (sizes[count / 2] + sizes[count / 2 + 1]) / 2
function out(label, val) {
if (human) val = human_readable(val)
printf "%-20s : %s\n", label, val
}
if (only_avg) out("Taille moyenne", moyenne)
else if (only_med) out("Taille médiane", mediane)
else if (only_count) printf "Nombre de fichiers : %d\n", count
else if (only_total) out("Taille totale", total)
else {
if (show_all || human || details) {
printf "Statistiques sur \"%s\"\n", path
printf "-------------------------\n"
}
out("Nombre de fichiers", count)
out("Taille totale", total)
out("Taille moyenne", moyenne)
out("Taille médiane", mediane)
out("Taille minimale", min)
out("Taille maximale", max)
}
if (details) {
print "\nHistogramme des tailles :"
for (i = 0; i in bucket; i++) {
low = 2^i
high = 2^(i+1)
if (i == 0)
label = sprintf("%4s %4s", "0", "1K")
else
label = sprintf("%4s %4s", human_readable(low), human_readable(high))
printf "%-20s : %5d fichiers\n", label, bucket[i]
}
}
}'
}
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -38,11 +39,32 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
busy() busy()
{ {
if [[ -n $1 ]]; then local pattern="ca fe"
local pattern="$@" for arg in "$@"; do
else case "$arg" in
local pattern="ca fe" --delay=*)
fi delay_ms="${arg#*=}"
cat /dev/urandom | hexdump -C | grep "$pattern" if ! [[ $delay_ms =~ ^[0-9]+$ ]]; then
disp E "Invalid delay value, must be an integer (milliseconds)."
return 1
fi
;;
*)
pattern="$arg"
;;
esac
done
# Convert milliseconds to seconds for 'sleep'
local delay_s=$(awk "BEGIN { printf \"%.3f\", $delay_ms / 1000 }")
cat /dev/urandom | hexdump -C | grep --line-buffered "$pattern" | \
while read -r line; do
echo $line
[[ $delay_ms -gt 0 ]] && sleep "$delay_s"
done
unset pattern unset pattern
} }
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/bin/bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -66,3 +67,5 @@ EOF
} }
export -f help export -f help
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/bin/bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -36,55 +37,66 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Show profile version # Show profile version
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
ver () ver()
{ {
[[ -z $PROFVERSION ]] && \
disp W "No version defined. Profile is probably badly installed." && \
return 1
disp "Profile version $PROFVERSION." disp "Profile version $PROFVERSION."
} }
export -f ver export -f ver
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Display weather of the given city (or default one) # Display weather of the given city (or default one)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
meteo () meteo()
{ {
cities=$@ local encoded cities=("$@")
[[ $# -eq 0 ]] && local cities=$DEFAULT_CITY [[ $# -eq 0 ]] && cities=("$DEFAULT_CITY")
for city in $cities; do for city in "${cities[@]}"; do
curl https://wttr.in/$city || disp E "Failed fetching datas for $city." encoded=$(urlencode "$city")
curl -s "https://wttr.in/$encoded" || \
disp E "Failed fetching datas for $city."
done done
} }
export -f meteo export -f meteo
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Display system general information # Display system general information
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
showinfo() showinfo()
{ {
echo -e "\n" echo -e "\n"
if command -v figlet >/dev/null 2>&1; then if command -v figlet >/dev/null 2>&1; then
if [[ -s /usr/share/figlet/ansi_shadow.flf ]]; then if [[ -s /usr/share/figlet/ansi_shadow.flf ]]; then
local figopt="-f ansi_shadow" local figopt="-f ansi_shadow"
fi fi
figlet -k $(hostname) $figopt if [[ -n $figopt ]]; then
figlet -k "$figopt" "$(hostname)"
else
figlet "$(hostname)"
fi
else else
echo "$(hostname -f)" hostname -f
fi fi
echo "" echo ""
if command -v neofetch >/dev/null 2>&1; then if command -v neofetch >/dev/null 2>&1; then
neofetch neofetch
else else
( (
if [[ -s /etc/os-release ]]; then if [[ -s /etc/os-release ]]; then
. /etc/os-release # shellcheck disable=SC1091
echo "$NAME $VERSION" . /etc/os-release
else echo "$NAME $VERSION"
cat /proc/version else
fi cat /proc/version
echo "Uptime: $(uptime)" fi
) echo "Uptime: $(uptime -p)"
)
fi fi
} }
export -f showinfo export -f showinfo
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/bin/bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -33,38 +34,69 @@
# * OF SUCH DAMAGE. # * OF SUCH DAMAGE.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
locale_check() {
locale -a | grep -qx "$1" || {
disp W "Locale '$1' is not installed on this system."
return 1
}
return 0
}
# ------------------------------------------------------------------------------
# Change locale to the given one in parameter
# ------------------------------------------------------------------------------
setlocale()
{
local loc=$1
[[ -z $loc ]] && disp E "No locale specified." && return 1
locale_check "$loc" || return 1
export LANG=$loc
export LC_MESSAGES=$loc
export LC_TIME=$loc
export LC_NUMERIC=$loc
export LC_MONETARY=$loc
export LC_COLLATE=$loc
export LC_CTYPE=$loc
disp I "Locale set to $loc."
}
export -f setlocale
# ------------------------------------------------------------------------------
# Special case : change locale to C standard
# ------------------------------------------------------------------------------
setc()
{
# Locale definitions
export LC_ALL=C
disp I "Locale changed to standard C (POSIX)."
}
export -f setc
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Change locale to French # Change locale to French
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
setfr () setfr()
{ {
# Set fr locale definitions # Set fr locale definitions
export LANG=fr_FR.UTF-8 setlocale "fr_FR.UTF-8"
export LC_MESSAGES=fr_FR.UTF-8
export LC_ALL=fr_FR.UTF-8
} }
export -f setfr export -f setfr
# ------------------------------------------------------------------------------
# Change locale to C standard
# ------------------------------------------------------------------------------
setc ()
{
# Locale definitions
export LANG=C
export LC_MESSAGES=C
export LC_ALL=C
}
export -f setc
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Change locale to US (needed by Steam) # Change locale to US (needed by Steam)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
setus () setus()
{ {
# Locale definitions setlocale "en_US.UTF-8"
export LANG=en_US.UTF-8
export LC_MESSAGES=en_US.UTF-8
export LC_ALL=en_US.UTF-8
} }
export -f setus export -f setus
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/bin/bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -36,49 +37,71 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Determine if parameter is a valid IPv4 address # Determine if parameter is a valid IPv4 address
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
isipv4 () isipv4()
{ {
# Set up local variables # Set up local variables
local ip=$1 local ip=$1
[[ -z $ip ]] && return 1
# Start with a regex format test # Start with a regex format test
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
local old_ifs=$IFS local old_ifs=$IFS
IFS="." IFS="."
ip=($ip) ip=($ip)
IFS=$old_ifs IFS=$old_ifs
if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 &&
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]; then ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]; then
if [[ -t 1 ]]; then if [[ -t 1 ]]; then
disp "The given IPv4 is valid." disp "The given IPv4 is valid."
fi fi
return 0 return 0
fi fi
fi fi
if [[ -t 1 ]]; then if [[ -t 1 ]]; then
disp "The given parameter is NOT a valid IPv4." disp "The given parameter is NOT a valid IPv4."
fi fi
return 1 return 1
} }
export -f isipv4 export -f isipv4
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Determine if parameter is a valid IPv4 address # Determine if parameter is a valid IPv4 address
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
isipv6 () isipv6()
{ {
local ip="$1" local ip="$1"
local regex='^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$' local regex='^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$'
if [[ $ip =~ $regex ]]; then if [[ $ip =~ $regex ]]; then
if [[ -t 1 ]]; then if [[ -t 1 ]]; then
disp "The given IPv6 is valid." disp "The given IPv6 is valid."
fi fi
return 0 return 0
fi fi
if [[ -t 1 ]]; then if [[ -t 1 ]]; then
disp "The given parameter is not a valid IPv6." disp "The given parameter is not a valid IPv6."
fi fi
return 1 return 1
} }
export -f isipv6 export -f isipv6
# ------------------------------------------------------------------------------
# Encode a string so it can be used as a URL parameter
# ------------------------------------------------------------------------------
urlencode() {
local LANG=C
local str="$*"
local length="${#str}"
for (( i = 0; i < length; i++ )); do
local c="${str:i:1}"
case "$c" in
[a-zA-Z0-9.~_-]) printf "$c" ;;
' ') printf '+' ;;
*) printf '%%%02X' "'$c" #| cut -d' ' -f2 ;;
esac
done
}
export -f urlencode
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/bin/bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -36,32 +37,32 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Look for a package within installed one # Look for a package within installed one
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
pkgs () pkgs()
{ {
local count=0 local count=0
for opt in $@ ; do for opt in $@; do
case $opt in case $opt in
"-h"|"--help") "-h" | "--help")
echo "dpkgs: look for an installed package by it's name." echo "dpkgs: look for an installed package by it's name."
echo echo
echo "Usage: dpkgs <string>" echo "Usage: dpkgs <string>"
return 0 return 0
;; ;;
"-"*) "-"*)
disp E "Invalid option, use \"dpkgs --help\" to display usage." disp E "Invalid option, use \"dpkgs --help\" to display usage."
echo echo
return 1
;;
*)
local pkg=$1 && shift
count=$(($count + 1))
[[ $count -gt 1 ]] &&
disp E "Please specify a package name, without space, eventually partial." &&
return 1 return 1
;;
*) ;;
local pkg=$1 && shift
count=$(( $count + 1 ))
[[ $count -gt 1 ]] &&
disp E "Please specify a package name, without space, eventually partial." &&
return 1
;;
esac esac
done done
[[ $count -lt 1 ]] && [[ $count -lt 1 ]] &&
@@ -71,9 +72,12 @@ pkgs ()
command -v dpkg >/dev/null 2>&1 && local cmd="dpkg -l" command -v dpkg >/dev/null 2>&1 && local cmd="dpkg -l"
command -v rpm >/dev/null 2>&1 && local cmd="rpm -qa" command -v rpm >/dev/null 2>&1 && local cmd="rpm -qa"
if [[ -z $cmd ]]; then if [[ -z $cmd ]]; then
disp E "No usable package manager seems unavialable." disp E "No usable package manager seems unavialable."
return 2 return 2
fi fi
$cmd | grep $pkg $cmd | grep $pkg
} }
export -f pkgs export -f pkgs
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/bin/bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -36,17 +37,16 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Search processes matching the given string # Search processes matching the given string
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
ppg () ppg()
{ {
ps -edf | grep $@ | grep -v "grep $@" ps -edf | grep "$@" | grep -v "grep $@"
} }
export -f ppg export -f ppg
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Get PID list of the given process name # Get PID list of the given process name
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
gpid () gpid()
{ {
[[ $UID -eq 0 ]] && local psopt="-A" [[ $UID -eq 0 ]] && local psopt="-A"
[[ $# -eq 1 ]] && local single=1 [[ $# -eq 1 ]] && local single=1
@@ -62,14 +62,33 @@ gpid ()
} }
export -f gpid export -f gpid
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Kill all processes owned by the given users # Kill all processes owned by the given users
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
ku () ku()
{ {
for u in $@; do for u in $@; do
killall -u $u killall -u "$u"
done done
} }
export -f ku export -f ku
# ------------------------------------------------------------------------------
# Kill all children of a process then the process
# ------------------------------------------------------------------------------
kt()
{
[[ -z $1 ]] && echo -e "Usage:\n\tkt <pid> [kill_options]"
local parent_pid="$1"
shift
children_pids=$(pgrep -P "$parent_pid")
for pid in $children_pids; do
kt "$pid" "$@"
done
kill "$@" "$parent_pid"
}
# ------------------------------------------------------------------------------
# EOF

View File

@@ -38,7 +38,7 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
function timer_now function timer_now
{ {
date +%s%N date +%s%N 2>/dev/null || date +%s
} }
function timer_start function timer_start
@@ -76,21 +76,21 @@ function timer_stop
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Function triguered internaly by bash : defining prompt # Function triguered internaly by bash : defining prompt
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
set_prompt () set_prompt()
{ {
Last_Command=$? # Must come first! local Last_Command=$? # Must come first!
Blue='\[\e[0;34m\]' local Blue='\[\e[0;34m\]'
White='\[\e[01;37m\]' local White='\[\e[01;37m\]'
Yellow='\[\e[01;93m\]' local Yellow='\[\e[01;93m\]'
Red='\[\e[01;31m\]' local Red='\[\e[01;31m\]'
Green='\[\e[01;32m\]' local Green='\[\e[01;32m\]'
OnGrey='\[\e[47m\]' local OnGrey='\[\e[47m\]'
OnRed='\[\e[41m\]' local OnRed='\[\e[41m\]'
OnBlue='\[\e[44m\]' local OnBlue='\[\e[44m\]'
ICyan='\[\e[0;96m\]' local ICyan='\[\e[0;96m\]'
Default='\[\e[00m\]' local Default='\[\e[00m\]'
FancyX='\342\234\227' local FancyX='\342\234\227'
Checkmark='\342\234\223' local Checkmark='\342\234\223'
# Begin with time # Begin with time
PS1="\[\e[s$Blue$OnGrey [ \t ] $OnBlue" PS1="\[\e[s$Blue$OnGrey [ \t ] $OnBlue"
@@ -123,3 +123,6 @@ set_prompt ()
# the text color to the default. # the text color to the default.
PS1+="$ICyan\\w \\\$$Default " PS1+="$ICyan\\w \\\$$Default "
} }
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -44,143 +45,146 @@ genpwd()
local occurs=2 # Bug, if set to 1, seems to be ignored local occurs=2 # Bug, if set to 1, seems to be ignored
local symb=1 maj=1 min=1 numb=1 local symb=1 maj=1 min=1 numb=1
local nbpwd=1 local nbpwd=1
local extcar
for opt in $@; do for opt in $@; do
case $opt in case $opt in
"-h"|"--help") "-h" | "--help")
echo "genpwd: generate one or more secure random password." echo "genpwd: generate one or more secure random password."
echo echo
echo "Usage: genpwd [options] [--extracars=<cars>] [--length=<n>] [nb_passwd]" echo "Usage: genpwd [options] [--extracars=<cars>] [--length=<n>] [nb_passwd]"
echo echo
echo "Options:" echo "Options:"
echo " -h, --help Display that help screen" echo " -h, --help Display that help screen"
echo " -s, --nosymbols Exclude symbols" echo " -s, --nosymbols Exclude symbols"
echo " -n, --nonumbers Exclude numbers" echo " -n, --nonumbers Exclude numbers"
echo " -u, --noup Exclude uppercase letters" echo " -u, --noup Exclude uppercase letters"
echo " -l, --nolow Exclude lowercase letters" echo " -l, --nolow Exclude lowercase letters"
echo " -e=<c>, --extracars=<c>" echo " -e=<c>, --extracars=<c>"
echo " Add the given caracters to the possible caracter list" echo " Add the given caracters to the possible caracter list"
echo " -L=<n>, --length=<n>" echo " -L=<n>, --length=<n>"
echo " Set length of the password (default is $length)" echo " Set length of the password (default is $length)"
echo " -o=<n>, --occurences=<n>" echo " -o=<n>, --occurences=<n>"
echo " Set the maximum occurences of a same caracter (default is $occurs)" echo " Set the maximum occurences of a same caracter (default is $occurs)"
echo echo
echo "If the --extracars parameter is given, at least one of the given caracter will" echo "If the --extracars parameter is given, at least one of the given caracter will"
echo "be used in the final password." echo "be used in the final password."
echo echo
echo "Please note that some caracters might be interpreted by Bash or Awk programs," echo "Please note that some caracters might be interpreted by Bash or Awk programs,"
echo "and thus, cannot be used without provoquing errors. Those identified caracters" echo "and thus, cannot be used without provoquing errors. Those identified caracters"
echo "are :" echo "are :"
echo ' * ? \ $ { }' echo ' * ? \ $ { }'
echo echo
return 0 return 0
;; ;;
"-s"|"--nosymbols") "-s" | "--nosymbols")
symb=0 symb=0
;; ;;
"-n"|"--nonumbers") "-n" | "--nonumbers")
numb=0 numb=0
;; ;;
"-u"|"--noup") "-u" | "--noup")
maj=0 maj=0
;; ;;
"-l"|"--nolow") "-l" | "--nolow")
min=0 min=0
;; ;;
"-e"?*|"--extracars"?*) "-e"?* | "--extracars"?*)
local extcar=$(echo "$opt" | cut -f 2- -d '=') extcar=$(echo "$opt" | cut -f 2- -d '=')
;; ;;
"-L"?*|"--length"?*) "-L"?* | "--length"?*)
local length=$(echo "$opt" | cut -f 2- -d '=') local length=$(echo "$opt" | cut -f 2- -d '=')
if ! [[ $length =~ ^[0-9]+$ ]]; then if ! [[ $length =~ ^[0-9]+$ ]]; then
disp E "The --length parameter requires a number." disp E "The --length parameter requires a number."
return 1 return 1
fi fi
;; ;;
"-o"?*|"--occurences"?*) "-o"?* | "--occurences"?*)
local occurs=$(echo "$opt" | cut -f 2- -d '=') local occurs=$(echo "$opt" | cut -f 2- -d '=')
if ! [[ $occurs =~ ^[1-9]+$ ]]; then if ! [[ $occurs =~ ^[1-9]+$ ]]; then
disp E "The --occurs parameter requires a number from 1 to 9." disp E "The --occurs parameter requires a number from 1 to 9."
return 1 return 1
fi fi
;; ;;
"-*") "-*")
disp E "Unknow parameter ${opt}." disp E "Unknow parameter ${opt}."
return 1 return 1
;; ;;
*) *)
if ! [[ $opt =~ ^[1-9]+$ ]]; then if ! [[ $opt =~ ^[1-9]+$ ]]; then
disp E "Unknow parameter ${opt}." disp E "Unknow parameter ${opt}."
return 1 return 1
else else
local nbpwd=$opt nbpwd=$opt
fi fi
;; ;;
esac esac
done done
# Function selecting a random caracter from the list in parameter # Function selecting a random caracter from the list in parameter
pickcar() pickcar() {
{ # When a character is picked we check if it's not appearing already twice
# When a character is picked we check if it's not appearing already twice # elsewhere, we choose an other char, to compensate weak bash randomizer
# elsewhere, we choose an other char, to compensate weak bash randomizer while [[ -z $char ]]; do
while [[ -z $char ]]; do local char="${1:RANDOM%${#1}:1} $RANDOM"
local char=$(echo ${1:RANDOM%${#1}:1} $RANDOM) if [[ $(awk -F"$char" '{print NF-1}' <<<"$picked") -gt $occurs ]]; then
if [[ $(awk -F"$char" '{print NF-1}' <<< "$picked") -gt $occurs ]]; then unset char
unset char fi
fi done
done picked+="$char"
picked+="$char" echo "$char"
echo "$char"
} }
disp I "Generating $nbpwd passwords, please wait..." disp I "Generating $nbpwd passwords, please wait..."
for n in $( seq 1 $nbpwd ); do for n in $(seq 1 $nbpwd); do
{ {
local carset='' # store final caracter set to use local carset='' # store final caracter set to use
local picked='' # store already used caracter local picked='' # store already used caracter
local rlength=0 # store already assigned length of caracters local rlength=0 # store already assigned length of caracters
# ?, *, $ and \ impossible to use to my knowledge as it would be interpreted # ?, *, $ and \ impossible to use to my knowledge as it would be interpreted
if [[ $symb == 1 ]]; then if [[ $symb == 1 ]]; then
pickcar '!.@#&%/^-_' pickcar '!.@#&%/^-_'
carset+='!.@#&%/^-_' carset+='!.@#&%/^-_'
(( rlength++ )) ((rlength++))
fi fi
if [[ $numb == 1 ]]; then if [[ $numb == 1 ]]; then
pickcar '0123456789' pickcar '0123456789'
carset+='0123456789' carset+='0123456789'
(( rlength++ )) ((rlength++))
fi fi
if [[ $maj == 1 ]]; then if [[ $maj == 1 ]]; then
pickcar 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' pickcar 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
carset+='ABCDEFGHIJKLMNOPQRSTUVWXYZ' carset+='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
(( rlength++ )) ((rlength++))
fi fi
if [[ $min == 1 ]]; then if [[ $min == 1 ]]; then
pickcar 'abcdefghijklmnopqrstuvwxyz' pickcar 'abcdefghijklmnopqrstuvwxyz'
carset+='abcdefghijklmnopqrstuvwxyz' carset+='abcdefghijklmnopqrstuvwxyz'
(( rlength++ )) ((rlength++))
fi fi
if [[ -n $extcar ]]; then if [[ -n $extcar ]]; then
pickcar "$extcar" pickcar "$extcar"
carset+=$extcar carset+=$extcar
(( rlength++ )) ((rlength++))
fi fi
# Check if we have enough car to have something viable # Check if we have enough car to have something viable
if [[ ${#carset} -lt $length ]]; then if [[ ${#carset} -lt $length ]]; then
disp E 'Not enought caracters are authorised for the password length.' disp E 'Not enought caracters are authorised for the password length.'
disp E 'Please allow more caracter (preferably) or reduce password lentgh.' disp E 'Please allow more caracter (preferably) or reduce password lentgh.'
return 1 return 1
fi fi
for i in $( seq 1 $(( $length - $rlength )) ); do for i in $(seq 1 $(($length - $rlength))); do
pickcar "$carset" pickcar "$carset"
done done
} | sort -R | awk '{printf "%s", $1}' } | sort -R | awk '{printf "%s", $1}'
unset picked carset rlength unset picked carset rlength
echo echo
done done
} }
export -f genpwd export -f genpwd
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -43,7 +44,7 @@ rain()
local rain_colors=("\e[37m" "\e[37;1m") local rain_colors=("\e[37m" "\e[37;1m")
# More from 256 color mode # More from 256 color mode
for i in {244..255}; do for i in {244..255}; do
rain_colors=( "${rain_colors[@]}" "\e[38;5;${i}m" ) rain_colors=("${rain_colors[@]}" "\e[38;5;${i}m")
done done
local rain_tab=${#rain_cars[@]} local rain_tab=${#rain_cars[@]}
local rain_color_tab=${#rain_colors[@]} local rain_color_tab=${#rain_colors[@]}
@@ -54,18 +55,17 @@ rain()
local X=0 Y=0 drop_length=0 rain_drop=0 local X=0 Y=0 drop_length=0 rain_drop=0
local max_rain_width=0 new_rain_odd=0 falling_odd=0 local max_rain_width=0 new_rain_odd=0 falling_odd=0
sigwinch() { sigwinch() {
term_width=$(tput cols) term_width=$(tput cols)
term_height=$(tput lines) term_height=$(tput lines)
#step_duration=0.025 #step_duration=0.025
(( max_rain_width = term_width * term_height / 4 )) ((max_rain_width = term_width * term_height / 4))
(( max_rain_height = term_height < 10 ? 1 : term_height / 10 )) ((max_rain_height = term_height < 10 ? 1 : term_height / 10))
# In percentage # In percentage
(( new_rain_odd = term_height > 50 ? 100 : term_height * 2 )) ((new_rain_odd = term_height > 50 ? 100 : term_height * 2))
(( new_rain_odd = new_rain_odd * 75 / 100 )) ((new_rain_odd = new_rain_odd * 75 / 100))
(( falling_odd = term_height > 25 ? 100 : term_height * 4 )) ((falling_odd = term_height > 25 ? 100 : term_height * 4))
(( falling_odd = falling_odd * 90 / 100 )) ((falling_odd = falling_odd * 90 / 100))
} }
do_exit() { do_exit() {
@@ -80,19 +80,19 @@ rain()
Y=${rains[idx + 1]} Y=${rains[idx + 1]}
drop_length=${rains[idx + 4]} drop_length=${rains[idx + 4]}
for ((y = Y; y < Y + drop_length; y++)); do for ((y = Y; y < Y + drop_length; y++)); do
(( y < 1 || y > term_height )) && continue ((y < 1 || y > term_height)) && continue
echo -ne "\e[${y};${X}H " echo -ne "\e[${y};${X}H "
done done
done done
for ((idx = 0; idx < num_rains * num_rain_metadata; idx += num_rain_metadata)); do for ((idx = 0; idx < num_rains * num_rain_metadata; idx += num_rain_metadata)); do
if (( 100 * RANDOM / 32768 < falling_odd )); then if ((100 * RANDOM / 32768 < falling_odd)); then
# Falling # Falling
if (( ++rains[idx + 1] > term_height )); then if ((++rains[idx + 1] > term_height)); then
# Out of screen, bye sweet <3 # Out of screen, bye sweet <3
rains=("${rains[@]:0:idx}" rains=("${rains[@]:0:idx}"
"${rains[@]:idx+num_rain_metadata:num_rains*num_rain_metadata}") "${rains[@]:idx+num_rain_metadata:num_rains*num_rain_metadata}")
(( num_rains-- )) ((num_rains--))
continue continue
fi fi
fi fi
@@ -102,7 +102,7 @@ rain()
drop_color=${rains[idx + 3]} drop_color=${rains[idx + 3]}
drop_length=${rains[idx + 4]} drop_length=${rains[idx + 4]}
for ((y = Y; y < Y + drop_length; y++)); do for ((y = Y; y < Y + drop_length; y++)); do
(( y < 1 || y > term_height )) && continue ((y < 1 || y > term_height)) && continue
echo -ne "\e[${y};${X}H${drop_color}${rain_drop}" echo -ne "\e[${y};${X}H${drop_color}${rain_drop}"
done done
done done
@@ -118,24 +118,24 @@ rain()
local rains=() local rains=()
local num_rains=0 local num_rains=0
sigwinch sigwinch
while (( exit_st <= 0 )); do while ((exit_st <= 0)); do
if (( $exit_st <=0 )); then if (($exit_st <= 0)); then
read -n 1 -t $step_duration ch read -n 1 -t $step_duration ch
case "$ch" in case "$ch" in
q|Q) q | Q)
do_exit do_exit
;; ;;
esac esac
if (( num_rains < max_rain_width )) && (( 100 * RANDOM / 32768 < new_rain_odd )); then if ((num_rains < max_rain_width)) && ((100 * RANDOM / 32768 < new_rain_odd)); then
# Need new |, 1-based # Need new |, 1-based
rain_drop="${rain_cars[rain_tab * RANDOM / 32768]}" rain_drop="${rain_cars[rain_tab * RANDOM / 32768]}"
drop_color="${rain_colors[rain_color_tab * RANDOM / 32768]}" drop_color="${rain_colors[rain_color_tab * RANDOM / 32768]}"
drop_length=$(( max_rain_height * RANDOM / 32768 + 1 )) drop_length=$((max_rain_height * RANDOM / 32768 + 1))
X=$(( term_width * RANDOM / 32768 + 1 )) X=$((term_width * RANDOM / 32768 + 1))
Y=$(( 1 - drop_length )) Y=$((1 - drop_length))
rains=( "${rains[@]}" "$X" "$Y" "$rain_drop" "$drop_color" "$drop_length" ) rains=("${rains[@]}" "$X" "$Y" "$rain_drop" "$drop_color" "$drop_length")
(( num_rains++ )) ((num_rains++))
fi fi
# Let rain fall! # Let rain fall!
@@ -152,3 +152,6 @@ rain()
trap - WINCH trap - WINCH
} }
export -f rain export -f rain
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -36,70 +37,80 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Remove host from know_host (name and IP) for the active user # Remove host from know_host (name and IP) for the active user
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
rmhost () rmhost()
{ {
if [[ "$#" -lt 1 ]]; then if [[ "$#" -lt 1 ]]; then
disp E "Incorrect number of parameters." disp E "Incorrect number of parameters."
disp E "Usage: rmhost <hostname|ip> [hostname2|ip2 [...]]" disp E "Usage: rmhost <hostname|ip> [hostname2|ip2 [...]]"
return 1 return 1
fi fi
while [[ $1 ]]; do while [[ $1 ]]; do
local hst=$1 && shift local hst=$1 && shift
isipv4 $hst > /dev/null isipv4 "$hst" >/dev/null
local v4=$? local v4=$?
isipv6 $hst > /dev/null isipv6 "$hst" >/dev/null
local v6=$? local v6=$?
if [[ $v4 -eq 0 || $v6 -eq 0 ]]; then if [[ $v4 -eq 0 || $v6 -eq 0 ]]; then
local ip=$hst local ip=$hst
unset hst unset hst
fi fi
unset v4 v6 unset v4 v6
if [[ ! $ip && $hst ]]; then if [[ ! $ip && $hst ]]; then
ip=$(host $hst | grep "has address" | awk '{print $NF}') if ! ip=$(host "$hst" 2>/dev/null | awk '/has address/ {print $NF; exit}'); then
[[ ! $? ]] && disp E "Impossible to extract IP from hostname." &&
disp E "Impossible to extract IP from hostname." && return 1
return 1 fi
fi [[ -z $ip ]] && {
disp E "Impossible to extract IP from hostname."
if [[ $hst ]]; then return 1;
disp I "Removing host $hst from ssh known_host..." }
ssh-keygen -R $hst > /dev/null fi
fi
if [[ $ip ]]; then if [[ $hst ]]; then
disp I "Removing IP $ip from ssh known_host..." disp I "Removing host $hst from ssh known_host..."
ssh-keygen -R $ip > /dev/null ssh-keygen -R $hst >/dev/null
fi fi
unset hst ip if [[ $ip ]]; then
disp I "Removing IP $ip from ssh known_host..."
ssh-keygen -R $ip >/dev/null
fi
unset hst ip
done done
} }
export -f rmhost export -f rmhost
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Login root via SSH on the given machine # Login root via SSH on the given machine
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
ssr () ssr()
{ {
for opt in $@ ; do for opt in $@; do
case $opt in case $opt in
"-h"|"--help") "-h" | "--help")
echo "ssr: do a root user ssh login." echo "ssr: do a root user ssh login."
echo echo
echo "Usage: ssr <server [ssh options]>" echo "Usage: ssr <server [ssh options]>"
return 0 return 0
;; ;;
esac esac
done done
command -v ssh >/dev/null 2>&1 || {
disp E "ssh is not installed."
return 127
}
[[ ! $1 ]] && [[ ! $1 ]] &&
disp E "Please specify the server you want to log in." && disp E "Please specify the server you want to log in." &&
return 1 return 1
local srv=$1 && shift local srv=$1 && shift
ssh -Y root@$srv $@ ssh -Y root@"$srv" "$@"
} }
export -f ssr export -f ssr
# ------------------------------------------------------------------------------
# EOF

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env bash
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org> # Copyright (c) 2013-2022 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
# Protected by the BSD3 license. Please read bellow for details. # Protected by the BSD3 license. Please read bellow for details.
@@ -33,24 +34,102 @@
# * OF SUCH DAMAGE. # * OF SUCH DAMAGE.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
export BASE_URL="https://git.geoffray-levasseur.org/fatalerrors/profile"
export UPDT_URL="$BASE_URL/raw/branch/master"
export ARCH_URL="$BASE_URL/archive/master.tar.gz"
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Check for profile updates # Check for profile updates
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
check_updates() check_updates()
{ {
if [[ $1 == "-q" ]]; then
# Quiet mode is mostly used internally when profile_upgrade is called
quiet=1
fi
disp I "Checking for updates..." disp I "Checking for updates..."
local vfile="/tmp/version" local vfile="/tmp/version"
wget "$UPDT_URL/version" -O $vfile 2&>1 /dev/null || { wget "$UPDT_URL/version" -O $vfile >/dev/null 2>&1 || {
disp E "Can\'t download information file, impossible to proceed!" disp E "Can't download version file, impossible to proceed!"
return 1 return 5
} }
if [[ -s /tmp/version ]]; then
local lastver=$(cat /tmp/version) if [[ -s $vfile ]]; then
if [[ $lastver != $PROFVERSION ]]; then local lastver=$(cat $vfile)
disp I "You have version $PROFVERSION installed. Version $lastver is available." if [[ $lastver != $PROFVERSION ]]; then
disp I "You should upgrade to last version when possible." disp I "You have version $PROFVERSION installed. Version $lastver is available."
fi [[ $quiet ]] && disp I "You should upgrade to last version when possible."
result=1
else
disp I "Your version is up-to-date."
result=0
fi
rm -f $vfile
else else
disp E "Impossible to read temporary file, impossible to proceed." disp E "Impossible to read temporary file, impossible to proceed."
fi
unset lastver vfile
return $result
}
# ------------------------------------------------------------------------------
# Apply update to profile
# ------------------------------------------------------------------------------
profile_upgrade()
{
check_updates -q
local need_update=$?
[[ $need_update -ne 1 ]] && {
disp "No update available."
return 0
}
if [[ -s $MYPATH/profile.sh ]]; then
disp E "Installation path detection failed, cannot upgrade automatically."
return 1
fi
if [[ -d $MYPATH/.git ]]; then
disp I "Git installation detected, applying git pull."
local curdir=$(pwd)
cd $MYPATH
git pull || {
disp E "Git pull failed, upgrade not applyed."
cd "$curdir"
return 2
}
disp I "Successfully upgraded using git."
cd "$curdir"
else
disp I "No Git detected. Downloading and applying upgrade from archive..."
local tmpdir="/tmp/profile_upg.$$"
mkdir -p "$tmpdir" || {
disp E "Failed to create temporary directory."
return 4
}
local archive="$tmpdir/profile.tar.gz"
wget -q "$ARCH_URL" -O "$archive" || {
disp E "Failed to download archive."
rm -rf "$tmpdir"
return 5
}
tar -xzf "$archive" -C "$tmpdir" || {
disp E "Archive extraction failed."
rm -rf "$tmpdir"
return 6
}
disp I "Installing new version..."
cp -r "$tmpdir"/profile/* "$MYPATH"/ || {
disp E "Failed to copy new files to $MYPATH."
rm -rf "$tmpdir"
return 7
}
disp I "Upgrade complete. You should now logout and login again."
rm -rf "$tmpdir"
fi fi
} }
# EOF

View File

@@ -35,8 +35,8 @@
# * OF SUCH DAMAGE. # * OF SUCH DAMAGE.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
if [[ ! $(echo $SHELL | grep bash) ]]; then if [[ ! $SHELL =~ bash|zsh ]]; then
echo "That environmet script is designed to be used with bash or zsh being the shell." echo "That environment script is designed to be used with bash or zsh being the shell."
echo "Please consider using bash or zsh instead, or patch me ;)!" echo "Please consider using bash or zsh instead, or patch me ;)!"
return 1 return 1
fi fi
@@ -44,35 +44,34 @@ fi
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# path* : private functions for PATH variable management # path* : private functions for PATH variable management
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
pathremove () pathremove()
{ {
local ifs=':' local IFS=':'
local newpath local newpath
local dir local dir
local pathvar=${2:-PATH} local pathvar=${2:-PATH}
for dir in ${!pathvar} ; do for dir in ${!pathvar}; do
if [ "$dir" != "$1" ] ; then if [ "$dir" != "$1" ]; then
newpath=${newpath:+$newpath:}$dir newpath=${newpath:+$newpath:}$dir
fi fi
done done
export $pathvar="$newpath" export $pathvar="$newpath"
} }
pathprepend () pathprepend()
{ {
pathremove $1 $2 pathremove $1 $2
local pathvar=${2:-PATH} local pathvar=${2:-PATH}
export $pathvar="$1${!pathvar:+:${!pathvar}}" export $pathvar="$1${!pathvar:+:${!pathvar}}"
} }
pathappend () pathappend()
{ {
pathremove $1 $2 pathremove $1 $2
local pathvar=${2:-PATH} local pathvar=${2:-PATH}
export $pathvar="${!pathvar:+${!pathvar}:}$1" export $pathvar="${!pathvar:+${!pathvar}:}$1"
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# ********************************** MAIN PROGRAM ****************************** # ********************************** MAIN PROGRAM ******************************
@@ -80,28 +79,36 @@ pathappend ()
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Store script's path (realpath -s resolve symlinks if profile.sh is a symlink) # Store script's path (realpath -s resolve symlinks if profile.sh is a symlink)
export MYPATH=$(dirname $(realpath -s $0)) if [[ -z "$PROFILE_PATH" ]]; then
if [[ ! -e $MYPATH/profile.sh ]]; then export MYPATH=$(dirname "$(realpath -s "$0")")
echo "[ Warning ] Path detection failed, using pwd..." else
export MYPATH="$PROFILE_PATH"
fi
if [[ ! -e "$MYPATH/profile.sh" ]]; then
echo "[ Warning ] Path detection failed, trying to use pwd..."
MYPATH=$(pwd) MYPATH=$(pwd)
if [[ ! -e $MYPATH/profile.sh ]]; then if [[ ! -e "$MYPATH/profile.sh" ]]; then
echo "[ Error ] Impossible to determine installation path, pretty much nothing will work." echo "[ Error ] Impossible to determine installation path, pretty much nothing will work."
fi fi
fi fi
if [[ ! -s $MYPATH/version ]]; then if [[ ! -s "$MYPATH/version" ]]; then
echo "[ Warning ] Impossible to determine running version of profile, your installation might be broken." echo "[ Warning ] Impossible to determine running version of profile, your installation might be broken."
fi fi
export PROFVERSION=$(cat $MYPATH/version) export PROFVERSION=$(cat "$MYPATH"/version)
# Build PATH environment variable # Build PATH environment variable
if [[ $EUID -eq 0 ]] ; then if [[ $EUID -eq 0 ]]; then
pathappend /sbin:/usr/sbin pathappend /sbin:/usr/sbin
fi fi
[[ -d /share/services/gestparc ]] && pathappend /share/services/gestparc [[ -d /share/services/gestparc ]] && pathappend /share/services/gestparc
[[ -d ~/bin ]] && pathappend ~/bin [[ -d ~/bin ]] && pathappend ~/bin
[[ -d ~/.local/bin ]] && pathappend ~/.local/bin [[ -d ~/.local/bin ]] && pathappend ~/.local/bin
# ------------------------------------------------------------------------------
# Default values are set here and will be overloaded with config file if any
# ------------------------------------------------------------------------------
# Set bash history # Set bash history
export HISTSIZE=50000 export HISTSIZE=50000
export HISTIGNORE="&:[bf]g:exit" export HISTIGNORE="&:[bf]g:exit"
@@ -125,14 +132,14 @@ export DEFAULT_CITY="Toulouse"
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Load global configuration # Load global configuration
[[ -f $MYPATH/etc/profile.conf ]] && . ~/.profile.conf [[ -f $MYPATH/etc/profile.conf ]] && . $MYPATH/etc/profile.conf
# Load personal configuration # Load personal configuration
[[ -f ~/.profile.conf ]] && . ~/.profile.conf [[ -f ~/.profile.conf ]] && . ~/.profile.conf
# Load module scripts # Load module scripts
for script in $MYPATH/profile.d/*.sh ; do for script in $MYPATH/profile.d/*.sh; do
if [ -r $script ] ; then if [[ -r $script ]]; then
. $script . $script
fi fi
done done
@@ -168,6 +175,7 @@ if [[ $INTERACTIVE ]]; then
alias du='du -ch' alias du='du -ch'
alias sdu='du -sk ./* | sort -n' alias sdu='du -sk ./* | sort -n'
alias hdu='du -hs ./* | sort -H'
# Define PS1 # Define PS1
trap 'timer_start' DEBUG trap 'timer_start' DEBUG

View File

@@ -1 +1 @@
3.3.1 3.4.0