#!/usr/bin/bash set -e RED=1 GREEN=2 ORANGE=3 BLUE=4 print_log() { tput bold tput setaf $1 echo -en "$2:" tput sgr0 tput bold echo -en " $3" if [ $5 ]; then tput setaf $GREEN echo -en " \u2713" fi if [ ! $4 ]; then echo "" fi tput sgr0 } print_info() { if [ $2 ]; then check=1 else check= fi suffix="" print_log $BLUE "INFO" "$1" "" $check } print_error() { print_log $RED "FEHLER" "$1" } print_warning() { print_log $ORANGE "WARNUNG" "$1" } question() { Y="jJyY" print_log $BLUE "Frage ([$Y] für 'Ja')" "$1 " 1 read ret case $ret in [$Y]* ) return 0;; * ) return 1;; esac } get_hostname() { tr -d " \t\n\r" < /etc/hostname } get_timezone() { tr -d " \t\n\r" < /etc/timezone } error_handler() { if [[ "$-" == *e* ]]; then local exit_code="$?" print_error "Das Skript wurde durch einen Fehler in Zeile $1 mit dem Fehlercode $exit_code beendet" exit $exit_code fi } trap 'error_handler $LINENO' ERR USER="dreher" HOME="/home/$USER" DIST="bullseye" if [ "$EUID" -ne 0 ]; then print_warning "$(basename $0) muss als root (bspw. mit sudo) ausgeführt werden.$(tput sgr0)" exit 1 fi if ! id $USER > /dev/null 2>&1; then print_error "Benutzer '$USER' existiert nicht." exit 1 fi if [ ! -d $HOME ]; then print_error "Home-Verzeichnis $HOME für '$USER' existiert nicht." exit 1 fi UNINSTALL_REALVNC=0 REALVNC="realvnc-vnc-server" if raspi-config nonint is_installed $REALVNC; then if question "'$REALVNC' ist installiert. Es sollte deinstalliert werden, da wir mit diesem Skript x11vnc installieren und verwenden. realvnc deaktivieren und fortfahren?"; then UNINSTALL_REALVNC=1 systemctl disable vncserver-x11-serviced.service systemctl stop vncserver-x11-serviced.service else exit 1 fi fi ################################### # ll und l ################################### LBIN="/usr/local/bin" print_info "Aliase ll (ls -la) und l (ls -l) werden in $LBIN angelegt" echo -e "#!/usr/bin/bash\nls -la \$@" > $LBIN/ll echo -e "#!/usr/bin/bash\nls -l \$@" > $LBIN/l chmod +x $LBIN/l chmod +x $LBIN/ll ################################### # APT ################################### apt update apt install -y --no-install-recommends raspberrypi-ui-mods lxplug-menu lxterminal x11vnc wireguard samba rpd-plym-splash pishutdown ################################### # ~/dreher_gmbh ################################### DREHER_DIR="$HOME/dreher_gmbh" LOGO_NAME="dreher_logo.png" LOGO_PATH="$DREHER_DIR/$LOGO_NAME" PLYMOUTH_DIR="/usr/share/plymouth/themes/pix" PLYMOUTH_SCRIPT="$PLYMOUTH_DIR/pix.script" PLYMOUTH_BACKUP="$PLYMOUTH_SCRIPT.original" SPLASH_ORIGINAL="splash.png" URL_BASE="http://repo.dreher.at" print_info "$DREHER_DIR einrichten ..." mkdir -p $DREHER_DIR chown -R $USER:$USER $DREHER_DIR chmod 700 $DREHER_DIR print_info "Logo von Server holen ..." URL_LOGO="$URL_BASE/misc/pic/logo.png" wget --backups=0 -O $LOGO_PATH $URL_LOGO > /dev/null 2>&1 cp $LOGO_PATH $PLYMOUTH_DIR/dreher_logo.png chown $USER:$USER $LOGO_PATH if grep -q $LOGO_NAME $PLYMOUTH_SCRIPT; then print_info "$PLYMOUTH_SCRIPT verwendet bereits '$LOGO_NAME'" 1 else if ! grep -q $SPLASH_ORIGINAL $PLYMOUTH_SCRIPT; then print_error "Kann '$SPLASH_ORIGINAL' in $PLYMOUTH_SCRIPT nicht durch '$LOGO_NAME' ersetzen, da '$SPLASH_ORIGINAL' nicht gefunden wurde." exit 1 fi print_info "$PLYMOUTH_SCRIPT nach $PLYMOUTH_BACKUP sichern und auf '$LOGO_NAME' umstellen" cp $PLYMOUTH_SCRIPT $PLYMOUTH_BACKUP sed -i "s/${SPLASH_ORIGINAL//./\\.}/${LOGO_NAME//./\\.}/g" $PLYMOUTH_SCRIPT fi WG_NAME="wg_setup.py" WG_CONF_PY="$DREHER_DIR/$WG_NAME" URL_WG="$URL_BASE/deb/dists/$DIST/$WG_NAME" print_info "$WG_NAME vom Server holen ..." wget --backups=0 -P $DREHER_DIR $URL_WG > /dev/null 2>&1 chown $USER:$USER $WG_CONF_PY ################################### # Desktop ################################### PCMANFM_DIR="$HOME/.config/pcmanfm" DE_CONF_DIR="$PCMANFM_DIR/LXDE-pi" DE_CONF_NAME="desktop-items-0.conf" DE_CONF_PATH="$DE_CONF_DIR/$DE_CONF_NAME" WALLPAPER_LINE="wallpaper=$LOGO_PATH" WALLPAPER_MODE_LINE="wallpaper_mode=center" if [ ! -d $DE_CONF_DIR ]; then print_info "Erstelle Verzeichnis $DE_CONF_DIR" mkdir -p $DE_CONF_DIR fi if [ -f $DE_CONF_PATH ]; then if grep -qE "^$WALLPAPER_MODE_LINE" $DE_CONF_PATH; then print_info "'$WALLPAPER_MODE_LINE' ist bereits in $DE_CONF_PATH eingetragen" 1 elif grep -q "wallpaper_mode=" $DE_CONF_PATH; then print_info "Ändere entsprechende Zeile in $DE_CONF_PATH zu '$WALLPAPER_MODE_LINE' ..." sed -i "s/wallpaper_mode=.*/$WALLPAPER_MODE_LINE/g" $DE_CONF_PATH else print_info "Hänge '$WALLPAPER_MODE_LINE' an $DE_CONF_PATH an ..." echo "$WALLPAPER_MODE_LINE" >> $DE_CONF_PATH fi if grep -qE "^${WALLPAPER_LINE//\//\\/}" $DE_CONF_PATH; then print_info "'$WALLPAPER_LINE' ist bereits in $DE_CONF_PATH eingetragen" 1 elif grep -q "wallpaper=" $DE_CONF_PATH; then print_info "Ändere entsprechende Zeile in $DE_CONF_PATH zu '$WALLPAPER_LINE' ..." sed -i "s/wallpaper=.*/${WALLPAPER_LINE//\//\\/}/g" $DE_CONF_PATH else print_info "Hänge '$WALLPAPER_LINE' an $DE_CONF_PATH an ..." echo "$WALLPAPER_LINE" >> $DE_CONF_PATH fi else echo "wallpaper_mode=center wallpaper_common=1 wallpaper=/home/dreher/dreher_gmbh/dreher_logo.png desktop_bg=#d6d3de desktop_fg=#e8e8e8 desktop_shadow=#d6d3de desktop_font=PibotoLt 12 show_wm_menu=0 sort=mtime;ascending; show_documents=0 show_trash=0 show_mounts=0" > $DE_CONF_PATH fi chown -R $USER:$USER $PCMANFM_DIR ################################### # raspi-config ################################### # Achtung: 0 -> Ja; 1 -> Nein * #********************************** LANG_DEFAULT="de_AT.UTF-8" TZ_DEFAULT="Europe/Vienna" WIFI_REG_DEFAULT="AT" XKBLAYOUT_DEFAULT="at" XKBLAYOUT_CURRENT=$(grep XKBLAYOUT /etc/default/keyboard | cut -d '"' -f2) if [ $(raspi-config nonint get_boot_splash) -eq 0 ]; then print_info "Splash-Screen ist bereits aktiviert" 1 else print_info "Aktiviere Splash-Screen ..." raspi-config nonint do_boot_splash 0 fi if [ $(raspi-config nonint get_blanking) -ne 0 ]; then print_info "Screen-Blanking (Display-Standby) ist bereits deaktiviert" 1 else print_info "Deaktiviere Screen-Blanking (Display-Standby) ..." raspi-config nonint do_blanking 1 fi if [ $(raspi-config nonint get_ssh) -eq 0 ]; then print_info "SSH ist bereits aktiviert" 1 else print_info "Aktiviere SSH ..." raspi-config nonint do_ssh 0 fi if [ $(raspi-config nonint get_spi) -eq 0 ]; then print_info "SPI ist bereits aktiviert" 1 else print_info "Aktiviere SPI ..." raspi-config nonint do_spi 0 fi if [ $(raspi-config nonint get_i2c) -eq 0 ]; then print_info "I2C ist bereits aktiviert" 1 else print_info "Aktiviere I2C ..." raspi-config nonint do_i2c 0 fi if [ $(raspi-config nonint get_serial) -ne 0 ] && [ $(raspi-config nonint get_serial_hw) -eq 0 ]; then print_info "UART ist bereits aktiviert und Serial-Shell deaktiviert" 1 else print_info "Aktiviere UART und Deaktiviere Serial-Shell ..." raspi-config nonint do_serial 2 fi if [ $(raspi-config nonint get_onewire) -eq 0 ]; then print_info "One-Wire ist bereits aktiviert" 1 else print_info "Aktiviere One-Wire ..." raspi-config nonint do_onewire 0 fi if [ "$LANG" = "$LANG_DEFAULT" ]; then print_info "locale (\$LANG) ist bereits $LANG" 1 else print_info "Ändere locale von $LANG auf $LANG_DEFAULT ..." raspi-config nonint do_change_locale "$LANG_DEFAULT" fi if [ "$(get_timezone)" = "$TZ_DEFAULT" ]; then print_info "Zeitzone ist bereits $TZ_DEFAULT" 1 else print_info "Setze Zeitzone auf $TZ_DEFAULT ..." timedatectl set-timezone "$TZ_DEFAULT" dpkg-reconfigure -f noninteractive tzdata fi if [ "$XKBLAYOUT_CURRENT" = "$XKBLAYOUT_DEFAULT" ]; then print_info "Tastaturlayout ist bereits auf '$XKBLAYOUT_DEFAULT' eingestellt" 1 else print_info "Ändere Tastaturlayout von '$XKBLAYOUT_CURRENT' zu '$XKBLAYOUT_DEFAULT' ..." raspi-config nonint do_configure_keyboard "$XKBLAYOUT_DEFAULT" fi set +e systemctl -q is-enabled NetworkManager > /dev/null 2>&1 set -e if [ $? -eq 0 ]; then print_info "NetworkManager ist bereits enabled" 1 else print_info "Enable NetworkManager ..." raspi-config nonint do_netconf 2 fi set +e WIFI_REG_CURRENT=$(raspi-config nonint get_wifi_country) set -e if [ "$WIFI_REG_CURRENT" = "$WIFI_REG_DEFAULT" ]; then print_info "Wifi-Region ist bereits $WIFI_REG_DEFAULT" 1 else print_info "Setze Wifi-Region von $WIFI_REG_CURRENT auf $WIFI_REG_DEFAULT ..." raspi-config nonint do_wifi_country "$WIFI_REG_DEFAULT" fi if [ $(raspi-config nonint get_autologin) -eq 0 ] && [ $(raspi-config nonint get_boot_cli) -ne 0 ]; then print_info "Desktop-Autologin ist bereits aktiviert" 1 else print_info "Aktiviere Desktop-Autologin ..." raspi-config nonint do_boot_behaviour "B4" fi ################################### # X11VNC ################################### VNC_DIR="$HOME/.vnc" VNC_PASS="$VNC_DIR/passwd" if [ ! -e $VNC_PASS ] || question "X11VNC-Passwort ändern?"; then print_log $BLUE "VNC-Passwort" "Bitte VNC-Passwort für Benutzer '$USER' eingeben:" mkdir -p $VNC_DIR x11vnc -storepasswd $VNC_PASS chown -R $USER:$USER $VNC_DIR chmod 600 $VNC_PASS fi X11VNC_UNIT_NAME="x11vnc.service" X11VNC_UNIT_PATH="/etc/systemd/system/$X11VNC_UNIT_NAME" print_info "Erstelle, starte und enable $X11VNC_UNIT_NAME" echo "[Unit] Description=X11VNC Server [Service] Type=simple User=$USER ExecStart=/usr/bin/x11vnc -rfbauth $VNC_PASS -forever -display :0 -loop -noxdamage -repeat -shared Restart=on-failure RestartSec=2s [Install] WantedBy=graphical.target" > $X11VNC_UNIT_PATH systemctl daemon-reload systemctl start $X11VNC_UNIT_NAME systemctl enable $X11VNC_UNIT_NAME ################################### # Samba ################################### KUNDE_DIR=$HOME/dreher_kunde USER_KUNDE="kunde" set +e # Fehler zulassen out=$(useradd -s /bin/false -g users -m $USER_KUNDE 2>&1) ret=$? set -e if [ $ret -eq 9 ]; then print_info "Benutzer '$USER_KUNDE' existiert bereits" 1 elif [ $ret -ne 0 ]; then print_error $out exit 1 else print_info "Benutzer '$USER_KUNDE' eingerichtet" 1 fi mkdir -p $KUNDE_DIR chown -R $USER_KUNDE:users $KUNDE_DIR chmod 770 $KUNDE_DIR SAMBA_CONF="/etc/samba/smb.conf" SAMBA_BU="$SAMBA_CONF.original" SAMBA_PREV="$SAMBA_CONF.prev" if [ ! -f $SAMBA_BU ]; then print_info "erstelle Backup von Original-Samba-Config ($SAMBA_BU)" cp $SAMBA_CONF $SAMBA_BU else print_info "Backup von Original-Samba-Config existiert bereits ($SAMBA_BU)" 1 fi print_info "Sichere letzte Samba-Config in $SAMBA_PREV" cp $SAMBA_CONF $SAMBA_PREV print_info "Schreibe neue Samba-Config in $SAMBA_CONF" echo "[global] workgroup = WORKGROUP security = user client min protocol = SMB2 client max protocol = SMB3 [dreher_gmbh] comment = Dreher GmbH Dateien – nicht öffentlich path = $DREHER_DIR read only = no [dreher_kunde] comment = Dreher-Kunden-Freigabe path = $KUNDE_DIR read only = no" > $SAMBA_CONF testparm --suppress-prompt > /dev/null 2>&1 if ! pdbedit -L | grep -qE "^$USER_KUNDE:" || question "Samba-Passwort für '$USER_KUNDE' ändern?"; then print_log $BLUE "Samba-Passwort '$USER_KUNDE'" "Bitte Passwort für Benutzer '$USER_KUNDE' eingeben:" smbpasswd -a $USER_KUNDE fi if ! pdbedit -L | grep -qE "^$USER:" || question "Samba-Passwort für '$USER' ändern?"; then print_log $BLUE "Samba-Passwort '$USER'" "Bitte Passwort für Benutzer '$USER' eingeben:" smbpasswd -a $USER fi ################################### # Hostname ################################### OLD_HOSTNAME=$(get_hostname) if question "Hostname '$OLD_HOSTNAME' ändern?"; then read -p "Neuen Hostnamen eingeben: " NEW_HOSTNAME if [ "$OLD_HOSTNAME" = "$NEW_HOSTNAME" ]; then print_warning "Hostname ist bereits '$OLD_HOSTNAME'" else hostnamectl set-hostname $NEW_HOSTNAME STATIC_HOSTNAME=$(get_hostname) sed -i "s/127\.0\.1\.1.*/127.0.1.1\t$STATIC_HOSTNAME/g" /etc/hosts if [ "$NEW_HOSTNAME" = "$STATIC_HOSTNAME" ]; then print_info "Hostname zu '$NEW_HOSTNAME' geändert" else print_info "Hostname zu '$STATIC_HOSTNAME' (static), '$NEW_HOSTNAME' (pretty) geändert" fi fi fi ################################### # WireGuard ################################### if question "WireGuard konfigurieren?"; then wg_conf_num=0 CURRENT_HOSTNAME="$(get_hostname)" if [[ "$CURRENT_HOSTNAME" =~ [0-9]+$ ]]; then number="${CURRENT_HOSTNAME##*[^0-9]}" if question "Hostname endet mit '$number'. Soll '$number' für die wg-Konfiguration verwednet werden?"; then wg_conf_num=$number else read -p "Welche Nummer soll stattdessen verwendet werden? -> " wg_conf_num fi else read -p "Nummer für wg-Konfiguartion angeben: " wg_conf_num fi echo "wg_conf_num: $wg_conf_num" if [ $wg_conf_num -ne 0 ]; then python3 $WG_CONF_PY start enable --id $number else print_warning "Fehler bei Ermittlung der Nummer für die wg-Konfiguration" fi fi SUDOERS_DIR="/etc/sudoers.d" SUDOERS_BAD_NAME="010_pi-nopasswd" SUDOERS_GOOD_NAME="${SUDOERS_BAD_NAME}~" SUDOERS_BAD_PATH="$SUDOERS_DIR/$SUDOERS_BAD_NAME" SUDOERS_GOOD_PATH="$SUDOERS_DIR/$SUDOERS_GOOD_NAME" if [ -f "$SUDOERS_BAD_PATH" ]; then print_info "Disable passwortfreies 'sudo' ..." mv -f "$SUDOERS_BAD_PATH" "$SUDOERS_GOOD_PATH" elif [ -f "$SUDOERS_GOOD_PATH" ]; then print_info "passwortfreies 'sudo' ist bereits disabled" 1 else print_warning "Konnte 'passwortfreies sudo' nicht ermitteln, da weder $SUDOERS_BAD_NAME noch $SUDOERS_GOOD_NAME in $SUDOERS_DIR gefunden wurden. Check das lieber mal" fi if [ $UNINSTALL_REALVNC -ne 0 ] && question "Soll '$REALVNC' jetzt deinstalliert werden?"; then apt remove $REALVNC fi if question "Jetzt neu starten?"; then print_log $GREEN "alles erledigt" "bis gleich :-)" reboot fi print_log $GREEN "alles erledigt" "neu starten nicht vergessen :-)"