From 87c79b59c9cd3ec8ca930560c8464f481cf62718 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 2 Jun 2020 19:20:40 -0400 Subject: [PATCH] Initial commit. --- configure-stormux.sh | 195 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100755 configure-stormux.sh diff --git a/configure-stormux.sh b/configure-stormux.sh new file mode 100755 index 0000000..9db0f8d --- /dev/null +++ b/configure-stormux.sh @@ -0,0 +1,195 @@ +#!/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) + +# Use the same text twice here and just hide the tag field. +region=$(dialog --backtitle "$(gettext "Please select your Region")" \ + --no-tags \ + --menu "$(gettext "Use up and down arrows or page-up and page-down to navigate the list, and press 'Enter' to make your selection.")" 0 0 0 \ + $(for i in ${regions[@]} ; do echo "$i";echo "$(gettext "$i")";done) --stdout) + +mapfile -t cities < <(timedatectl --no-pager list-timezones | grep "$region" | cut -d '/' -f2 | sort -u) + +# Use the same text twice here and just hide the tag field. +city=$(dialog --backtitle "$(gettext "Please select a city near you")" \ + --no-tags \ + --menu "$(gettext "Use up and down arrow or page-up and page-down to navigate the list.")" 0 0 10 \ + $(for i in ${cities[@]} ; do echo "$i";echo "$(gettext "$i")";done) --stdout) + +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