2020-06-02 19:20:40 -04:00
#!/bin/bash
# Configure Stormux
# A script to configure the system for new users.
#
# Copyright 2020, Storm Dragon, <storm_dragon@linux-a11y.org>
#
# 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)
2020-07-07 17:57:46 -04:00
dialog --backtitle "Stormux" \
2020-06-02 19:20:40 -04:00
--clear \
--inputbox " $1 " 0 0 " $2 " --stdout
}
passwordbox( ) {
# Returns: text entered by the user
# Args 1, Instructions for box.
# args: 2 initial text (optional)
2020-07-07 17:57:46 -04:00
dialog --backtitle "Stormux" \
2020-06-02 19:20:40 -04:00
--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)
2020-07-07 17:57:46 -04:00
dialog --clear --backtitle "Stormux" --yesno " $* " 10 80 --stdout
2020-06-02 19:20:40 -04:00
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
2020-07-07 17:57:46 -04:00
dialog --backtitle "Stormux" \
2020-06-02 19:20:40 -04:00
--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)
2020-06-09 23:46:41 -04:00
region = $( menulist ${ regions [@] } )
2020-06-02 19:20:40 -04:00
mapfile -t cities < <( timedatectl --no-pager list-timezones | grep " $region " | cut -d '/' -f2 | sort -u)
2020-06-09 23:46:41 -04:00
city = $( menulist ${ cities [@] } )
2020-06-02 19:20:40 -04:00
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
}
2020-06-09 23:51:58 -04:00
# System modification functions end here.
2020-06-02 19:20:40 -04:00
# Make sure basic xdg directory structure is in place:
xdg-user-dirs-update
exit 0