#!/bin/bash # Configure Stormux # A script to configure the system for new users. # # Copyright 2020, Storm Dragon, # # This is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free # Software Foundation; either version 3, or (at your option) any later # version. # # This software is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this package; see the file COPYING. If not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # #--code-- # UI code starts here. # Settings to improve accessibility of dialog. export DIALOGOPTS='--insecure --no-lines --visit-items' inputbox() { # Returns: text entered by the user # Args 1, Instructions for box. # args: 2 initial text (optional) dialog --backtitle "$(gettext "Enter text and press enter.")" \ --clear \ --inputbox "$1" 0 0 "$2" --stdout } passwordbox() { # Returns: text entered by the user # Args 1, Instructions for box. # args: 2 initial text (optional) dialog --backtitle "$(gettext "Enter text and press enter.")" \ --clear \ --passwordbox "$1" 0 0 "$2" --stdout } msgbox() { # Returns: None # Shows the provided message on the screen with an ok button. dialog --clear --msgbox "$*" 10 72 } infobox() { # Returns: None # Shows the provided message on the screen with no buttons. local timeout=3 dialog --infobox "$*" 0 0 read -n1 -t $timeout continue # Clear any keypresses from the buffer read -t 0.01 continue } yesno() { # Returns: Yes or No # Args: Question to user. # Called in if $(yesno) == "Yes" # Or variable=$(yesno) dialog --clear --backtitle "$(gettext "Press 'Enter' for \"yes\" or 'Escape' for \"no\".")" --yesno "$*" 10 80 --stdout if [[ $? -eq 0 ]]; then echo "Yes" else echo "No" fi } menulist() { # Args: List of items for menu. # returns: selected tag local menuList for i in "${@}" ; do menuList+=("$i" "$i") done dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \ --clear \ --no-tags \ --menu "Please select an option" 0 0 0 ${menuList[@]} --stdout return $? } show_doc() { # Displays file in w3m using pager mode # Args: path to file. # Returns: none. fold -sw $cols "$1" | w3m -o keymap_file=~/.w3m/pager } # System modification functions begin here. change_user() { # The user can not be logged in when the name change occurs. # Write a file to /etc/cron.d/chuser # The file will run at boot, change the username, and delete itself. # Args: new username. if [[ $# -ne 1 ]]; then msgbox "Missing required argument, username." exit 1 fi if [[ "$(whoami)" == "root" ]]; then msgbox "Please run this script as the user you would like to rename, not as root." exit 1 fi local oldUser="$USER" local groups="$(groups "$oldUser")" groups="${groups// /,}" local newUser="$1" if ! [[ "$newUser" =~ ^[a-z][-a-z0-9]*$ ]]; then msgbox "Username $newUser failed validation. It cannot contain spaces or some punctuation." exit 1 fi # Heredocument left-aligned cat << EOF | sudo tee /etc/cron.d/0chuser &> /dev/null SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin @reboot root usermod -a -G $groups -m -d /home/$newUser -l $newUser $oldUser && sed -i -e "s#NODM_USER=.*#NODM_USER='$newUser'#" -e "s#NODM_XSESSION=.*#NODM_XSESSION='/home/$newUser/.xinitrc'#" /etc/nodm.conf; rm -f /etc/cron.d/0chuser;reboot EOF # Heredocument end. # Files in cron.d must be 644 to work. sudo chmod 644 /etc/cron.d/0chuser && echo "Setting file permissions on /etc/cron.d/0chuser to 644" | log # Reboot the computer so the script can run local answer="$(yesno "Would you like to reboot now so the username can be changed? If no, you will need to reboot manually for the changes to be applied.")" if [[ "$answer" == "Yes" ]]; then sudo reboot fi } set_timezone() { # Attempt to autodetect the timezone. local timezone="$(curl -s --connect-timeout 5 ipinfo.io | grep -E '\s*"timezone":' | cut -d '"' -f4)" | dialog --progressbox "Attempting to detect your timezone..." 0 0 if [[ -n "$timezone" ]]; then local answer="$(yesno "The timezone for your current location is ${timezone}. Would you like to use this timezone?")" fi if [[ "$answer" == "No" ]]; then # Get the list of timezones mapfile -t regions < <(timedatectl --no-pager list-timezones | cut -d '/' -f1 | sort -u) region=$(menulist ${regions[@]}) mapfile -t cities < <(timedatectl --no-pager list-timezones | grep "$region" | cut -d '/' -f2 | sort -u) city=$(menulist ${cities[@]}) timezone="${region}/${city}" fi # Set the timezone sudo timedatectl set-timezone ${timezone} # Make sure we are syncing with the internet sudo timedatectl set-ntp true } unmute_soundcard() { # Try to unmute the soundcard. if amixer get Master | grep -q '\[off\]' ; then amixer sset Master unmute fi # Check system volume, try to make sure it is unmuted and at a reasonable level. soundcardVolume=$(amixer get Master | grep '\[on\]' | cut -d '[' -f2 | cut -d '%' -f1 | head -1) if [[ $soundcardVolume -le 25 ]]; then amixer sset Master 50% |& log fi } # Make sure basic xdg directory structure is in place: xdg-user-dirs-update exit 0