- Mitglied seit
- 19. Okt 2009
- Beiträge
- 48
- Punkte für Reaktionen
- 0
- Punkte
- 12
Hallo an Alle!
Nachdem ich nun seit geraumer Zeit bestimmte Funktionen unter meiner DS-Haube haben wollte, aber nirgends genau gefunden habe was ich suche, habe ich nun in einer Hau-Ruck Aktion angefangen kleine Shellscripte zu schreiben, die (momentan zumindest) schonmal anfangen das zu erfüllen, was ich eigentlich haben will.
Ich muß dazu sagen, eigentlich hate ich bisher meine Scripte immer nur für/unter Windows geschrieben (und man sollte es nicht glauben, aber auch die Commandshell von Windows ist seit Jahren besser für manche Aufgaben geeignet als so manches grafisches Programmlein...) und immer einen recht eindeutigen Bogen um die Linux Shell gemacht, auch wenn ich mit Linux an sich schon seit Jahren gerne arbeite (auch auf der Shell, aber halt nicht mittels Scripten).
Seit ich nun meine DS109 habe (September 2009) mußte ich zwangsläufig immer mal wieder die Konsole bemühen, und auch hier befiel mich irgendwann die Erkenntnis: effizientes Arbeiten geht häufig nicht ohne ein Script oder zumindest ein ordentlich definiertes Alias.
Die zwei folgenden Scripte entstanden hauptsächlich aufgrund "schlechter" Erfahrung mit meiner DS - oder vielmehr mit der darin enthaltenen Platte.
Ursprünglich hatte ich ein Bundleangebot DS109 mit 2TB WD-green-irgendwas gekauft (ohne zuvor im Inet zu gucken, was es für Erfahrungen mit den WD Platten gibt, der Kauf war mal wieder ein "jetzt-musses" Entschluß).
Und wie es nunmal so ist (auch wenn man es schon aus beruflichen Gründen eigentlich besser weiß): "oooch, mein Backup mach ich erst, wenn alles läuft wie ich es will..."
Dieser Entschluß und die fatale Eintscheidung den Großteil meiner Daten gleich auf die neue Platte zu verschieben (sonst hab ich ja dann alles doppelt...) führte dann zu der Erkenntnis: Wenn JETZT die neue Platte abraucht nützt es auch nix, sich selbst in den Ar... zu beissen (auch wenn man das irgendwie schaffen sollte)! Aber genau das tat die Platte natürlich auch....
Zwar hab ich meine Daten alle wieder bekommen, allerdings auch einen WIRKLICH unnötig RIESIGEN Haufen zusätzliche Arbeit. Diese Erfahrung brachte mich zu der Erkenntnis: Ich brauche unbedingt ständig aktuelle Informationen über die Smartwerte meiner Platte, und zwar ohne mich dazu immer ins Interface einloggen zu müssen.
Ich möchte also (das habe ich schon fertig gebracht, wenn auch nicht sehr elegant), daß mir in regelmässigen Abständen die Smartwerte der Platte (zum Nachverfolgen) in einem Verzeichnis abgelegt werden, auf das ich auch per Samba/FTP/usw. und als nicht Admin Zugriff habe.
Ausserdem möchte ich einen "besonderen" Hinweis, wenn sich die Werte (abgesehen von den Betriebsstunden) ändern (hab ich auch hinbekommen).
Wenn so eine Änderung auftritt, möchte ich gerne eine eMail mit diesen Werten (das fehlt mir noch, aber um den Weg momentan weiterzuverfolgen, bin ich zu Müde).
Script 1 sieht also aus wie folgt und liegt in "/root"
Was sollte vorbereitet sein:
* der Pfad für "smartlog" (jeder wie er es haben will)
Was wird (über IPKG oder sonstwie) gebraucht:
* diffutils: ipkg install diffutils
Was macht das Teil:
Zuerst wird in der Variable "smartlog" festgelegt, wo das "LOG-Verzeichnis" für die Smartwerte liegt und in "smartdiff" wird definiert, wie das "Delta"-File heissen soll, also das, in dem die geänderten Werte (letztes zum aktuellen Log) stehen.
Dann wird noch der Pfad angelegt (wobei ich momentan auch noch ein Problem habe, da Linux offenbar keinen kompletten, nicht existenten Pfad anlegen kann). Im Zweifel sollte man diesen Pfad also selber schnell erstellen, der "mkdir" Befehl kann dann getrost entfernt oder die Ausgabe nach "/dev/null" umgeleitet werden.
* Die letzte (Datum) Logdatei wird festgestellt ("last") - das führt zu einem Fehler, wenn noch keine existiert, ist aber nicht weiter tragisch.
* Die SMART-Werte der Platte "SDA" (das muß evtl. entsprechend abgeändert werden) werden abgerufen und in eine Datei mit Zeitstempel geschrieben.
* Es wird die letzte (also nun die aktuelle) Logdatei gesucht ("curr")
* Damit auch jeder Benutzer (der Zugriff auf (hier) das Synology-Verzeichnis hat) was mit den Logs anfangen kann, werden die Berechtigungnen angepasst (chmod/chown), wobei bei "chown" zumindest die Gruppe ("home") für jeden individuell angepasst werden muß.
* Mit "diff" wird nach Unterschieden in den beiden letzten Dateien ("last" und "curr") gesucht, wobei die Betriebsstunden sinnvollerweise ignoriert werden. Das Ergebnis (so es eines gibt) landet in der Datei "smartdiff" (wurde am Anfang festgelegt)
* Nun gucken wir noch ob die "smartdiff"-Datei neuer ist (nach Änderungszeit), als die "last"-Log, was nur dann der Fall ist, wenn Diff Unterschiede festgestellt hat. Ist das der Fall wird an die "smartdiff"-Log angehängt, von welchen beiden Vergleichen die Unterschiede stammen. Damit hat man auch gleich einen gewissen Überblick, welcher Zeitraum zwischen den Änderungen liegt.
Damit ist das Shellscript einsatzbereit. Wie man das Teil letztendlich nennt ist völlig egal. Ich würde den Code hier abkopieren, die Shell öffnen (putty), im "/root"-Verzeichnis sollte man sowieso sein, "touch smartwerte.sh" eingeben, den Editor seiner Wahl (ich nehme am liebsten Joe (ipkg install joe) nehmen, weil der Wordstar (Gott bin ich alt!!!) kompatibel ist - Ich liebe Klammern, merkt man das?), und fügt per rechten Mausklick in das Putty-Fenster den zuvor kopierten Code ein.
Noch abspeichern und den Editor beenden.
Eine Frage zwischendurch: Kann es sein (auf meiner DS ist das tatsächlich so), dass ein "chmod +x" hier in der Busybox nicht nötig ist? Auch das "#!/bin/sh" am Anfang ist tatsächlich nicht notwendig, wenn das Script per "sh 'script.sh'" aufgerufen wird...
Ich habe das Script in die "rc.local" eingetragen (/bis/sh /root/'script.sh'), damit bei jedem Start der DS die Werte aktualisiert werden, und als Job in die "crontab", damit jeden Tag zumindest einmal die Werte aktualisiert werden, da meine DS nicht ohne besonderen Grund neu startet.
Notwendigkeit für Script 2:
Man macht diverse Veränderungen an neuralgischen Linux Dateien (eigentlich immer die Selben) aber was man eigentlich ändert, dokumentiert natürlich niemand (ja ich weiß, das SOLLTE man).
Ich möchte also, daß alle Dateien, in denen ich eigene Änderunge/Anpassungen vornehme, nachvollziehbar an einen "sicheren" (sprich anderen...) Ort kopiert werden - und zwar ohne daß ich alle Dateien ständig manuell kopieren muß.
Meine (funktionierende aber da wenig elegante, also vorläufige) Lösung sieht wie folgt aus:
Was sollte vorbereitet sein:
* der Pfad für "bkpdir" (jeder wie er es haben will), mit Ausnahme des Teils mit Zeitstempel, also idF. "/volume1/homes/admin/synology/settings/"
Was wird (über IPKG oder sonstwie) gebraucht:
* soweit ich das überblicke, nix
Was macht das Teil:
* Das Backupverzeichnis wird festgelegt und dazu noch ein Zeitstempel (pro Aufruf, gilt für alle nachfolgenden Zeilen)
* Das gerade festgelegt Verzeichnis (eigentlich nur der Teil mit dem Datum) wird erstellt
* Per Schleife wird abgearbeitet, welche Datei (vollständiger Pfad) weiterverarbeitet werden soll. Diesen Teil empfinde ich als besonders unelegant, weil ich das unter Windows definitiv besser gelöst hätte, aber hier krieg ichs irgendwie noch nicht gebacken. Aber es funktioniert zumindest. Wichtig ist das hier nicht die Dateien an sich benutzt werden, sondern ein Befehl initiiert wird (das "ls") der nach der Datei sucht - damit die Schleife ordentlich abgearbeitet werden kann. Wichtig dabei ist jeweils das abschliessende ";".
* Wenn das entsprechende File gefunden wurde, wird im zuvor festgelegten Verzeichnis "bkpdir" die Datei plus Zeitstempel abgelegt. Eigentlich sollten hier nur die Dateien landen, die eine Änderung erfahren haben... aber leider krieg ich das nicht hin.
* Die installierten IPKG Pakete werden in eine Textdatei gelistet
* Damit auch jeder Benutzer (der Zugriff auf (hier) das Synology-Verzeichnis hat) was mit den Logs anfangen kann, werden die Berechtigungnen angepasst (chmod/chown), wobei bei "chown" zumindest die Gruppe ("home") für jeden individuell angepasst werden muß.
Ich habe mir dieses Script ebenfalls in der crontab eingetragen und lasse es einmal pro Woche laufen.
Wichtig: Wer manuell Einträge in die "crontab" macht, muß den Dienst danach neu starten, damit das auch funktioniert (und natürlich alles beachten was für die Bearbeitung der crontab sonst so geschrieben wurde).
Gruß an Alle .. Platz geht aus
Nachdem ich nun seit geraumer Zeit bestimmte Funktionen unter meiner DS-Haube haben wollte, aber nirgends genau gefunden habe was ich suche, habe ich nun in einer Hau-Ruck Aktion angefangen kleine Shellscripte zu schreiben, die (momentan zumindest) schonmal anfangen das zu erfüllen, was ich eigentlich haben will.
Ich muß dazu sagen, eigentlich hate ich bisher meine Scripte immer nur für/unter Windows geschrieben (und man sollte es nicht glauben, aber auch die Commandshell von Windows ist seit Jahren besser für manche Aufgaben geeignet als so manches grafisches Programmlein...) und immer einen recht eindeutigen Bogen um die Linux Shell gemacht, auch wenn ich mit Linux an sich schon seit Jahren gerne arbeite (auch auf der Shell, aber halt nicht mittels Scripten).
Seit ich nun meine DS109 habe (September 2009) mußte ich zwangsläufig immer mal wieder die Konsole bemühen, und auch hier befiel mich irgendwann die Erkenntnis: effizientes Arbeiten geht häufig nicht ohne ein Script oder zumindest ein ordentlich definiertes Alias.
Die zwei folgenden Scripte entstanden hauptsächlich aufgrund "schlechter" Erfahrung mit meiner DS - oder vielmehr mit der darin enthaltenen Platte.
Ursprünglich hatte ich ein Bundleangebot DS109 mit 2TB WD-green-irgendwas gekauft (ohne zuvor im Inet zu gucken, was es für Erfahrungen mit den WD Platten gibt, der Kauf war mal wieder ein "jetzt-musses" Entschluß).
Und wie es nunmal so ist (auch wenn man es schon aus beruflichen Gründen eigentlich besser weiß): "oooch, mein Backup mach ich erst, wenn alles läuft wie ich es will..."
Dieser Entschluß und die fatale Eintscheidung den Großteil meiner Daten gleich auf die neue Platte zu verschieben (sonst hab ich ja dann alles doppelt...) führte dann zu der Erkenntnis: Wenn JETZT die neue Platte abraucht nützt es auch nix, sich selbst in den Ar... zu beissen (auch wenn man das irgendwie schaffen sollte)! Aber genau das tat die Platte natürlich auch....
Zwar hab ich meine Daten alle wieder bekommen, allerdings auch einen WIRKLICH unnötig RIESIGEN Haufen zusätzliche Arbeit. Diese Erfahrung brachte mich zu der Erkenntnis: Ich brauche unbedingt ständig aktuelle Informationen über die Smartwerte meiner Platte, und zwar ohne mich dazu immer ins Interface einloggen zu müssen.
Ich möchte also (das habe ich schon fertig gebracht, wenn auch nicht sehr elegant), daß mir in regelmässigen Abständen die Smartwerte der Platte (zum Nachverfolgen) in einem Verzeichnis abgelegt werden, auf das ich auch per Samba/FTP/usw. und als nicht Admin Zugriff habe.
Ausserdem möchte ich einen "besonderen" Hinweis, wenn sich die Werte (abgesehen von den Betriebsstunden) ändern (hab ich auch hinbekommen).
Wenn so eine Änderung auftritt, möchte ich gerne eine eMail mit diesen Werten (das fehlt mir noch, aber um den Weg momentan weiterzuverfolgen, bin ich zu Müde).
Script 1 sieht also aus wie folgt und liegt in "/root"
Rich (BBCode):
#!/bin/sh
smartlog=/volume1/homes/admin/synology/smartwerte
smartdiff=$smartlog/smart_sda_diff.info
mkdir $smartlog
for log in `ls $smartlog/*.txt | tail -1`; do last=$log; done
smartctl -d marvell -A /dev/sda >$smartlog/smart_sda_`date +%Y%m%d_%H%M%S`.txt
# smartctl -d marvell -A /dev/sda | egrep 0x >$smartlog/smart_sda_`date +%Y%m%d_%H%M%S`.txt
# fuer diejenigen, die die Werte einfach ohne Kopf haben wollen, egrep deshalb, weil das DS-"grep" zumindest bei mir nicht hinhaut
for log in `ls $smartlog/*.txt | tail -1`; do curr=$log; done
chmod -R 777 $smartlog
chown -R admin:home $smartlog
diff -iwB -I Hours $last $curr >> $smartdiff
vgl1=`basename $last`
vgl2=`basename $curr`
if [ "$smartdiff" -nt "$last" ]; then echo $vgl1 mit $vgl2 >> $smartdiff; fi
Was sollte vorbereitet sein:
* der Pfad für "smartlog" (jeder wie er es haben will)
Was wird (über IPKG oder sonstwie) gebraucht:
* diffutils: ipkg install diffutils
Was macht das Teil:
Zuerst wird in der Variable "smartlog" festgelegt, wo das "LOG-Verzeichnis" für die Smartwerte liegt und in "smartdiff" wird definiert, wie das "Delta"-File heissen soll, also das, in dem die geänderten Werte (letztes zum aktuellen Log) stehen.
Dann wird noch der Pfad angelegt (wobei ich momentan auch noch ein Problem habe, da Linux offenbar keinen kompletten, nicht existenten Pfad anlegen kann). Im Zweifel sollte man diesen Pfad also selber schnell erstellen, der "mkdir" Befehl kann dann getrost entfernt oder die Ausgabe nach "/dev/null" umgeleitet werden.
* Die letzte (Datum) Logdatei wird festgestellt ("last") - das führt zu einem Fehler, wenn noch keine existiert, ist aber nicht weiter tragisch.
* Die SMART-Werte der Platte "SDA" (das muß evtl. entsprechend abgeändert werden) werden abgerufen und in eine Datei mit Zeitstempel geschrieben.
* Es wird die letzte (also nun die aktuelle) Logdatei gesucht ("curr")
* Damit auch jeder Benutzer (der Zugriff auf (hier) das Synology-Verzeichnis hat) was mit den Logs anfangen kann, werden die Berechtigungnen angepasst (chmod/chown), wobei bei "chown" zumindest die Gruppe ("home") für jeden individuell angepasst werden muß.
* Mit "diff" wird nach Unterschieden in den beiden letzten Dateien ("last" und "curr") gesucht, wobei die Betriebsstunden sinnvollerweise ignoriert werden. Das Ergebnis (so es eines gibt) landet in der Datei "smartdiff" (wurde am Anfang festgelegt)
* Nun gucken wir noch ob die "smartdiff"-Datei neuer ist (nach Änderungszeit), als die "last"-Log, was nur dann der Fall ist, wenn Diff Unterschiede festgestellt hat. Ist das der Fall wird an die "smartdiff"-Log angehängt, von welchen beiden Vergleichen die Unterschiede stammen. Damit hat man auch gleich einen gewissen Überblick, welcher Zeitraum zwischen den Änderungen liegt.
Damit ist das Shellscript einsatzbereit. Wie man das Teil letztendlich nennt ist völlig egal. Ich würde den Code hier abkopieren, die Shell öffnen (putty), im "/root"-Verzeichnis sollte man sowieso sein, "touch smartwerte.sh" eingeben, den Editor seiner Wahl (ich nehme am liebsten Joe (ipkg install joe) nehmen, weil der Wordstar (Gott bin ich alt!!!) kompatibel ist - Ich liebe Klammern, merkt man das?), und fügt per rechten Mausklick in das Putty-Fenster den zuvor kopierten Code ein.
Noch abspeichern und den Editor beenden.
Eine Frage zwischendurch: Kann es sein (auf meiner DS ist das tatsächlich so), dass ein "chmod +x" hier in der Busybox nicht nötig ist? Auch das "#!/bin/sh" am Anfang ist tatsächlich nicht notwendig, wenn das Script per "sh 'script.sh'" aufgerufen wird...
Ich habe das Script in die "rc.local" eingetragen (/bis/sh /root/'script.sh'), damit bei jedem Start der DS die Werte aktualisiert werden, und als Job in die "crontab", damit jeden Tag zumindest einmal die Werte aktualisiert werden, da meine DS nicht ohne besonderen Grund neu startet.
Notwendigkeit für Script 2:
Man macht diverse Veränderungen an neuralgischen Linux Dateien (eigentlich immer die Selben) aber was man eigentlich ändert, dokumentiert natürlich niemand (ja ich weiß, das SOLLTE man).
Ich möchte also, daß alle Dateien, in denen ich eigene Änderunge/Anpassungen vornehme, nachvollziehbar an einen "sicheren" (sprich anderen...) Ort kopiert werden - und zwar ohne daß ich alle Dateien ständig manuell kopieren muß.
Meine (funktionierende aber da wenig elegante, also vorläufige) Lösung sieht wie folgt aus:
Rich (BBCode):
#!/bin/sh
bkpdir=/volume1/homes/admin/synology/settings/cfgbkp\_`date +%Y%m%d_%H%M`
mkdir $bkpdir 2>&1 > /dev/null
for file in $(ls /usr/syno/etc/smb.conf; ls /etc/rc.local; ls /etc/profile; ls /root/.profile; ls /root/*.sh; ls /root/*.txt; ls /etc/crontab;);
do
filebase=`basename $file`
cp $file $bkpdir/$filebase\_`date +%Y%m%d_%H%M%S`
done
/opt/bin/ipkg list_installed >$bkpdir/installed_ipkg\_`date +%Y%m%d_%H%M%S`.txt
chmod -R 777 $bkpdir
chown -R admin:home $bkpdir
Was sollte vorbereitet sein:
* der Pfad für "bkpdir" (jeder wie er es haben will), mit Ausnahme des Teils mit Zeitstempel, also idF. "/volume1/homes/admin/synology/settings/"
Was wird (über IPKG oder sonstwie) gebraucht:
* soweit ich das überblicke, nix
Was macht das Teil:
* Das Backupverzeichnis wird festgelegt und dazu noch ein Zeitstempel (pro Aufruf, gilt für alle nachfolgenden Zeilen)
* Das gerade festgelegt Verzeichnis (eigentlich nur der Teil mit dem Datum) wird erstellt
* Per Schleife wird abgearbeitet, welche Datei (vollständiger Pfad) weiterverarbeitet werden soll. Diesen Teil empfinde ich als besonders unelegant, weil ich das unter Windows definitiv besser gelöst hätte, aber hier krieg ichs irgendwie noch nicht gebacken. Aber es funktioniert zumindest. Wichtig ist das hier nicht die Dateien an sich benutzt werden, sondern ein Befehl initiiert wird (das "ls") der nach der Datei sucht - damit die Schleife ordentlich abgearbeitet werden kann. Wichtig dabei ist jeweils das abschliessende ";".
* Wenn das entsprechende File gefunden wurde, wird im zuvor festgelegten Verzeichnis "bkpdir" die Datei plus Zeitstempel abgelegt. Eigentlich sollten hier nur die Dateien landen, die eine Änderung erfahren haben... aber leider krieg ich das nicht hin.
* Die installierten IPKG Pakete werden in eine Textdatei gelistet
* Damit auch jeder Benutzer (der Zugriff auf (hier) das Synology-Verzeichnis hat) was mit den Logs anfangen kann, werden die Berechtigungnen angepasst (chmod/chown), wobei bei "chown" zumindest die Gruppe ("home") für jeden individuell angepasst werden muß.
Ich habe mir dieses Script ebenfalls in der crontab eingetragen und lasse es einmal pro Woche laufen.
Wichtig: Wer manuell Einträge in die "crontab" macht, muß den Dienst danach neu starten, damit das auch funktioniert (und natürlich alles beachten was für die Bearbeitung der crontab sonst so geschrieben wurde).
Gruß an Alle .. Platz geht aus
Zuletzt bearbeitet: