diff --git a/.gitignore b/.gitignore index a012ec2..6d7585a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ archive/ +*.log diff --git a/apps/keepassxc/keepassxc-ssh-unlock.sh b/apps/keepassxc/keepassxc-ssh-unlock.sh index 950fbd8..3372f11 100755 --- a/apps/keepassxc/keepassxc-ssh-unlock.sh +++ b/apps/keepassxc/keepassxc-ssh-unlock.sh @@ -1,5 +1,6 @@ #!/bin/bash _dir="$(dirname $(realpath "${BASH_SOURCE:-$0}"))" +# echo at $@ >> ~/Desktop/ssh.log if systemctl --user is-active ssh-agent; then echo starting keepass unlock for $1 BASH_ENV=$HOME/ssh-agent.properties $_dir/keepassxc-unlock.sh "$@" @@ -10,7 +11,7 @@ if systemctl --user is-active ssh-agent; then sleep 2 cat $HOME/ssh-agent.properties echo starting keepass unlock for $1 - BASH_ENV=$HOME/ssh-agent.properties $_dir/keepassxc-unlock.sh "$@" + SSH_AUTH_SOCK=$(cat $HOME/ssh-agent.properties) $_dir/keepassxc-unlock.sh "$@" else echo unable to start ssh-agent fi diff --git a/apps/keepassxc/keepassxc-unlock.sh b/apps/keepassxc/keepassxc-unlock.sh index 4d36477..2db42a2 100755 --- a/apps/keepassxc/keepassxc-unlock.sh +++ b/apps/keepassxc/keepassxc-unlock.sh @@ -4,12 +4,14 @@ database=${1:-$KEEPASS_DB_PATH} keyfile=${2:-$KEEPASS_DB_KEY_PATH} unlock="dbus-send --print-reply --dest=org.keepassxc.KeePassXC.MainWindow /keepassxc org.keepassxc.KeePassXC.MainWindow.openDatabase string:$database string:"" string:$keyfile" -if ! qdbus | grep keepassxc; then +if ! qdbus | grep keepassxc; then + echo starting keepassxc first keepassxc& sleep 1 if ! qdbus | grep keepassxc; then echo unable to start keepassxc; exit; fi fi -if $unlock &> /dev/null; then +env | grep SSH +if export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; $unlock &> /dev/null; then echo keepass database $database succesfully unlocked else echo unable to unlock $database diff --git a/distro/arch/pacman b/distro/arch/pacman index 7b64558..eafd611 100644 --- a/distro/arch/pacman +++ b/distro/arch/pacman @@ -1,6 +1,6 @@ #/bin/bash -# echo https://wiki.archlinux.org/title/Pacman +# https://wiki.archlinux.org/title/Pacman alias pm="pacman" alias pms="sudo pacman" alias pmi="sudo pacman -S --needed" @@ -14,6 +14,8 @@ alias pmlf="comm -23 <(pacman -Qqett | sort | uniq) <(pacman -Qqg base-devel | s alias pkgst="pacman -Qi" alias pkgi="pacman -Si" + + pmig () { pacman -Q | grep $1 | cut -d ' ' -f 1 } diff --git a/distro/debian/apt b/distro/debian/apt new file mode 100644 index 0000000..e04b02e --- /dev/null +++ b/distro/debian/apt @@ -0,0 +1,4 @@ +add-repo-key () { +gpg --keyserver keyserver.ubuntu.com --recv-key $1 +gpg -a --export $1 | sudo apt-key add - +} \ No newline at end of file diff --git a/modules/bindfs.lib b/modules/bindfs.lib deleted file mode 100644 index df3675a..0000000 --- a/modules/bindfs.lib +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -# echo loading bindfs -export BFS_MOUNT_DIR=${BFS_MOUNT_DIR:-/mnt/bfs} - -if [ -v PS1 ]; then - alias rbfsu="dir_rebind_user" - alias rbfs="dir_rebind" - alias bfsu="dir_bind_user" - alias bfs="dir_bind" - alias bfsum="dir_bind_unmount" - alias bfse="bfs_vscode" - - sudo mkdir $BFS_MOUNT_DIR 2> /dev/null - sudo chown $USER:$USER $BFS_MOUNT_DIR -fi - -mounted () { - mountpoint "$1" &> /dev/null && echo yes || return 1 -} - -dir_bind_unmount () { - local usesudo - local mp=$1 - [[ ! $(mounted $mp) ]] && echo no mountpoint at $mp && mp=$BFS_MOUNT_DIR/$(basename $mp) - [[ ! $(mounted $mp) ]] && echo no mountpoint at $mp either, aborting && return 1 - [[ $EUID -ne 0 ]] && usesudo=sudo - if $usesudo fusermount -u $mp; then - echo unmounted $mp, removing empty mountpoint directory - rm -rf $mp - else - echo error, unable to unmount $mp - fi -} - -dir_bind_user () { - local usesudo; local dir;local user;local group;local mp - -if [ $# -lt 3 ]; then - echo "minimum 3 args needed to rebind " - echo passed were $@ - return 1 -fi - -[[ $EUID -ne 0 ]] && usesudo=sudo - -[[ $(id -u $1 2> /dev/null) ]] || { echo user $1 does not exist can not continue; return 2; } - -dir=$(realpath $2) -mp=$3 -[[ $(mounted $mp) ]] && echo something already mounted at $mp, aborting && return 1 -if ! $usesudo mkdir -p $mp; then echo unable to make mountpoint aborting; return 2; fi -$usesudo chown $1:$1 $mp -user=$(stat -c '%u' $dir) -group=$(stat -c '%g' $dir) -$usesudo bindfs --force-user=$1 --force-group=$1 --create-for-user=$user --create-for-group=$group --chown-ignore --chgrp-ignore $dir $mp -[[ $? -gt 0 ]] && echo error in call to bindfs - -if [[ $(mounted $mp) ]]; then - echo $dir has been mounted at $mp for user $1 - echo "to unmount use: dir_bind_unmount $mp or bfsum $mp" - else - echo unable to mount $dir at $mp as user $user - fi - - } - -dir_bind () { -mp=${2:-$BFS_MOUNT_DIR/$(basename $1)} -dir_bind_user $USER $1 $mp -if [ -v PS1 ]; then -echo enter \"u\" when you ready to unmount, otherwise any other key will leave mounted -read -n1 ans -echo -e "\n" -[[ $ans == "u" ]] && dir_bind_unmount $mp -fi -} - -dir_rebind () { -dir_bind_user $USER $1 $1 -} - -dir_rebind_user () { -dir_bind_user $1 $2 $2 -} - -bfs_vscode () { -mp=${2:-$BFS_MOUNT_DIR/$(basename $1)} -dir_bind_user $USER $1 $mp -/opt/bin/vscode $mp -if [ -v PS1 ]; then -echo when you ready to unmount FIRST close your vscode window then enter \"u\" -echo otherwise any other key will leave mounted -read -n1 ans -echo -e "\n" -[[ $ans == "u" ]] && dir_bind_unmount $mp -fi - -} - -(return 0 2>/dev/null) || dir_bind_user $@ - diff --git a/modules/btrbk.lib b/modules/btrbk.lib deleted file mode 100644 index d6bcf7c..0000000 --- a/modules/btrbk.lib +++ /dev/null @@ -1,184 +0,0 @@ -#!/bin/bash - -# dry run by default -# >btrbk_run -# with -e exectue -# >btrbk_run -e -# to only create the links -# >btrbk_run -e -n - -btrbk_scripts_dir="$(dirname $(realpath "${BASH_SOURCE:-$0}"))" - -# will try to find a conf file with out without .conf extension in a few places -btrbk_conf () { - local file=${1:-btrbk.conf} - [[ -f $file ]] && echo $file && return - [[ -f $file.conf ]] && echo $file.conf && return - BTRBK_CONF_DIR=${BTRBK_CONF_DIR:-/snapshots/conf} -# echo $btrbk_scripts_dir -# echo $BTRBK_CONF_DIR - [[ -f $BTRBK_CONF_DIR/$file ]] && echo $BTRBK_CONF_DIR/$file && return - [[ -f $BTRBK_CONF_DIR/$file.conf ]] && echo $BTRBK_CONF_DIR/$file.conf && return - [[ -f /etc/btrbk/$file ]] && echo /etc/btrbk/$file && return - [[ -f /etc/btrbk/$file.conf ]] && echo /etc/btrbk/$file.conf && return - [[ -f /etc/btrbk.conf ]] && echo /etc/btrbk.conf && return - return 1 -} - -btrbk_clean () { - local file=$(btrbk_conf $1) - [[ ! $file ]] && return 1 - sudo btrbk -c $file clean $2 -} - -btrbk_src () { - local file=$(btrbk_conf $1) - [[ ! $file ]] && return 1 - sudo btrbk -c $file list config --format col:h:source_subvolume -} - -btrbk_dests () { -local file=$(btrbk_conf $1) -[[ ! $file ]] && return 1 -local dests=$(sudo btrbk -c $file list config --format col:h:snapshot_path | tail -1) -dests+=" $(sudo btrbk -c $file list target --format col:h:target_path)" -echo $dests -} - -btrbk_latest_links () { - -local dry_run="echo" -[[ $1 == "-e" ]] && dry_run="" && shift - -local file=$(btrbk_conf $1) -[[ ! $file ]] && echo unable to find conf file for ${1:-btrbk.conf} && return 1 -shift - -local latest=$(sudo btrbk -c $file list latest --format col:h:snapshot_subvolume | xargs -I % sh -c 'basename %' | sed '$!N; /^\(.*\)\n\1$/!P; D') -[[ ( ! $latest ) || $latest == "-" ]] && echo "no latest snapshots so can't make .latest links" && return 3 -local dests=$(btrbk_dests $file) - -if [[ $dry_run ]]; then - echo dry run for making latest links for following destinations, NOTE: use -e to actually make them - echo $dests - echo "-------------------" -fi - -echo making .latest symlinks in each destination -for dest in $dests; do -for snap in $latest; do -# [[ -e $dest/${snap%%.*}.latest ]] && $dry_run_echo sudo rm $dest/${snap%%.*}.latest -local cmd="sudo ln -srfn $dest/$snap $dest/${snap%%.*}.latest" -echo $cmd -[[ ! $dry_run ]] && $cmd -done -done - -} - -btrbk_run () { - -local dry_run="-n" -[[ $1 == "-e" ]] && dry_run="" && shift - -local file=$(btrbk_conf $1) -[[ ! $file ]] && echo unable to find conf file for ${1:-btrbk.conf} && return 1 -shift - -local src=$(btrbk_src $file) - -local snaps=$(sudo btrbk -c $file list source --format col:h:snapshot_name) - -local dests=$(sudo btrbk -c $file list config --format col:h:snapshot_path | tail -1) -local dests+=" $(btrbk -c $file list target --format col:h:target_path)" - -# todo distinguish local from remote destinations and deal with differently for latest link - -# any pre snap tasks -# for dest in $dests; do -# if [[ ! -d $dest ]]; then -# if confirm directory $dest does not exist, create; then -# sudo mkdir -p $dest -# else -# echo destination $dest directory MUST exist aborting brtbk run -# return 2 -# fi -# fi -# done - -echo using configuration file: $file -echo creating snapshots: $snaps -echo from $src -echo at these destinations $dests -echo additional passed arguments: $@ - -# do snaps and backups -[[ $dry_run ]] && echo backup dry run || echo Taking snapshost and making backups now... -sudo btrbk -c $file run $dry_run --progress $@ - -# post snap/backup - -btrbk_latest_links $([[ $dry_run ]] || printf "%s" -e) $file - -} - -(return 0 2>/dev/null) || btrbk_run $@ - - -latest_clone () { - - local src=$(realpath $1) - local dest=$(realpath $2) - shift 2 - module_load confirm - if [[ ! -d $dest ]]; then - if confirm "destination directory $dest does not exist, create it"; then - sudo mkdir -p $dest - else - return 1 - fi - fi - local snaps=$(ls $src | grep latest | sed 's/.\{1\}$//' | xargs -I % realpath $src/%) - [[ ! $snaps ]] && echo no latest snapshots in $src && ls -la $src && return 1 - if confirm create snapshots for $snaps in $dest; then - local destsnap - for snap in $snaps; do - destsnap="$dest/$(basename $snap | cut -f 1 -d '.' )" - if [[ -d $destsnap ]]; then - if confirm -s snapshot $destsnap already exists do you want to over write it; then - sudo btrfs subvolume delete $destsnap - else - return 2 - fi - fi - sudo btrfs subvolume snapshot $@ $snap $destsnap - done - echo $dest - ls -la $dest - fi - -} - -# use snapshot to then snap latest to another location, have it edit the fstab file -# #!/bin/bash -# [[ $# -lt 2 ]] && echo "need to supply a and a snapshot name" && exit -# # echo sed 's/$name/'$name'/g' named.conf.tmpl > $subvoldir-$name.conf -# # echo sed -i 's/$subvoldir/'$subvoldir'/g' $subvoldir-$name.conf - -# named="$2" -# src=/mnt/linuxpart -# dest=/mnt/linuxpart - -# echo sudo mkdir -p $dest/$named -# echo sudo btrfs subvolume snapshot $src/$1/@root $dest/$named/@root -# echo sudo btrfs subvolume snapshot $src/$1/@opt $dest/$named/@opt -# echo sudo btrfs subvolume snapshot $src/$1/@home $dest/$named/@home -# echo sudo btrfs subvolume snapshot $src/@shell $dest/$named/@shell - -# sudo mkdir -p $dest/$named -# sudo btrfs subvolume snapshot $src/$1/@root $dest/$named/@root -# sudo btrfs subvolume snapshot $src/$1/@opt $dest/$named/@opt -# sudo btrfs subvolume snapshot $src/$1/@home $dest/$named/@home -# sudo btrfs subvolume snapshot $src/@shell $dest/$named/@shell - -# echo to edit: bfs_vscode $dest/$named \ No newline at end of file diff --git a/modules/trustedkeys.func b/modules/distro/debian/trustedkeys.func similarity index 100% rename from modules/trustedkeys.func rename to modules/distro/debian/trustedkeys.func diff --git a/osxfer/example.env b/osxfer/example.env new file mode 100644 index 0000000..eedb909 --- /dev/null +++ b/osxfer/example.env @@ -0,0 +1,13 @@ +### TARGET ### +# target device to mountpint -give a value for only one of these three +TUUID= +TLABEL=primary +TDEV= +# ---- +# directory on target for subvolumes +TNAME=osname +### SOURCE ### +# mountpoint of source subvolumes +SMP=/mnt/pnystick +# directory on source mountpint for subvolumes +SNAME=basemanjaro \ No newline at end of file diff --git a/osxfer/os.conf.tmpl b/osxfer/os.conf.tmpl new file mode 100644 index 0000000..8ca966d --- /dev/null +++ b/osxfer/os.conf.tmpl @@ -0,0 +1,14 @@ +timestamp_format short +snapshot_preserve_min all +target_preserve_min all + +transaction_log /snapshots/log/<% $TNAME %>.log + +incremental no +snapshot_dir <%% echo ${SDIR:-/snapshots/transfer/source} %> +target <%% echo ${TSNAPS:-${TDIR:-/snapshots/transfer/target}/tmp/tsnaps} %> +volume <% $SMP %>/<% $SNAME %> +subvolume @home +subvolume @root +subvolume @opt +subvolume @shell diff --git a/osxfer/transfer.sh b/osxfer/transfer.sh new file mode 100755 index 0000000..b3eea9e --- /dev/null +++ b/osxfer/transfer.sh @@ -0,0 +1,86 @@ +#!/bin/bash +scripts_dir="$(dirname $(realpath "${BASH_SOURCE:-$0}"))" + +efile=$1.env +if [[ -f $efile ]]; then + module_load confirm + echo "#### sourcing $efile ########" + source $efile + TDIR=${TDIR:-/snapshots/transfer/target} + TSNAPS=${TDIR:-/snapshots/transfer/target}/${TSNAPS:-tmp/tsnaps} + SDIR=${SDIR:-/snapshots/transfer/source} + CDIR=${CDIR:-/snapshots/conf} + # TODO make sure minimal environment is set + source <( + source $efile + bash $(module_find btpl) os.conf.tmpl + ) >$CDIR/$TNAME.conf + echo "######### btrbk file: $TNAME.conf ##############" + cat "$CDIR/$TNAME.conf" + echo "#######################" + if ! confirm "conf file is ok?"; then exit; fi + module_load btrbk btrfs + mkdir -p $TDIR &>/dev/null + mkdir -p $SDIR &>/dev/null + echo $SDIR + ls -la /snapshots/transfer + [[ $TLABEL ]] && sudo mount -L $TLABEL $TDIR + [[ $TUUID ]] && sudo mount --UUID=$TUUID $TDIR + [[ $TDEV ]] && sudo mount /dev/$TDEV $TDIR + if mountpoint $TDIR &>/dev/null; then + sudo mkdir -p $TSNAPS + echo able to mount $TLABEL $TUUID $TDEV at $TDIR... continuing transfer + if btrbk_run $2 "$CDIR/$TNAME.conf"; then + echo successful transfer from $SMP/$SNAME to $TLABEL $TUUID $TDEV - $TSNAPS + sudo btrbk -c "$CDIR/$TNAME.conf" list latest + echo "########################" + if sudo mkdir -p $TDIR/$TNAME &>/dev/null; then + echo cloning transfered read only snapshots at $TSNAPS + ls -la $TSNAPS + echo to $TDIR/$TNAME + sudo btrbk -c "$CDIR/$TNAME.conf" list latest + latest=$(sudo btrbk -c "$CDIR/$TNAME.conf" list latest --format col:h:snapshot_subvolume | xargs -I % sh -c 'basename %' | sed '$!N; /^\(.*\)\n\1$/!P; D') + if [[ $latest ]]; then + for snap in $latest; do + # dests+=" $(btrbk -c $file list target --format col:h:target_path)" + bsnap=$(basename "${snap%.*}") + echo cloning $TSNAPS/$snap to $TDIR/$TNAME/$bsnap + if [[ -d $TDIR/$TNAME/$bsnap ]]; then + echo snapshot $TDIR/$TNAME/$bsnap already exists you must manually remove it if you want to overwrite + echo "'sudo btrfs sub del $TDIR/$TNAME/$bsnap' or 'sudo btrfs sub del $TDIR/$TNAME/*'" + else + sudo btrfs sub snap $TSNAPS/$snap $TDIR/$TNAME/$bsnap + echo $TDIR/$TNAME/$bsnap + ls -la $TDIR/$TNAME/$bsnap + fi + done + echo $TDIR/$TNAME + ls -la $TDIR/$TNAME + else + echo no transfered snapshots to clone + fi + else + echo ERROR unable to make directory $TDIR/$TNAME + fi + else + echo ERROR: snapshot transfer to $TLABEL $TUUID $TDEV - $TSNAPS failed + fi + echo deleting temporary transfer snapshots at $SDIR + sudo btrfs sub del $SDIR/* + sudo rm -rf $SDIR + echo deleting temporary transfer snapshots at $TSNAPS + sudo btrfs sub del $TSNAPS/* + sudo rm -rf $TSNAPS + echo unmounting $TDIR + if sudo umount -R $TDIR; then + if ! confirm "remove local mount directory $TDIR?"; then exit; fi + sudo rm -f $TDIR + else + echo WARNING: not able to unmount $TDIR + fi + else + echo unable to mount $TLABEL $TUUID $TDEV at $TDIR + fi +else + echo environment file $efile does not exisit +fi diff --git a/session/dm.inst b/session/dm.inst new file mode 100755 index 0000000..7d723b1 --- /dev/null +++ b/session/dm.inst @@ -0,0 +1,28 @@ +#!/bin/bash + +sdir="$(dirname $(realpath "${BASH_SOURCE:-$0}"))" + +_dm=$(basename $(grep 'ExecStart=' /etc/systemd/system/display-manager.service)) +echo Current Display Manager on this system is: $_dm + +case $_dm in + + lightdm) + if [[ -d /etc/lightdm ]]; then + echo adding startup/cleanup configuration + if sudo mkdir /etc/lightdm/lightdm.conf.d &> /dev/null; then + sudo cp $sdir/lightdm/lightdm.conf.d/* /etc/lightdm/lightdm.conf.d/ + ls -la /etc/lightdm/lightdm.conf.d + else + echo could not make directory $sdir/lightdm/lightdm.conf.d + fi + else + echo lightdm configuration directory /etc/lightdm does not exist + echo unable to install user setup/cleanup scripts + fi + ;; + *) + echo unknown display manager $_dm + ;; +esac + diff --git a/session/lightdm/lightdm.conf.d/50-setup-cleanup.conf b/session/lightdm/lightdm.conf.d/50-setup-cleanup.conf new file mode 100644 index 0000000..e058f2c --- /dev/null +++ b/session/lightdm/lightdm.conf.d/50-setup-cleanup.conf @@ -0,0 +1,3 @@ +[Seat:*] +session-cleanup-script=/etc/lightdm/lightdm.conf.d/lightdm-cleanup.sh +session-setup-script=/etc/lightdm/lightdm.conf.d/lightdm-setup.sh diff --git a/session/lightdm/lightdm.conf.d/lightdm-cleanup.sh b/session/lightdm/lightdm.conf.d/lightdm-cleanup.sh new file mode 100755 index 0000000..6d05be3 --- /dev/null +++ b/session/lightdm/lightdm.conf.d/lightdm-cleanup.sh @@ -0,0 +1,8 @@ +#!/bin/bash +dir=${HOME}/${USER_SESSION_DIR:-.session} +file=${dir}/session_logout +echo "running as user $(id -u), cleanup for ${USER}, file:${file} $(date)" >> /opt/scripts/lightdm.log +log=${dir}/session.log +if [[ -e "$file" ]]; then + /bin/bash $file 1>>${log} 2>>${log} || true +fi diff --git a/session/lightdm/lightdm.conf.d/lightdm-setup.sh b/session/lightdm/lightdm.conf.d/lightdm-setup.sh new file mode 100755 index 0000000..6f76fb3 --- /dev/null +++ b/session/lightdm/lightdm.conf.d/lightdm-setup.sh @@ -0,0 +1,8 @@ +#!/bin/bash +dir=${HOME}/${USER_SESSION_DIR:-.session} +file=${dir}/session_login +echo "running as user $(id -u), setup for ${USER}, file:${file} $(date)" >> /opt/scripts/lightdm.log +log=${dir}/session.log +if [[ -e "$file" ]]; then + /bin/bash $file 1>>${log} 2>>${log} || true +fi diff --git a/session/readme.md b/session/readme.md new file mode 100644 index 0000000..e69de29 diff --git a/session/systemd/mount@.service b/session/systemd/mount@.service new file mode 100644 index 0000000..6696495 --- /dev/null +++ b/session/systemd/mount@.service @@ -0,0 +1,11 @@ +[Unit] +Requires=home.mount +After=home.mount + +[Service] +ExecStart=/bin/mount %h/%I +ExecStop=/bin/umount %h/%I +RemainAfterExit=yes + +[Install] +WantedBy=default.target \ No newline at end of file