diff --git a/install.sh b/install.sh new file mode 100644 index 00000000..32f67865 --- /dev/null +++ b/install.sh @@ -0,0 +1,235 @@ +#!/bin/bash -- +# Installs Stud.IP, Vips, Courseware and LearningNet. + +### Preparations +STUDIP_DIR=/opt/studip +PLUGIN_DIR="$STUDIP_DIR"/public/plugins_packages +COURSEWARE_DIR="$PLUGIN_DIR"/virtUOS/Courseware +VIPS_DIR="$PLUGIN_DIR"/virtUOS/VipsPlugin +LEARNINGNET_DIR="$PLUGIN_DIR"/virtUOS/LearningNet + +PLUGIN_URL=localhost/studip/dispatch.php/admin/plugin/unregistered +REGISTER_URL=localhost/studip/dispatch.php/admin/plugin/ +COURSE_URL=localhost/studip/dispatch.php/course/plus/index?cid=a07535cf2f8a72df33c12ddfa4b53dde + +PHP_INI=/etc/php/7.0/apache2/php.ini +APACHE_DIR=/etc/apache2 +USER="$@" +USER_DIR=/home/"$USER" +WORK_DIR="$USER_DIR"/studip-related + +# exit when any command fails +set -e +# keep track of the last executed command +trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG +# echo an error message before exiting +trap 'echo "\"${last_command}\" command failed with exit code $?."' EXIT + +# Call with root! +if [[ $EUID -ne 0 ]]; then + exec sudo /bin/bash "$0" "$(whoami)" +else + if [[ -z "$USER" ]]; then + echo "Pass the developeing user as a param, e.g. 'sudo ./install.sh peter'." + fi +fi + +## Install needed packages +apt update +apt -y upgrade +add-apt-repository -y ppa:ondrej/php # We need the old PHP 7.0, get it via PPA. +apt -y install \ + php7.0 php7.0-mysql php7.0-curl php7.0-bcmath php7.0-zip php7.0-xsl \ + php7.0-xml php7.0-ldap php7.0-mbstring \ + apache2 mariadb-server \ + git curl \ + composer nodejs npm \ + cmake doxygen graphviz + +# Bonus: +# "Für das Export-Tool [...] müssen der Formating Objects Processor und ein Java +# Runtime Environment installiert sein." + +### PHP 7.0 and Apache2 configuration +cat << EOF >> /etc/apache2/conf-available/studip-httpd.conf +# Config for Stud.IP +Alias /studip /opt/studip/public + + # für rewrite wird die Option FollowSymLinks oder SymLinksIfOwnerMatch benötigt ... + #Options SymLinksIfOwnerMatch + #RewriteEngine on + #RewriteRule ^download/(normal|force_download|zip)/([0-467])/([^/]+)/(.+)$ sendfile.php?$1=1&type=$2&file_id=$3&file_name=$4 [L] + #RewriteRule ^download/(normal|force_download|zip)/5/([^/]+)/([^/]+)/(.+)$ sendfile.php?$1=1&type=5&range_id=$2&list_id=$3&file_name=$4 [L] + #bzw. bei Verwendung von Alias: + #RewriteEngine on + #RewriteBase /opt/studip/public + #RewriteRule ^download/(normal|force_download|zip)/([0-467])/([^/]+)/(.+)$ /studip/sendfile.php?$1=1&type=$2&file_id=$3&file_name=$4 [L] + #RewriteRule ^download/(normal|force_download|zip)/5/([^/]+)/([^/]+)/(.+)$ /studip/sendfile.php?$1=1&type=5&range_id=$2&list_id=$3&file_name=$4 [L] + + #Apache 2.2 + #Order Allow,Deny + #Allow from all + + #Apache 2.4 + Require all granted + + php_value upload_max_filesize 7M + php_value post_max_size 8M + php_value memory_limit 64M + php_value max_execution_time 300 + php_flag short_open_tag On + php_admin_flag allow_url_fopen On + php_value max_input_vars 10000 + # PHP Konstanten sind hier nicht verfügbar + # 22519 = E_ALL & ~(E_NOTICE|E_DEPRECATED) PHP 5.3.x + php_value error_reporting 22519 + + # PHP 5.5 (ab 5.6 Standardeinstellung) + php_value default_charset utf-8 + php_value mbstring.internal_encoding utf-8 + +EOF + +cat << EOF >> /etc/apache2/conf-available/php70_module.conf + + + DirectoryIndex index.php index.html + + SetHandler application/x-httpd-php + + + SetHandler application/x-httpd-php-source + + + +EOF + +a2enconf studip-httpd +a2enconf php70_module +systemctl reload apache2 + +### Stud.IP +# download studip, unzip +sudo -u "$USER" mkdir -p "$WORK_DIR" +cd "$WORK_DIR" +sudo -u "$USER" curl -o studip.zip -L https://downloads.sourceforge.net/project/studip/Stud.IP/4.4/studip-4.4.1.zip?ts=1582561420 +sudo -u "$USER" unzip studip.zip +mv 4.4.1/ "$STUDIP_DIR" + +# create studip database with user 'studip', password 'LearningNetPW' +mysql -u root --password="" -e "CREATE DATABASE studip DEFAULT CHARACTER SET latin1 COLLATE latin1_german1_ci" +mysql -u root --password="" -e "GRANT USAGE ON *.* TO 'studip'@'localhost' IDENTIFIED BY 'LearningNetPW'" +mysql -u root --password="" -e "GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES ON studip.* TO 'studip'@'localhost'" + +# load example mysql dumps +# users: root@studip, test_dozent, test_admin, test_tutor, test_autor +# password always: testing +# CHANGE PASSWORD BEFORE THE INSTALLATION GOES INTO PRODUCTION! +mysql -u root --password="" studip < "$STUDIP_DIR"/db/studip.sql +mysql -u root --password="" studip < "$STUDIP_DIR"/db/studip_root_user.sql +mysql -u root --password="" studip < "$STUDIP_DIR"/db/studip_default_data.sql +mysql -u root --password="" studip < "$STUDIP_DIR"/db/studip_resources_default_data.sql +# comment out broken demo data +sed -i -e 's/^REPLACE INTO `abschluss`/-- REPLACE INTO `abschluss`/' \ + "$STUDIP_DIR"/db/studip_demo_data.sql +mysql -u root --password="" studip < "$STUDIP_DIR"/db/studip_demo_data.sql +mysql -u root --password="" studip < "$STUDIP_DIR"/db/studip_resources_demo_data.sql + +# set db user and password in config +cp "$STUDIP_DIR"/config/config_local.inc.php.dist "$STUDIP_DIR"/config/config_local.inc.php +sed -i -e 's/DB_STUDIP_USER = ""/DB_STUDIP_USER = "studip"/' \ + "$STUDIP_DIR"/config/config_local.inc.php +sed -i -e 's/DB_STUDIP_PASSWORD = ""/DB_STUDIP_PASSWORD = "LearningNetPW"/' \ + "$STUDIP_DIR"/config/config_local.inc.php +cp "$STUDIP_DIR"/config/config.inc.php.dist "$STUDIP_DIR"/config/config.inc.php +chown -R www-data "$STUDIP_DIR" + +### Composer +# composer can also be installed via apt, but that one is completely broken somehow +cd "$WORK_DIR" +EXPECTED_CHECKSUM="$(wget -q -O - https://composer.github.io/installer.sig)" +php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" +ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")" + +if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then + >&2 echo 'ERROR: Invalid installer checksum' + rm composer-setup.php + exit 1 +fi + +php composer-setup.php --quiet +rm composer-setup.php +sudo -u "$USER" mkdir -p "$USER_DIR"/.local/bin +sudo -u "$USER" mv composer.phar "$USER_DIR"/.local/bin/composer +PATH=$PATH:"$USER_DIR"/.local/bin +echo 'PATH=$PATH:~/.local/bin' >> "$USER_DIR"/.profile + +### Courseware +cd "$WORK_DIR" +sudo -u "$USER" git clone https://github.com/virtUOS/courseware.git +mkdir -p "$COURSEWARE_DIR" +mv -T courseware "$COURSEWARE_DIR" + +cd "$COURSEWARE_DIR" +chown -R "$USER" "$COURSEWARE_DIR" +sudo -u "$USER" composer install +sudo -u "$USER" composer update +sudo -u "$USER" npm install +sudo -u "$USER" npm run build:dev + +### ViPs +cd "$WORK_DIR" +sudo -u "$USER" curl -o vips.zip -L https://develop.studip.de/studip/plugins.php/pluginmarket/presenting/download/8fb3b533969d7100dc0fec4587818665 +sudo -u "$USER" unzip vips.zip -d vips +mkdir -p "$VIPS_DIR" +mv -T vips "$VIPS_DIR" + +### LearningNet +cd "$WORK_DIR" +sudo -u "$USER" git clone https://github.com/milsen/LearningNet.git +mkdir -p "$LEARNINGNET_DIR" +mv -T LearningNet "$LEARNINGNET_DIR" + +# core and frontend +cd "$LEARNINGNET_DIR" +chown -R "$USER" "$LEARNINGNET_DIR" +sudo -u "$USER" composer install +sudo -u "$USER" composer update +sudo -u "$USER" npm install +sudo -u "$USER" npm run build:dev + +# C++ dependencies +sudo -u "$USER" mkdir -p "$LEARNINGNET_DIR"/backend/deps/ +cd "$LEARNINGNET_DIR"/backend/deps/ +sudo -u "$USER" curl -o lemon.zip -L http://lemon.cs.elte.hu/hg/lemon-main/archive/tip.zip +sudo -u "$USER" curl -o rapidjson.zip -L https://github.com/Tencent/rapidjson/archive/master.zip +sudo -u "$USER" unzip lemon.zip +sudo -u "$USER" unzip rapidjson.zip +sudo -u "$USER" rm lemon.zip rapidjson.zip +sudo -u "$USER" mv lemon* lemon/ +sudo -u "$USER" mv rapidjson* rapidjson/ + +# backend +sudo -u "$USER" mkdir -p "$LEARNINGNET_DIR"/backend/build +cd "$LEARNINGNET_DIR"/backend/build +sudo -u "$USER" cmake .. +sudo -u "$USER" make -j4 +sudo -u "$USER" make doc +./test/compress_test && \ + ./test/check_test && \ + ./test/recommend_test && \ + echo "All tests succeeded!" + +### The End +cat << EOF +Stud.IP users are root@studip, test_dozent, test_admin, test_tutor, test_autor. +The password is always 'testing'. +Visit $REGISTER_URL to register Courseware, ViPs and LearningNet. +Afterwards enable the plugins in the plugin management: $PLUGIN_URL +Lastly, activate the plugins for a specific seminar under "Mehr...". +EOF +sudo -u "$USER" firefox "$REGISTER_URL" & +sleep 5 +sudo -u "$USER" firefox -new-tab "$PLUGIN_URL" & +sleep 5 +sudo -u "$USER" firefox -new-tab "$COURSE_URL" &