initial commit
This commit is contained in:
commit
c754df18c2
15 changed files with 374 additions and 0 deletions
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# .dots
|
||||||
|
|
||||||
|
### personal dot files for proxmox based hosts
|
58
scripts/notify.sh
Executable file
58
scripts/notify.sh
Executable file
|
@ -0,0 +1,58 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
# usage:
|
||||||
|
# notify.sh <topic> <payload> [options]
|
||||||
|
# documentation @ https://docs.ntfy.sh/publish
|
||||||
|
|
||||||
|
url="https://notify.velvettear.de"
|
||||||
|
user="velvettear"
|
||||||
|
password="\$Velvet90"
|
||||||
|
|
||||||
|
[[ -z "$1" ]] && printf "error: no topic specified\n" 1>&2 && exit 1
|
||||||
|
[[ -z "$2" ]] && printf "error: no payload specified\n" 1>&2 && exit 1
|
||||||
|
|
||||||
|
url="$url/$1"
|
||||||
|
payload="$2"
|
||||||
|
|
||||||
|
# check if payload is a file
|
||||||
|
if [[ -e "$payload" ]]; then
|
||||||
|
args+=("-T" "$(realpath $payload)" "-H" "Filename: $(basename $payload)")
|
||||||
|
else
|
||||||
|
args+=("-d" "$payload")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check for valid priority level
|
||||||
|
function checkPriority() {
|
||||||
|
prio="$(printf "$1" | tr '[:upper:]' '[:lower:]')"
|
||||||
|
if [[ "$prio" == "min" ]] || [[ "$prio" == "low" ]] || [[ "$prio" == "default" ]] || [[ "$prio" == "high" ]] || [[ "$prio" == "max" ]] || [[ "$prio" == "urgent" ]]; then
|
||||||
|
args+=("-H" "Priority: $prio")
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# check arguments
|
||||||
|
index=1
|
||||||
|
for arg in "$@"; do
|
||||||
|
((index++))
|
||||||
|
value="${!index}"
|
||||||
|
case "$arg" in
|
||||||
|
-e|--emoji|-i|--icon)
|
||||||
|
args+=("-H" "Tags: $value")
|
||||||
|
;;
|
||||||
|
-p|--priority)
|
||||||
|
checkPriority "$value"
|
||||||
|
;;
|
||||||
|
-t|--title)
|
||||||
|
args+=("-H" "Title: $value")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "user: $user"
|
||||||
|
echo "pw: $password"
|
||||||
|
echo "url: $url"
|
||||||
|
echo "args: ${args[@]}"
|
||||||
|
|
||||||
|
curl -u $user:$password "${args[@]}" $url
|
24
scripts/prepare-fs.sh
Executable file
24
scripts/prepare-fs.sh
Executable file
|
@ -0,0 +1,24 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
# this script is used in a systemd service file (wanted by other services)
|
||||||
|
|
||||||
|
[[ "$EUID" != 0 ]] && printf "error: permission denied!\n" && exit 1
|
||||||
|
|
||||||
|
printf "preparing filesystem...\n"
|
||||||
|
|
||||||
|
if [[ ! -d "/var/log/pveproxy" ]]; then
|
||||||
|
printf "creating directory '/var/log/pveproxy' with owner 'www-data'...\n"
|
||||||
|
mkdir -p /var/log/pveproxy
|
||||||
|
chown -R www-data:www-data /var/log/pveproxy
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -d "/var/log/nginx" ]]; then
|
||||||
|
printf "creating directory '/var/log/nginx' with owner 'www-data'...\n"
|
||||||
|
mkdir -p /var/log/nginx
|
||||||
|
chown -R www-data:www-data /var/log/nginx
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "finished preparing the filesystem!\n"
|
21
scripts/restic/j5040.sh
Executable file
21
scripts/restic/j5040.sh
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
[[ "$EUID" != 0 ]] && printf "error: permission denied!\n" >&2 && exit 1
|
||||||
|
|
||||||
|
directories=(
|
||||||
|
"/etc"
|
||||||
|
)
|
||||||
|
|
||||||
|
printf ">> starting restic backup...\n"
|
||||||
|
|
||||||
|
for directory in ${directories[@]}; do
|
||||||
|
seconds="$SECONDS"
|
||||||
|
printf "> backing up '"$directory"'...\n"
|
||||||
|
restic backup --verbose --no-scan --retry-lock 3h "$directory"
|
||||||
|
printf "> backup of '"$directory"' finished after "$(( $SECONDS - $seconds ))" seconds!\n"
|
||||||
|
done
|
||||||
|
|
||||||
|
printf ">> restic backup finished after "$SECONDS" seconds!\n"
|
30
scripts/restic/n100.sh
Executable file
30
scripts/restic/n100.sh
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
[[ "$EUID" != 0 ]] && printf "error: permission denied!\n" >&2 && exit 1
|
||||||
|
|
||||||
|
directories=(
|
||||||
|
"/etc"
|
||||||
|
"/mnt/storage/audiobooks"
|
||||||
|
"/mnt/storage/comics"
|
||||||
|
"/mnt/storage/documents"
|
||||||
|
"/mnt/storage/ebooks"
|
||||||
|
"/mnt/storage/images"
|
||||||
|
"/mnt/storage/music"
|
||||||
|
"/mnt/storage/software"
|
||||||
|
"/mnt/storage/syncthing"
|
||||||
|
"/mnt/storage/videos"
|
||||||
|
)
|
||||||
|
|
||||||
|
printf ">> starting restic backup...\n"
|
||||||
|
|
||||||
|
for directory in ${directories[@]}; do
|
||||||
|
seconds="$SECONDS"
|
||||||
|
printf "\n> backing up '"$directory"'...\n"
|
||||||
|
restic backup --verbose --no-scan --retry-lock 3h "$directory"
|
||||||
|
printf "> backup of '"$directory"' finished after "$(( $SECONDS - $seconds ))" seconds!\n"
|
||||||
|
done
|
||||||
|
|
||||||
|
printf ">> restic backup finished after "$SECONDS" seconds!\n"
|
32
scripts/restic/restic.sh
Executable file
32
scripts/restic/restic.sh
Executable file
|
@ -0,0 +1,32 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
# exit on error
|
||||||
|
|
||||||
|
# check permissions
|
||||||
|
[[ "$EUID" != 0 ]] && printf "error: permission denied!\n" >&2 && exit 1
|
||||||
|
|
||||||
|
# check if script exists
|
||||||
|
script="$(dirname $(realpath "$0"))/$(hostname).sh"
|
||||||
|
[[ ! -x "$script" ]] && printf "error: script '"$script"' does not exist or is not executable!\n" >&2 && exit 1
|
||||||
|
|
||||||
|
# get hostname
|
||||||
|
host="$(hostname)"
|
||||||
|
[[ -z "$host" ]] && host="$HOST"
|
||||||
|
|
||||||
|
# setup restic
|
||||||
|
export RESTIC_REPOSITORY="rest:http://192.168.100.101:8000"
|
||||||
|
export RESTIC_PASSWORD="\$Velvet90"
|
||||||
|
export RESTIC_COMPRESSION="max"
|
||||||
|
export RESTIC_CACHE_DIR="/var/cache/restic"
|
||||||
|
|
||||||
|
# setup log file
|
||||||
|
log="/var/log/restic-"$(hostname)".log"
|
||||||
|
|
||||||
|
# source / execute restic script
|
||||||
|
source "$script" 2>&1 | tee "$log"
|
||||||
|
|
||||||
|
# send a notification when finished
|
||||||
|
/home/velvettear/.dots/scripts/notify.sh "backups" "$log" --title "$host" --icon "green_circle"
|
63
scripts/update.sh
Executable file
63
scripts/update.sh
Executable file
|
@ -0,0 +1,63 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
# debian update script
|
||||||
|
|
||||||
|
# exit on ctrl-c
|
||||||
|
trap 'printf ""$font_colored_bold"\n>> stopping system update after "$SECONDS" seconds..."$font_default"\n" && exit 1' SIGINT
|
||||||
|
|
||||||
|
# font styles & colors
|
||||||
|
font_default="\e[0m"
|
||||||
|
font_colored="\e[32;1m"
|
||||||
|
font_colored_bold="\e[31;1m"
|
||||||
|
|
||||||
|
[[ "$EUID" != "0" ]] && printf ""$font_colored_bold">> error: permission denied!"$font_default"\n" && exit 1
|
||||||
|
|
||||||
|
for arg in "$@"; do
|
||||||
|
case "$arg" in
|
||||||
|
-n|--noconfirm)
|
||||||
|
noconfirm="true"
|
||||||
|
;;
|
||||||
|
-r|--reboot)
|
||||||
|
reboot="true"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
printf ""$font_colored_bold">> system update started..."$font_default"\n"
|
||||||
|
|
||||||
|
printf ""$font_colored"> updating packages..."$font_default"\n"
|
||||||
|
/usr/bin/apt-get update
|
||||||
|
[[ "$noconfirm" ]] && /usr/bin/apt-get dist-upgrade -y || /usr/bin/apt-get dist-upgrade
|
||||||
|
|
||||||
|
printf ""$font_colored"> cleaning cache..."$font_default"\n"
|
||||||
|
rm -rf "/var/cache//usr/bin/apt-get/*"
|
||||||
|
[[ "$noconfirm" ]] && /usr/bin/apt-get clean -y || /usr/bin/apt-get clean
|
||||||
|
|
||||||
|
printf ""$font_colored"> removing orphaned packages..."$font_default"\n"
|
||||||
|
[[ "$noconfirm" ]] && /usr/bin/apt-get autoremove --purge -y || /usr/bin/apt-get autoremove --purge
|
||||||
|
|
||||||
|
printf ""$font_colored"> removing \"no valid subscription\" message..."$font_default"\n"
|
||||||
|
sed -i.bak "s/data.status.* !== 'ACTIVE'/false/I" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
|
||||||
|
|
||||||
|
printf ""$font_colored"> updating restic..."$font_default"\n"
|
||||||
|
restic self-update
|
||||||
|
|
||||||
|
#printf ""$font_colored"> installing dark theme..."$font_default"\n"
|
||||||
|
#bash <(curl -s https://raw.githubusercontent.com/Weilbyte/PVEDiscordDark/master/PVEDiscordDark.sh ) install
|
||||||
|
|
||||||
|
printf ""$font_colored_bold">> system updated finished after "$SECONDS" seconds!"$font_default"\n"
|
||||||
|
|
||||||
|
[[ ! "$reboot" ]] && exit 0
|
||||||
|
|
||||||
|
timeout="5"
|
||||||
|
printf ""$font_colored"> rebooting system in "
|
||||||
|
while [[ "$timeout" -gt "0" ]]; do
|
||||||
|
printf "$timeout... "
|
||||||
|
timeout="$(( timeout - 1 ))"
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
printf "now!"$font_default"\n"
|
||||||
|
systemctl reboot
|
18
scripts/zfs-scrub.sh
Executable file
18
scripts/zfs-scrub.sh
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
[[ "$EUID" != 0 ]] && printf "error: permission denied!\n" && exit 1
|
||||||
|
|
||||||
|
printf "scrubbing all available zfs pools...\n"
|
||||||
|
|
||||||
|
mapfile -t pools < <(zpool list | tail -n +2 | awk '{print $1}')
|
||||||
|
for pool in "${pools[@]}"; do
|
||||||
|
timestamp="$SECONDS"
|
||||||
|
printf "scrubbing zfs pool '"$pool"'...\n"
|
||||||
|
zpool scrub -w "$pool"
|
||||||
|
printf "scrubbing zfs pool '"$pool"' finished after $(( $SECONDS - $timestamp )) seconds!\n"
|
||||||
|
done
|
||||||
|
|
||||||
|
printf "scrubbing all available zfs pools finished after $SECONDS seconds!\n"
|
11
systemd/prepare-fs.service
Normal file
11
systemd/prepare-fs.service
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[Unit]
|
||||||
|
Description=filesystem preparation
|
||||||
|
Before=pveproxy.service
|
||||||
|
Before=nginx.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/etc/velvettear/scripts/prepare-fs.sh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
10
systemd/restic/restic.service
Normal file
10
systemd/restic/restic.service
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[Unit]
|
||||||
|
Description=restic backup
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/home/velvettear/.dots/scripts/restic/restic.sh
|
||||||
|
ExecStartPost=/home/velvettear/.dots/scripts/notify.sh "backups" "/var/log/restic-%i.log" --title "%i" --icon "green_circle"
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
8
systemd/restic/restic.timer
Normal file
8
systemd/restic/restic.timer
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[Unit]
|
||||||
|
Description=restic backup
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=*-*-* 00:03:00
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
9
systemd/zfs/zfs-scrub.service
Normal file
9
systemd/zfs/zfs-scrub.service
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=scrub all available zfs pools
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/etc/velvettear/scripts/zfs-scrub.sh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
8
systemd/zfs/zfs-scrub.timer
Normal file
8
systemd/zfs/zfs-scrub.timer
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[Unit]
|
||||||
|
Description=scrub all available zfs pools weekly
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=Sun *-*-* 08:00:00
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
71
zsh/zprofile
Executable file
71
zsh/zprofile
Executable file
|
@ -0,0 +1,71 @@
|
||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
# export environment variables
|
||||||
|
|
||||||
|
# set .dots directory
|
||||||
|
export VELVETTEAR_DOTS="$HOME/.dots"
|
||||||
|
|
||||||
|
# set prompt
|
||||||
|
export PROMPT="%(!.%F{red}.)%n@%m > %/%(!.#.$) %f"
|
||||||
|
|
||||||
|
# set general variables
|
||||||
|
export USER="$(whoami)"
|
||||||
|
export HOST="$(hostname)"
|
||||||
|
export HOSTNAME="$HOST"
|
||||||
|
export TMP="/tmp"
|
||||||
|
export TEMP="/tmp"
|
||||||
|
export TMPDIR="/tmp"
|
||||||
|
|
||||||
|
# set nvim as default editor
|
||||||
|
export EDITOR="nvim"
|
||||||
|
export VISUAL="nvim"
|
||||||
|
export PAGER="less"
|
||||||
|
|
||||||
|
# configure the shell history
|
||||||
|
export HISTFILE="$HOME/.zhistory"
|
||||||
|
export SAVEHIST="100"
|
||||||
|
export HISTSIZE="10000"
|
||||||
|
export HISTTIMEFORMAT="%d.%m.%Y %H:%M:%S"
|
||||||
|
export HISTCONTROL="ignoredups"
|
||||||
|
|
||||||
|
# set all kinds of aliases
|
||||||
|
|
||||||
|
# file and directory listings
|
||||||
|
alias ls="ls --color=auto"
|
||||||
|
alias la="ls -a --color=auto"
|
||||||
|
alias ll="ls -l --color=auto"
|
||||||
|
alias lla="ls -la --color=auto"
|
||||||
|
|
||||||
|
# grep
|
||||||
|
alias grep="grep --color=auto"
|
||||||
|
alias fgrep="fgrep --color=auto"
|
||||||
|
alias egrep="egrep --color=auto"
|
||||||
|
|
||||||
|
# diff
|
||||||
|
alias diff="diff --color=auto"
|
||||||
|
|
||||||
|
# tar
|
||||||
|
alias tarp="tar -I pigz -cf -v"
|
||||||
|
alias untarp="tar -I pigz -xf"
|
||||||
|
|
||||||
|
# general
|
||||||
|
alias ..="cd .."
|
||||||
|
alias whereami="realpath ."
|
||||||
|
alias c="clear"
|
||||||
|
|
||||||
|
# create / delete / copy / move
|
||||||
|
alias rmr="rm -r"
|
||||||
|
alias rmrf="rm -rf"
|
||||||
|
alias cpr="cp -R"
|
||||||
|
alias cprf="cp -Rf"
|
||||||
|
alias mkdirp="mkdir -p"
|
||||||
|
|
||||||
|
# applications
|
||||||
|
alias vi="nvim"
|
||||||
|
alias vim="nvim"
|
||||||
|
|
||||||
|
# scripts
|
||||||
|
alias update="sudo $VELVETTEAR_DOTS/scripts/update.sh"
|
8
zsh/zshrc
Executable file
8
zsh/zshrc
Executable file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
# author: Daniel Sommer <daniel.sommer@velvettear.de>
|
||||||
|
# license: MIT
|
||||||
|
|
||||||
|
# exit if user is not root
|
||||||
|
[[ "$EUID" != "0" ]] && return
|
||||||
|
echo "LOGIN AS ROOT"
|
Loading…
Reference in a new issue