Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | anwenderwiki:usr2amp_thoschi [2013/12/11 00:51] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | {{tag> skripte apache mysql}} | ||
+ | |||
+ | ====== Einleitung ====== | ||
+ | |||
+ | Es kann notwendig sein, einzelnen oder mehreren Benutzern zu ermöglichen, | ||
+ | |||
+ | Da z.B. bei uns regelmäßig wechselnde Informatik-Kurse mit MySQL arbeiten, könnte man dies natürlich über lokale bzw. separate xAMP-Server realisieren. | ||
+ | |||
+ | Das folgende Skript ermöglicht eine Alternative. Es legt für bestimmte Benutzer ein Verzeichnis in dessen Home an und gibt dieses im LAN oder global frei. Gleichzeitig wird für diesen Benutzer ein MySQL-Nutzer eingerichtet und eine Datenbank seines Namens. | ||
+ | |||
+ | Man kann eine Nutzerliste sowohl als Textdatei oder ein sophomorix-Projekt übergeben. Daneben ist auch die manuelle Pflege der Benutzer möglich. Falls man mit Liste oder Projekt synchronisiert, | ||
+ | |||
+ | Damit sich diese Liste nicht mit vorhandenen Systembenutzern beißt, kann zum einen ein Präfix vergebene werden, welches diese Nutzer kennzeichnet (standardmäßig '' | ||
+ | |||
+ | Neben dem Standard-Betriebsmodus " | ||
+ | |||
+ | Die Benutzer-Webseiten können so eingeschränkt werden, dass sie nur am lokalen Rechner, nur vom LAN oder von beliebigen Rechnern (also bei Erreichbarkeit von außen auch über das Internet) erreichbar sind. | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | ====== Funktionsweise ====== | ||
+ | |||
+ | Aufgerufen wird das Skript entweder ohne Parameter (manuelle Bearbeitung der Benutzer) oder mit den Parametern '' | ||
+ | |||
+ | Zunächst erstellt das Skript die aktuelle Nutzerliste und - falls übergeben - eine Liste der übergebenen Datei bzw. dem Projekt. Diese werden dann verglichen. | ||
+ | |||
+ | Das diff wird dann abgearbeitet. Beim Anlegen wird jeweils: | ||
+ | * eine conf-Datei für Apache erstellt (mit den gewünschten Berechtigungen) | ||
+ | * ein HTML-Verzeichnis im Home der Benutzer erstellt (und mit den passenden Rechten versehen) | ||
+ | * ein Datenbankbenutzer (im lmn-Modus mit dem sophomorix-Initialpasswort) erstellt | ||
+ | * eine Datenbank mit dem Namen des Benutzers erstellt, für welche der Nutzer alle Rechte besitzt | ||
+ | |||
+ | Beim Löschen wird jeweils: | ||
+ | * der HTML-Ordner NICHT gelöscht (das kann der Benutzer selbst tun) | ||
+ | * der Datenbank-Benutzer gelöscht | ||
+ | * die Datenbank auf Nachfrage gesichert und im Anshluss gelöscht. Das Backup wird ggf. im Home des Benutzers (mit Timestamp) gespeichert. Falls das Skript beim Anlegen eines Nutzers Backups findet, können diese sowohl vom Benutzer (z.B. per phpmyadmin) als auch vom Skript (per Auswahlmenü) eingelesen werden. | ||
+ | |||
+ | Das Skript versucht, fehlerhafte Eingaben/ | ||
+ | |||
+ | ====== Quellcode ====== | ||
+ | |||
+ | < | ||
+ | |||
+ | #!/bin/bash | ||
+ | |||
+ | # mode kann " | ||
+ | mode=" | ||
+ | # das unterscheidet die skripterzeugten einträge von sonstigen - nicht leichtfertig ändern (-> Inkonsistenz) | ||
+ | prefix=" | ||
+ | # zur Sicherheit: Datenbanken/ | ||
+ | exclude=( " | ||
+ | apachedir="/ | ||
+ | htmldir=" | ||
+ | |||
+ | # lokales netzwerk (bei manueller Änderung von / | ||
+ | localnet=" | ||
+ | |||
+ | # ein paar Fehler abfangen | ||
+ | [[ $mode == " | ||
+ | [[ -e $apachedir ]] || { echo " | ||
+ | [[ " | ||
+ | |||
+ | # grobes Abfangen des Parameters (ist es/ | ||
+ | if [[ $1 ]]; then | ||
+ | [[ " | ||
+ | [[ " | ||
+ | [[ " | ||
+ | [[ " | ||
+ | fi | ||
+ | |||
+ | # nun definieren wir die Funktionen zum anlegen und löschen | ||
+ | create() { | ||
+ | |||
+ | # home bestimmen (je nach system) und anlegen | ||
+ | [[ " | ||
+ | ) || home=$(cat /etc/passwd | grep ": | ||
+ | # wenn kein home - machen wir nicht weiter | ||
+ | if [[ $home ]]; then | ||
+ | [[ ! -d $home/ | ||
+ | [[ " | ||
+ | [[ " | ||
+ | # unter linuxmuster.net 6 ist www-data die Gruppe für die Lehrer-Homeverzeichnisse | ||
+ | [[ " | ||
+ | chmod ugo+rwx $home/ | ||
+ | # Apache-Dateien anlegen | ||
+ | echo -e "# Durch das Apache-Skript angelegte conf-Datei für den Benutzer $1\n"\ | ||
+ | "Alias /$1 $home/ | ||
+ | "< | ||
+ | " | ||
+ | "$([[ " | ||
+ | "$([[ " | ||
+ | "$([[ " | ||
+ | " | ||
+ | " | ||
+ | "</ | ||
+ | " | ||
+ | |||
+ | # prüfe, ob nutzer oder db vorhanden | ||
+ | if [[ " | ||
+ | # hole erstpasswort aus sophomorix oder frage nach | ||
+ | [[ " | ||
+ | # lege benutzer/db an | ||
+ | mysql -e " | ||
+ | mysql -e " | ||
+ | mysql -e "GRANT ALL ON $1.* TO ' | ||
+ | |||
+ | # zurückspielen von backups | ||
+ | sqlmenu=(); for i in $(find $home -name " | ||
+ | if [[ " | ||
+ | sqlfile=$(whiptail --title " | ||
+ | [[ $sqlfile ]] && mysql $1 < $home/ | ||
+ | fi | ||
+ | else | ||
+ | whiptail --title " | ||
+ | fi | ||
+ | else | ||
+ | whiptail --title " | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | delete() { | ||
+ | # löschen der apache-conf | ||
+ | rm $apachedir$prefix$1.conf | ||
+ | # löschen des HTML-Verzeichnisses, | ||
+ | [[ " | ||
+ | ) || home=$(cat /etc/passwd | grep ": | ||
+ | [[ "$(ls -A $home/ | ||
+ | |||
+ | # prüfe, ob nutzer oder db vorhanden | ||
+ | if [[ " | ||
+ | whiptail --title " | ||
+ | else | ||
+ | # löschen von DB und user (wenn etwas in der Datenbank, dump ins user-home) | ||
+ | [[ " | ||
+ | mysql -e "DROP DATABASE $1;" | ||
+ | mysql -e "DROP USER ' | ||
+ | | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | menu=( " | ||
+ | " | ||
+ | " | ||
+ | |||
+ | [[ $1 ]] && { type=$([[ " | ||
+ | menu=( " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | menu=( " | ||
+ | |||
+ | while choice=$(whiptail --backtitle "$([[ $1 ]] && echo "$type übergeben: $2" || echo "keine Daten übergeben" | ||
+ | |||
+ | # Einlesen der aktuellen Liste und ggf. der übergebenen Datei (prefix und .conf werden enfernt - hier nur Nuternamen! | ||
+ | conf_cur=( $(find $apachedir -name " | ||
+ | [[ " | ||
+ | [[ " | ||
+ | |||
+ | # filtern um ausgeschlossene Elemente | ||
+ | for ((i=0; | ||
+ | [[ " | ||
+ | [[ $1 && " | ||
+ | done; done | ||
+ | |||
+ | case $choice in | ||
+ | " | ||
+ | # Apache neu starten | ||
+ | echo " | ||
+ | exit 0 | ||
+ | ;; | ||
+ | " | ||
+ | usr=$(whiptail --inputbox " | ||
+ | exitstatus=$?; | ||
+ | # prüfen ob auf Sperrliste | ||
+ | doit=1 | ||
+ | for testusr in ${exclude[@]}; | ||
+ | [[ " | ||
+ | done | ||
+ | |||
+ | # prüfen ob schon vorhanden | ||
+ | for testusr in ${conf_cur[@]}; | ||
+ | [[ " | ||
+ | done | ||
+ | # welches Netz ist erlaubt | ||
+ | if [[ " | ||
+ | access=$(whiptail --title " | ||
+ | [[ $access ]] && create $usr | ||
+ | fi | ||
+ | fi | ||
+ | ;; | ||
+ | " | ||
+ | menu2=(); for i in " | ||
+ | if [[ " | ||
+ | usr=$(whiptail --title " | ||
+ | if [[ $usr ]]; then | ||
+ | whiptail --title " | ||
+ | exitstatus=$?; | ||
+ | fi | ||
+ | else | ||
+ | whiptail --title " | ||
+ | fi | ||
+ | ;; | ||
+ | " | ||
+ | if [[ " | ||
+ | whiptail --title " | ||
+ | exitstatus=$?; | ||
+ | else | ||
+ | whiptail --title " | ||
+ | fi | ||
+ | ;; | ||
+ | *) | ||
+ | # diff besti mmen | ||
+ | diff_cre=( ); diff_crn=( ); diff_del=( ); diff_den=( ) | ||
+ | if [[ " | ||
+ | for usr in ${conf_new[@]}; | ||
+ | doit=1; for usrtest in ${conf_cur[@]}; | ||
+ | [[ " | ||
+ | done | ||
+ | fi | ||
+ | if [[ " | ||
+ | for usr in ${conf_cur[@]}; | ||
+ | doit=1; for usrtest in ${conf_new[@]}; | ||
+ | [[ " | ||
+ | done | ||
+ | fi | ||
+ | [[ " | ||
+ | [[ " | ||
+ | [[ " | ||
+ | if [[ $exitstatus = 0 ]]; then | ||
+ | [[ " | ||
+ | [[ " | ||
+ | fi | ||
+ | ;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | </ | ||