From 57103606ca5a20f6a9e520e95ea14998d5b110a3 Mon Sep 17 00:00:00 2001 From: levasseur Date: Tue, 21 Sep 2021 17:38:04 +0200 Subject: [PATCH] added profile files, removed personal figlet font --- modules/install_profile.sh | 2 +- repo/common/.bashrc | 115 +++++ repo/common/.profile | 27 + repo/common/profile | 987 +++++++++++++++++++++++++++++++++++++ 4 files changed, 1130 insertions(+), 1 deletion(-) create mode 100644 repo/common/.bashrc create mode 100644 repo/common/.profile create mode 100644 repo/common/profile diff --git a/modules/install_profile.sh b/modules/install_profile.sh index fa7c157..cc72c7f 100644 --- a/modules/install_profile.sh +++ b/modules/install_profile.sh @@ -13,7 +13,7 @@ export DEP_install_profile="install_pkg" install_profile() { - installfile ansi_shadow.flf /usr/share/figlet/ansi_shadow.flf + #installfile ansi_shadow.flf /usr/share/figlet/ansi_shadow.flf local usrlist="/root" if find /home -mindepth 1 -maxdepth 1 -type d | read; then diff --git a/repo/common/.bashrc b/repo/common/.bashrc new file mode 100644 index 0000000..7f332ba --- /dev/null +++ b/repo/common/.bashrc @@ -0,0 +1,115 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# If set, the pattern "**" used in a pathname expansion context will +# match all files and zero or more directories and subdirectories. +#shopt -s globstar + +# make less more friendly for non-text input files, see lesspipe(1) +#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + #alias grep='grep --color=auto' + #alias fgrep='fgrep --color=auto' + #alias egrep='egrep --color=auto' +fi + +# colored GCC warnings and errors +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + +# some more ls aliases +#alias ll='ls -l' +#alias la='ls -A' +#alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +. ~/profile diff --git a/repo/common/.profile b/repo/common/.profile new file mode 100644 index 0000000..d89ea5a --- /dev/null +++ b/repo/common/.profile @@ -0,0 +1,27 @@ +# ~/.profile: executed by the command interpreter for login shells. +# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login +# exists. +# see /usr/share/doc/bash/examples/startup-files for examples. +# the files are located in the bash-doc package. + +# the default umask is set in /etc/profile; for setting the umask +# for ssh logins, install and configure the libpam-umask package. +#umask 022 + +# if running bash +if [ -n "$BASH_VERSION" ]; then + # include .bashrc if it exists + if [ -f "$HOME/.bashrc" ]; then + . "$HOME/.bashrc" + fi +fi + +# set PATH so it includes user's private bin if it exists +if [ -d "$HOME/bin" ] ; then + PATH="$HOME/bin:$PATH" +fi + +# set PATH so it includes user's private bin if it exists +if [ -d "$HOME/.local/bin" ] ; then + PATH="$HOME/.local/bin:$PATH" +fi diff --git a/repo/common/profile b/repo/common/profile new file mode 100644 index 0000000..14871a9 --- /dev/null +++ b/repo/common/profile @@ -0,0 +1,987 @@ +#!/bin/bash +# Begin profile +# ------------------------------------------------------------------------------------------ +# Initial version from Beyond Linux From Scratch by +# * James Robertson +# * Dagmar d'Surreal +# ------------------------------------------------------------------------------------------ +# Current version from Geoffray Levasseur +# 16/02/2013 Version 1.0.0 : Initial version +# 24/10/2015 Version 2.0.0 : Added some advanced functionnalities (clean, srr, etc.) +# 04/02/2017 Version 2.0.1 : clean improvements (--shell) +# 16/09/2018 Version 2.1.0 : Added rmhost, setc, setfr, review of locales management +# 23/09/2019 Version 2.1.1 : [bugfix] dpkgs +# 24/09/2019 Version 2.1.2 : [bugfix] bug in profile version display +# 16/12/2019 Version 2.2.0 : Added showinfo, primary write of showdiskmap (to be finished) +# 08/01/2020 Version 2.3.0 : Added use of figlet and neofetch as an equivalent to motd +# 16/01/2020 Version 2.3.1 : [bugfix] non-interactive mode were blocked with some functions +# 31/01/2020 Version 2.3.2 : Figlet : changed default font to ansi_shadow +# 02/03/2020 Version 2.4.0 : Added command auzip +# 03/03/2020 Version 2.5.0 : Added command taz and rmspc, auzip renamed utaz and improved +# 05/03/2020 Version 2.5.1 : Language consistancy fix, added pigz support in taz +# 06/03/2020 Version 2.5.2 : Few aliases sorted out +# 11/09/2020 Version 2.5.3 : Few more aliases, improved code consistancy and typo, +# : improved utaz, removed showdiskmap, removed remaining French, +# : added license information for future publication +# 24/10/2020 Version 2.6.0 : Added session save and restore for Konsole +# 25/12/2020 Version 2.6.1 : Add check on rmhost, improvements rmspc, created expendlist +# 26/02/2021 Version 2.6.2 : taz: corrected bug with trailing slash on directories +# ------------------------------------------------------------------------------------------ +# Copyright (c) 2013-2020 Geoffray Levasseur +# Protected by the BSD3 license. Please read bellow for details. +# +# * Redistribution and use in source and binary forms, +# * with or without modification, are permitted provided +# * that the following conditions are met: +# * +# * Redistributions of source code must retain the above +# * copyright notice, this list of conditions and the +# * following disclaimer. +# * +# * Redistributions in binary form must reproduce the above +# * copyright notice, this list of conditions and the following +# * disclaimer in the documentation and/or other materials +# * provided with the distribution. +# * +# * Neither the name of the copyright holder nor the names +# * of any other contributors may be used to endorse or +# * promote products derived from this software without +# * specific prior written permission. +# * +# * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +# * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# * OF SUCH DAMAGE. +# ------------------------------------------------------------------------------------------ + +export PROFVERSION="2.6.1" + +export DEFAULT_CITY="Toulouse" + +# ------------------------------------------------------------------------------------------ +# path* : private functions for PATH variable management +# ------------------------------------------------------------------------------------------ +pathremove () +{ + local ifs=':' + local newpath + local dir + local pathvar=${2:-PATH} + for dir in ${!pathvar} ; do + if [ "$dir" != "$1" ] ; then + newpath=${newpath:+$newpath:}$dir + fi + done + export $pathvar="$newpath" +} + +pathprepend () +{ + pathremove $1 $2 + local pathvar=${2:-PATH} + export $pathvar="$1${!pathvar:+:${!pathvar}}" +} + +pathappend () +{ + pathremove $1 $2 + local pathvar=${2:-PATH} + export $pathvar="${!pathvar:+${!pathvar}:}$1" +} + +# ------------------------------------------------------------------------------------------ +# expandlist : treat wildcards in a file/directory list +# ------------------------------------------------------------------------------------------ +expandlist() +{ + local result="" + for item in "$1"; do + for content in "$item"; do + result+="\"$content\" " + done + done + echo $result +} + +# ------------------------------------------------------------------------------------------ +# timer_* functions : internal timing function for prompt +# ------------------------------------------------------------------------------------------ +function timer_now +{ + date +%s%N +} + +function timer_start +{ + timer_start=${timer_start:-$(timer_now)} +} + +function timer_stop +{ + local delta_us=$((($(timer_now) - $timer_start) / 1000)) + local us=$((delta_us % 1000)) + local ms=$(((delta_us / 1000) % 1000)) + local s=$(((delta_us / 1000000) % 60)) + local m=$(((delta_us / 60000000) % 60)) + local h=$((delta_us / 3600000000)) + # Goal: always show around 3 digits of accuracy + if ((h > 0)); then timer_show=${h}h${m}m + elif ((m > 0)); then timer_show=${m}m${s}s + elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s + elif ((s > 0)); then timer_show=${s}.$(printf %03d $ms)s + elif ((ms >= 100)); then timer_show=${ms}ms + elif ((ms > 0)); then timer_show=${ms}.$((us / 100))ms + else timer_show=${us}us + fi + unset timer_start +} + +# ------------------------------------------------------------------------------------------ +# Function triguered internaly by bash : defining prompt +# ------------------------------------------------------------------------------------------ +set_prompt () +{ + Last_Command=$? # Must come first! + Blue='\[\e[0;34m\]' + White='\[\e[01;37m\]' + Yellow='\[\e[01;93m\]' + Red='\[\e[01;31m\]' + Green='\[\e[01;32m\]' + OnGrey='\[\e[47m\]' + OnRed='\[\e[41m\]' + OnBlue='\[\e[44m\]' + ICyan='\[\e[0;96m\]' + Default='\[\e[00m\]' + FancyX='\342\234\227' + Checkmark='\342\234\223' + + # Begin with time + PS1="$Blue$OnGrey[ \t ]$Default " + + # Add a bright white exit status for the last command + + # If it was successful, print a green check mark. Otherwise, print + # a red X. + if [[ $Last_Command == 0 ]]; then + PS1+="$White$OnBlue[ \$Last_Command " + PS1+="$Green$Checkmark " + else + PS1+="$White$OnRed[ \$Last_Command " + PS1+="$Yellow$FancyX " + fi + + # Add the ellapsed time and current date + timer_stop + PS1+="($timer_show)$White ]$Default " + + # If root, just print the host in red. Otherwise, print the current user + # and host in green. + if [[ $EUID -eq 0 ]]; then + PS1+="$Red\\u$Green@\\h " + else + PS1+="$Green\\u@\\h " + fi + # Print the working directory and prompt marker in blue, and reset + # the text color to the default. + PS1+="$ICyan\\w \\\$$Default " +} + +# ------------------------------------------------------------------------------------------ +# Show profile version +# ------------------------------------------------------------------------------------------ +ver () +{ + echo "Profile version $PROFVERSION." +} +export ver +# ------------------------------------------------------------------------------------------ +# Change locale to French +# ------------------------------------------------------------------------------------------ +setfr () +{ + # Set fr locale definitions + export LANG=fr_FR.UTF-8 + export LC_MESSAGES=fr_FR.UTF-8 + export LC_ALL=fr_FR.UTF-8 +} +export setfr + +# ------------------------------------------------------------------------------------------ +# Change locale to C standard +# ------------------------------------------------------------------------------------------ +setc () +{ + # Locale definitions + export LANG=C + export LC_MESSAGES=C + export LC_ALL=C +} +export setc + +# ------------------------------------------------------------------------------------------ +# Change locale to US (needed by Steam) +# ------------------------------------------------------------------------------------------ +setus () +{ + # Locale definitions + export LANG=en_US.UTF-8 + export LC_MESSAGES=en_US.UTF-8 + export LC_ALL=en_US.UTF-8 +} +export setc + +# ------------------------------------------------------------------------------------------ +# Display weather of the given city (or default one) +# ------------------------------------------------------------------------------------------ +meteo () +{ + cities=$@ + [[ $# -eq 0 ]] && local cities=$DEFAULT_CITY + + for city in $cities; do + curl wttr.in/$city + done +} +export meteo + +# ------------------------------------------------------------------------------------------ +# Clean a directory or a tree from temporary or backup files +# ------------------------------------------------------------------------------------------ +clean () +{ + for opt in $@ ; do + case $opt in + "-r"|"--recurs") + local recursive=1 + ;; + + "-h"|"--help") + echo "clean : erase backup files in the given directories." + echo + echo "Usage : clean [option] [directory1] [...[directoryX]]" + echo + echo "Options :" + echo " -h, --help Display that help screen" + echo " -r, --recurs Do a recursive cleaning" + echo " -f, --force Do not ask for confirmation (use with care)" + echo " -s, --shell Do nothing and display what will be executed" + echo + return 0 + ;; + + "-s"|"--shell") + local outshell=1 + ;; + + "-f"|"--force") + local force=1 + ;; + + "-"*) + echo "Invalid option, use \"clean --help\" to display usage." + echo + return 1 + ;; + + *) + local dirlist="$dirlist $opt" + ;; + esac + done + + [[ ! $dirlist ]] && local dirlist=$(pwd) + + [[ ! $recursive ]] && local findopt="-maxdepth 1" + [[ ! $force ]] && local rmopt="-i" + unset recursive force + + for dir in $dirlist; do + local dellist=$(find $dir $findopt -type f -name "*~" -o -name "#*#" -o -name "*.bak" -o -name ".~*#") + for f in $dellist; do + if [[ ! $outshell ]]; then + rm $rmopt $f + else + echo "rm $rmopt $f" + fi + done + done + unset outshell dirlist dellist findopt rmopt +} +export clean + +# ------------------------------------------------------------------------------------------ +# Login root via SSH on the given machine +# ------------------------------------------------------------------------------------------ +ssr () +{ + for opt in $@ ; do + case $opt in + "-h"|"--help") + echo "ssr: do a root user ssh login." + echo + echo "Usage : ssr " + return 0 + ;; + esac + done + + [[ ! $1 ]] && + echo "Please specify the server you want to log in." && return 1 + + local srv=$1 && shift + + ssh -x root@$srv $@ +} +export ssr + +# ------------------------------------------------------------------------------------------ +# Look for a package within installed one +# ------------------------------------------------------------------------------------------ +dpkgs () +{ + local count=0 + for opt in $@ ; do + case $opt in + "-h"|"--help") + echo "dpkgs: look for an installed package by it's name." + echo + echo "Usage: dpkgs " + return 0 + ;; + + "-"*) + echo "Invalid option, use \"dpkgs --help\" to display usage." + echo + return 1 + ;; + + *) + local pkg=$1 && shift + count=$(( $count + 1 )) + [[ $count -gt 1 ]] && + echo "*** Error: Please specify a package name, without space, eventually partial." && return 1 + + ;; + esac + done + [[ $count -lt 1 ]] && echo "*** Error: Please specify a package name, without space, eventually partial." && return 1 + + [[ -x /usr/sbin/dpkg ]] && "*** Error: dpkg command seems unavialable." && return 2 + + dpkg -l | grep $pkg +} +export dpkgs + +# ------------------------------------------------------------------------------------------ +# Search processes matching the given string +# ------------------------------------------------------------------------------------------ +ppg () +{ + ps -edf | grep $@ | grep -v "grep $@" +} +export ppg + +# ------------------------------------------------------------------------------------------ +# Create a directory then goes inside +# ------------------------------------------------------------------------------------------ +mcd () { + if [[ ! $# -eq 1 ]] ; then + echo "Create a directory then goes inside." + echo "Usage : mcd " + return 1 + fi + mkdir -pv $1 && cd $1 +} +export mcd + +# ------------------------------------------------------------------------------------------ +# Get PID list of the given process name +# ------------------------------------------------------------------------------------------ +gpid () { + [[ $# -eq 1 ]] && local single=1 + for pid in $@; do + local result=$(ps -A | grep $pid | awk '{print $1}') + if [[ $single ]]; then + [[ $result ]] && echo "$result" + else + [[ $result ]] && echo "$pid: $result" + fi + done + [[ $result ]] || return 1 +} +export gpid + +# ------------------------------------------------------------------------------------------ +# Remove host from know_host (name and IP) for the active user +# ------------------------------------------------------------------------------------------ +rmhost () { + if [[ "$#" -ne 1 ]]; then + echo "Error: incorrect number of parameters." + echo "Usage: rmhost " + return 1 + fi + + hst=$1 + ip=$(host $hst | grep "has address" | awk '{print $NF}') + [[ ! $? ]] && echo "*** rmhost(): Error extracting IP from hostname." && return 1 + + echo "Removing host $hst from ssh known_host..." + ssh-keygen -R $hst > /dev/null + echo "Removing IP $ip from ssh known_host..." + ssh-keygen -R $ip > /dev/null +} +export rmhost + +# ------------------------------------------------------------------------------------------ +# Rename all files in current directory to replace spaces with _ +# ------------------------------------------------------------------------------------------ +rmspc () { + local lst="" + for opt in $@ ; do + case $opt in + "-h"|"--help") + echo "rmspc : remove spaces from all filenames in current directories" + echo + echo "Usage : rmspc [option]" + echo + echo "Options :" + echo " -h, --help Display that help screen" + echo " -r, --recursive Treat subdiretories of the given directories" + echo " -c, --subst-char Change the replacement character (default is underscore)" + echo " -v, --verbose Display what is being done" + echo " -s, --shell Do nothing and display commands that would be executed" + echo + return 0 + ;; + + "-r"|"--recursive") + local recurs=1 + ;; + + "-c"?*|"--subst-char"?*) + local substchar=$(echo "$opt" | cut -f 2- -d '=') + ;; + + "-v"|"--verbose") + local verb=1 + ;; + + "-s"|"--shell") + local shell=1 + ;; + + *) + echo "Invalid parameter, use \"rmspc --help\" to display options list" + echo + return 1 + ;; + esac + done + + [[ ! $substchar ]] && substchar="_" + [[ $verb ]] && local mvopt="-v" + + for f in *\ *; do + [[ $recurs ]] && [[ -d "$f" ]] && ( + #[[ $verb ]] && echo "Entering directory $f ..." + pushd "$f" > /dev/null + rmspc --subst-char="$substchar" $mvopt --shell + popd > /dev/null + #[[ $verb ]] && echo "Leaving directory $f" + ) + + if [[ $(echo $f | grep " ") ]]; then + local newf="${f// /${substchar}}" + local command="mv $mvopt \"$f\" \"$newf\"" + if [[ $shell ]]; then + echo $command + else + $command + fi + fi + done + unset lst substchar verb shell newf command mvopt +} +export rmspc + +# ------------------------------------------------------------------------------------------ +# Smartly uncompress archives (zip only) +# ------------------------------------------------------------------------------------------ +utaz() +{ + for opt in $@ ; do + case $opt in + "-h"|"--help") + echo "utaz : uncompress all the given files and/or the ones found in the given" + echo " directories creating an host directory where needed." + echo + echo "Usage : utaz [option] [directorie(s)|file(s)]" + echo + echo "Options :" + echo " -h, --help Display that help screen" + echo " -d, --delete If decompression success, delete the source file" + echo " -c, --create-dir Always create a host directory" + echo " -n, --no-dir Never create a host directory" + echo + return 0 + ;; + + "-d"|"--delete") + local willrm=1 + ;; + + "-c"|"--create-dir") + local createdir=1 + ;; + + "-n"|"--no-dir") + local nodir=1 + ;; + + "-"*) + echo "Invalid option, use \"utaz --help\" to display options list" + echo + return 1 + ;; + + *) + # The ${opt%/} writing is to remove trailing / if any + local LIST="$LIST ${opt%/}" + ;; + esac + done + + [[ $createdir && $nodir ]] && echo "*** Error: --create-dir and --no-dir options are mutually exclusive." + + [[ ! $LIST ]] && local LIST="." + + for zitem in $LIST; do + [[ $(ls $zitem/*.zip 2> /dev/null | wc -l) -eq 0 ]] && + echo "$zitem contains no supported archive file, skipping." && + continue + + for f in $zitem/*.zip; do + echo -n "Processing archive $zitem/$f... " + local dir=${f::-4} + + mkdir -p $dir + [[ $? -gt 0 ]] && + echo "[ filesystem can't create directories, exit ]" && + return 1 + + unzip -o $f -d $dir > /dev/null 2>&1 + case $? in + 0) + [[ $willrm ]] && rm -f $f && echo -n "Deleted ! " + ;; + + 1) + echo "No deletion on warnings " + ;; + *) + echo "[ zip file corrupted, failed ]" + rm -rf $dir > /dev/null 2>&1 + continue + ;; + esac + + if [[ $createdir ]]; then + echo -n "[ subdir created, " + elif [[ $nodir ]]; then + mv ./$dir/* ./ && rmdir $dir + echo -n "[ No subdir, " + else + subdirs=$(find $dir -maxdepth 1 | wc -l) + if [[ $subdirs -eq 2 ]]; then + mv ./$dir/* ./ && rmdir $dir + echo -n "[ No subdir, " + else + echo -n "[ subdir created, " + fi + fi + echo " OK ]" + done + done +} +export utaz + +# ------------------------------------------------------------------------------------------ +# Compress directories or files into one or more archive +# ------------------------------------------------------------------------------------------ +taz() +{ + _doxz() + { + command -v xz >/dev/null 2>&1 || { + echo -e >&2 "\t*** The program 'xz' is not installed, aborting." + return 127 + } + + [[ $4 ]] && local verb='-v' + + # Display a warning for this format + echo -e "\t! Warning: xz format is not suited for long term archiving." + echo -e "\t See https://www.nongnu.org/lzip/xz_inadequate.html for details." + + # Compresse to xz (lzma2) - Deprecated + xz $verb --compress --keep -$3 -T $2 $1 + return $? + } + + _dolz() + { + local procopt="--threads $2" + local command=plzip + + command -v plzip >/dev/null 2>&1 || { + command -v lzip >/dev/null 2>&1 || { + echo -e >&2 "\t*** Program 'plzip' or 'lzip' are not installed, aborting." + return 127 + } + local command=lzip + local procopt="" + [[ $2 -gt 1 ]] && + echo -e "\t! Warning: lzip doesn't support multithreading, falling back to 1 thread." && + exho -e "\t* Consitder installing plzip to obtain multithreading abilities." + } + + [[ $4 ]] && local verb="-vv" + + # Compresse au format lzip (lzma) + $command $verb $procopt --keep -$3 $1 + return $? + } + + _dogz() + { + local procopt="--processes $2" + local command=pigz + + command -v pigz >/dev/null 2>&1 || { + command -v gzip >/dev/null 2>&1 || { + echo -e >&2 "\t*** Programs 'pigz' or 'gzip' are not installed, aborting." + return 127 + } + local command="gzip --compress" + local procopt="" + [[ $2 -gt 1 ]] && + echo -e "\t! Warning: gzip doesn't support multithreading, falling back to 1 thread." && + exho -e "\t* Consitder installing pigz to obtain multithreading abilities." + } + + [[ $4 ]] && local verb="--verbose" + + # Compresse au format bz2 + $command $verb $procopt --keep -$3 $1 + return $? + } + + _dobz2() + { + local procopt="-p$2" + local command=pbzip2 + + command -v pbzip2 >/dev/null 2>&1 || { + command -v bzip2 >/dev/null 2>&1 || { + echo -e >&2 "\t*** The program 'pbzip2' or 'bzip2' are not installed, aborting." + return 127 + } + local command=bzip2 + local procopt="" + [[ $2 -gt 1 ]] && + echo -e "\t! Warning: bzip2 doesn't support multithreading, falling back to 1 thread." && + exho -e "\t* Consitder installing pbzip2 to obtain multithreading abilities." + } + + [[ $4 ]] && local verb="-v" + + # Compresse au format bz2 + $command $verb --compress $procopt --keep -$3 $1 + return $? + } + + _dolzo() + { + command -v lzop >/dev/null 2>&1 || { + echo -e >&2 "\t*** The program 'lzop' is not installed, aborting." + return 127 + } + + [[ $4 ]] && local verb='-v' + [[ $2 -gt 1 ]] && echo -e "\t! Warning: lzop doesn't support multithreading, falling back to 1 thread." + + # Compresse au format lzo + lzop --keep -$3 $1 + return $? + } + + for opt in $@ ; do + case $opt in + "-h"|"--help") + echo "taz : archive all files of a directory." + echo + echo "Usage: taz [option] [--parallel=] [--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 " -1, .., -9 Compression level to use [1=fast/big, 9=slow/small]" + 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 + ;; + + "-"[1..9]) + local complevel=${opt:1:1} + ;; + + "-"*) + echo "Invalid option, use taz --help to display options list" + echo + return 1 + ;; + + *) + local LIST="$LIST ${opt%/}" + ;; + esac + done + + [[ ! $compform ]] && compform=lz # safe and efficient (unless data are already compressed) + [[ ! $nproc ]] && nproc=1 + [[ ! $complevel ]] && complevel=6 + + for item in $LIST; do + local donetar=0 + echo "--- Processing $item..." + + if [[ -d $item ]]; then + echo -ne "\t* Creating $item.tar... " + + tar -cf $item{.tar,} + if [[ ! $? -eq 0 ]]; then + echo "[ failed, skipping ]" + continue + fi + + local donetar=1 + echo "[ OK ]" + fi + + local fname=$item + [[ $donetar -gt 0 ]] && fname=$item.tar + + # Skip compression part if tar is asked + if [[ $compform != "tar" ]]; then + echo -e "\t* Compressing archive..." + _do$compform $fname $nproc $complevel $verbose + [[ ! $? -eq 0 ]] && case $? in + 127) + echo -e "\t*** Compression program unavailable, aborting." + return 127 + ;; + *) + echo -e "\t*** Compression program returned an error, not deleting anything if asked, skipping to next item." + continue + ;; + esac + + [[ $donetar -gt 0 ]] && rm $fname + fi + + if [[ $willrm ]]; then + echo -en "\t* Deleting original source as asked... " + rm -r $item && echo '[ OK ]' || echo '[ failed ]' + fi + + echo "--- Done" + done + +} +export taz + +# ------------------------------------------------------------------------------------------ +# Display system genal information +# ------------------------------------------------------------------------------------------ +showinfo() { + echo "" + figlet $(hostname) -t -k + echo "" + neofetch +} +export showinfo + +# ------------------------------------------------------------------------------------------ +# Save or restore Konsle session manually +# ------------------------------------------------------------------------------------------ +ksession() { + # Configuration + local command='' + local savepath="${HOME}/.konsole/" + local savefile="$savepath/current-tabs" + + # Restore if asked to + if [[ "$1" = "restore" ]]; then + + echo "Restoring..." + konsole --tabs-from-file $savefile -e 'bash -c exit' & + + elif [[ "$1" = "save" ]]; then + + pid=$(pgrep konsole -u $USER) + if [[ $pid ]]; then + echo "# Most recent session list " $(date) > $savefile + for p in $pid; do + local sessions=$(qdbus org.kde.konsole-$p | grep /Sessions/) + if [[ $sessions ]] ; then + [[ ! -d $savepath ]] && mkdir $savepath + for i in $sessions; do + local format=$(qdbus org.kde.konsole-$p $i tabTitleFormat 0) + local processid=$(qdbus org.kde.konsole-$p $i processId) + local cwd=$(pwdx $processid | sed -e "s/^[0-9]*: //") + if [[ $(pgrep --parent $processid) ]] ; then + childpid=$(pgrep --parent $processid) + command=$(ps -p $childpid -o args=) + fi + echo "workdir: ${cwd};; title: ${format};; command:${command}" >> ${savefile} + command='' + done + fi + done + fi + + else + echo "ksession: save and restore KDE's Konsole sessions" + echo + echo "Usage: ksession " + fi +} +export ksession + + +# ------------------------------------------------------------------------------------------ +# ------------------------------------------------------------------------------------------ +# **************************************** MAIN PROGRAM ************************************ +# ------------------------------------------------------------------------------------------ +# ------------------------------------------------------------------------------------------ + +# Former PS1, stopped for much better function +# Set the prompt look'n'feel +# NORMAL="\[\e[0m\]" +# RED="\[\e[1;31m\]" +# GREEN="\[\e[1;32m\]" +# PURPLE="\[\e[1;35m\]" +# BLUEONGREY="\[\e[0;34m\e[47m\]" +# if [[ $EUID == 0 ]] ; then +# export PS1="$BLUEONGREY[\t]$NORMAL $PURPLE\$?$NORMAL|$RED\u@\H:$NORMAL\w$RED\$ $NORMAL" +# else +# export PS1="$BLUEONGREY[\t]$NORMAL $PURPLE\$?$NORMAL|$GREEN\u@\H:$NORMAL\w$GREEN\$ $NORMAL" +# fi + +# Build PATH environment variable +if [[ $EUID -eq 0 ]] ; then + pathappend /sbin:/usr/sbin +fi +[[ -d ~/.gem/ruby/2.3.0/bin ]] && pathappend ~/.gem/ruby/2.3.0/bin +[[ -d /share/services/gestparc ]] && pathappend /share/services/gestparc + +# Set bash history +export HISTSIZE=10000 +export HISTIGNORE="&:[bf]g:exit" + +# Set default pager +export PAGER=less + +# Execute optionnal config script if any +for script in ~/profile.d/*.sh ; do + if [ -r $script ] ; then + . $script + fi +done + +# Interactive shell detection, two methods available each one of those might have different result +# depending on distribution +#shopt -q login_shell && INTERACTIVE=1 +[[ $- == *i* ]] && INTERACTIVE=1 + +if [[ $INTERACTIVE ]]; then + # For compiling (as we often compile with LFS/0linux...) + export MAKEFLAGS='-j4' + export PKGSOURCES='/share/src/archives' + + #Aliases + alias ll='ls -laFh --color=auto' + alias la='ls -Ah --color=auto' + alias l='ls -CF --color=auto' + alias ls='ls --color=auto' + + alias grep='grep --color=auto' + alias egrep='egrep --color=auto' + alias fgrep='fgrep --color=auto' + alias qfind="find . -name " + + alias mkck='make check' + alias mkin='make install' + alias mkdin='make DESTDIR=$PWD/dest-install install' + alias ssh='ssh -x' + + alias wget='wget -c' # resume mode by default + alias myip='curl ip.appspot.com' + + # Human readable by default + alias df='df -H' + alias du='du -ch' + + alias sdu='du -sk ./* | sort -n' + + # Define PS1 + trap 'timer_start' DEBUG + PROMPT_COMMAND='set_prompt' + + # Set default language + setfr + showinfo + echo "Profile version $PROFVERSION chargé..." +fi + +# Cleanup +unset pathremove pathprepend pathappend + +#return 0 +# End /etc/profile