|
#!/bin/bash
##---------------------------------------------------------------------------##
#
# Program: set-up-environment
# Author: Brian <genius@groupbcl.ca> :)
# Date: June 2016, major revisions January 2017
#
# Automates the process of setting up a user environment for a live-boot
# Linux distribution or virtual machine (works for both RPM and DEB based
# environments):
#
# * Creates a RAM-drive on /tmp
# * Installs the BUUS (Brian's Useful Utilities Set) programs into /usr/local/bin
# * Mounts a persistent storage volume for /home, if needed
# * Installs and configures Midnight Commander
# * Installs vim
# * Sets up some useful things in /etc/profile.d/misc.sh
# * Sets up a useful .vimrc for root and the live user
#
##---------------------------------------------------------------------------##
# The script makes the following assumptions when it detects a live CD,
# DVD, or USB drive environment:
#
# * There is a file called 'home.img' somewhere in the file system of one
# of the partitions on the drive. If the file isn't found in the
# currently mounted file systems when this script is run, it locates any
# other partitions on the drive, mounts them, and looks there. It
# continues searching all available removable devices until home.img is
# found or it runs out of drives to search. A failure to find home.img
# is not fatal.
#
# * The 'home.img' file is a mountable file system containing a home
# directory, with subdirectories for the live user and '.common'. The
# .common subdirectory contains directories for Documents, Downloads,
# Music, Pictures, Public, .ssh (see below) and .mozilla, and these are
# symlinked from the live user home directory to provide a common set of
# directories between multiple live users. Note that the .kde and
# Desktop directories are not shared in this fashion; each live user has
# its own copy.
#
# * The live user's home directory has to have its own .ssh directory and
# its own .ssh/authorized_keys, but other files in the .ssh can be
# symlinked to their counterparts in ../../.common/.ssh.
#
# * There is a file called BUUS.tar.gz in the same subdirectory where the
# home.img file is, or its parent directory. If it's not found there,
# this script looks fit a copy in /tmp, and failing that retrieves a
# copy from my NextCloud server.
##---------------------------------------------------------------------------##
# Currently this script works with the following:
# * My 8 GB Kingston DataTraveller G4 flash drive
# * My "Penguin" flash drive with two partitions (now lost):
# + Label 'FAT_PANGUIN', which has the live distribution on it
# + Label 'EXT_PENGUIN', which has the 'home.img' file on it
# * My 16 GB Kingston DT101 flash drive with a single partition 'DT101-16GB'
##---------------------------------------------------------------------------##
# BUUS: This script is part of Brian's Useful Utilities Set
##---------------------------------------------------------------------------##
function run_step {
echo "$1"
if [ "$2" ] && [ -f "$2" -o -d "$2" ]
then
echo "* Processing has already been done"
RC=0
else
shift 2
RC=0
while [ $RC = 0 -a "$1" ]
do
echo " >> $1"
eval "$1"
RC=$?
[ $RC = 0 ] || echo "*** Command failed ***"
shift
done
fi
echo
}
function die { echo "$1" >&2; exit 1; }
[ -r /etc/shadow ] || die "Must run as root--try 'sudo $0'"
#--- Determine which distribution we're runnning
if [ -f /etc/os-release ]
then
. /etc/os-release
elif [ -f /etc/redhat-release ]
then
# Example: CentOS release 5.8 (Final)
eval "$(awk 'match($0,/^(.*) release (.*)/,a) {
print "NAME=\"" a[1] "\" VERSION_ID=\"" a[2] "\""
}' /etc/redhat-release)"
fi
[ "$VERSION_ID" ] || die "Unable to determine distribution name and version"
echo -e "Running on Linux distribution '$NAME' version $VERSION_ID\n"
#--- Is there a user other nthan root on the system? ---
LIVE_USER="$(ls /home | head -n 1)"
[ "$LIVE_USER" ] && LIVE_GID="$(awk -F: "/^$LIVE_USER/{print \$4}" /etc/passwd)"
#--- Are we on a Live CD/DVD/USB system?
mount | grep -q squashfs && LIVE_ENV=true || LIVE_ENV=false
#--- Determine which package manager is available
[ -x /usr/bin/rpm -o -x /bin/rpm ] && PKG='rpm' INSTALLER='rpm -Uvh'
[ -x /usr/bin/yum -o -x /bin/yum ] && PKG='rpm' INSTALLER='yum install -y'
[ -x /usr/bin/dnf -o -x /bin/dnf ] && PKG='rpm' INSTALLER='dnf install -y'
[ -x /usr/bin/apt-get -o -x /bin/apt-get ] && PKG='deb' INSTALLER='apt-get install'
#--- Set up RAM drive on /tmp
run_step 'Set up RAM drive on /tmp' '/tmp' \
'mkdir /tmp' \
'mount -t tmpfs tmpfs /tmp' \
'touch -r /etc/fstab /tmp/x1' \
'echo "tmpfs /tmp tmpfs defaults 0 0" >>/etc/fstab' \
'grep -e "^#" /etc/fstab | grep -v "^[[:space:]]*\$" >/tmp/x2' \
'egrep -v -e "^[[:space:]]\$" -e "^#" /etc/fstab | column -t >>/tmp/x2' \
'touch -r /tmp/x1 /tmp/x2' \
'cat /tmp/x2 >/etc/fstab' \
'touch -r /tmp/x2 /etc/fstab' \
'rm -f /tmp/x1 /tmp/x2'
# Locate the device where home.img and BUUS.tar.gz are stored. Sometimes I
# split a USB device into multiple partitions, with the persistent home
# filesystem on a different partition. Look for that partition and mount it if
# necessary.
if $LIVE_ENV
then
echo "Searching for 'home.img'"
BLKID_FILE='/dev/shm/blkid.text'
blkid >$BLKID_FILE
# First try the mounted filesystems
for DIR in $(mount | grep '^/dev/[sh]d[a-z]' | cut -f3 -d' ')
do
echo "* $DIR"
HOME_IMG_PATH_AND_FN="$(find $DIR -name home.img | head -n 1)"
[ "$HOME_IMG_PATH_AND_FN" ] && break
done
# Now try the unmounted partitions on removable devices
if [ ! "$HOME_IMG_PATH_AND_FN" ]
then
# Check all the disc devices in /sys/block
cd /sys/block
for DEV in [sh]d[a-z]
do
[ "$(cat $DEV/removable)" = 1 ] || continue
# If it's removable, check the partitions
cd $DEV
for PARTITION in ${DEV}[0-9]*
do
mount | grep -q "^/dev/$PARTITION" && continue
# We found a partition that isn't mounted. Try mounting it.
LABEL="$(echo $PARTITION | tr '[a-z]' '[A-Z')"
eval "$(grep ^/dev/$PARTITION $BLKID_FILE | cut -f2- -d' ')"
X_MOUNT_PT="/dev/shm/$LABEL"
echo "* /dev/$PARTITION ($LABEL)"
mkdir $X_MOUNT_PT
mount /dev/$PARTITION $X_MOUNT_PT >/dev/null 2>&1
[ $? = 0 ] && HOME_IMG_PATH_AND_FN="$(find $X_MOUNT_PT -name home.img | head -n 1)"
[ "$HOME_IMG_PATH_AND_FN" ] && break
umount $X_MOUNT_PT >/dev/null 2>&1
rmdir $X_MOUNT_PT
done
done
fi
# Did we find it?
[ "$HOME_IMG_PATH_AND_FN" ] && echo "* Found at $HOME_IMG_PATH_AND_FN" || echo "* Could not find partition!"
echo
fi
#--- Set up /usr/local/bin
if [ "$HOME_IMG_PATH_AND_FN" ]
then
BUUS_PATH=$(dirname $HOME_IMG_PATH_AND_FN)
[ -f $BUUS_PATH/BUUS.tar.gz ] || BUUS_PATH=$(dirname $BUUS_PATH)
[ -f $BUUS_PATH/BUUS.tar.gz ] && run_step 'Set up /usr/local/bin' \
'/usr/local/bin/pause' \
'cd /usr/local/bin' \
"tar xzf $BUUS_PATH/BUUS.tar.gz"
elif [ -f /tmp/BUUS.tar.gz ]
then
run_step 'Set up /usr/local/bin from /tmp/BUUS.tar.gz' \
'/usr/local/bin/pause' \
'cd /usr/local/bin' \
'tar xzf /tmp/BUUS.tar.gz' \
'rm -f /tmp/BUUS.tar.gz'
else
run_step 'Set up /usr/local/bin from BUUS.tar.gz on NextCloud at penguin' \
'/usr/local/bin/pause' \
'curl -s http://renyamon.dyns.net/nextcloud/index.php/s/IFz4KpywiPru4Fr/download >/tmp/BUUS.tar.gz' \
'cd /usr/local/bin' \
'tar xzf /tmp/BUUS.tar.gz' \
'rm -f /tmp/BUUS.tar.gz'
fi
#--- Set up /etc/profile.d/misc.sh'
run_step 'Set up /etc/profile.d/misc.sh' '/etc/profile.d/misc.sh' \
'echo "TMOUT=900
export EDITOR=vim
export HISTCONTROL=ignoreboth
shopt -s no_empty_cmd_completion" >/etc/profile.d/misc.sh'
#--- Mount persistent storage over /home, if needed (e.g. Linux Mint)
if $LIVE_ENV
then
echo "Set up persistent storage for /home"
if ! mount | grep -q 'on /home'
then
# Mount 'home.img' over /home. The file name 'home.img' is forced by Fedora,
# because it uses a file with that name to hold the contents of the home
# filesystem. Ubuntu live distributions (well, Linux Mint) don't mount
# anything over /home by default, so we do it here.
if [ "$HOME_IMG_PATH_AND_FN" ]
then
run_step "Mount 'home.img' over /home" \
"/home/$LIVE_USER/Setup" \
"mount -o loop,noatime $HOME_IMG_PATH_AND_FN /home"
else
echo "* FAILED: Could not find 'home.img'"
fi
else
echo -e "* Processing has already been done\n"
fi
fi
#--- Ensure the live user can work with /home/.common
if [ -d /home/.common ]
then
COMMON_OWNER="$(ls -ld /home/.common | awk '{ print $3 }')"
[ $COMMON_OWNER != $LIVE_USER ] &&
run_step "Give ownership of /home/.common to $LIVE_USER" \
'' "chown -R $LIVE_USER:$LIVE_USER /home/.common"
fi
#--- If not a live system, see if we can mount a CD/DVD on the assumption
# this is a VM recently installed from a virtual CD/DVD
HAVE_CD_DVD=false
if ! $LIVE_ENV
then
run_step 'Attempt to mount CD/DVD' '/tmp/mnt' \
'mkdir /tmp/mnt' \
'mount /dev/cdrom /tmp/mnt'
[ $RC = 0 ] && HAVE_CD_DVD=true
fi
#-- Install the Midnight Commander, if we can find the package(s)
if [ "$INSTALLER" -a ! -f /usr/bin/mc ]
then
SETUP_DIR="/home/.common/Setup/$NAME-$VERSION_ID"
if [ -d "$SETUP_DIR/mc" ]
then
MC_PACKAGE="${SETUP_DIR}/mc/*.$PKG"
else
echo "'$SETUP_DIR' was not found"
echo "Attempting to install Midnight Commander using a package manager"
MC_PACKAGE='mc'
if $HAVE_CD_DVD
then
echo "> Searching CD/DVD for mc packages"
MC_PACKAGE="$(find /tmp/mnt -type f | grep /mc- | tr '\n' ' ')"
if [ "$MC_PACKAGE" ]
then
echo " * $MC_PACKAGE"
else
echo " * Not found; falling back to 'mc'"
MC_PACKAGE='mc'
fi
fi
fi
run_step 'Install Midnight Commander' '/usr/bin/mc' \
"$INSTALLER $MC_PACKAGE"
fi
# Set up Midnighter Commander's configuration
if [ -x /usr/bin/mc ]
then
MC_CONFIG=B # Version 4.8 and above
MC_DATA_DN="$(mc -F 2>&1 | awk '/^.User data/{SW=1};SW && /Config dir/{print$3}')"
[ "$MC_DATA_DN" ] || MC_CONFIG='A' MC_DATA_DN='/root/.mc'
run_step "Set up root's Midnight Commander configuration" \
"$MC_DATA_DN/ini" \
"[ -d $MC_DATA_DN ] || mkdir $MC_DATA_DN" \
"sed '1,/mc-config.${MC_CONFIG}.tar.gz.b64/d' $0 | sed '/____ END/,\$d' | base64 -id | tar xzf - -C $MC_DATA_DN" \
"chown -R root:root $MC_DATA_DN"
# Set one up for the user as well
if [ "$LIVE_USER" ]
then
ROOT_MC_DATA_DN=$MC_DATA_DN
MC_DATA_DN="${MC_DATA_DN/\/root//home/$LIVE_USER}"
run_step "Set up ${LIVE_USER}'s Midnight Commander configuration" \
"$MC_DATA_DN/ini" \
"[ -d $MC_DATA_DN ] || mkdir $MC_DATA_DN" \
"cp -a $ROOT_MC_DATA_DN $MC_DATA_DN" \
"chown -R $LIVE_USER:$LIVE_GID $MC_DATA_DN"
fi
# Set up /etc/profile.d/mc.sh, if needed
[ -f /usr/libexec/mc/mc-wrapper.sh ] && MC_WRAPPER="/usr/libexec/mc/mc-wrapper.sh" # RedHat
[ -f /usr/lib/mc/mc-wrapper.sh ] && MC_WRAPPER="/usr/lib/mc/mc-wrapper.sh" # Debian
[ $RC = 0 -a "$MC_WRAPPER" ] && run_step "Add 'mc' alias to /etc/profile.d/mc.sh" \
'/etc/profile.d/mc.sh' \
"echo \"alias mc='. $MC_WRAPPER'\" >/etc/profile.d/mc.sh"
fi
#--- If packages are available, install vim
VI="$(which vi)"
VI_DN="$(dirname $VI)"
if [ -d "$SETUP_DIR/vim" ]
then
[ $NAME = 'Fedora' ] && FORCE='--force '
run_step "Install vim" "$VI_DN/vim" \
"${INSTALLER} ${FORCE}${SETUP_DIR}/vim/*.$PKG"
#--- Else link /bin/vi to /bin/vim
else
run_step "Link $VI_DN/vi to $VI_DN/vim" \
"$VI_DN/vim" "ln $VI_DN/vi $VI_DN/vim"
fi
#--- Set up .vimrc
run_step "Set up .vimrc" '/root/.vimrc' \
'echo -e "set number background=dark tabstop=4\nau vimEnter * NoMatchParen" >~root/.vimrc' \
"[ '$LIVE_USER' ] && cp -a ~root/.vimrc /home/$LIVE_USER/.vimrc" \
"[ '$LIVE_USER' ] && chown $LIVE_USER:$LIVE_GID /home/$LIVE_USER/.vimrc"
#--- Open port 22 in the firewall
# (Is iptables running? Is port 22 already open?)
iptables -L | grep -qve '^[[:space:]]*$' -e '^Chain' -e '^target' &&
iptables -L | grep -q 'dpt:ssh' && touch /tmp/port_22_is_open
run_step "Open port 22 in the firewall" '/tmp/port_22_is_open' \
'iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT'
[ -f /tmp/port_22_is_open ] && rm -f /tmp/port_22_is_open
#--- Start sshd
run_step "Start sshd" '/var/tmp/.sshd_started' \
'systemctl start sshd' \
'touch /var/tmp/.sshd_started' \
"ip addr | egrep '^[[:space:]].*inet ' | grep -v 'lo$'"
#--- Set up my public key in ~USER/.ssh
if [ $LIVE_USER ]
then
SSH_DN="/home/$LIVE_USER/.ssh"
PK="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAyuEV2KC1CQKbSSkf4eEM2l556e2pUAeXvVjAS6"
PK="${PK}w+4eoahCp+FzQ/D0q5I0Q81GbOe9HlZC3pIA6IzZQPQ0ncy0WJSM785Be0zX+1AYHOqqz"
PK="${PK}qcp2Vxbjx35iiU3WTbUVqQ+fP/KvKUWe/4Z+ge7S/WBVJQmdtRUaA4+ZbJyZJlQ9zo1iu"
PK="${PK}ztrILgf0z9VCgJLbkpH34O9GS9PLEXPtVKBJifAt3fK6U4M1SB4MzgRqDGLRwVQLavFU4"
PK="${PK}524BqzRu4vuZPv43nnobnT+YkEOdUD0NpxrrDzJn8tcHc/YS1VIaf3vh/epfPMdyXhE6p"
PK="${PK}1HqUS625fkTRp/yyO7nacKWMwbQw== brian@sparrow.renyamon.net"
run_step "Set up $SSH_DN" "$SSH_DN/authorized_keys" \
"[ -d $SSH_DN ] || mkdir $SSH_DN" \
"echo '$PK' > $SSH_DN/authorized_keys" \
"chown -R $LIVE_USER:$LIVE_GID $SSH_DN" \
"chmod 700 $SSH_DN" "chmod 600 $SSH_DN/authorized_keys"
fi
#--- (Re)build the 'mlocate' database
UPDATEDB="$(which updatedb)"
if [ $UPDATEDB ]
then
run_step "Rebuild 'mlocate' database" \
'/dev/shm/updatedb.text' \
'nohup updatedb >/dev/shm/updatedb.text 2>&1 &'
else
echo "Rebuild 'mlocate' database"
echo -e "* Unable to build database--'updatedb' not found\n"
fi
exit
# _____ mc-config.A.tar.gz.b64 _____
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
# _____ END _____
# _____ mc-config.B.tar.gz.b64 _____
H4sIAEFphVgAA+1YbY/buBHez/oV+rJAe40T29l10gICCiRIe0ByPdw1H4pkQdDSSGJMkTqSWq+D
or/9niGltXcvL8AhW7SABkhkDWfI4bw8M1pl1NlD0xK02Vzwc/Xscnn6ZLp8drk6Wz1dXqzWm4uL
1bOz5Qq8zVm+fHDLQIMP0uX52VbbPX1B7mvr/6f07o2qjGrasHhhu06aitxVdk1uaz0Vq6yXgych
60BOuMGA41vSWvQygGU8GHIIVnh5TcJTGHpWciS1tqUM4PWypGKZpDoyA37zlsqwvtTiWtEeOnd4
VKkAuVKTdGJLtXUk6IZKyJXW1Mp1oiJNgU4YFkbvnbrDY50h8PETp1U+WHcQvLWJxh5l05nT/spR
GUVbGzS0jid6WdP0tsw6y6Y76kkG4SRLLJdZZYetJhyjyh18QFQV68t08+ehFVsVhPTwR5AnZ7Ir
+ODbXTtcCq5uyMc1cjg9rZQa8YGs1LaBeC1hoKPakW/xWjnbR2d7vOydxIut2HSrK0G+TK/LO68i
qI7sENh8pqyshD90Wpmdj2G3e4GoClUL2W1VM8AONkfesMlBaNUpVo53rBUuj4A3A3kvwqHnw6WO
4UVS9HrA5VWyzxp9EAhHpUxzujKeCZP6IQiu0uBFzD4o3QRHNF3DDMfAIgE6D1eU1lVw+ga+YVvg
j9J22IjNClLz9qWW3qtS9M42cJzfSvbvde1vXcHaoQfjmA3T0p+X6aaGguO8THIObwfUASJa+eLp
pC71Xh68YHkcdnMopoXIYSsQZ+gYHKJsrKovrsdk/8RWg1E3Iiar7e9uhPwCFyENLRkRr18r337m
Ylx/1okgt7F+EZji+cTcw7Ei5hRSgxA404S2eLae1uFuzZpe7BUyPdY/h3lchocGZ0RlkdMRExQg
xyBxJoGtLHdRCaY6OzRt3Oy4QS13JFqp68S/1Us3TkA05sUnVnrrFb/9Ri/a0ksnBdCmA7rxpe9v
wYkcMcZFDxzX+SGmMuaDjvv7gwmokRYYqxlned/bxZ6cR7jgACSNPkZ/XC4H59kldEA+CbL6eOK4
lJBZGU8uUCXQpMrdUehaecUwdNdTE3cMzS0/xhN1Fk5851XX68QdYoEcDWgJ0GaAWKx3osFF6/im
opOuUea41CCePZK0sly0CiF2qEX2iKgkgAtoUkYMdNRRtyWXcOQ2ZmMXiRnW7ZC6wsgu4X1/SFh5
9CdCyOWc3CpqLRtfbE6TDKbQDUQ9b/2f6WiydZGpxnDLQengmryRIOes80VwA2U7OnQIfuZ3uFyD
G7gse/daHlA9V1kHIAFgT06GBRCH404YOBRZElSIbyO+sRN97AWxC3Nxdz2XBcP4Xf2aoS/11VXW
Wqc+WqSYBkvHFgZsCKrkNvrLIDVkNNUBuW0IMuojFZvNqdokFYCRJ0IrXOqN8uVVxsiQioJxlYv1
fJufU37+97+cvzldRTsZl/LzfzHwJIhCB/WhaJBXIxgxojGMFNJYc+CG9tesUjBfojGjdLnjFW//
+WrxPPN2cCUduf8AfjnxnBtoTIYKTbgMcR3TB2LS83SipWkGFicDlFf91kqAFjcIKk4YsAO5jnu+
sBrRvcq2klsrvxQpSov15WZ8jw/BTGW4f0DtR/YW1GLKg61QiLUdk0Rpuz3wAKSKGvKUdcBmbqCc
037kRc2UjGNyRU5lwygWeWN311ZWo94JR3S+iUVnpnOk28XJAW2LuXELR8iKsTGjfaDlJv694S0l
wHiskdeKo5aAXKIC9uPKmCals3EUbCZD708to/k4k5EzwXLagN3oufISM1mO+GzRneoPp8xfhjhC
YRIs28RfZ9kES3vUYRIbo4HMvcpeoafk3z1Gijd5BMgc42rZMvLWvPQ4XzBw5O/fj0KL3mH2THo/
v/3+ZS75x9/wI84GsvOT4vv3f4j/FnyDfLG8wKSUL+T4/qflaoXlP+YLe0dqfV8qCkXBk5MdfUAu
+6+aDLlJ742tVK2oyhsV8pQx/Ev7RXzJF4tulMg+M/+ngD9WD/kZ+JXvv/XqYnPv+2+9vFzP33//
DXr3A+3z12gQeayfqwmICx4jkX4TcnBrYnT03DCDihMOBhCAPuZsV3ByZnHyTKU7aM3jsRunqcjI
GQQe/ftRxy0DT24zeETVKBshNI0a6YvQjW/LpM/V8yg2vvF/wBu58XccLu6sHjdOu6y+yS7rb7LL
02+yy8Xv34U/jdNXASKbbZ2imjufZ3SNOfETj3D/A0kxZ8ADZcAnSu6LSfFS8YiE7w7H47XygsfK
1M5tnMr4LxdPWtvRk4iVTx7HD6LmSVd+rvnMNNNMM80000wzzTTTTDPNNNNMM80000wPSr8CLWpp
ygAoAAA=
# _____ END ____
# vim: tabstop=4
|