mirror of
https://github.com/akuker/RASCSI.git
synced 2024-11-18 21:07:52 +00:00
0b78f09f8d
Add bridge-utils Minor fixes to easyinstall Can now save config, detach all devices Bridge script error out if any command fails
304 lines
8.1 KiB
Bash
Executable File
304 lines
8.1 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# BSD 3-Clause License
|
||
# Author @sonique6784
|
||
# Copyright (c) 2020, sonique6784
|
||
|
||
function showRaSCSILogo(){
|
||
logo="""
|
||
.~~. .~~.\n
|
||
'. \ ' ' / .'\n
|
||
.╔═══════╗.\n
|
||
: ║|¯¯¯¯¯|║ :\n
|
||
~ (║|_____|║) ~\n
|
||
( : ║ . __ ║ : )\n
|
||
~ .╚╦═════╦╝. ~\n
|
||
( ¯¯¯¯¯¯¯ ) RaSCSI Assistant\n
|
||
'~ .~~~. ~'\n
|
||
'~'\n
|
||
"""
|
||
echo -e $logo
|
||
}
|
||
|
||
VIRTUAL_DRIVER_PATH=/home/pi/images
|
||
HFS_FORMAT=/usr/bin/hformat
|
||
HFDISK_BIN=/usr/bin/hfdisk
|
||
LIDO_DRIVER=~/RASCSI/lido-driver.img
|
||
|
||
|
||
function initialChecks() {
|
||
currentUser=$(whoami)
|
||
if [ "pi" != "$currentUser" ]; then
|
||
echo "You must use 'pi' user (current: $currentUser)"
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -d ~/RASCSI ]; then
|
||
echo "You must checkout RASCSI repo into /home/pi/RASCSI"
|
||
echo "$ git clone git@github.com:akuker/RASCSI.git"
|
||
exit 2
|
||
fi
|
||
}
|
||
|
||
function installPackages() {
|
||
sudo apt-get update && sudo apt install git libspdlog-dev genisoimage python3 python3-venv nginx bridge-utils -y
|
||
}
|
||
|
||
# install all dependency packages for RaSCSI Service
|
||
# compile and install RaSCSI Service
|
||
function installRaScsi() {
|
||
installPackages
|
||
sudo apt-get update && sudo apt-get install --yes git libspdlog-dev
|
||
|
||
cd ~/RASCSI/src/raspberrypi
|
||
make all CONNECT_TYPE=FULLSPEC
|
||
sudo make install CONNECT_TYPE=FULLSPEC
|
||
|
||
sudoIsReady=$(sudo grep -c "rascsi" /etc/sudoers)
|
||
|
||
if [ $sudoIsReady = "0" ]; then
|
||
sudo bash -c 'echo "
|
||
# Allow the web server to restart the rascsi service
|
||
www-data ALL=NOPASSWD: /bin/systemctl restart rascsi.service
|
||
www-data ALL=NOPASSWD: /bin/systemctl stop rascsi.service
|
||
# Allow the web server to reboot the raspberry pi
|
||
www-data ALL=NOPASSWD: /sbin/shutdown, /sbin/reboot
|
||
" >> /etc/sudoers'
|
||
fi
|
||
|
||
sudo systemctl restart rsyslog
|
||
sudo systemctl enable rascsi # optional - start rascsi at boot
|
||
sudo systemctl start rascsi
|
||
}
|
||
|
||
function stopOldWebInterface() {
|
||
APACHE_STATUS=$(sudo systemctl status apache2 &> /dev/null; echo $?)
|
||
if [ "$APACHE_STATUS" -eq 0 ] ; then
|
||
echo "Stopping old Apache2 RaSCSI Web..."
|
||
sudo systemctl disable apache2
|
||
sudo systemctl stop apache2
|
||
fi
|
||
}
|
||
|
||
# install everything required to run an HTTP server (Nginx + Python Flask App)
|
||
function installRaScsiWebInterface() {
|
||
stopOldWebInterface
|
||
installPackages
|
||
|
||
sudo cp -f ~/RASCSI/src/web/service-infra/nginx-default.conf /etc/nginx/sites-available/default
|
||
sudo cp -f ~/RASCSI/src/web/service-infra/502.html /var/www/html/502.html
|
||
|
||
mkdir -p $VIRTUAL_DRIVER_PATH
|
||
chmod -R 775 $VIRTUAL_DRIVER_PATH
|
||
groups www-data
|
||
sudo usermod -a -G pi www-data
|
||
groups www-data
|
||
|
||
sudo systemctl reload nginx
|
||
|
||
sudo cp ~/RASCSI/src/web/service-infra/rascsi-web.service /etc/systemd/system/rascsi-web.service
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable rascsi-web
|
||
sudo systemctl start rascsi-web
|
||
}
|
||
|
||
function updateRaScsiGit() {
|
||
cd ~/RASCSI
|
||
git fetch
|
||
git stash
|
||
git rebase origin/master
|
||
git stash apply
|
||
}
|
||
|
||
function updateRaScsi() {
|
||
updateRaScsiGit
|
||
installPackages
|
||
sudo systemctl stop rascsi
|
||
|
||
cd ~/RASCSI/src/raspberrypi
|
||
|
||
make clean
|
||
make all CONNECT_TYPE=FULLSPEC
|
||
sudo make install CONNECT_TYPE=FULLSPEC
|
||
sudo systemctl start rascsi
|
||
}
|
||
|
||
function updateRaScsiWebInterface() {
|
||
stopOldWebInterface
|
||
updateRaScsiGit
|
||
sudo cp -f ~/RASCSI/src/web/service-infra/nginx-default.conf /etc/nginx/sites-available/default
|
||
sudo cp -f ~/RASCSI/src/web/service-infra/502.html /var/www/html/502.html
|
||
sudo systemctl restart rascsi-web
|
||
sudo systemctl restart nginx
|
||
}
|
||
|
||
function showRaScsiStatus() {
|
||
sudo systemctl status rascsi
|
||
}
|
||
|
||
function createDrive600MB() {
|
||
createDrive 600 "HD600"
|
||
}
|
||
|
||
function createDriveCustom() {
|
||
driveSize=-1
|
||
until [ $driveSize -ge "10" ] && [ $driveSize -le "4000" ]; do
|
||
echo "What drive size would you like (in MB) (10-4000)"
|
||
read driveSize
|
||
|
||
echo "How would you like to name that drive?"
|
||
read driveName
|
||
done
|
||
|
||
createDrive $driveSize "$driveName"
|
||
}
|
||
|
||
function formatDrive() {
|
||
diskPath="$1"
|
||
volumeName="$2"
|
||
|
||
if [ ! -x $HFS_FORMAT ]; then
|
||
# Install hfsutils to have hformat to format HFS
|
||
sudo apt-get install hfsutils
|
||
fi
|
||
|
||
if [ ! -x $HFDISK_BIN ]; then
|
||
# Clone, compile and install 'hfdisk', partition tool
|
||
git clone git://www.codesrc.com/git/hfdisk.git
|
||
cd hfdisk
|
||
make
|
||
|
||
sudo cp hfdisk /usr/bin/hfdisk
|
||
fi
|
||
|
||
# Inject hfdisk commands to create Drive with correct partitions
|
||
(echo i; echo ; echo C; echo ; echo 32; echo "Driver_Partition"; echo "Apple_Driver"; echo C; echo ; echo ; echo "${volumeName}"; echo "Apple_HFS"; echo w; echo y; echo p;) | $HFDISK_BIN "$diskPath"
|
||
partitionOk=$?
|
||
|
||
if [ $partitionOk -eq 0 ]; then
|
||
if [ ! -f $LIDO_DRIVER ];then
|
||
echo "Lido driver couldn't be found. Make sure RASCSI is up-to-date with git pull"
|
||
return 1
|
||
fi
|
||
|
||
# Burn Lido driver to the disk
|
||
dd if=$LIDO_DRIVER of="$diskPath" seek=64 count=32 bs=512 conv=notrunc
|
||
|
||
driverInstalled=$?
|
||
if [ $driverInstalled -eq 0 ]; then
|
||
# Format the partition with HFS file system
|
||
$HFS_FORMAT -l "${volumeName}" "$diskPath" 1
|
||
hfsFormattedOk=$?
|
||
if [ $hfsFormattedOk -eq 0 ]; then
|
||
echo "Disk created with success."
|
||
else
|
||
echo "Unable to format HFS partition."
|
||
return 4
|
||
fi
|
||
else
|
||
echo "Unable to install Lido Driver."
|
||
return 3
|
||
fi
|
||
else
|
||
echo "Unable to create the partition."
|
||
return 2
|
||
fi
|
||
}
|
||
|
||
function createDrive() {
|
||
if [ $# -ne 2 ]; then
|
||
echo "To create a Drive, volume size and volume name must be provided"
|
||
echo "$ createDrive 600 \"RaSCSI Drive\""
|
||
echo "Drive wasn't created."
|
||
return
|
||
fi
|
||
|
||
driveSize=$1
|
||
driveName=$2
|
||
mkdir -p $VIRTUAL_DRIVER_PATH
|
||
drivePath="${VIRTUAL_DRIVER_PATH}/${driveSize}MB.hda"
|
||
|
||
if [ ! -f $drivePath ]; then
|
||
echo "Creating a ${driveSize}MB Drive"
|
||
dd if=/dev/zero of=$drivePath bs=1M count=$driveSize
|
||
|
||
echo "Formatting drive with HFS"
|
||
formatDrive "$drivePath" "$driveName"
|
||
|
||
else
|
||
echo "Error: drive already exists"
|
||
fi
|
||
}
|
||
|
||
function showMenu() {
|
||
echo ""
|
||
echo "Choose among the following options:"
|
||
echo "INSTALL"
|
||
echo " 0) install RaSCSI Service + web interface + 600MB Drive (recommended)"
|
||
echo " 1) install RaSCSI Service (initial)"
|
||
echo " 2) install RaSCSI Web interface"
|
||
echo "UPDATE"
|
||
echo " 3) update RaSCSI Service + web interface (recommended)"
|
||
echo " 4) update RaSCSI Service"
|
||
echo " 5) update RaSCSI Web interface"
|
||
echo "CREATE EMPTY DRIVE"
|
||
echo " 6) 600MB drive (recommended)"
|
||
echo " 7) custom drive size (up to 4000MB)"
|
||
|
||
|
||
choice=-1
|
||
|
||
until [ $choice -ge "0" ] && [ $choice -le "7" ]; do
|
||
echo -n "Enter your choice (0-7) or CTRL-C to exit: "
|
||
read -r choice
|
||
done
|
||
|
||
|
||
case $choice in
|
||
0)
|
||
echo "Installing RaSCSI Service + Web interface"
|
||
installRaScsi
|
||
installRaScsiWebInterface
|
||
createDrive600MB
|
||
showRaScsiStatus
|
||
;;
|
||
1)
|
||
echo "Installing RaSCSI Service"
|
||
installRaScsi
|
||
showRaScsiStatus
|
||
;;
|
||
2)
|
||
echo "Installing RaSCSI Web interface"
|
||
installRaScsiWebInterface
|
||
;;
|
||
3)
|
||
echo "Updating RaSCSI Service + Web interface"
|
||
updateRaScsi
|
||
updateRaScsiWebInterface
|
||
showRaScsiStatus
|
||
;;
|
||
4)
|
||
echo "Updating RaSCSI Service"
|
||
updateRaScsi
|
||
showRaScsiStatus
|
||
;;
|
||
5)
|
||
echo "Updating RaSCSI Web interface"
|
||
updateRaScsiWebInterface
|
||
;;
|
||
6)
|
||
echo "Creating a 600MB drive"
|
||
createDrive600MB
|
||
;;
|
||
7)
|
||
echo "Creating a custom drive"
|
||
createDriveCustom
|
||
;;
|
||
esac
|
||
}
|
||
|
||
|
||
showRaSCSILogo
|
||
initialChecks
|
||
showMenu
|