CGI ist nicht tot zu bekommen. Warum auch? Ist es doch eine (für den Admin) coole Lösung um mal fix ein BASH Skript zu schreiben und dieses durch eine URL angetriggert auszuführen.
Leider läuft das ganze nicht out-of-the-Box, daher müssen folgende Dinge auf einem CentOS System passieren, damit es funktioniert:
yum install -y fcgiwrap.x86_64 spawn-fcgi
damit haben wir dann schon die Grundlage geschaffen.
Nun müssen wir noch spawn-fcgi konfigurieren, damit es später mit unserem NGINX zusammenspielt:
cat << EOF > /etc/sysconfig/spawn-fcgi
FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0777"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"
EOF
damit legen wir nach dem Start einen unix socket für die Kommunikatio unter /var/run/fcgiwrap.socket an und übergeben die Rechte an NGINX.
Nun machen wir uns noch ein Skriptverzeichnis:
mkdir -p -m 770 /var/www/cgi-bin
chown -vR nginx:nginx /var/www/cgi-bin
und natürlich müssen wir unserem NGINX beibringen mit dem Dienst zu reden - dazu nutzen wir eine location directive:
location / {
root /var/www/cgi-bin;
fastcgi_intercept_errors on;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
im Anschluss müssen wir unsere Dienste noch aktualisieren:
systemctl enable spawn-fcgi
systemctl start spawn-fcgi
systemctl restart nginx
von nun an sollten wir in der Lage sein Skripte unter /var/www/cgi-bin über den Aufruf innerhalb der URL anzusprechen und zur Ausführung zu bewegen. Ein Skript sollte übrigens in etwa so beginnen:
#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html>"
echo "<head>"
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"
echo "<title>Bash CGI script</title>"
echo "</head>"
echo "<body>"
echo ""
echo ""
echo ""
echo "</body>"
echo "</html>"
Immer wieder komme ich an den Punkt, das ich mir Videos für den Offlineverzehr herunterladen möchte. Seit es für den Urlaub, bei dem ich bewusst auf das Internet verzichten möchte. Oder aber einfach nur, weil ich auf einer längeren Autofahrt nicht auf die Netzabdeckung verlassen möchte.
Es hat sich herausgestellt, dass das Tool youtube-dl der beste Freund ist, den man sich für diese Aufgabe wünschen kann.
Im Falle von udemy muss man sich allerdings ein wenig durch das Internet suchen, wenn man sich alle notwendigen Informationen heraussuchen möchte die man braucht, damit die gekauften Kurse endlich auf der Platte landen.
Dazu habe ich mir ein Skript gebaut, damit mir ein wenig die Arbeit abnimmt. Zuvor allerdings erstelle ich mir eine Datei courses.txt in welcher ich die URLs zum content Pfad meiner Kurse pflege:
...
https://www.udemy.com/**KURSNAME**/learn/v4/**content**
...
Nachdem ich das getan habe, kann es daran gehen mein Skript aufzuabuen und mit den notwendigen Werten vorzukofigurieren:
download_couses.sh
#!/bin/bash
COURSEFILE=***/PATH/TO/***courses.txt
USERAGENT="Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25"
FORMAT=best
USERNAME=***MY@USERNAME***
PASSWORD=***MY-SECRET-PASSWORD***
SAVESTYLE="./%(playlist)s/%(chapter_number)s-%(chapter)s/%(playlist_index)s-%(title)s.%(ext)s""
SAVEDIR=***/PATH/TO/VIDEOS***
cd $SAVEDIR
for i in $(cat $COURSEFILE);
do
DOWNLOADSTRING="./youtube-dl --continue --sleep-interval 10 --user-agent '$USERAGENT' -u $USERNAME -p $PASSWORD -f $FORMAT -o $SAVESTYLE $i"
./youtube-dl --continue --sleep-interval 10 --user-agent '$USERAGENT' -u $USERNAME -p $PASSWORD -f $FORMAT -o $SAVESTYLE $i
if [ $? -ne 0 ]
then
echo "error with $DOWNLOADSTRING"
exit 1
fi
done
Für die Erledigung dieser Aufgabe reicht mir das so und ist handy genug. In meinem Fall werden die Kurse dann in meinem Homeorder unter Videos gespeichert im Format Kursname -> Kapitel -> 001 - Titel
Hat man ein LDAP Verzeichnis mit vielen Benutzern, dann ist einem angeraten direkt zu Beginn ein gutes, belastbares Design zu erstellen. Tut man das nämlich nicht, so hat man schnell einige hundert Benutzerkonten an falscher Stelle.
Wer dann nacharbeiten möchte, der such sich entweder gescheite Tools, oder macht es selbst. Dabei hat man eigentlich nicht viele Möglichkeiten. Im Grunde genommen geht es nur darum den DN eines Eintrages zu ändern, sodass dieser dann zum neuen Design passt.
Wenn man Beispielsweise 2000 Benutzer in einer OU hat, davon aber nur 789 zu einer bestimmten Gruppe gehörende verschieben will, so kann man das natürlich auch per Hand machen. Oder aber, man jongliert mit den vorhandnen Informationen und sichert sich gleich für die Zukunft ab, denn mit hoher Wahrscheinlichkeit wird so etwas in ähnlicher Form wieder vorkommen.
Zunächst einmal brauch man alle Benutzer einer Gruppe, und das möglichst durch Leerzeichen getrennt. Anschließend muss man sich eine LDIF zusammenschrauben die es einem ermöglicht ein Konto zu verschieben. In schnell und einfach sieht das dann so aus:
#!bin/bash PASSWORD=STRENG_GEHEIMES_PASSWORD for i in $(ldapsearch -x cn=G_R_U_P_P_E_N_N_A_M_E | grep memberUid | cut -f 2 -d " " | sort) do ldapsearch -x -s one -b ou=Users,dc=DOMAIN,dc=DE uid=$i | grep -i dn if [ "$?" -eq "0" ]; then echo "dn: uid=$i,ou=Users,dc=DOMAIN,dc=DE\nchangetype: moddn\nnewrdn: uid=$i\ndeleteoldrdn: 1\nnewsuperior: ou=extern,ou=Users,dc=DOMAIN,dc=DE" \ | ldapmodify -x -w $PASSWORD -D "cn=Manager,dc=DOMAIN,dc=DE" -H ldap://localhost echo "$i wurde verschoben" fi done
Das Leben ist schön.