#!/bin/bash # shellcheck source=kzcommon.sh ############################################################################### # Netwerkschijf aankoppelen. # # Geschreven door Karel Zimmer . # # Auteursrecht (c) 2014-2021 Karel Zimmer. # GNU Algemene Publieke Licentie . # # RelNum=12.05.01 # RelDat=2021-04-01 ############################################################################### ############################################################################### # Global constants ############################################################################### source "$(dirname "$0")"/kzcommon.sh readonly NAS_LOGIN=/root/.${PROGRAM_NAME}login readonly NAS_MOUNT_POINT=/mnt/$PROGRAM_NAME readonly NAS_FIXED_IP_ADDRESS="Zorg dat de NAS een vast IP-adres heeft. Hiervoor is nodig: - het MAC-adres van de NAS \ (zoals $(ip -oneline link | awk '/ UP /{print $17}')) - toegang tot de NAS via een webbrowser - toegang tot de router via een webbrowser 1. Kies in de router met het MAC-adres van de NAS een IP-adres buiten het bereik van DHCP die automatisch de IP-adressen uitdeelt (vaak 192.168.0.200). 2. Kies in de NAS het vaste IP-adres en zet DHCP uit." readonly RUN_AS_SUPERUSER=true readonly SYSTEMD_MOUNT_DIR=/etc/systemd/system readonly SYSTEMD_MOUNT_FILE=mnt-nas.mount readonly SYSTEMD_MOUNT=$SYSTEMD_MOUNT_DIR/$SYSTEMD_MOUNT_FILE # Bij aanpassingen ook .completion aanpassen! readonly OPTIONS_SHORT=$OPTIONS_SHORT_COMMON readonly OPTIONS_LONG=$OPTIONS_LONG_COMMON readonly USAGE="Gebruik: $PROGRAM_NAME $OPTIONS_USAGE_COMMON" readonly HELP="Gebruik: $PROGRAM_NAME [OPTIE...] Netwerkschijf aankoppelen. Opties: $OPTIONS_HELP_COMMON" ############################################################################### # Global variables ############################################################################### declare NAS_GEBRUIKERSNAAM=${SUDO_USER:-$USER} declare NAS_IP_ADRES=192.168.0.200 declare NAS_SHARENAAM=${SUDO_USER:-$USER} declare NAS_WACHTWOORD='geheim' ############################################################################### # Functions ############################################################################### check_input() { PARSED=$( getopt --alternative \ --options "$OPTIONS_SHORT" \ --longoptions "$OPTIONS_LONG" \ --name "$PROGRAM_NAME" \ -- "$@" ) || GETOPT_RC=$? if [[ $GETOPT_RC -ne 0 ]]; then printf '%s\n' "$USAGELINE" >&2 exit $ERROR fi eval set -- "$PARSED" process_general_options "$@" while true; do case $1 in --) shift break ;; *) shift ;; esac done if [[ "$*" ]]; then printf "$PROGRAM_NAME: %s\n%s\n" \ 'geen argumenten opgeven' \ "$USAGELINE" >&2 exit $ERROR fi check_user # Na check_user voor toegang tot media. check_packages request_input } check_packages() { rm --force /root/.naslogin check_dpkg sudo apt-get install --yes cifs-utils samba |& $LOGCMD } request_input() { local fstab='' local quest1='Deze regels verwijderen?' local quest2="Heeft de NAS een vast IP-adres zoals $NAS_IP_ADRES?" local quest3='IP-adres van de NAS' local quest4='Gebruikersnaam op de NAS' local quest5='Wachtwoord van deze gebruiker op de NAS' local quest6='Share-naam van deze gebruiker op de NAS' local -i zenity_rc=0 local warning='' fstab=$( if ! grep --regexp="$PROGRAM_NAME" /etc/fstab; then printf '\n' fi ) if [[ $fstab ]]; then warning="Onderstaande regels zijn al aanwezig in de koppeltabel: $fstab" if $OPTION_GUI; then # Constructie '2> >($LOGCMD)' om stderr naar de log te krijgen. # Voorbeeld: Unable to init server: Kon niet verbinden: # Verbinding is geweigerd # en: (zenity:47712): Gtk-WARNING **: 10:35:49.339: # cannot open display: zenity --question \ --no-markup \ --width 400 \ --height 100 \ --title 'Waarschuwing' \ --text "$warning\n\n$quest1" \ 2> >($LOGCMD) || zenity_rc=$? if [[ $zenity_rc -eq 0 ]]; then verwijder_regels fi else printf '%s\n' "$warning" read -rp "$quest1 [j/N]: " while true; do case $REPLY in j*|J*) verwijder_regels break ;; n*|N*|'') info 'Ok, we gaan verder.' break ;; *) printf '%b' "${UP_ONE_LINE}${ERASE_LINE}" continue ;; esac done fi fi if $OPTION_GUI; then if ! zenity --question \ --no-markup \ --width 400 \ --height 100 \ --title 'Vraag' \ --text "$quest2" 2> >($LOGCMD); then zenity --info \ --no-markup \ --width 500 \ --height 100 \ --title 'Melding' \ --text "$NAS_FIXED_IP_ADDRESS" 2> >($LOGCMD) || true exit $SUCCESS fi else while true; do read -rp "$quest2 [j/N]: " case $REPLY in j*|J*) info 'Ok, we gaan verder.' break ;; n*|N*|'') printf '%s\n' "$NAS_FIXED_IP_ADDRESS" exit $SUCCESS ;; *) printf '%b' "${UP_ONE_LINE}${ERASE_LINE}" continue ;; esac done fi TEXT='Beantwoord alstublieft de volgende vragen' if $OPTION_GUI; then REPLY=$( zenity --forms \ --title 'Vragen' \ --text "$TEXT" \ --separator "," \ --add-entry "$quest3" \ --add-entry "$quest4" \ --add-password "$quest5" \ --add-entry "$quest6" 2> >($LOGCMD) ) || zenity_rc=$? if [[ $zenity_rc -ne 0 ]]; then exit $SUCCESS fi NAS_IP_ADRES=$( printf '%s' "$REPLY" | awk -F, '{print $1}') NAS_GEBRUIKERSNAAM=$(printf '%s' "$REPLY" | awk -F, '{print $2}') NAS_WACHTWOORD=$( printf '%s' "$REPLY" | awk -F, '{print $3}') NAS_SHARENAAM=$( printf '%s' "$REPLY" | awk -F, '{print $4}') else printf '%s\n%s\n' "$TEXT." "Als u niets opgeeft, wordt de waarde \ tussen [] gebruikt als antwoord." read -rp " $quest3? [$NAS_IP_ADRES]: " if [[ $REPLY ]]; then NAS_IP_ADRES=$REPLY fi read -rp " $quest4? [$NAS_GEBRUIKERSNAAM]: " if [[ $REPLY ]]; then NAS_GEBRUIKERSNAAM=$REPLY fi read -rsp " $quest5? [$NAS_WACHTWOORD]: " if [[ $REPLY ]]; then NAS_WACHTWOORD=$REPLY fi printf '\n' read -rp " $quest6? [$NAS_SHARENAAM]: " if [[ $REPLY ]]; then NAS_SHARENAAM=$REPLY fi fi } process_input() { local text0='Opdrachten worden verwerkt' local text1='Maak koppelpunt' local text2='Maak NAS login' local text3='Maak systemd' local text4='Koppel NAS aan' TITLE='Netwerkschijf aankoppelen' if $OPTION_GUI; then ( printf '%s\n' "#$text1" create_mountpoint printf '%s\n' "#$text2" create_nas_login printf '%s\n' "#$text3" create_systemd_unit_file printf '%s\n' "#$text4" mount_nas ) |& zenity --progress \ --pulsate \ --auto-close \ --no-cancel \ --width 600 \ --height 50 \ --title "$TITLE" \ --text "$text0" 2> >($LOGCMD) else create_mountpoint create_nas_login create_systemd_unit_file mount_nas fi } create_mountpoint() { if [[ -d $NAS_MOUNT_POINT ]]; then return $SUCCESS fi printf '%s\n' 'Maak NAS koppelpunt...' mkdir "$NAS_MOUNT_POINT" |& $LOGCMD chmod '777' "$NAS_MOUNT_POINT" |& $LOGCMD } create_nas_login() { printf '%s\n' 'Maak NAS login...' TEXT="username=$NAS_GEBRUIKERSNAAM\npassword=$NAS_WACHTWOORD" printf '%b\n' "$TEXT" > "$NAS_LOGIN" chmod '600' "$NAS_LOGIN" |& $LOGCMD } create_systemd_unit_file() { printf '%s\n' 'Maak systemd mount-bestand...' printf '%s\n' "[Unit] Description=Mount NAS Directory [Mount] What=//$NAS_IP_ADRES/$NAS_SHARENAAM Where=/mnt/nas Type=cifs Options=credentials=$NAS_LOGIN,sec=ntlm,vers=1.0,rw,noperm,iocharset=utf8,\ dir_mode=0777,file_mode=0777 [Install] WantedBy=multi-user.target" > "$SYSTEMD_MOUNT" } mount_nas() { printf '%s\n' 'Koppel NAS aan...' systemctl enable "$SYSTEMD_MOUNT_FILE" |& $LOGCMD if ! systemctl start "$SYSTEMD_MOUNT_FILE" |& $LOGCMD; then true fi systemctl daemon-reload |& $LOGCMD } term_script() { if ! systemctl status "$SYSTEMD_MOUNT_FILE"; then true fi info "Het systemd mount-bestand is geactiveerd. De NAS zou beschikbaar moetn zijn op '$NAS_MOUNT_POINT'. De-activeer het systemd mount-besta2nd met de opdracht: ${BLUE}sudo systemctl disable mnt-nas.mount${NORMAL}" exit $SUCCESS } ############################################################################### # Main line ############################################################################### main() { init_script check_input "$@" process_input term_script } main "$@" # EOF