2020-11-19 23:15:01 +01:00
#!/bin/bash
# Mit diesem Skript lässt sich auf einem Ubuntu-System eine OrderSprinter-System bestehend aus Kernapplikation,
# Javaprinter, TSEConnector (Simulationsmodus) sowie nächtlichem Backup auf einem angeschlossenen USB-Stick
# einrichten.
# Das Skript sollte auf einem frischen Ubuntu-System ausgeführt werden, da es bestehende Daten und Konfigurationen
# ändert.
# Allgemeine Zugangsdaten zur Datenbank. Diese Werte können frei geändert werden. Allerdings darf das Passwort keine
# Zeichen enthalten, die in der URL als Argumenttrenner verwendet werden (?,&). Die Passwörter werden dem Intaller
# im Klartext übergeben und landen in der Regel im Log des Webservers.
dbadminpassword = "anadminpass_1"
db = "ordersprinter"
dbuser = "os_"
dbuserpassword = "dbpass"
tabprefix = "os_"
remoteaccesscode = "please_change"
2020-11-19 23:24:04 +01:00
# Dies ist der Geräteadresse (USB-Port) des Speichermediums (z.B. USB-Stick, SD-Karte, SSD/HDD), auf den das
# nächtliche Backup geschrieben werden soll. Um diese Adresse herauszufinden, kann man das Speichermedium anstecken
# und über das Kommando "df" diese Adresse herausfinden. Wichtig ist, dass man nicht den Adresse der TSE eingibt,
# denn die TSE sollte unter keinen Umständen direkt beschrieben werden.
# ACHTUNG: Statt "/" muss ein "\/" eingetragen werden:
backupdevice = "\/dev\/sdb1"
2020-11-19 23:24:09 +01:00
# Währung
currency = "Euro"
2020-11-19 23:24:04 +01:00
##########################################################################################
#
# Ende des Bereichs, in dem ein unerfahrener Anwender Anpassungen vornehmen sollte.
#
#########################################################################################
2020-11-19 23:15:01 +01:00
# OrderSprinter-Version
2020-11-19 23:24:09 +01:00
version = "2_0_11"
2020-11-19 23:15:01 +01:00
# Warnhinweis an den Anwender mit der Möglichkeit des Abbruchs
echo "Dieses Skript ist für die Ausführung auf einem frisch aufgesetzten"
2020-11-19 23:15:07 +01:00
echo "Ubuntu-System 20.04 geschrieben worden. Bei anderen Ubuntu-Versionen"
echo "müssen möglicherweise Pfade im Skript angepasst werden!"
2020-11-19 23:15:01 +01:00
echo "Man kann es auch auf einem bereits in Benutzung befindlichen Ubuntu-"
echo "System verwenden, allerdings kann es dabei zu Datenverlust kommen:"
echo ""
echo "Das Installationsskript löscht möglicherweise bereits vorhandene Daten"
echo "im Dokumentenverzeichnis des Webservers. Außerdem werden Daten in"
echo "verschiedene Verzeichnisse geschrieben (z.B. /usr/local/bin) und"
echo "Konfigurationsdateien abgeändert (z.B. php.ini), und Services"
echo "angelegt."
echo "Es wird eine Datenbank angelegt und eine möglicherweise bereits"
echo " DB-Konfiguration sowie eine Datenbank mit Namen ' $db ' "
echo "überschrieben!"
echo ""
echo "Es können andere als die vordefinierten Zugangsdaten zur Datenbank"
echo "verwendet werden. Dazu sind die Werte für die Variablen in diesem "
echo "Skript anzupassen (dbadminpassword,db,dbuser,dbusertpassword,"
echo "tabprefix)."
2020-11-19 23:24:04 +01:00
echo "Außerdem ist vermutlich die Voreinstellung für die Geräteadresse des"
echo "Backup-Mediums anzupassen."
2020-11-19 23:15:01 +01:00
echo ""
echo "Das Skript muss als root ausgeführt werden!"
echo ""
if [ [ $EUID -ne 0 ] ] ; then
echo "Das Skript wurde nicht mit root-Rechten gestartet. Die Ausführung muss abgebrochen werden."
exit 1
fi
2020-11-19 23:24:09 +01:00
echo "Das Skript kann alleine stehend aufgerufen werden und die "
echo " Version ${ version } downloaden und installieren. "
echo "Andererseite kann man auch die neueste Version der"
echo "OrderSprinter-Suite downloaden, in ein Verzeichnis"
echo "entpacken und das dortige Skript ausführen."
2020-11-19 23:15:01 +01:00
read -p "Wird das Skript im Verzeichnis des entpackten Download der OrderSprinter-Suite aufgerufen (j/n)?" calllocation
case " $calllocation " in
j| J ) calllocation = 1; ;
* ) calllocation = 0; ;
esac
# Frage wegen Installationsumfang
2020-11-19 23:24:09 +01:00
installcore = 0
echo "Kernapplikation installieren? Alle anderen Installationsoptionen basieren"
echo "darauf, dass die Kernapplikation so aufgesetzt ist, wie im Skript festgelegt."
read -p "Soll das Skript die Kernapplikation installieren (j/n)?" installcore
case " $installcore " in
j| J ) installcore = 1; ;
* ) installcore = 0; ;
esac
installprintserver = 0
read -p "Soll das Skript den Javaprintserver installieren (j/n)?" installprintserver
case " $installprintserver " in
j| J ) installprintserver = 1; ;
* ) installprintserver = 0; ;
esac
2020-11-19 23:15:01 +01:00
insertsamplecontent = 0
2020-11-19 23:24:09 +01:00
read -p "Beispieldaten einfügen (Benutzer, Raumplan usw.). Beispieldaten sollten nur in eine frischen Installation eingefügt werden, z.B. im Zusammenhang mit einer Installation des Kernsystems. Einfügen? (j/n)?" samplecontent
2020-11-19 23:15:01 +01:00
case " $samplecontent " in
j| J ) insertsamplecontent = 1; ;
* ) insertsamplecontent = 0; ;
esac
# Frage Benutzer, ob das TSE-Modul installiert werden soll
install_tse = 0
read -p "TSEConnector einrichten (j/n)?" choice
case " $choice " in
j| J ) install_tse = 1; ;
* ) install_tse = 0; ;
esac
2020-11-19 23:24:09 +01:00
# Frage Benutzer, ob regelmäßiges Backup auf einen angeschlossenen USB-Stick stattfinden soll
2020-11-19 23:15:01 +01:00
autobackup = 0
read -p "Regelmäßiges nächtliches Backup um 4 Uhr auf angeschlossenen USB-Stick (j/n)?" dobackup
case " $dobackup " in
j| J ) autobackup = 1; ;
* ) autobackup = 0; ;
esac
# Calculate availabe RAM that can be assigned to PHP process
ramsize = $( eval "free -t | grep -oP '\d+' | sed '1!d'" )
avail = $(( ramsize/1000-500)) M
echo " Assigning $avail of memory for PHP processes "
# Download der OrderSprinter-Applikation und Entpacken in ein temporäres Verzeichnis
echo " Download der OrderSprinter-Suite ( $version ) "
rm -r /tmp/ordersprinter 2> /dev/null
mkdir /tmp/ordersprinter
if [ [ $calllocation -eq 0 ] ]
then
wget -O /tmp/ordersprinter/os.zip 2>>/dev/null " https://www.ordersprinter.de/ordersprinter- ${ version } .zip?edition=ubuntu "
cd /tmp/ordersprinter
echo "Entpacken der OrderSprinter-Suite"
unzip -q os.zip
else
scriptpath = " $( cd " $( dirname " $0 " ) " >/dev/null 2>& 1 ; pwd -P ) "
cp -R ${ scriptpath } /../* /tmp/ordersprinter
fi
2020-11-19 23:24:09 +01:00
if [ [ $installcore -eq 1 ] ]
then
# Installation der Umgebung
echo "Update der Umgebung. Dies wird eine Zeitlang dauern..."
echo "Paketlisten neu einlesen und aktualisieren..."
apt-get -y update
echo "Neuen Versionen von Paketen installieren, falls Aktualisierungen vorhanden sind..."
apt-get -y upgrade
echo "Installation von Webserver und Datenbank..."
apt-get -qq -y install unzip apache2 libapache2-mod-php php mariadb-server php-mysql php-gd php-curl php-zip php-xml default-jre
mysqladmin -u root password $dbadminpassword
# Konfigurationswerte
PHPVERSION = $( ls /etc/php)
echo "Anpassen einiger Konfigurationswerte"
sed -i -e " s/memory_limit.*/memory_limit = $avail / " /etc/php/${ PHPVERSION } /apache2/php.ini
sed -i -e "s/max_execution_time.*/max_execution_time = 600/" /etc/php/${ PHPVERSION } /apache2/php.ini
sed -i -e "s/post_max_size.*/post_max_size = 10000M/" /etc/php/${ PHPVERSION } /apache2/php.ini
sed -i -e "s/upload_max_filesize.*/upload_max_filesize = 10000M/" /etc/php/${ PHPVERSION } /apache2/php.ini
service apache2 reload
sleep 3s
echo "Create database"
mysql -uroot -p$dbadminpassword -e " DROP DATABASE IF EXISTS $db " ;
mysql -uroot -p$dbadminpassword -e " CREATE DATABASE $db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci " ;
mysql -uroot -p$dbadminpassword -e " DROP USER IF EXISTS $dbuser @localhost " ;
mysql -uroot -p$dbadminpassword -e " CREATE USER $dbuser @localhost IDENTIFIED BY ' $dbuserpassword ' " ;
mysql -uroot -p$dbadminpassword -e " GRANT ALL ON $db .* TO $dbuser @localhost " ;
echo "Copy files to webserver doc directory"
rm -r /var/www/html/index.html
cp -R /tmp/ordersprinter/webapp/* /var/www/html/
chown -R www-data:www-data /var/www/html
chmod -R u+w /var/www/html
cd /var/www/html/php
echo "Konfiguration des Datenbankzugangs"
sed -i -e " s/defined('MYSQL_USER').*/defined('MYSQL_USER') || define ('MYSQL_USER', ' $dbuser ');/ " config.php
sed -i -e " s/defined('MYSQL_PASSWORD').*/defined('MYSQL_PASSWORD') || define ('MYSQL_PASSWORD', ' $dbuserpassword ');/ " config.php
sed -i -e " s/defined('MYSQL_DB').*/defined('MYSQL_DB') || define ('MYSQL_DB', ' $db ');/ " config.php
sed -i -e " s/defined('TAB_PREFIX').*/defined('TAB_PREFIX') || define ('TAB_PREFIX', ' $tabprefix ');/ " config.php
echo "Default-Installation der Kernapplikation"
wget -O /tmp/loginstall.txt 2>>/dev/null " http://localhost/install/installer.php?command=defaultinstall&db= ${ db } &dbuser= ${ dbuser } &dbpass= ${ dbuserpassword } &prefix= ${ tabprefix } "
# Währung
mysql -uroot -p$dbadminpassword -e " UPDATE $db . ${ tabprefix } config SET setting=' ${ currency } ' WHERE name='currency' " ;
mysql -uroot -p$dbadminpassword -e " UPDATE $db . ${ tabprefix } histconfig SET setting=' ${ currency } ' WHERE setting='Euro' " ;
fi
2020-11-19 23:15:01 +01:00
if [ [ $insertsamplecontent -eq 1 ] ]
then
echo "Beispieldaten einfügen"
wget -O /tmp/logsamplecontent.txt 2>>/dev/null " http://localhost/install/installer.php?command=defaultinsertsamplecontent&db= ${ db } &dbuser= ${ dbuser } &dbpass= ${ dbuserpassword } &prefix= ${ tabprefix } "
fi
echo "Löschen des Installationsverzeichnisses"
rm -r /var/www/html/install
2020-11-19 23:24:09 +01:00
if [ [ $installprintserver -eq 1 ] ]
then
echo "Druckserver einrichten"
cp -R /tmp/ordersprinter/printserver/javaprinter /usr/local/bin
echo "#!/bin/sh" > /usr/local/bin/javaprinter.bat
echo "/usr/bin/java -jar /usr/local/bin/javaprinter/javaprinter.jar -configfile=/usr/local/bin/javaprinter/config.json &" >> /usr/local/bin/javaprinter.bat
chmod +x /usr/local/bin/javaprinter.bat
printf "[Unit]\n" > /etc/systemd/system/javaprinter.service
printf "Description=OrderSprinter-Javaprinter\n\n" >> /etc/systemd/system/javaprinter.service
printf "[Service]\n" >> /etc/systemd/system/javaprinter.service
printf "Type=forking\n" >> /etc/systemd/system/javaprinter.service
printf "ExecStart=/usr/local/bin/javaprinter.bat\n\n" >> /etc/systemd/system/javaprinter.service
printf "[Install]\n" >> /etc/systemd/system/javaprinter.service
printf "WantedBy=multi-user.target\n" >> /etc/systemd/system/javaprinter.service
systemctl enable javaprinter.service
systemctl start javaprinter
fi
2020-11-19 23:15:01 +01:00
if [ [ $install_tse -eq 1 ] ]
then
# TSE
echo "TSE Setup"
cp -R /tmp/ordersprinter/tseconnector /usr/local/bin
echo "#!/bin/sh" > /usr/local/bin/tseconnector.bat
2020-11-19 23:15:10 +01:00
echo "/usr/bin/java -Djava.library.path=/usr/local/bin/tseconnector/swissbit/nativelibs/linux64 -jar /usr/local/bin/tseconnector/swissbit/tseconnector.jar pass=123 port=8000 supplier=swissbit mountpoint=/mnt/SWISSBIT mode=simulate loglevel=1 &" >> /usr/local/bin/tseconnector.bat
2020-11-19 23:15:01 +01:00
chmod +x /usr/local/bin/tseconnector.bat
printf "[Unit]\n" > /etc/systemd/system/tseconnector.service
printf "Description=OrderSprinter-TSEConnector\n\n" >> /etc/systemd/system/tseconnector.service
printf "[Service]\n" >> /etc/systemd/system/tseconnector.service
printf "Type=forking\n" >> /etc/systemd/system/tseconnector.service
printf "ExecStart=/usr/local/bin/tseconnector.bat\n\n" >> /etc/systemd/system/tseconnector.service
printf "[Install]\n" >> /etc/systemd/system/tseconnector.service
printf "WantedBy=multi-user.target\n" >> /etc/systemd/system/tseconnector.service
systemctl enable tseconnector.service
systemctl start tseconnector
2020-11-19 23:24:09 +01:00
# Lasst uns nun den TSEConnector aktivieren:
2020-11-19 23:15:01 +01:00
mysql -uroot -p$dbadminpassword -e " UPDATE ${ db } . ${ tabprefix } config SET setting='1' WHERE name='usetse' " ;
# In Deutschland gibt es eine Bonausgabepflicht:
mysql -uroot -p$dbadminpassword -e " UPDATE ${ db } . ${ tabprefix } config SET setting='1' WHERE name='forceprint' " ;
fi
if [ [ $autobackup -eq 1 ] ]
then
echo "Nächtliches Backup einrichten"
cp /tmp/ordersprinter/scripts/backup-db-linux.sh /usr/local/bin/
sed -i -e " s/Benutzer/ $dbuser / " /usr/local/bin/backup-db-linux.sh
sed -i -e " s/DasPasswort/ $dbuserpassword / " /usr/local/bin/backup-db-linux.sh
sed -i -e " s/123/ $remoteaccesscode / " /usr/local/bin/backup-db-linux.sh
sed -i -e "s/localhost\/ordersprinter/localhost/" /usr/local/bin/backup-db-linux.sh
2020-11-19 23:24:04 +01:00
sed -i -e " s/mount=.*/mount=\" ${ backupdevice } \"/ " /usr/local/bin/backup-db-linux.sh
mysql -uroot -p$dbadminpassword -e " UPDATE ${ db } . ${ tabprefix } config SET setting=MD5(' $remoteaccesscode ') WHERE name='remoteaccesscode' " ;
2020-11-19 23:15:01 +01:00
# Passe die Crontab an, damit der Job jede Nacht um 4 Uhr läuft
cp /etc/crontab /tmp/crontab
# Entferne einen Eintrag von einem möglicherweise vorherigen Scriptlauf
sed -i -e "/.*backup-db-linux.*/d" /tmp/crontab
# Lösche letzte Zeile (sollte ein Hash sein)
sed '$d' /tmp/crontab > /tmp/crontab_without_last_line; mv /tmp/crontab_without_last_line /tmp/crontab
# Füge neuen Eintrag hinzu (nächtliche Sicherung um 4 Uhr)
echo "0 4 * * * root /usr/local/bin/backup-db-linux.sh > /dev/null 2>&1" >> /tmp/crontab
echo "#" >> /tmp/crontab
cp /tmp/crontab /etc/crontab
fi
2020-11-19 23:24:09 +01:00
printf "\n\nInstallation abgeschlossen entsprechend der Auswahl der Komponenten:\n"
printf "======================================================================\n"
if [ [ $installcore -eq 1 ] ]
then
printf "Installation der Kernkomponente:\n"
printf " Aufruf der OrderSprinter-Applikation im Browser über http://localhost bzw. http:// ${ HOSTNAME } \n "
printf " Alle eingerichteten Benutzer haben das Passwort 123, ebenso ist der Kassenbon-Stornocode 123.\n"
fi
if [ [ $installprintserver -eq 1 ] ]
then
printf "Der Druckserver ist eingerichtet und startet automatisch. Je nach Drucker und Anbindung kann\n"
printf "eine weitere Konfiguration erforderlich sein.\n"
fi
if [ [ $install_tse -eq 1 ] ]
then
printf "Der TSEConnector befindet sich im Simulationsmodus. Für einen Normalbetrieb muss die\n"
printf "Befehlszeile in /usr/local/bin/tseconnector.bat abgeändert werden (mode=normal).\n"
fi
if [ [ $autobackup -eq 1 ] ]
then
printf " Nächtliches Backup wurde eingerichtet für Gerät ${ backupdevice } \n "
fi