From: root Date: Tue, 24 May 2016 08:56:35 +0000 (+0200) Subject: initial commit X-Git-Url: https://git.hoellein.online/?a=commitdiff_plain;h=9e564a0a45c0cb09351368f5178e30c1b2b0571b;p=help initial commit --- 9e564a0a45c0cb09351368f5178e30c1b2b0571b diff --git a/600cu.txt b/600cu.txt new file mode 100644 index 0000000..0e17c7f --- /dev/null +++ b/600cu.txt @@ -0,0 +1,18 @@ +###scanner unter windows vista zum laufen bekommen +Here is a workaround to install a Mustek 600 CU scanner in Windows Vista Home Premium: + + * Make sure you have Microsoft Windows Vista Service Pack 1 installed. + * Download and unpack the zipfile. + * Execute the "Mustek_600_CU_Vista_Install.exe" file, as administrator if necessary, which installs the drivers and GUI. + When asked to reboot, click 'cancel' + * Go to "Control Panel", "Device manager" and rightclick the "unknown device" under "other devices", + select "update driver", "Automatically Search for drivers", "Don't search online". When asked, select "Install Driver" + * Install the programme in which you want to scan (i.e. Paint Shop Pro) + * Reboot your machine. + * Go to "Control Panel", "Scanners and Cameras", select "600CU" and click "Properties", "Test Camera or Scanner" + * Start the programme in which you want to scan (i.e. Paint Shop Pro) and try to scan. It should work now + +It can be a bit tricky to get this to work. If it doesn't work at first, play a little with +(un)installing the scanner and/or programme. Eventually it should work. +I've tested it this way and it works fine on my pc. + diff --git a/Android.txt b/Android.txt new file mode 100644 index 0000000..e64c0aa --- /dev/null +++ b/Android.txt @@ -0,0 +1,7 @@ +###Ideen für Apps +Memory für Kinder mit Buchstaben +-quasi lauter buttons mit bildern drauf, beim click anzeige von buchstabe und beim zweiten button dann auch anzeige vom buchstaben +-wenn richtig sound und offen lassen, wenn falsch sound und wieder verdecken +-große und kleine buchstben gemischt, also a==A +-nächste stufe mit zahlen und vielleicht 1=="eins" +-schöne grafiken, schöne musik, vielleicht von beatbox programm ... diff --git a/Dual Cisco Switch Reelnet.jpg b/Dual Cisco Switch Reelnet.jpg new file mode 100644 index 0000000..9ced3f5 Binary files /dev/null and b/Dual Cisco Switch Reelnet.jpg differ diff --git a/EncFs.txt b/EncFs.txt new file mode 100644 index 0000000..212c3fa --- /dev/null +++ b/EncFs.txt @@ -0,0 +1,112 @@ +###einrichten des encfs +encfs ~/Encoded ~/Decoded + +Should also work for KDE - edit /etc/pam.d/kdm instead of /etc/pam.d/gdm . + +Adapted from http://www.ubuntu-eee.com/wiki/index.php5?title=Transparent_Encryption_for_home_folder . + +Tested under Ubuntu EEE 8.04.1, Ubuntu 8.04.1 + +Notes + + * + + This uses pass-through filesystem encryption with EncFS. You don't need an encrypted partition nor do you need to decide how large the encrypted portion should be. See http://www.arg0.net/encfsintro for a detailed explaination. + * I don't use ecryptfs because it can't encrypt filenames. This is unacceptable for me as the filenames contain private information. + * I use EncFS for a long time now and i didn't hit a single problem. + * I use pam-encfs and not pam-mount because pam-mount had problems i don't remember exactly with the FUSE EncFS mount + * You must have a second account (root or sudo) handy to log into a console and fix things up + +Required packages + + 1. encfs + 2. + + libpam-encfs (DO NOT INSTALL VIA APT (if you are on Hardy) - broken in the Hardy repos - see https://bugs.launchpad.net/ubuntu/+source/libpam-encfs/+bug/205783 ) + +Install encfs from the Ubuntu repositories: + +sudo aptitude install encfs + +Install libpam-encfs from: http://ppa.launchpad.net/andrearatto/ubuntu/pool/main/libp/libpam-encfs/libpam-encfs_0.1.4.1-3~ppa1_i386.deb + +/etc/security/pam_encfs.conf + +The default pam_encfs.conf has a conflicting option that will cause your mounts to fail every time. Allow_other is specified in fuse_default, and allow_root is set in the automatic encfs mount per user. These two options cannot be specified together! It looks like EncFS Options and FUSE Options cannot be left empty, so i just use -v for EncFS (just verbose output) and allow_other for FUSE (you need either allow_other or allow_root for gdm to work). This is what it looks like for me, username jakob: + +drop_permissions +encfs_default +fuse_default + +#USERNAME SOURCE TARGET EncFS Options FUSE Options +#jakob /home/jakob.encfs /home/jakob -v allow_other +# +#/etc/fuse.conf +# +#Uncomment or add the following line to /etc/fuse.conf so that the allow_other option in pam_encfs.conf can take effect. +# +#user_allow_other +# +#Make sure the user is in the group "fuse" as well, or else he won't be able to use FUSE mounts like EncFS. +# +#/etc/pam.d/gdm +# +#pam_encfs needs to be the first module because it doesn't take any "use_first_pass" options. Also, gdm creates a .Xauthority file in the home directory after pam_unix, EncFS needs to be mounted before this happens. Insert "auth requisite pam_encfs.so" just before "@include common-auth". For me this file looks like this: +# +##%PAM-1.0 +#auth requisite pam_nologin.so +#auth required pam_env.so readenv=1 +#auth required pam_env.so readenv=1 envfile=/etc/default/locale +#auth requisite pam_encfs.so +#@include common-auth +#auth optional pam_gnome_keyring.so +#@include common-account +#session required pam_limits.so +#@include common-session +#session optional pam_gnome_keyring.so auto_start +#@include common-password +# +#/etc/pam.d/login +# +#(Optional) Edit /etc/pam.d/login like /etc/pam.d/gdm if you want the encrypted home to work even when logging in through the text mode console. WARNING: If you don't enable pam_encfs in /etc/pam.d/login you will be still able to login. You will then get an empty home directory. Bash will create a file .bash_history that will prevent subsequent mounts of EncFS, as the mountpoint is no more empty. You have to delete this file as root to fix this. +# +#Create encrypted folder +# +# * Log out and log in as a different user (sudo-enabled or root) +# * Create necessary directories and set permissions (replace "jakob" with your username). +# +# sudo -s +# mv /home/jakob /home/jakob.original +# mkdir /home/jakob.encfs /home/jakob +# chown jakob:jakob /home/jakob /home/jakob.encfs +# +# * Create encrypted folder +# +# sudo -u jakob encfs /home/jakob.encfs /home/jakob +# +# * Accept default options, or tinker with the encryption settings. I just used the default security rather than paranoid mode because paranoid mode doesn't support hard links apparently. +# * +# +# The Password does not have to be the same as the login password +# * Copy your home folder contents into the encrypted folder +# +# sudo -u jakob rsync -a --progress /home/jakob.original/ /home/jakob/ +# +# * Reboot +# * You will be asked first for your EncFS password and then for your login password +# +# Your home folder should now be encrypted. If it works, log in and delete your jakob.original folder. +# +# Known Issues +# +# * The home directory is not unmounted at logout. While it's possible (see /usr/share/doc/libpam-encfs/README.gz ), this caused a lot of trouble for me. Most of the time, unmounting won't work anyway because some gnome apps take long to terminate and have files open when the unmount should happen. Another thing i experienced is some gnome app creating a file (saved_state) after encfs is unmounted ( ! ). This file is created in the mountpoint. Then the mountpoint will be non-empty and subsequent logins will fail! You have to empty it again using a root shell to fix this. +# * +# +# Upgrading to intrepid will break the setup: https://bugs.launchpad.net/ubuntu/+source/encfs/+bug/234818 . +# +# Workaround: +# +# 1. Log in to another (unencrypted) sudo/root account +# 2. Copy your home directory's contents to another (not encrypted) folder +# 3. Upgrade to Intrepid +# 4. Create a new EncFS volume and copy your home dir contents into it - see instructions above diff --git a/FLOPPY.IMG b/FLOPPY.IMG new file mode 100644 index 0000000..1a12bee Binary files /dev/null and b/FLOPPY.IMG differ diff --git a/N900.txt b/N900.txt new file mode 100644 index 0000000..da4560e --- /dev/null +++ b/N900.txt @@ -0,0 +1,61 @@ +###Browser in Hochformat nutzen +Browser wie gehabt im Querformat starten, die Kombination Strg-Shift-O drücken, die Tastatur einschieben und das N900 ins Hochformat drehen +###Repositories maemo +http://wiki.n900.de/Repositories +###umts internet über bluetooth nutzen +#mac adresse vom telefon suchen (telefon muss sichtbar sein) +hcitool scan +hcitool info A8:7B:39:DC:52:90 +#channel number merken, brauchen wir +sdptool search DUN +#vi /etc/bluetooth/rfcomm.conf +rfcomm0 { + bind yes; + device A8:7B:39:DC:52:90; + channel 1; + comment "Bluetooth PPP Connection"; +} +#verbinden +rfcomm bind 0 A8:7B:39:DC:52:90 1 +#vi /etc/ppp/peers/BluetoothDialup +debug +noauth +connect "/usr/sbin/chat -v -f /etc/chatscripts/BluetoothDialup" +usepeerdns +/dev/rfcomm0 115200 +defaultroute +crtscts +lcp-echo-failure 0 +#vi /etc/chatscripts/BluetoothDialup +debug +noauth +connect "/usr/sbin/chat -v -f /etc/chatscripts/BluetoothDialup" +usepeerdns +/dev/rfcomm0 115200 +defaultroute +crtscts +lcp-echo-failure 0 +root@laptop:~# cat /etc/chatscripts/BluetoothDialup +TIMEOUT 35 +ECHO ON +ABORT '\nBUSY\r' +ABORT '\nERROR\r' +ABORT '\nNO ANSWER\r' +ABORT '\nNO CARRIER\r' +ABORT '\nNO DIALTONE\r' +ABORT '\nRINGING\r\n\r\nRINGING\r' +'' \rAT +OK 'AT+CGDCONT=2,"IP","internet"' #internet ist APN und 2 ist die verbindung am telefon +OK ATD*99***2# +CONNECT "" +#verbindung starten +pon BluetoothDialup +#verbindung beenden +poff BluetoothDialup +###Schatte um die icons auf Desktop entfernen (DEFAULT ist akt. Theme) +cd /usr/share/themes/DEFAULT/images +rm ApplicationShortcutAppletPressed.png +rm ApplicationShortcutApplet.png +###Ovi Maps downloaden +http://static.s2g.gate5.de/map5/maploaderzip-00.02.41.123/312.zip +http://static.s2g.gate5.de/map5/maploaderzip-00.01.22.103/112.zip diff --git a/aircrack.txt b/aircrack.txt new file mode 100644 index 0000000..77d8fa3 --- /dev/null +++ b/aircrack.txt @@ -0,0 +1,114 @@ +------------------- +Aircrack besteht aus folgenden Programmen: + +Aircrack: zum Berechnen des WEP-Schlüssels und zum durchführen einer Wörterbuch-Attacke auf ein WPA-PSK Paket. + +Airodump: zum auffangen und speichern von Netzwerkverkehr im Monitor-Mode. + +Airdecap: zum entschlüsseln eines Dump-Files mit Hilfe des WEP / WPA Keys. + +WZCOOK: zum auslesen der im Wireless-Konfigurations-Tool von Windows gespeicherten WEP-Keys und des PMK bei WPA-Verschlüsselung. + + +Hardwareanforderung: + +-eine unter Windows funktionierende WLAN Karte/USB-Stick mit passendem Chipsatz. + +Softwareanforderung: + +-passende WLAN Treiber, welche den Monitor Mode unter Windows unterstützen. + + +Vorbereiten der WLAN Karte: + +Um den gesamten Netzwerkverkehr eines WLANs aufzeichnen zu können, müssen wir passende Treiber installieren, welche die Karte so einstellen, dass alle Netzwerkpakete, die durch die Luft fliegen, empfangen und aufgezeichnet werden können, ohne im Netz angemeldet zu sein. Dies nennt sich Monitor Mode. + +Passende Treiber gibt es für Karten mit: +-Atheros Chipsatzen: AR5000, AR5001, AR5002, AR5004, AR5004, -AR5005, AR5006 (kein USB) +-HermesI Chipsatz +-PrismGT Chipsatz +-Aironet Chipsatz +-RTL8180 Chipsatz +-dem altem Broadcom Chipsatz + +Karten mit Prism 2/2.5 Chipsatz oder gar Centrino Chips werden nicht unterstützt! + +Bevor wir die Austauschtreiber installieren, müssen erst die originalen Treiber installiert werden. Funktioniert die Karte damit problemlos, dann können wir die anderen installieren. Das lässt sich nicht durch ein normales Treiberupdate bewerkstelligen. Wir müssen Windows die Treiber aufzwingen. Dazu wählen wir unsere WLAN Karte im Geräte-Manager aus und klicken auf Treiber aktualisieren. Wir lassen Windows aber nicht automatisch installieren, sondern wählen unseren Treiber selbst aus und ignorieren dabei die Warnmeldungen. Nun kontrollieren wir, ob der neue Treiber angenommen wurde. Die WLAN Karte funktioniert nun immer noch wie gewohnt. Eventuell aktive WLAN Konfigurationstools des Kartenherstellers sollten deaktiviert werden und das hauseigene Windows Tool zur Konfiguration aktiviert werden. + + +Installation von Aircrack: + +Die Programmsammlung von Aircrack muss nicht installiert werden. Nach dem Download wir sie lediglich entpackt. Je nach Downloadquelle muss man sich eventuell noch die Dateien: PEEK.dll, cygwin1.dll und MSVCR70.DLL aus dem Netz laden und in den Aircrack Ordner kopieren. + + +Benutzung von Airodump: + +Als erstes müssen wir Airodump durch Doppelklick starten und unsere WLAN Karte durch Eingabe einer Zahl auswählen. Dann den Treiber durch Eingabe eines Buchstabens. Als nächstes werden wir nach dem Kanal befragt, auf dem unser Netzwerk sendet (z.B. 11). Danach müssen wir einen Dateinamen angeben, unter dem wir unser entstehendes File abspeichern möchten (z.B. meinAP). Nun werden wir gefragt ob wir nur die IV’s speichern wollen. Da die IV’s das einzige sind was wir zum cracken eines WEP-Keys brauchen, können wir das mit y bestätigen. Das hält unser File kleiner und das spätere berechnen des Keys geht schneller. Jetzt startet das Programm mit der Aufzeichnung der Netzwerkpakete und zeigt uns dieses auf dem Bildschirm an. +Das File wird nun in unserem Fall in den Aircrack Ordner geschrieben und nennt sich meinAp.ivs. Wollen wir hingegen ein WPA-PSK verschlüsseltes WLAN angreifen, so müssen wir die Frage immer mit n beantworten, da es in diesen Netzen keine IV’s gibt! +Wenn wir die Frage, ob nur die IV’s gespeichert werden sollen mit n beantworten, dann nennt sich das File meinAP.cap. Zusätzlich entsteht noch eine .txt Datei mit den Netwerkdaten, welche auch in Airodump angezeigt werden. + +Benutzung von Aircrack: + +Bei WEP Verschlüsselung: +Zur Berechnung eines WEP-Keys brauchen wir eine gewisse Menge an aufgezeichneten Datenpaketen, welche jeweils ein IV enthalten. Je nach Verschlüsselungsstärke brauchen wir für einen 64bit Key ca. 250.000 und für einen 124bit Key ca. 500.000 dieser Pakete. Diese Zahlen sind allerdings nur Anhaltspunkte. Mal sind es weniger und mal deutlich mehr. Aber spätestens nach 16.000.000 IV’s ist der Schlüssel geknackt, wenn er nicht zwischenzeitlich geändert wurde. +Um ein mit airodump aufgezeichnetes File an Aircrack zu übergeben, müssen wir lediglich in den Aircrack Ordner wechseln und das File mit der Maustaste festhalten und auf die aircrack.exe ziehen. Nun öffnet sich ein Eingabefenster und Aircrack beginnt in diesem mit der Berechnung des Keys. Wenn wir Aircrack mit Zusatzparametern starte wollen, dann müssen wir Aircrack selber im Eingabefenster starten. Dazu klicken wir auf Start > Ausführen und geben cmd ein. Nun wechseln wir im Eingabefenster in den Aircrack Ordner. Wenn er sich auf dem Desktop befindet und Aircrack heißt, dann geben wir cd Desktop/Aircrack ein und bestätigen mit Enter. Jetzt kommt unser Aircrackbefehl. z.B.: +aircrack.exe –n 124 –f 3 meinAP.ivs +um einen 124bit Key zu knacken und den fudge-faktor auf 3 zu setzen. Eine Liste alle möglichen Optionen befindet sich in der Aircrack-Doku. +Wir können Aircrack ruhig schon recht früh starten, auch wenn Airodump noch fleißig Pakete sammelt, da Aircrack über eine Funktion verfügt, welche auch neu dazugekommene IV’s berücksichtigt und mit zur Berechnung verwendet. +Des Weiteren können wir auch mehrere Files gleichzeitig an Aircrack übergeben. Das ist sinnvoll, wenn wir Airodump beenden und am nächsten Tag weiter IV’s sammeln. Dann heißt unser Befehl z.B.: +aircrack.exe meinAP.ivs meinAP2.ivs meinAP3.ivs … +Sobald Aircrack den richtigen Schlüssel gefunden hat, hört es auf zu rechnen und zeigt ihn uns unten im Eingabefenster an. + +Bei WPA-PSK Verschlüsselung: +Ein WPA Netzwerk lässt sich nicht durch das Sammeln von Datenpaketen errechnen, egal wie viele Pakete auch vorhanden sind. Ein Cracken ist nur mithilfe einer Wörtebuch-Attacke oder durch Bruteforce möglich. Aircrack verwendet zum Angriff die Wörterbuch-Attacke. Hier zu bedient es sich einer Textdatei. In diesen Textdateien befindet sich in jeder Zeile ein Wort, eine Zahlenkombination, ein Name … +Zum Testen stellen wir an unserm AP ein leichtes WPA-PSK Passwort ein. +Der Angriff lässt sich ausschließlich auf einen aufgefangenen 4-Way-Handshake durchführen. Ein Handshake kommt ausschließlich zustande, wenn sich eine WLAN Karte am AP anmeldet! Diesen schneiden wir mit Airodump mit, und auf diesen lassen wir unser Wörterbuch los. Airodump informiert uns nicht wenn ein Handshake aufgefangen wurde, wir können es nur hin und wieder kontrolieren. +Zuerst brauchen wir eine Wörterbuchdatei. Die können wir uns zu Testzwecken entweder selber machen oder uns aus dem Internet laden. Wichtig ist das sich das WPA Passwort in dieser Datei befindet, sonst kann es auch nicht gefunden werden. Aircrack akzeptiert Wörterbuchdateien im txt oder lst Format. Haben wir so eine Datei, kopieren wir diese in unseren Aircrack Ordner. Nun starten wir ein Eingabefenster und wechseln in diesem in unseren Aircrack Ordner. Jetzt starten wir unseren Befehl: +aircrack.exe –a 2 –w wörterbuch.txt meinAP.cap +Für wörterbuch.txt setzen wir natürlich den Namen unser Wörterbuchdatei ein und für meinAP.cap den unseres mit Airodump erstelltem File. +Ist in unserem File ein Handshake gespeichert wird uns dieses angezeigt und Aircack beginnt die einzelnen Wörter unserer Textdatei auf den Handshake anzusetzen. Sobald es eine Übereinstimmung gefunden wurde stoppt Aircrack und zeigt das Passwort an. +Komplizierte Passwörter sind vor dieser Art von Attacke relativ sicher, da es unwahrscheinlich ist das jemand das Wort: ajdtGjhFdFDFsj23437HHFDvahjfüöqÄ in seiner Wörterbuchdatei hat. + +Zusätzlich gibt es auch WinAircrack mit einer grafischen Oberfläche und deutschem Language-Pack. + +Beschleunigung des Crack-Vorgangs: + +Bei WEP Verschlüsselung: +Versprecht euch von Aircrack für Windows nicht zuviel!!! +Da das Sammeln der Datenpakete in einem Netzwerk abhängig von der Netzwerkauslastung ist, kann es sehr lange dauern, bis wir genügend IV’s gesammelt haben. Durch bloßes Surfen im Internet von einem im WLAN angemeldetem PC’s aus kommen in einer akzeptablen Zeit nicht genügend Datenpakete durch die Luft. Deshalb müssen wir in unserem Test das ganze beschleunigen. Das können wir entweder durch verschieben von größeren Datenmengen zwischen zwei angemeldeten PC’s erreichen oder wenn wir nur einen angemeldeten PC im WLAN-Netz haben, durch anpingen der Access Points mit Hilfe eines Pingflooders, welcher auf dem angemeldetem Rechner installiert ist und kontinuierlich Pings an die eingestellte IP-Adresse der AP’s sendet. Diese Programme sind aber mit Vorsicht zu benutzen, da zu viele Pings in zu kurzer Zeit einen PC, Server oder auch AP zu Absturz bringen können. + +Ist kein PC am AP angemeldet kommen auch keine IV’s zustande und ein Cracken unter Windows ist nicht möglich! + +Bei WPA-PSK Verschlüsselung: +Einfach einen PC mit richtigem Key am AP anmelden oder einen angemeldeten kurz ab und dann wieder anmelden, um einen Handshake zu erzeugen. Keine Anmeldung, kein Handshake. + + +Benutzung von Airdecap: + +Airdecap wird benutzt um ein mitgeschnittenes cap-File, mit Hilfe des richtigen Verschlüsselungs-Key zu entschlüsseln und nur Datenpakete eines bestimmten WLAN’s zu filtern, um es mit einem Netzwerkanalyse-Programm, wie z.B. Ethereal, zu analysieren. Es wird mit Doppelklick gestartet und man befolgt danach einfach den Bildschirmaufforderungen. Danach erhält man ein neues, unverschlüsseltes cap-File. + + +Benutzung von WZCOOK: + +Dieses Programm läuft nicht auf jedem System. Es wird benutzt um in Windows gespeicherte Netzwerkschlüssel in Klartext anzuzeigen. Es zeigt gespeicherte Netzwerknamen, WEP-Keys sowie die Pairwise Master Keys (PMK) von WPA-Netzen. +Nach dem Starten des Programms werden alle im System gespeicherten Netzwerke + Keys angezeigt und zusätzlich wird eine Datei namens wepkeys.txt auf die Festplatte geschrieben. + + +Links: + +1. aircrack Dokus: +http://www.wirelessdefence.org/Conte...kORIGINAL.html +http://repat.re.ohost.de/aircrack.html + +2. Hilfe zum Verständnis von aircrack und zur rechtlichen Lage: +http://wardriving-forum.de/viewtopic.php?t=9879 + +3. aircrack Programmsammlung für Windows: +http://www.subagora.com/subagora/Win...rcrackPack.zip + +4. Treiber: +http://www.wildpackets.com/support/downloads/drivers +http://500brabus.byethost22.com/driver1.htm + +6. Wörterbuchdatei zum Testen: +http://ftp.se.kde.org/pub/security/t...rdlists/all.gz diff --git a/android.txt b/android.txt new file mode 100644 index 0000000..0cac62c --- /dev/null +++ b/android.txt @@ -0,0 +1,29 @@ +###Nexus 4 sideload +#Nexus in Recovery Menü (POWER+VOLUME-DOWN) +#jetzt zu Recover Mode gehen und ausführen +#jetzt in sideload wechseln (POWER+VOLUME-UP) +### + starte das Handy ins Recovery + verbinde das Handy mit dem PC (die USB Treiber müssen installiert sein) + öffne ein Kommandozeilenfenster und navigiere in den Ordner, in dem du die adb.exe installiert hast + notiere dir dem Mount-Zustand und die Rechte des Ordners /system + mounte das /system read-write über adb (adb shell-Kommando) und setze die Rechte auf 777 + führe folgenden Befehl aus: + +adb pull /system/build.prop build.prop + + öffne die Datei build.prop, die sich nun im Ordner der adb befindet mit einem beliebigen Textprogramm (z.B. notepad++) + füge an das Ende der Datei folgende Zeile ein: + +persist.service.adb.enable=1 + + speichere die Datei und schließe den Texteditor + führe folgenden Befehl aus: + +adb push build.prop /system/build.prop + + setze den Mount-Zustand und die Rechte des Ordners /system auf den alten Stand zurück. + starte das Handy neu + Um Datenverlust auszuschließen sollte der Befehl sync die Eingaben abschließen. + nun sollte USB-Debugging dauerhaft aktiviert sein und du kannst jederzeit mit der ADB arbeiten. + diff --git a/android_programmierung.txt b/android_programmierung.txt new file mode 100644 index 0000000..8ddd6a4 --- /dev/null +++ b/android_programmierung.txt @@ -0,0 +1,5 @@ +#web: http://www.app-entwickler-verzeichnis.de/apps-programmierung/24-android/297-android-programmierung-tutorial-der-grosse-android-newbie-guide +# +adb kill-server +adb start-server + diff --git a/antivirus.txt b/antivirus.txt new file mode 100644 index 0000000..fcbc3ea --- /dev/null +++ b/antivirus.txt @@ -0,0 +1,2 @@ +###freeware zum maleware entfernen unter windows +malewarebytes Anti-Maleware diff --git a/apache.txt b/apache.txt new file mode 100644 index 0000000..b634549 --- /dev/null +++ b/apache.txt @@ -0,0 +1,20 @@ +###server certifikat erzeugen +pushd /etc/apache2/ +mkdir -p ssl.crt ssl.key +umask 77 +/usr/bin/openssl genrsa 1024 > ssl.key/evk-archiv.key +/usr/bin/openssl req -new -key ssl.key/evk-archiv.key -x509 -days 3650 -out ssl.crt/evk-archiv.crt +Country Name (2 letter code) [AU]:DE +State or Province Name (full name) [Some-State]:Sachsen +Locality Name (eg, city) []:Chemnitz +Organization Name (eg, company) [Internet Widgits Pty Ltd]:TBZ-Pariv GmbH +Organizational Unit Name (eg, section) []:MODARCH +Common Name (eg, YOUR name) []:evk-archiv +Email Address []:modarch@tbz-pariv.de +umask 0022 +make -C ssl.crt + +in /etc/sysconfig/apache2 +APACHE_SERVERADMIN="modarch@tbz-pariv.de" +APACHE_CONF_INCLUDE_FILES="${FIRMA}-archiv.conf" +### diff --git a/apt.txt b/apt.txt new file mode 100644 index 0000000..d2cf703 --- /dev/null +++ b/apt.txt @@ -0,0 +1,35 @@ +###baut den cache neu um Pakete zu installieren, wenn man eine source hinzugefügt hat +apt-get update +###installieren von paketen (vi) +apt-get install vi +###reinstallieren von paketen +apt-get --reinstall install paket +###komplettes löschen von Paketen (network-manager) +apt-get remove --purge network-manager +###nach Programmen suchen +apt-cache search compiz +###nach Programmen suchen +aptitude search compiz +###Paketschlüssel per wget holen und importieren +wget -q http://apt.wicd.net/wicd.gpg -O- | sudo apt-key add - +###installieren von mplayer mittels aptitude +aptitude install mplayer +###remove mplayer mittels aptitude +aptitude remove mplayer +###remove von mplayer + aller zusätzlich installieren abhängigen packete +apt-get autoremove mplayer +###Thunderbird repo +#eintragen +deb http://ppa.launchpad.net/ubuntu-mozilla-daily/ppa/ubuntu jaunty main +deb-src http://ppa.launchpad.net/ubuntu-mozilla-daily/ppa/ubuntu jaunty main +apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 247510BE +###hold packages +apt-mark hold package_name +aptitude hold package_name +echo "package hold" | sudo dpkg --set-selections +###unhold packages +apt-mark unhold package_name +aptitude unhold package_name +echo "package install" | sudo dpkg --set-selections +### +### diff --git a/arduino.txt b/arduino.txt new file mode 100644 index 0000000..7bf7054 --- /dev/null +++ b/arduino.txt @@ -0,0 +1,2 @@ +###fake Arduino Masseproblem (http://forum.fhem.de/index.php?action=dlattach;topic=24651.0;attach=21345;image) +pin 25 und pin 26 des ftdi müssen verbunden sein diff --git a/argyll.txt b/argyll.txt new file mode 100644 index 0000000..8e20e3f --- /dev/null +++ b/argyll.txt @@ -0,0 +1,154 @@ +###Webseiten zu Colormanagement, Spyder, Farbräumen und Software +http://www.dslr-forum.de/showthread.php?p=2937674#post2937674 +http://www.iccview.de/content/blogcategory/2/11/lang,de/ +http://nubi.bplaced.net/argyllcms_spyder2/ +http://www.homecinema-fr.com/colorimetre/index_en.php +http://www.simpelfilter.de/farbmanagement/graupunkt.html +http://colormanagement.org/de/testimages.html + +###auslesen der aktuellen Werte eines Displays/CRT's +dispcal -yl -r +dispcal -yc -r +###Calibration das Helligkeit und Weißpunkt lässt +dispcal -v TargetA +###matrix/shaper profil erzeugen +colprof -v -D"Display A" -qm -as DisplayA +###lut profil +colprof -v -D"Display A" -qm -S swop.icm -cpp -dmt DisplayA + + + +###komplette Anleitung +##Schritt 1: dispcal + +Dieses Programm liefert die Basis für die Kalibrierung. Hier werden die Darstellung der Grautöne iteriert und eine Grundprüfung des Displays vorgenommen. Erzeugt wird eine cal-Datei. Der Zeitaufwand hängt von der gewünschten Genauigkeit ab. +Das Programm wird erst mit euch einige Schritte durchgehen, um den Monitor schonmal hardwareseitig so nah wie möglich an die Zielkalibrierung zu bringen. Es wird euch nach mehreren Einstellungen fragen. Für LCDs kann man nach dem Aufruf den Punkt 1 für den Blackpoint überspringen. Wichtig sind die Einstellungen für die Weißpunkt unter 2 und die Helligkeit unter 3. +Wenn ihr könnt, dann nutzt auch die Möglichkeiten eures Monitors aus! Umso weniger muss später softwareseitig an den Kurven herumgebogen werden! Zu beachten ist: manchmal ist das Programm dispcal etwas bugbefallen. Wenn man nämlich (jedenfalls bei mir) die Option für den Weißpunkt aufruft und damit fertig ist, so wird der Sensor anschließend nicht mehr richtig initialisiert und es wird immer nur 0 ausgelesen. Einfach das Programm neustarten und die nächste Option wählen behebt das Problem! +Ich persönlich benutze das Programm mit folgenden Parametern: + +dispcal -g l -b 140 -w 0.3127,0.3290 -y l -v -q m eizo + +Der Schalter -g gibt an, welche Gammakurve gewünscht ist. Hier kann man einen Zahlenwert wie etwa 2.2 angeben. Ich benutze L* (-g l), was wohl ein neuer Standard für eine Helligkeitsverteilung ist, die der der Wahrnehmung des menschlichen Auges sehr nahe kommt. +Dann folgt -b 140. Das sagt, das meine Zielhelligkeit 140cd/m² entsprechen soll. Hier wohl eine Frage des Geschmacks, wie hell man es gerne hätte. +Die nächste Angabe (-w 0.3127,0.3290) steht für den gewünschten Weißpunkt. Dies sind chromatische Koordinaten, in diesem Fall stehen sie für D65, was etwa 6504K entspricht. Wer lieber Farbtemperaturen nach Planck angibt, kann stattdessen auch -t 6500 für 6500K benutzen (oder jeder andere Wert). +Mein Spyder2 braucht dann die Angabe -y l um zu wissen, dass es sich bei dem Gerät um einen LCD-Monitor handelt. Der Switch -v steht für Verbose. Das würde ich generell empfehlen, damit man auch sieht, was das Programm gerade macht. Sonst sitzt man relativ lange vor der Kommandozeile und weiß nix über den Fortschritt. +Es folgt -q h. Das ist der Qualitätsregler, wobei l, m und h für low, medium bzw. high stehen. Damit legt man also die Genauigkeit der Grauiteration fest. Der zeitliche Aufwand unterscheidet sich stark, man kann pro Schritt von einer Verdopplung bis Verdreifachung ausgehen. Ich würde die Qualitätsstufe m empfehlen, das dauert dann so 15-20 mins. Wers schneller mag, nutzt l. Die hohe Stufe ist eigentlich wenig sinnvoll, da die zu erwartenden Genauigkeitssteigerung wohl außerhalb der Wahrnehmung liegt. Ich konnte keinen Unterschied im Ergebnis feststellen, wohl aber, das etwa eine Stunde für diesen Schritt draufging. +Danach folgt der Name für die zu erzeugende Datei, ich hab sie so genannt wie meinen Monitor. Man will ja die Übersicht behalten. +##Schritt 2: targen + +Dieses Programm wertet die cal-Datei aus und erstellt eine für die Kalibrierung nötige Datei im ti1-Format. Dort stehen Farbinformationen für die Flächen drin, die anschließend durch das Colorimeter ausgelesen werden sollen. Das Programm erfüllt eigentlich nur diesen Zweck, kommt aber aufgrund der vielfältigen Anwendungsmöglichkeiten natürlich nicht um Parameter herum. Ich benutze meist folgende Einstellungen: + +targen -d 3 -v -f 500 eizo + +Der Switch -d 3 gibt an, dass es Flächen im RGB-Format erstellen soll. Denn theoretisch kann das Programm z.b. auch für die Kalibrierung von Druckern benutzt werden, wo CYMK gefragt ist. +Verbose wird auch wieder angeschaltet, um zu wissen, was passiert. Der Parameter -f 500 gibt an, wieviele Patches erstellt werden sollen. Je mehr Farbpatches, umso genauer wird dann das Profil. Für einen gewöhnlichen CRT oder LCD reichen hier sicher wenige hundert, meine Empfehlung liegt so zwischen 400-600. Aber damit darf natürlich experimentiert werden. +Am Ende steht der Name der zu verwendenden cal-Datei, was dann auch der ausgegebenen ti1-Datei entspricht. Das ganze dauert dann je nach Anzahl der gewünschten Farben so 2-10 Sekunden, also nicht der Rede wert. +##Schritt 3: dispread + +Das ist der vorletzte Schritt, der wieder etwas zeitaufwändiger ist. Dispread greift sich die cal- und ti1-Datei und fängt an, die Farbflächen auszulesen. +Der Aufruf benötigt entwas weniger Optionen und sieht bei mir so aus: + +dispread -v -y l -k eizo.cal eizo + +Verbose und -y l sollte klar sein. Der Parameter -k eizo.cal gibt an, welche Kalibrierungsdatei vor der Messung angewandt werden soll. Diese Angabe ist Pflicht, da sonst der nicht vorkalibrierte Monitor für die Messung benutzt wird. Das wäre pure Zeitverschwendung. Am Ende steht noch der Dateiname der eingelesenen ti1-Datei und steht gleichzeitig für die ausgegebene ti3-Datei, die die Ergebnisse enthält. +Bei mir mit dem Spyder2 dauert das Auslesen eines Farbwertes so 1-2 Sekunden. Ihr könnt euch ausmalen, wie lange der Vorgang also in Abhängigkeit zu der Anzahl der Farbpatches, die mit targen ausgesucht wurde, dauert. Eine Viertelstunde bei 500 Patches dauert es schon. +##Schritt 4: colprof ehemals profile + +Eigentlich sind alle erforderlichen Schritte jetzt vollbracht. Nur: es gibt noch keine ICM/ICC-Datei. Die muss nämlich extra erzeugt werden, auch hier gibt es nämlich Unterschiede. + +colprof -v -A "Eizo" -M "S2431W" -D "20080313" -C "Steffen" -qh -a l eizo + +So wie oben sieht es bei mir aus. In der Reihenfolge wie oben steht dort: Verbose an, Hersteller "Eizo", Modell "S2431W", Datum "20080313" und Copyright "Steffen". Hier könnt ihr eintragen, was für euch sinnig scheint. Auf das eigentliche Profil hat es keine Auswirkung. Anders ist es mit den nächsten Beiden. Das q sollt euch bekannt vorkommen, auch hier steht es wieder für Quality. Die Auswahlmöglichkeiten sind die selben, bis auf die Tatsache, dass u für "Ultra" hinzugekommen ist. Der Author des Programms empfiehlt diese Einstellung aber nicht. +High ist hier eigentlich ganz okay, auch Medium sollte gute Ergebnisse liefern. +Dahinter steht -a l für die Angabe der Profilart. Hier hat man für PC-Monitore im Wesentlichen zwei Möglichkeiten. Das l steht hier für CLUT und ist die genauere Variante. Sonst kann man noch s für die etwas ungenauere Variante einer Matrix benutzen. Betrachtet man das Ergebnis für beide Möglichkeiten, so fällt einem vielleicht am meisten die unterschiedliche Dateigröße auf. Ein Matrix-Profil fasst bei mir so 4KB, ein LUT-Profil kann schonmal 500KB verschlingen. Die Unterschiede in der Darstellung sind für mich nicht erkenntbar, schaut man sich hingegen die möglichen Farbwerte im Vergleich zu sRGB an, so unterscheiden sich die Ergebnisse schon. Man sieht schön, dass das rechte Profil genauere Kurven hat und auch einen etwas weiteren Farbraum erasst. Ich sehe also keinen Grund, nicht ein CLUT-Profil zu erstellen. + +Damit ist jetzt aber der Arbeitsakt vollzogen und ein ICM/ICC-Profil erstellt. Und es wird euch qualitativ sicher zufriedenstellen. Bei mir waren die Ergebnisse jedenfalls besser, als ich es mit basICColor oder Colorvision hinbekommen habe. +Wie läd man nun das Profil auf die Grafikkarte? Auch hierfür liefert das Paket eine Antwort. Das Tool dispwin erledigt dies. Im einfachsten Fall schreibt man einfach dispwin profilname.icm in die Kommandozeile und das Profil ist geladen. Man muss es aber trotzdem unter den Eigenschaften der Anzeige selber als Farbprofil für den Monitor hinzufügen, dies geschieht nicht automatisch. +Mit dispwin -c läd man dann übrigens wieder eine linease Kurve auf die Karte und bekommt somit den unkalibrierten Zustand zu Gesicht. +Wahlweise kann man aber natürlich auch so eine Software wie xcalib benutzen (auch kostenlos), auch wenn es hierfür eigentlich keinen Grund gibt. +###Randbemerkungen + +Jedes dieser Tools bietet eine Fülle von Optionen. Wenn man man wissen will, was sonst noch alles geht, einfach toolname -? in die Konsole eingeben. +Ein Tipp von mir noch: fügt die Tools eurer Umgebungsvariable %path% hinzu, damit ihr nicht immer in den Programmordner navigieren müsst. Ich habe mir einen eigenen Ordner für die Profile erstellt, damit das ganze übersichtlicher bleibt. Die Dateien werden nämlich immer in dem Pfad erzeugt, in der auch gerade die Commandline ist. Generell ist das Tool natürlich auch für mehrere Monitore geeignet. Die meisten Tools, für die das relevant ist, lassen sich mit dem Parameter -d # auf einen Monitor festlegen, wobei die Raute hier für die Displaynummer steht. +###Schnellmethode, alles in einem Schritt +Mit der neuen Version von ArgyllCMS kam eine weitere Methode hinzu, schnell ein Profil mit nur einer einzigen Kommandozeile zu erzeugen. Es wird dann lediglich das Tool dispcal aufgerufen: + +dispcal -v -qm -yl -t6500 -g2.2 -p.5,.5,2 -K -o profilname.icm -O"Profilbeschreibung" 20090311 + +Die Kommandozeile enthält die gleichen Befehle wie oben, nur das noch die Schalter -o profilname.icm und -O"Profilbeschreibung" angefügt wurden. Dadurch wird direkt nach der Kalibrierung gleich noch eine vorgegebene Testreihe an Farbfeldern vermessen und ein Shaper/Matrix-Profil mit dem Dateinamen profilname.icm und der Beschreibung "Profilbeschreibung" erzeugt – ganz ohne, dass man die anderen Tools aufrufen müsste. + +Diese Profile sind auch sehr gut geeignet und können bedenkenlos benutzt werden. Allerdings werden einem hier natürlich viele Möglichkeiten aus der Hand genommen. Es ist gewissermaßen mit dem Vorgehen von kommerziellen Produkten gleichzusetzen. Man kann die Ziele der Kalibrierung vorgeben, der Rest wird über ein Standardverfahren vom Programm erledigt. + +Wer allerdings nur mal schnell schauen möchte, ob Argyll die Ergebnisse liefert, die man sich wünscht, dem ist damit sicher gut geholfen. Später kann man sich ja immernoch ein Profil nach eigenen Vorstellungen erzeugen. +dispcal -v -qm -yl -t6500 -g2.2 -p.5,.5,2 -K -o profilname.icm -O"Profilbeschreibung" 20090311 + +### +Schritt 1: die Kalibrierung + +Eigentlich ist dieser Schritt für die Erzeugung eines Monitorprofils gar nicht notwendig. Ähnlich wie bei der Software von beispielsweise basICColor kann man auch mit Argyll das Display nur Profilieren. Trotzdem ist eine zusätzliche Kalibrierung sicher nie verkehrt, wenn man einige Details beachtet: der Monitor sollte schon vor der Kalibrierung so nah wie möglich an das gewünschte Ziel gebracht werden. Dazu bedient man sich der Einstellungsmöglichkeiten im OSD des Monitors. ArgyllCMS liefert hier eine gute Unterstützung bei der Anpassung des Displays an die Zielwerte. Die erste Kommandozeile, mit der das alles erledigt wird, lautet wie folgt: + +dispcal -v -qm -yl -t6500 -g2.2 -p.5,.5,2 -K 20090311 + +In der Reihenfolge der Argumente bedeutet dies: Berichterstattung ist aktiviert, die gewünschte Qualität des Profils ist Medium (das bedeutet, die erlaubte Abweichung zum Ziel beträgt maximal 0.8 dE), es handelt sich um einen LCD-Monitor (CRT wäre -yc), der gewünschte Weißpunkt beträgt 6500K, das Zielgamma beträgt 2.2 (-gs für sRGB, -gl für L-Star) und das Messfenster soll in der Mitte des Bildschirms bei doppelter Messfenstergröße positioniert werden. Der Parameter -K löst vor den Messungen die Kalibrierung des Messgerätes selbst aus, wie auch aus anderen Programmen bekannt. Die Bezeichnung dahinter ist der gewünschte Dateiname der produzierten Ergebnisdatei, bei mir wie unschwer zu erkennen immer das aktuelle Datum. Die Dateiendung .cal wird automatisch angehängt. + +Dies sind alles Parameter, die nach eigenen Vorstellungen angepasst werden können und teilweise auch gar nicht benötigt werden. Ich habe beispielsweise den Wert -b weggelassen, mit dem man eine Ziel-Helligkeit in cd/m^2 angeben könnte. Diesen Wert stelle ich aber bei der angeleiteten Monitorjustierung selber ein und er soll nicht über die Kalibrierung erzwungen werden. Denn es kommt mir hier nicht wirklich darauf an, ob nun 119 oder 121 cd/m^2 erreicht werden – viel lieber ist mir, das so wenig wie möglich durch die Grafikkarte an der Ausgabe herumgebogen werden muss. + +Führt man diese Befehlszeile aus, dann erscheint nach der Kalibrierung des Messgerätes zunächst die Aufforderung zur Monitorjustierung. Über die dritte Option erhält man eine Angabe zur aktuellen Helligkeit und des aktuellen Weißpunktes und kann nun über das OSD des Monitors die gewünschten Zielwerte so nah wie möglich einstellen. Danach kann man über den vorletzten Menüpunkt zur eigenlichen Kalibrierung fortfahren. + +Das Ganze rödelt jetzt – je nach gewählter Qualität – für einige Zeit vor sich hin. Ist der Prozess durchgelaufen, kann mit dem nächsten Schritt fortgefahren werden: + + + +Schritt 2: Generieren der Testfelder + +ArgyllCMS liefert ein umfangreiches Tool zum Erstellen der so genannten "Test-Patches" zur Verfügung. Theoretisch kann man alle möglichen Geräte vom Beamer über den Monitor bis zum Drucker profilieren. Speziell für Monitore bietet sich folgende Befehlszeile an: + +targen -v3 -d3 -e10 -g64 -f400 20090311 + +Wieder wird die Berichterstattung aktiviert; der gewählte Farbmodus wird auf RGB gesetzt, es werden 10 reinweiße Patches zur Bestimmung des Weißpunktes erstellt, 64 Testfelder entlang der neutralen Achse und schließlich 400 sinnvoll verteilte Farbfelder über den gesamten RGB-Farbraum. Die letzte Bezeichnung steht wieder für den ausgegebenen Dateinamen (die Dateiendung .ti1 wird automatisch angefügt). + +Die Anzahl der Patches kann hier nach belieben und eigener zugewilligter Zeit verändert werden. Wesentlich mehr als 400 Patches machen das Profil zwar noch etwas genauer, allerdings kann man auch mit weniger ansehnliche Ergebnisse bekommen. Viele kommerzielle Produkte lesen hier eher so um die 40 Patches aus – ist also sicherlich eine Frage der geforderten Genauigkeit und des eigenen Anspruches. + +Da das Programm eigentlich nur ein wenig "herumrechnet" und selber nichts misst, sondern nur eine Datei mit Messfeldern erstellt, ist das Ganze nach wenigen Sekunden durch und wir können mit dem nächsten Utility weitermachen. + + +Schritt 3: Profilieren des Bildschirms + +Nachdem wir eine Kalibrierungsdatei und eine Datei mit den Testpatches erzeugt haben, können wir also mit der Profilierung beginnen. Ich benutze folgende Kommandozeile: + +dispread -v -yl -k 20090311.cal -p.5,.5,2 -K 20090311 + +Die Berichterstattung ist aktiviert, der Displaytyp auf LCD gesetzt, unsere zuvor erstellte Kalibrierung wird in die Grafikkarte geladen. Danach erfolgt wieder die Positionierung des Messfensters wie vorhin, es wird eine Kalibrierung des Messgerätes gefordert und als Letztes wird angegeben, wie die Datei mit den Testpatches heißt. Genau so wird auch die erzeugte Datei mit den Ergebnissen heißen, die Dateiendung .ti3 wird automatisch angehängt. + +Je nach Anzahl der Testpatches kann dies nun eine ganze Weile dauern. Ist dieser Schritt durchlaufen, sind alle erforderlichen Messwerte erfasst worden und es kann ein Profil erstellt werden. + + +Schritt 4: Erstellung der ICC-Datei + +Für alle technisch Interessierten: Argyll erstellt momentan immer ICC-Profile nach dem v2-Standard. basICColor kann auch schon Profile nach dem neuen Standard v4 erzeugen, für den Endnutzer hat dies aber momentan noch keine wesentlichen Auswirkungen oder Vorteile, außer dass man sich als Nachteil Inkompatibilitätsprobleme mit einigen Programmen einhandelt. Es spricht also nichts gegen diese "Einschränkung" – bisher jedenfalls. + +Nachdem wir alle Dateien zusammen haben, kann mit Argyll das Profil erzeugt werden. Hier kommt auch schon eine Änderung zur alten Anleitung: das Tool wurde von profile zu colprof umbenannt. + +colprof -v -A"Eizo" -M"S2431W" -D"20090311, 6500K, Gamma 2.2, Matrix" -C"Steffen Sachse, 2009" -qh -as 20090311 + +Ein letztes Mal wird die Berichterstattung aktiviert, danach folgen Hersteller, Modell und Beschreibung für das Profil. Schließlich noch das "Copyright", oder auch die Makernote genannt. Innerhalb der Anführungsstriche kann man hier sinnvolle Angaben machen, damit man sein Profil später beispielsweise in Photoshop leichter wiederfindet. Dort wird die Beschreibung angezeigt, wenn sie denn vorhanden ist. Schließlich wird noch die Qualität auf Hoch gesetzt und als Profiltyp Shaper/Matrix festgelegt. Dieser Profiltyp ist mitlerweile auch meine emfpohlene Variante, da er maximale Kompatibilität garantiert und trotzdem sehr genau ist. Am Ende steht dann – wie immer – er Name der Eingabe- und der Ausgangsdatei. Die Dateiendung .icc wird automatisch angehängt. + + +Bemerkungen + +Alle Dateien findet man in dem Verzeichnis wieder, aus der die Kommandozeile ausgeführt wird. Hat man also, wie im Eröffnungspost beschrieben, die %PATH%-Variable von Windows um den Pfad zu den Tools von Argyll ergänzt, dann bietet es sich an, vor der Ausführung irgendeines Kommandos in einen sinnvollen Dateipfad zu navigieren. Sonst findet man aber natürlich trotzdem all seine Dateien wieder, vermutlich im Ordner /Dokumente und Einstellungen/Benutzername. Je nach Windows-Version heißt dieser ein wenig anders. + +Setzt man nicht die %PATH%-Variable, so muss man zum Ausführen der Dateien zwangsweise in den Pfad von ArgyllCMS navigieren und dort ins /bin/-Verzeichnis wechseln. Folgerichtig werden dann auch alle Dateien dort erzeugt. + + +Die "Quick 'n' Dirty"-Methode + +Mit der neuen Version von ArgyllCMS kam eine weitere Methode hinzu, schnell ein Profil mit nur einer einzigen Kommandozeile zu erzeugen. Es wird dann lediglich das Tool dispcal aufgerufen: + +dispcal -v -qm -yl -t6500 -g2.2 -p.5,.5,2 -K -o profilname.icm -O"Profilbeschreibung" 20090311 + +Die Kommandozeile enthält die gleichen Befehle wie oben, nur das noch die Schalter -o profilname.icm und -O"Profilbeschreibung" angefügt wurden. Dadurch wird direkt nach der Kalibrierung gleich noch eine vorgegebene Testreihe an Farbfeldern vermessen und ein Shaper/Matrix-Profil mit dem Dateinamen profilname.icm und der Beschreibung "Profilbeschreibung" erzeugt – ganz ohne, dass man die anderen Tools aufrufen müsste. + +Diese Profile sind auch sehr gut geeignet und können bedenkenlos benutzt werden. Allerdings werden einem hier natürlich viele Möglichkeiten aus der Hand genommen. Es ist gewissermaßen mit dem Vorgehen von kommerziellen Produkten gleichzusetzen. Man kann die Ziele der Kalibrierung vorgeben, der Rest wird über ein Standardverfahren vom Programm erledigt. + +Wer allerdings nur mal schnell schauen möchte, ob Argyll die Ergebnisse liefert, die man sich wünscht, dem ist damit sicher gut geholfen. Später kann man sich ja immernoch ein Profil nach eigenen Vorstellungen erzeugen. diff --git a/asterisk.txt b/asterisk.txt new file mode 100644 index 0000000..2e68d18 --- /dev/null +++ b/asterisk.txt @@ -0,0 +1,203 @@ +###Asterisk Konsole öffnen +asterisk -r +###Konsolenbefehle +#reload der Konfiguration +reload +#sip registrierungen anschauen +sip show registry +# +sip show peers +#asterisk stoppen +stop now +#dialplan neu einlesen +dialplan reload +#sip telefon anrufen +console dial 2000 +#aktive channels / calls anzeigen +core show channels +core show calls +###Asterisk Applikationen +#Hörer abnehmen +Answer() +#Auflegen +Hangup() +#Sounddatei abspielen +Playback() +#Pause (in Sekunden) +Wait(20) +#nichts machen (No Operation) String wird im CLI ausgegeben +NoOP(String) +###sip debugging auf Asterisk-Konsole einschalten +sip set debug on +###Dial() +#mehrere Telefon gleichzeitig klingeln lassen, das erste was abnimmt gewinnt +exten => s,1,Dial(SIP/2000&SIP/2001&SIP/2303) + + +###Variablen benutzen +${123456789:1} : ergibt den Teilstring 2345678 +${123456789:-4} : ergibt den Teilstring 6789 +${123456789:0:3} : ergibt den Teilstring 123 +${123456789:2:3} : ergibt den Teilstring 345 +${123456789:-4:3} : ergibt den Teilstring 678 +###länge des Variablen inhalts (auf gustav steht 123) +${LEN(${gustav})} : ergibt 3 +###wenn telefone nach auflegen der gegenstelle weiter klingeln +#hilft meist in der sip.conf +pedantic=no +###sipgate trunking Anschluß Einstellungen +[sipconnect.sipgate.de] +type = peer +host = sipconnect.sipgate.de +outboundproxy=sipconnect.sipgate.de +port = 5060 +username = 1234567t0 +fromuser = 1234567t0 +fromdomain = sipconnect.sipgate.de +secret = XXXXXX +dtmfmode = rfc2833 +insecure = port,invite +canreinvite = no +registertimeout = 600 +disallow=all +allow=alaw +allow=ulaw +###ausgehenden Gesprächen gewünschte Absenderrufnummer setzen +#im E164-Format (also international ohne führende Nullen oder "+"-Zeichen) +#als neuen Header P-Preferred-Identity: +SipAddHeader(P-Preferred-Identity: ) +###Rufnummer unterdrücken +SipAddHeader(P-Preferred-Identity: ) +SipAddHeader(Privacy: id) +###Absendernummer für Telefone setzen in extensions.conf +#Absendernummer ist hier 4921158000000, immer ohne führende 0 oder + +[sipout] +exten => _X.,1,Set(CALLERID(number)=SIPID) +exten => _X.,n,SipAddHeader(P-Preferred-Identity: ) +exten => _X.,n,Dial(SIP/${EXTEN}@sipgate-out,30,trg) +exten => _X.,n,Hangup +###sipgate VPN +#Webzugangsdaten als username und passwort +VPN-Peer: secureconnect.sipgate.net +Groupname: secureconnect.sipgate.net +Secret: sipgate-key +Use Cert: Off +### +[secure] +deny=0.0.0.0/0.0.0.0 ; Keine IP-Adresse darf sich registrieren... +permit=172.17.0.0/255.255.248.0 + +[Sekreteriat] +include => telefontest +include => intern +;Antje, Sylvia, Susi +exten => 0,1,Dial(SIP/0,20) +exten => 0,2,VoiceMail(2000,u) + +[Z110] +include => telefontest +include => intern +;Lars, Steffen, Sarah + +[Z112] +include => telefontest +include => intern +;Mario, Stephan + +exten => 2999,1,VoiceMailMain(${CALLERID(num)},s) +;unsere 100 Nummer erst mal alle bei uns +;exten => 0,1,NoOp(test); +;exten => _[1-9]X,n,NoOp(Test)); +exten => 4921163558627768,1,Dial(SIP/0) +exten => 493713371470,n,Dial(SIP/0) +;exten => _49371337147[1-9]X,n,Dial(SIP/0) +;exten => _1X,n,Dial,SIP/${EXTEN}|55|Ttr +;exten => _XXXX.,1,SipAddHeader(P-Asserted-Identity: ) +;exten => _XXXX.,1,SipAddHeader(P-Preferred-Identity: ) +exten => _XXXX.,1,SipAddHeader(P-Preferred-Identity: ) +;exten => _XXXX.,n,NoOp(TEST) +;exten => _XXXX.,n,NoOp(${CALLERID(num)}) +;exten => _XXXX.,n,NoOp(${CALLERIDNUM}) +;exten => _XXXX.,n,Dial(SIP/${EXTEN}@sipconnect.sipgate.de) + + +[Z101] +include => telefontest +include => intern +;Holger, Thomas, Swen + +[Z114] +include => telefontest +include => intern +;Rene, Holger, Sven, Volker + +[Z009] +include => telefontest +include => intern +;Kuvertieren + +[Z010] +include => telefontest +include => intern +;Matthi, Holger, Ralf, Bernd +exten => _0[1-9].,1,Dial(SIP/${EXTEN}@sipconnect.sipgate.de) + +[007] +include => telefontest +include => intern +;Mario, Falk +[Chef] + + +[telefontest] +;Telefontest auf Nummer 1001 +exten => 1001,1,Answer(); +exten => 1001,n,Playback(hello-world) +exten => 1001,n,Hangup() + +[intern] +exten => _XX,1,NoOp(${EXTEN}) +exten => _XX,n,Dial(SIP/${EXTEN}) +;exten => 10,1,Dial(SIP/10) +;exten => 11,1,Dial(SIP/11) +;exten => 12,1,Dial(SIP/12) +;exten => 13,1,Dial(SIP/13) + + +[incomming] +exten => 493713371470,1,NoOp(incomming call from: ${EXTEN}) +exten => 493713371470,n,Dial(SIP/0) + +exten => _493713371471X,1,Dial(SIP/10) +exten => _493713371472X,1,Dial(SIP/10) +exten => _493713371473X,1,Dial(SIP/10) +exten => _493713371474X,1,Dial(SIP/10) +exten => _493713371475X,1,Dial(SIP/10) +exten => _493713371476X,1,Dial(SIP/10) +exten => _493713371477X,1,Dial(SIP/10) +exten => _493713371478X,1,Dial(SIP/10) +exten => _493713371479X,1,Dial(SIP/10) + +[test] +exten => _493713371470,1,NoOp(Anruf auf: ${EXTEN}) +exten => _493713371470,n,Dial(SIP/0) +exten => _49371337147[1-9]X,1,NoOp(Anruf auf: ${EXTEN}) +exten => _49371337147[1-9]X,n,Dial(SIP/0) + +###mögliche callerid variablen +exten => _XXXX.,n,NoOp(CALLERID(all)=${CALLERID(all)}) +exten => _XXXX.,n,NoOp(CALLERID(name)=${CALLERID(name)}) +exten => _XXXX.,n,NoOp(CALLERID(num)=${CALLERID(num)}) +exten => _XXXX.,n,NoOp(CALLERID(ANI)=${CALLERID(ANI)}) +exten => _XXXX.,n,NoOp(CALLERID(DNID)=${CALLERID(DNID)}) +exten => _XXXX.,n,NoOp(CALLERID(RDNIS)=${CALLERID(RDNIS)}) +exten => _XXXX.,n,NoOp(CALLERID(pres)=${CALLERID(pres)}) +exten => _XXXX.,n,NoOp(CALLERID(ton)=${CALLERID(ton)}) + +###mit anderen Rufnummer via Sipgate telefonieren +#Syntax (am Telefon): 99** +exten => _99.,1,Set(CALLERID(number)=) +exten => _99.,n,Set(destination=${CUT(EXTEN,"*",3)}) +exten => _99.,n,Set(source=${CUT(EXTEN,"*",2)}) +exten => _99.,n,Set(CALLERID(name)=49${source:1}) +exten => _99.,n,Dial(SIP/${destination}@sipgate,600,t) diff --git a/autotools.txt b/autotools.txt new file mode 100644 index 0000000..80420b1 --- /dev/null +++ b/autotools.txt @@ -0,0 +1,14 @@ +###benutzen von autotools +1) Create sources, “Makefile.am” +2) `autoscan` +3) Rename “configure.scan” to “configure.ac” +4) `autoheader` +5) Add AM_INIT_AUTOMAKE to “configure.ac” +6) `aclocal` +7) `automake addmissing +copy` +8) `autoconf` +9) `./configure` +10) `make` +11) `make install` +### diff --git a/avr.txt b/avr.txt new file mode 100644 index 0000000..0045e35 --- /dev/null +++ b/avr.txt @@ -0,0 +1,291 @@ +###Adressen im Netz +http://www.hobby-bastelecke.de/ +http://www.mschrod.de/Elektronik/AVR/Hauptseite.htm +http://home.arcor.de/dirk.milewski/ +http://www.ulrichradig.de/home/index.php/avr/avr-car-delay/umbau-zur-alarmanlage +http://forum.electronicwerkstatt.de/phpBB/ +http://www.electronicwerkstatt.de/ +http://avr-net-io.de +http://www.ethersex.de +http://www.wiesolator.de/ +http://www.avrfreaks.net/ +http://www.avrprojekte.de/ +http://www.avr-projekte.de/ +http://www.siwawi.arubi.uni-kl.de/avr_projects/ +http://www.mikrocontroller.com/de/einleitung.php +http://www.cczwei.de/ +http://gaedtke.name/ +http://www.comwebnet.de/ +http://www.avr-asm-tutorial.net +http://www.embedded-projects.net/index.php?page_id=74 +http://www.tschallener.net/AVR/avr.htm +http://www.avr-asm-tutorial.net/avr_de/beginner/index.html +#Steuerung mit Webserver NET-IO +http://www.mikrocontroller.net/articles/Steuerung_und_Regelung_eines_Raums_mit_dem_AVR-Webserver +#AVR in C programmieren +http://www.stud.uni-stuttgart.de/studweb/users/etk/etk39219/avrc/ +#Display / LCD ansteuern per µC +http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD +#SPI +http://www.mct.de/faq/spi.html +#Schieberegister +http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister +#Temperatursensor DS1621 +http://www.myplace.nu/avr/thermo/ +http://www.digitemp.com/index.shtml +http://www.johannes-bauer.com/mcus/tempgrid/?menuid=5 +#AVR Oszi / Sensoren mit Funksendern +http://www.avr.roehres-home.de/logikanalyzer/index.html +#Oszi für Soundkarte +http://www.schule-bw.de/unterricht/faecher/physik/mess/soundkarte/hardware/adamczyk/ +#AVR Handysteuerung Siemens / PIR +http://mschrod.de/Elektronik/AVR/Projekte/HandyS45/SMS_Versand.html +#HV Progger STK500 +http://www.der-hammer.info/hvprog/index.htm +#Kennzeichnung von Halbleitern +http://www.mikrocontroller.net/articles/Kennzeichnung_von_Halbleitern +#Pegelwandlung +http://www.mikrocontroller.net/articles/Pegelwandler#STEP-UP:_5V_-.3E_9..15V +#Datenblätter +http://www.alldatasheet.com/ +http://www.datasheetcatalog.com/ +http://www.datasheetcatalog.net/de/ +http://www.elektronik-kompendium.de/service/datenblatt.htm +#AVR gesteuertes Netzteil +http://www.tuxgraphics.org/electronics/200707/bench-power-supply-unit.shtml +#Lötstation selbstbau +http://stegem.de/Elektronik/Loetkolben/index.htm +#Datenübertragung mit Funkmodulen +http://plischka.at/blog/?p=3 +http://plischka.at/Mega32-Universal-DMX-Board.html +http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR +###Codebeispiele in C +http://www.rn-wissen.de/index.php/Kategorie:Quellcode_C +#AVR Infos +http://www.rn-wissen.de/index.php/Avr +###PIR aus Airwick +Pin1 ist links +1. VCC (3.3V-4V) +2. GND +3. LED GND +4. GND +5. PIR out +6. switch 9 min­utes (con­nects it to GND) +7. switch 18 min­utes (con­nects it to GND) +8. switch 36 min­utes (con­nects it to GND) +9. switch off (con­nects it to GND) +###Abblockkondensator +http://www.rn-wissen.de/index.php/Abblockkondensator +Kerko oder Folie (kein Elko) 100nF bis 20MHz +###miso / mosi bei SPI +#Drei gemeinsame Leitungen, an denen jeder Teilnehmer angeschlossen ist: +SDO (engl. Serial Data Out) bzw. MISO oder SOMI (engl. Master in Slave out) +SDI (engl. Serial Data In) bzw. MOSI oder SIMO (engl. Master out Slave in) +SCK (engl. Serial Clock), wird vom Master ausgegeben +MOSI=Master Out Slave In +MISO=Master In Slave Out +###Compilieren/Linken/Hex erstellen +#http://www.rn-wissen.de/index.php/Hallo_Welt_f%C3%BCr_AVR_%28LED_blinken%29#Quellcode +Compilieren + +Zunächst wird die C-Datei übersetzt. Der Übersetzungsvorgang wird gesteuert durch Kommandozeilen-Parameter (siehe avr-gcc). Die Option + +-c + legt fest, daß nur compiliert wird (und nicht gelinkt), +-o name + gibt den Namen der Ausgabedatei an. Ohne diese Option heißt die Ausgabedatei immer a.out +-mmcu=atmega8 + legt den Controllertyp fest, in dem Beispiel den ATmega8 +-g + erzeugt Debug-Infos und +-Os + optimiert auf Codegröße. +-DF_CPU=xxx + optional, falls der Controller nicht mit 1 MHz läuft. xxx ist die Taktfrequenz in Hertz. + +> avr-gcc blinky.c -c -o blinky.o -Os -g -mmcu=atmega8 + +Danach ist eine neue Datei entstanden (*.o) + +blinky.c blinky.o + +Linken + +Die erzeugte Objek-Datei wird nun zur Ausgabedatei (*.elf) gelinkt: + +> avr-gcc blinky.o -o blinky.elf -mmcu=atmega8 + +erzeugt die ausführbare Datei (*.elf), die noch zusätzliche Informationen wie Debug-Infos etc. beinhaltet mit dem Namen blinky.elf: + +blinky.c blinky.elf blinky.o + +Umwandeln nach hex +Code und Daten + +Viele Progger wollen die zu ladende Datei im Intel-hex-Format (*.hex bzw. *.ihex). Dazu gibt man an + +> avr-objcopy -j .text -j .data -O ihex blinky.elf blinky.hex + +Damit enthält die hex-Datei die Sections .text (Programm) und .data (Daten). Das Verzeichnis beinhaltet jetzt + +blinky.c blinky.elf blinky.hex blinky.o + +EEPROM + +Ein hex-File, das den Inhalt des EEPROMs wiederspiegelt, erhält man mit + +> avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex blinky.elf blinky_eeprom.hex + +Für das Beispiel ist das EEPROM-File blinky_eeprom.hex leer, da wir keine Daten ins EEPROM gelegt haben. +Listfile erstellen + +Falls man ein Listfile haben möchte, dann geht das mit + +> avr-objdump -h -S -j .text -j .data blinky.elf > blinky.lst + +Das Listfile ist eine Textdatei, die alle Assembler-Befehle auflistet, wie sie letztendlich auf den Controller geladen werden. + +avr-objdump gibt seine Ausgabe auf das Terminal aus. Diese Ausgabe wird mit '>' in die Datei blinky.lst umgeleitet. Hier ein Ausschnitt aus dem Listfile: + +00000072 : + +// ////////////////////////////////////////////////////////////////////// +// Wartet etwa t*10 ms. +// timer_10ms wird alle 10ms in der Timer1-ISR erniedrigt. +// Weil es bis zum nächsten IRQ nicht länger als 10ms dauert, +// wartet diese Funktion zwischen (t-1)*10 ms und t*10 ms. +void wait_10ms (const uint8_t t) +{ + timer_10ms = t; + 72: 80 93 61 00 sts 0x0061, r24 + while (timer_10ms); + 76: 80 91 61 00 lds r24, 0x0061 + 7a: 88 23 and r24, r24 + 7c: e1 f7 brne .-8 ; 0x76 + 7e: 08 95 ret + +Links stehen die Adressen, dann die Maschinencodes der Befehle, danach die Maschinencodes in Assembler-Darstellung. Ganz rechts nach dem Kommentarzeichen ';' stehen die Dezimalcodes von Konstanten oder die Zieladressen von Sprüngen, wie bei dem brne-Befehl an Adresse 7c, der gegebenenfalls 8 Bytes zurückspringt und dann an Adresse 76 landet. +[bearbeiten] +Mapfile erstellen + +Ein Mapfile gibt Auskunft darüber, an welcher Adresse Code und Objekte landen. Erstellt wird das Mapfile während des Linkens, indem avr-gcc ein Option an den Linker weiterreicht, die diesem zum Erstellen eines solchen Files veranlasst: + +> avr-gcc blinky.o -o blinky.elf ... -Wl,-Map,blinky.map + +Dadurch entsteht das Mapfile blinky.map. +[bearbeiten] +Die Größe ermitteln + +Die Größe der erhaltenen Objekte/Files können mit avr-size ausgegeben werden. + +> avr-size -x blinky.o + +druckt aus: + + text data bss dec hex filename + 0x7c 0x0 0x2 126 7e blinky.o + +Das sind die Größen der einzelnen Sections. Für das Flash relevant ist die Größe von .text (Code) + .data (initialisierte Daten), für das SRAM relevent ist .data (initialisierte Daten) + .bss (null-initialisierte Daten). + +Im Flash werden also 126+0=126 Bytes belegt, und im SRAM 0+2=2 Bytes. + +Ab binutils 2.16 gibt es für avr-size die Option -C, mit der man eine Zusammenfassung des ganzen Programms ausgeben kann: + +> avr-size -C --mcu=atmega8 blinky.elf + +druckt aus: + +AVR Memory Usage +---------------- +Device: atmega8 + +Program: 216 bytes (2.6% Full) +(.text + .data + .bootloader) + +Data: 2 bytes (0.2% Full) +(.data + .bss + .noinit) + +Die Gesamtgrösse ergibt sich erst aus dem elf-File, denn auch die Vektortabelle und der Startup-Code belegen Platz. Hier eine Auflistung der beteiligten Sections: + +> avr-size -x -A blinky.elf + +druckt aus: + +blinky.elf : +section size addr +.text 0xd8 0x0 +.data 0x0 0x800060 +.bss 0x2 0x800060 +.noinit 0x0 0x800062 +.eeprom 0x0 0x810000 +.stab 0x36c 0x0 +.stabstr 0x84 0x0 +.debug_aranges 0x14 0x0 +.debug_pubnames 0x48 0x0 +.debug_info 0xfc 0x0 +.debug_abbrev 0xa2 0x0 +.debug_line 0x101 0x0 +.debug_str 0xa6 0x0 +Total 0x86b + +Im Flash werden somit 0xd8+0=216 Bytes belegt, also 90 Bytes mehr als das Object benötigt; davon entfallen z.B. schon 38 Bytes auf die Vektortabelle des ATmega8, die 2*19 Bytes groß ist. + +Die Größen einzelner Funktionen/Variablen lassen sich anzeigen mit + +> avr-nm --size-sort -S blinky.elf + +was nach Größe sortiert ausdruckt: + +00800060 00000001 b interrupt_num_10ms.0 +00800061 00000001 b timer_10ms +00000072 0000000e T wait_10ms +0000005c 00000016 T timer1_init +000000bc 0000001c T main +00000080 0000003c T __vector_6 + +[bearbeiten] +HEX-Dateien zu diesem C-Code + +Zu dieser C-Datei gibt es HEX-Dateien für einige AVRs. Siehe dazu HEX Beispiel-Dateien für AVR. +[bearbeiten] +Spin-off + +Eine LED blinken zu lassen könnte auch wesentlich einfacher implementert werden, also z.B. ohne Funktionsaufrufe oder Interrupt-Programmierung. + +Neben der eigentlichen Aufgabe "LED blinken lassen" kann man an dem Code aber noch andere Dinge lernen: + + * Programmierung eines Interrupts + * Initialisierung von Timer1 als Zähler mit "Clear Timer on Compare Match" + * Bedingte Codeübersetzung/Controllerunterscheidung mit #ifdef (in timer1_init) + * Abchecken der Gültigkeit von Defines durch den Präprozessor +###flashen +avrdude -p m16 -P /dev/ttyUSB0 -c ponyser -U flash:w:test1.hex +###testen der Verbindung zum Controller +avrdude -p m16 -F -c ponyser -P /dev/ttyS0 -v -U lfuse:r:-:i +#Beschreibung +-p gibt den Mikroprozessortyp an +-c Gibt den Programmieradapter an -> in diesem Fall SerCon-Kompatibel an der 6-Pol ISP Buchse +-P gibt den Anschluss am PC an -> in diesem Falle COM1 unter Linux +-F veranlasst avrdude die Chipsignatur zu ignorieren, dass ist beim 644P nötig, + denn avrdude kennt nur den 644. Beim P stimmt die Signatur nicht mit der im + dude hinterlegten überein und er verweigert sonst das Beschreiben des Chips +-U macht eine Speicheroperation - Speichertyp:Lesen/Schreiben:DatenOrt(:Datentyp) +-v Ausgabe mehr Debuginformationen +###setzen von FUSE Bits +avrdude -p m644 -F -c ponyser -P /dev/ttyS0 -v -U lfuse:w:0xFF:m -U hfuse:w:0xDC:m -U efuse:w:0xFD:m +###löschen des gesamten Chips +avrdude -p m644 -F -c ponyser -P /dev/ttyS0 -v -e +### +###c programm für avr übersetzen +Um eine C-Datei foo.c mir avr-gcc optimiert zu einem lauffähigen elf-Programm foo.elf für einen ATmega32 zu compileren, würde man angeben +> avr-gcc -O2 -mmcu=atmega32 foo.c -o foo.elf +Hat man seine Quellen auf zwei oder mehre Dateien verteilt, geht es analog: +> avr-gcc -O2 -mmcu=atmega32 foo.c foo2.c -o foo.elf +Will man nur eine Objekt-Datei erstellen (nur compilieren, nicht linken), dann geht das wie folgt. Das kann günstig sein bei grösseren Projekten, wenn man das Projekt neu erzeugen will, aber nur in einer Quelldatei was geändert hat. Oder wenn das Objekt in einer Bibliothek landen soll. +> avr-gcc -O2 -c -mmcu=atmega32 foo.c -o foo.o +Die ausführbare Gesamtdatei foo_all.elf erhält man dann, indem alle Objekte zusammenlinkt: +> avr-gcc -mmcu=atmega32 foo.o foo2.o foo3.o -o foo_all.elf +Um die ausführbare Datei in das oft verwendete Intex-HEX-Format umzuwandeln (einmal fürs Programm, einmal für ein Abbild des EEPROMs) gibt man an: +>vr-objcopy -O ihex -j .text -j .data foo_all.elf foo_all.hex avr-objcopy -O ihex -j .text -j .data foo_all.elf foo_all.hex +> avr-objcopy -O ihex -j .eeprom --change-section-lma .eeprom=0 foo_all.elf foo_all_eeprom.hex + diff --git a/avr/blink.bas b/avr/blink.bas new file mode 100644 index 0000000..9e92e3f --- /dev/null +++ b/avr/blink.bas @@ -0,0 +1,29 @@ +'################################################### +'step2.bas.BAS +'für +'RoboterNetz.de AVR Tutorial in RN-Wissen +' +'Autor: Frank Brall +'Weitere Beispiele und Beschreibung der Hardware +'unter +' http://www.Roboternetz.de oder +' http://www.Roboternetz.de/wissen +'####################################################### + +$regfile = "m32def.dat" +$framesize = 32 +$swstack = 32 +$hwstack = 32 +$crystal = 1000000 + +Config Portc.0 = Output 'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C) + +Do + Portc.0 = 1 'Pin wird auf High, also 5V geschaltet + Waitms 100 + Portc.0 = 0 'Pin wird auf Low, also 0V geschaltet + Waitms 100 +Loop + +End + diff --git a/avr/blink.c b/avr/blink.c new file mode 100644 index 0000000..72ef7f7 --- /dev/null +++ b/avr/blink.c @@ -0,0 +1,27 @@ +// Testprogramm: Blinken auf Pin PC0 +// +#ifndef MCU // Welcher AVR genutzt wird, wird i.A. im Makefile definiert +#define MCU atmega32 +#endif + +#ifndef F_CPU // kann auch im Makefile definiert sein +#define F_CPU 1000000UL // Takt als LONG definieren, da zu groß für Integer +#endif + +#include // Namen der IO Register +#include // Funktionen zum warten +// Achtung, damit delay richtig funktioniert muß mit Optimierung compiliert werden + +int main(void) +{ + DDRC = _BV(0); // Nur PC0 als output, _BV(0) = (1<<0) = 1 + PORTC = 254; // Pullups auf allen anderen Pins + + while (1) + { + PORTC &= 255-_BV(0); // 0 auf Bit 0 Ausgeben, Rest so lassen + _delay_ms(100); // 100 ms Warten + PORTC |= _BV(0); // 1 auf Bit 0 Ausgeben, Rest so lassen + _delay_ms(100); + } +} diff --git a/avr/blinki.c b/avr/blinki.c new file mode 100644 index 0000000..d4342a1 --- /dev/null +++ b/avr/blinki.c @@ -0,0 +1,172 @@ +###Blinki Beispielcode +#include +#include + +// Für alte avr-gcc Versionen +#ifndef SIGNAL +#include +#endif // SIGNAL + +// Geblinkt wird PortB.1 (push-pull) +// Eine LED in Reihe mit einem Vorwiderstand zwischen +// PortB.1 und GND anschliessen. +#define PAD_LED 1 +#define PORT_LED PORTB +#define DDR_LED DDRB + +// Der MCU-Takt. Wird gebraucht, um Timer1 mit den richtigen +// Werten zu initialisieren. Voreinstellung ist 1MHz. +// (Werkseinstellung für AVRs mit internem Oszillator). +// Das Define wird nur gemacht, wenn F_CPU noch nicht definiert wurde. +// F_CPU kann man so auch per Kommandozeile definieren, z.B. für 8MHz: +// avr-gcc ... -DF_CPU=8000000 +// +// ! Der Wert von F_CPU hat rein informativen Character für +// ! die korrekte Codeerzeugung im Programm! +// ! Um die Taktrate zu ändern müssen die Fuses des Controllers +// ! und/oder Quarz/Resonator/RC-Glied/Oszillator +// ! angepasst werden! +#ifndef F_CPU +#define F_CPU 1000000 +#endif + +// So viele IRQs werden jede Sekunde ausgelöst. +// Für optimale Genauigkeit muss +// IRQS_PER_SECOND ein Teiler von F_CPU sein +// und IRQS_PER_SECOND ein Vielfaches von 100. +// Ausserdem muss gelten F_CPU / IRQS_PER_SECOND <= 65536 +#define IRQS_PER_SECOND 2000 /* 500 µs */ + +// Anzahl IRQs pro 10 Millisekunden +#define IRQS_PER_10MS (IRQS_PER_SECOND / 100) + +// Gültigkeitsprüfung. +// Bei ungeeigneten Werten gibt es einen Compilerfehler +#if (F_CPU/IRQS_PER_SECOND > 65536) || (IRQS_PER_10MS < 1) || (IRQS_PER_10MS > 255) +# error Diese Werte fuer F_CPU und IRQS_PER_SECOND +# error sind ausserhalb des gueltigen Bereichs! +#endif + +// Compiler-Warnung falls die Genauigkeit nicht optimal ist. +// Wenn das nervt für deine Werte, einfach löschen :-) +#if (F_CPU % IRQS_PER_SECOND != 0) || (IRQS_PER_SECOND % 100 != 0) +# warning Das Programm arbeitet nicht mit optimaler Genauigkeit. +#endif + +// Prototypen +void wait_10ms (const uint8_t); +void timer1_init(); + +// Zähler-Variable. Wird in der ISR erniedrigt und in wait_10ms benutzt. +static volatile uint8_t timer_10ms; + +// ////////////////////////////////////////////////////////////////////// +// Implementierungen der Funktionen +// ////////////////////////////////////////////////////////////////////// + +#if !defined (TCNT1H) +#error Dieser Controller hat keinen 16-Bit Timer1! +#endif // TCNT1H + +// ////////////////////////////////////////////////////////////////////// +// Timer1 so initialisieren, daß er IRQS_PER_SECOND +// IRQs pro Sekunde erzeugt. +void timer1_init() +{ + // Timer1: keine PWM + TCCR1A = 0; + + // Timer1 ist Zähler: Clear Timer on Compare Match (CTC, Mode #4) + // Timer1 läuft mit vollem MCU-Takt: Prescale = 1 +#if defined (CTC1) && !defined (WGM12) + TCCR1B = (1 << CTC1) | (1 << CS10); +#elif !defined (CTC1) && defined (WGM12) + TCCR1B = (1 << WGM12) | (1 << CS10); +#else +#error Keine Ahnung, wie Timer1 fuer diesen AVR zu initialisieren ist! +#endif + + // OutputCompare für gewünschte Timer1 Frequenz + // TCNT1 zählt immer 0...OCR1A, 0...OCR1A, ... + // Beim überlauf OCR1A -> OCR1A+1 wird TCNT1=0 gesetzt und im nächsten + // MCU-Takt eine IRQ erzeugt. + OCR1A = (unsigned short) ((unsigned long) F_CPU / IRQS_PER_SECOND-1); + + // OutputCompareA-Interrupt für Timer1 aktivieren +#if defined (TIMSK1) + TIMSK1 |= (1 << OCIE1A); +#elif defined (TIMSK) + TIMSK |= (1 << OCIE1A); +#else +#error Keine Ahnung, wie IRQs fuer diesen AVR zu initialisieren sind! +#endif +} + +// ////////////////////////////////////////////////////////////////////// +// Wartet etwa t*10 ms. +// timer_10ms wird alle 10ms in der Timer1-ISR erniedrigt. +// Weil es bis zum nächsten IRQ nicht länger als 10ms dauert, +// wartet diese Funktion zwischen (t-1)*10 ms und t*10 ms. +void wait_10ms (const uint8_t t) +{ + timer_10ms = t; + while (timer_10ms); +} + +// ////////////////////////////////////////////////////////////////////// +// Die Interrupt Service Routine (ISR). +// In interrupt_num_10ms werden die IRQs gezählt. +// Sind IRQS_PER_10MS Interrups geschehen, +// dann sind 10 ms vergangen. +// timer_10ms wird alle 10 ms um 1 vermindert und bleibt bei 0 stehen. +SIGNAL (SIG_OUTPUT_COMPARE1A) +{ + static uint8_t interrupt_num_10ms; + + // interrupt_num_10ms erhöhen und mit Maximalwert vergleichen + if (++interrupt_num_10ms == IRQS_PER_10MS) + { + // 10 Millisekunden sind vorbei + // interrupt_num_10ms zurücksetzen + interrupt_num_10ms = 0; + + // Alle 10ms wird timer_10ms erniedrigt, falls es nicht schon 0 ist. + // Wird verwendet in wait_10ms + if (timer_10ms != 0) + timer_10ms--; + } +} + +// ////////////////////////////////////////////////////////////////////// +// Das Hauptprogramm: Startpunkt +int main() +{ + // LED-Port auf OUT + DDR_LED |= (1 << PAD_LED); + + // Timer1 initialisieren + timer1_init(); + + // Interrupts aktivieren + sei(); + + // Endlosschleife + // Die LED ist jeweils 1 Sekunde an und 1 Sekunde aus, + // blinkt also mit einer Frequenz von 0.5 Hz + while (1) + { + // LED an + PORT_LED |= (1 << PAD_LED); + + // 1 Sekunde warten + wait_10ms (100); + + // LED aus + PORT_LED &= ~(1 << PAD_LED); + + // 1 Sekunde warten + wait_10ms (100); + } + + // main braucht keine return-Anweisung, weil wir nie hier hin kommen +} diff --git a/avr/blinky.c b/avr/blinky.c new file mode 100644 index 0000000..f913020 --- /dev/null +++ b/avr/blinky.c @@ -0,0 +1,172 @@ +#include +#include + +// Für alte avr-gcc Versionen +#ifndef SIGNAL +#include +#endif // SIGNAL + +// Geblinkt wird PortB.1 (push-pull) +// Eine LED in Reihe mit einem Vorwiderstand zwischen +// PortB.1 und GND anschliessen. +#define PAD_LED 1 +#define PORT_LED PORTB +#define DDR_LED DDRB + +// Der MCU-Takt. Wird gebraucht, um Timer1 mit den richtigen +// Werten zu initialisieren. Voreinstellung ist 1MHz. +// (Werkseinstellung für AVRs mit internem Oszillator). +// Das Define wird nur gemacht, wenn F_CPU noch nicht definiert wurde. +// F_CPU kann man so auch per Kommandozeile definieren, z.B. für 8MHz: +// avr-gcc ... -DF_CPU=8000000 +// +// ! Der Wert von F_CPU hat rein informativen Character für +// ! die korrekte Codeerzeugung im Programm! +// ! Um die Taktrate zu ändern müssen die Fuses des Controllers +// ! und/oder Quarz/Resonator/RC-Glied/Oszillator +// ! angepasst werden! +#ifndef F_CPU +#define F_CPU 1000000 +#endif + +// So viele IRQs werden jede Sekunde ausgelöst. +// Für optimale Genauigkeit muss +// IRQS_PER_SECOND ein Teiler von F_CPU sein +// und IRQS_PER_SECOND ein Vielfaches von 100. +// Ausserdem muss gelten F_CPU / IRQS_PER_SECOND <= 65536 +#define IRQS_PER_SECOND 2000 /* 500 µs */ + +// Anzahl IRQs pro 10 Millisekunden +#define IRQS_PER_10MS (IRQS_PER_SECOND / 100) + +// Gültigkeitsprüfung. +// Bei ungeeigneten Werten gibt es einen Compilerfehler +#if (F_CPU/IRQS_PER_SECOND > 65536) || (IRQS_PER_10MS < 1) || (IRQS_PER_10MS > 255) +# error Diese Werte fuer F_CPU und IRQS_PER_SECOND +# error sind ausserhalb des gueltigen Bereichs! +#endif + +// Compiler-Warnung falls die Genauigkeit nicht optimal ist. +// Wenn das nervt für deine Werte, einfach löschen :-) +#if (F_CPU % IRQS_PER_SECOND != 0) || (IRQS_PER_SECOND % 100 != 0) +# warning Das Programm arbeitet nicht mit optimaler Genauigkeit. +#endif + +// Prototypen +void wait_10ms (const uint8_t); +void timer1_init(); + +// Zähler-Variable. Wird in der ISR erniedrigt und in wait_10ms benutzt. +static volatile uint8_t timer_10ms; + +// ////////////////////////////////////////////////////////////////////// +// Implementierungen der Funktionen +// ////////////////////////////////////////////////////////////////////// + +#if !defined (TCNT1H) +#error Dieser Controller hat keinen 16-Bit Timer1! +#endif // TCNT1H + +// ////////////////////////////////////////////////////////////////////// +// Timer1 so initialisieren, daß er IRQS_PER_SECOND +// IRQs pro Sekunde erzeugt. +void timer1_init() +{ + // Timer1: keine PWM + TCCR1A = 0; + + // Timer1 ist Zähler: Clear Timer on Compare Match (CTC, Mode #4) + // Timer1 läuft mit vollem MCU-Takt: Prescale = 1 +#if defined (CTC1) && !defined (WGM12) + TCCR1B = (1 << CTC1) | (1 << CS10); +#elif !defined (CTC1) && defined (WGM12) + TCCR1B = (1 << WGM12) | (1 << CS10); +#else +#error Keine Ahnung, wie Timer1 fuer diesen AVR zu initialisieren ist! +#endif + + // OutputCompare für gewünschte Timer1 Frequenz + // TCNT1 zählt immer 0...OCR1A, 0...OCR1A, ... + // Beim überlauf OCR1A -> OCR1A+1 wird TCNT1=0 gesetzt und im nächsten + // MCU-Takt eine IRQ erzeugt. + OCR1A = (unsigned short) ((unsigned long) F_CPU / IRQS_PER_SECOND-1); + + // OutputCompareA-Interrupt für Timer1 aktivieren +#if defined (TIMSK1) + TIMSK1 |= (1 << OCIE1A); +#elif defined (TIMSK) + TIMSK |= (1 << OCIE1A); +#else +#error Keine Ahnung, wie IRQs fuer diesen AVR zu initialisieren sind! +#endif +} + +// ////////////////////////////////////////////////////////////////////// +// Wartet etwa t*10 ms. +// timer_10ms wird alle 10ms in der Timer1-ISR erniedrigt. +// Weil es bis zum nächsten IRQ nicht länger als 10ms dauert, +// wartet diese Funktion zwischen (t-1)*10 ms und t*10 ms. +void wait_10ms (const uint8_t t) +{ + timer_10ms = t; + while (timer_10ms); +} + +// ////////////////////////////////////////////////////////////////////// +// Die Interrupt Service Routine (ISR). +// In interrupt_num_10ms werden die IRQs gezählt. +// Sind IRQS_PER_10MS Interrups geschehen, +// dann sind 10 ms vergangen. +// timer_10ms wird alle 10 ms um 1 vermindert und bleibt bei 0 stehen. +SIGNAL (SIG_OUTPUT_COMPARE1A) +{ + static uint8_t interrupt_num_10ms; + + // interrupt_num_10ms erhöhen und mit Maximalwert vergleichen + if (++interrupt_num_10ms == IRQS_PER_10MS) + { + // 10 Millisekunden sind vorbei + // interrupt_num_10ms zurücksetzen + interrupt_num_10ms = 0; + + // Alle 10ms wird timer_10ms erniedrigt, falls es nicht schon 0 ist. + // Wird verwendet in wait_10ms + if (timer_10ms != 0) + timer_10ms--; + } +} + +// ////////////////////////////////////////////////////////////////////// +// Das Hauptprogramm: Startpunkt +int main() +{ + // LED-Port auf OUT + DDR_LED |= (1 << PAD_LED); + + // Timer1 initialisieren + timer1_init(); + + // Interrupts aktivieren + sei(); + + // Endlosschleife + // Die LED ist jeweils 1 Sekunde an und 1 Sekunde aus, + // blinkt also mit einer Frequenz von 0.5 Hz + while (1) + { + // LED an + PORT_LED |= (1 << PAD_LED); + + // 1 Sekunde warten + wait_10ms (100); + + // LED aus + PORT_LED &= ~(1 << PAD_LED); + + // 1 Sekunde warten + wait_10ms (100); + } + + // main braucht keine return-Anweisung, weil wir nie hier hin kommen +} + diff --git a/avr/send_rs232.bas b/avr/send_rs232.bas new file mode 100644 index 0000000..51fa48b --- /dev/null +++ b/avr/send_rs232.bas @@ -0,0 +1,38 @@ +'################################################### +'step5.bas.BAS +'für +'RoboterNetz.de AVR Tutorial in RN-Wissen +' +'Autor: Frank Brall +'Weitere Beispiele und Beschreibung der Hardware +'unter +' http://www.Roboternetz.de oder +' http://www.Roboternetz.de/wissen +'####################################################### + + +$regfile = "m32def.dat" +$framesize = 32 +$swstack = 32 +$hwstack = 32 +$crystal = 16000000 +$baud = 9600 + +Config Portc.0 = Output 'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C) + +Config Pina.7 = Input 'Ein Pin (PA0) wird als Eingang definiert +Porta.7 = 1 'Interner Pullup Widerstand ein + + +Do + If Pina.7 = 1 Then + Portc.0 = 1 'Pin wird auf High, also 5V geschaltet + Print "Schalter nicht gedrückt" + Else + Portc.0 = 0 'Pin wird auf Low, also 0V geschaltet + Print "Schalter gedrückt" + End If + Wait 1 +Loop + +End diff --git a/avr/taster_entprellen.c b/avr/taster_entprellen.c new file mode 100644 index 0000000..77dd813 --- /dev/null +++ b/avr/taster_entprellen.c @@ -0,0 +1,146 @@ +/*http://www.mikrocontroller.net/articles/Entprellung */ +/************************************************************************/ +/* */ +/* Debouncing 8 Keys */ +/* Sampling 4 Times */ +/* With Repeat Function */ +/* */ +/* Author: Peter Dannegger */ +/* danni@specs.de */ +/* */ +/************************************************************************/ + +#include +#include +#include + +#ifndef F_CPU +#define F_CPU 1000000 // processor clock frequency +#warning kein F_CPU definiert +#endif + +#define KEY_DDR DDRB +#define KEY_PORT PORTB +#define KEY_PIN PINB +#define KEY0 0 +#define KEY1 1 +#define KEY2 2 +#define ALL_KEYS (1<1: key press detect + + if( (key_state & REPEAT_MASK) == 0 ) // check repeat function + rpt = REPEAT_START; // start delay + if( --rpt == 0 ){ + rpt = REPEAT_NEXT; // repeat delay + key_rpt |= key_state & REPEAT_MASK; + } +} + +/////////////////////////////////////////////////////////////////// +// +// check if a key has been pressed. Each pressed key is reported +// only once +// +uint8_t get_key_press( uint8_t key_mask ) +{ + cli(); // read and clear atomic ! + key_mask &= key_press; // read key(s) + key_press ^= key_mask; // clear key(s) + sei(); + return key_mask; +} + +/////////////////////////////////////////////////////////////////// +// +// check if a key has been pressed long enough such that the +// key repeat functionality kicks in. After a small setup delay +// the key is reported beeing pressed in subsequent calls +// to this function. This simulates the user repeatedly +// pressing and releasing the key. +// +uint8_t get_key_rpt( uint8_t key_mask ) +{ + cli(); // read and clear atomic ! + key_mask &= key_rpt; // read key(s) + key_rpt ^= key_mask; // clear key(s) + sei(); + return key_mask; +} + +/////////////////////////////////////////////////////////////////// +// +uint8_t get_key_short( uint8_t key_mask ) +{ + cli(); // read key state and key press atomic ! + return get_key_press( ~key_state & key_mask ); +} + +/////////////////////////////////////////////////////////////////// +// +uint8_t get_key_long( uint8_t key_mask ) +{ + return get_key_press( get_key_rpt( key_mask )); +} + +int main( void ) +{ + KEY_DDR &= ~ALL_KEYS; // konfigure key port for input + KEY_PORT |= ALL_KEYS; // and turn on pull up resistors + + TCCR0 = (1<file | separated by the value of the OFS variable. The | +| | output record is terminated with the value of | +| | the ORS variable. | +'---------------------+-------------------------------------------------' +| printf fmt, | Format and print. | +| expr-list | | +'---------------------+-------------------------------------------------' +| printf fmt, | Format and print on file. | +| expr-list >file | | +'---------------------+-------------------------------------------------' +| system(cmd-line) | Execute the command cmd-line, and return the | +| | exit status. | +'---------------------+-------------------------------------------------' +| fflush([file]) | Flush any buffers associated with the open | +| | output file or pipe file. If file is missing, | +| | then stdout is flushed. If file is the null | +| | string, then all open output files and pipes | +| | have their buffers flushed. | +'---------------------+-------------------------------------------------' +| print ... >> file | Appends output to the file. | +'---------------------+-------------------------------------------------' +| print ... | command | Writes on a pipe. | +'---------------------+-------------------------------------------------' +| print ... |& | Sends data to a co-process. | +| command | | +'---------------------'-------------------------------------------------' + + + =========================== Numeric Functions ========================= + +.---------------------.-------------------------------------------------. +| | | +| Function | Description | +| | | +'---------------------+-------------------------------------------------' +| atan2(y, x) | Returns the arctangent of y/x in radians. | +'---------------------+-------------------------------------------------' +| cos(expr) | Returns the cosine of expr, which is in radians.| +'---------------------+-------------------------------------------------' +| exp(expr) | The exponential function. | +'---------------------+-------------------------------------------------' +| int(expr) | Truncates to integer. | +'---------------------+-------------------------------------------------' +| log(expr) | The natural logarithm function. | +'---------------------+-------------------------------------------------' +| rand() | Returns a random number N, between 0 and 1, | +| | such that 0 <= N < 1. | +'---------------------+-------------------------------------------------' +| sin(expr) | Returns the sine of expr, which is in radians. | +'---------------------+-------------------------------------------------' +| sqrt(expr) | The square root function. | +'---------------------+-------------------------------------------------' +| srand([expr]) | Uses expr as a new seed for the random number | +| | generator. If no expr is provided, the time of | +| | day is used. The return value is the previous | +| | seed for the random number generator. | +'---------------------'-------------------------------------------------' + + + ====================== Bit Manipulation Functions ===================== + +.---------------------.-------------------------------------------------. +| | | +| Function | Description | +| | | +'---------------------+-------------------------------------------------' +| and(v1, v2) | Return the bitwise AND of the values provided | +| | by v1 and v2. | +'---------------------+-------------------------------------------------' +| compl(val) | Return the bitwise complement of val. | +'---------------------+-------------------------------------------------' +| lshift(val, count) | Return the value of val, shifted left by | +| | count bits. | +'---------------------+-------------------------------------------------' +| or(v1, v2) | Return the bitwise OR of the values provided by | +| | v1 and v2. | +'---------------------+-------------------------------------------------' +| rshift(val, count) | Return the value of val, shifted right by | +| | count bits. | +'---------------------+-------------------------------------------------' +| xor(v1, v2) | Return the bitwise XOR of the values provided | +| | by v1 and v2. | +'---------------------'-------------------------------------------------' + + + =========================== String Functions ========================== + +.---------------------.-------------------------------------------------. +| | | +| Function | Description | +| | | +'---------------------+-------------------------------------------------' +| asort(s [, d]) | Returns the number of elements in the source | +| | array s. The contents of s are sorted using | +| | gawk's normal rules for comparing values, and | +| | the indexes of the sorted values of s are | +| | replaced with sequential integers starting with | +| | 1. If the optional destination array d is | +| | specified, then s is first duplicated into d, | +| | and then d is sorted, leaving the indexes of | +| | the source array s unchanged. | +'---------------------+-------------------------------------------------' +| asorti(s [, d]) | Returns the number of elements in the source | +| | array s. The behavior is the same as that of | +| | asort(), except that the array indices are | +| | used for sorting, not the array values. When | +| | done, the array is indexed numerically, and the | +| | values are those of the original indices. The | +| | original values are lost; thus provide a second | +| | array if you wish to preserve the original. | +'---------------------+-------------------------------------------------' +| gensub(r, s, | Search the target string t for matches of the | +| h [, t]) | regular expression r. If h is a string | +| | beginning with g or G, then replace all matches | +| | of r with s. Otherwise, h is a number | +| | indicating which match of r to replace. If t is | +| | not supplied, $0 is used instead. Within the | +| | replacement text s, the sequence \n, where n is | +| | a digit from 1 to 9, may be used to indicate | +| | just the text that matched the n'th | +| | parenthesized subexpression. The sequence \0 | +| | represents the entire matched text, as does the | +| | character &. Unlike sub() and gsub(), the | +| | modified string is returned as the result of | +| | the function, and the original target string | +| | is not changed. | +'---------------------+-------------------------------------------------' +| gsub(r, s [, t]) | For each substring matching the regular | +| | expression r in the string t, substitute the | +| | string s, and return the number of | +| | substitutions. If t is not supplied, use $0. | +| | An & in the replacement text is replaced with | +| | the text that was actually matched. Use \& to | +| | get a literal &. (This must be | +| | typed as "\\&") | +'---------------------+-------------------------------------------------' +| index(s, t) | Returns the index of the string t in the | +| | string s, or 0 if t is not present. (This | +| | implies that characterindices start at one.) | +'---------------------+-------------------------------------------------' +| length([s]) | Returns the length of the string s, or the | +| | length of $0 if s is not supplied. | +'---------------------+-------------------------------------------------' +| match(s, r [, a]) | Returns the position in s where the regular | +| | expression r occurs, or 0 if r is not present, | +| | and sets the values of RSTART and RLENGTH. | +| | Note that the argument order is the same as for | +| | the ~ operator: str ~ re. If array a is | +| | provided, a is cleared and then elements 1 | +| | through n are filled with the portions of s | +| | that match the corresponding parenthesized | +| | subexpression in r. The 0'th element of a | +| | contains the portion of s matched by the entire | +| | regular expression r. Subscripts a[n, "start"], | +| | and a[n, "length"] provide the starting index | +| | in the string and length respectively, of each | +| | matching substring. | +'---------------------+-------------------------------------------------' +| split(s, a [, r]) | Splits the string s into the array a on the | +| | regular expression r, and returns the number of | +| | fields. If r is omitted, FS is used instead. | +| | The array a is cleared first. Splitting behaves | +| | identically to field splitting. | +'---------------------+-------------------------------------------------' +| sprintf(fmt, | Prints expr-list according to fmt, and returns | +| expr-list) | the resulting string. | +'---------------------+-------------------------------------------------' +| strtonum(str) | Examines str, and returns its numeric value. | +| | If str begins with a leading 0, strtonum() | +| | assumes that str is an octal number. If str | +| | begins with a leading 0x or 0X, strtonum() | +| | assumes that str is a hexadecimal number. | +'---------------------+-------------------------------------------------' +| sub(r, s [, t]) | Just like gsub(), but only the first matching | +| | substring is replaced. | +'---------------------+-------------------------------------------------' +| substr(s, i [, n]) | Returns the at most n-character substring of s | +| | starting at i. If n is omitted, the rest of s | +| | is used. | +'---------------------+-------------------------------------------------' +| tolower(str) | Returns a copy of the string str, with all the | +| | upper-case characters in str translated to | +| | their corresponding lower-case counterparts. | +| | Non-alphabetic characters are left unchanged. | +'---------------------+-------------------------------------------------' +| toupper(str) | Returns a copy of the string str, with all the | +| | lower-case characters in str translated to | +| | their corresponding upper-case counterparts. | +| | Non-alphabetic characters are left unchanged. | +'---------------------'-------------------------------------------------' + + + ============================ Time Functions =========================== + +.---------------------.-------------------------------------------------. +| | | +| Function | Description | +| | | +'---------------------+-------------------------------------------------' +| mktime(datespec) | Turns datespec into a time stamp of the same | +| | form as returned by systime(). The datespec is | +| | a string of the form YYYY MM DD HH MM SS[ DST]. | +| | The contents of the string are six or seven | +| | numbers representing respectively the full year | +| | including century, the month from 1 to 12, the | +| | day of the month from 1 to 31, the hour of the | +| | day from 0 to 23, the minute from 0 to 59, and | +| | the second from 0 to 60, and an optional | +| | daylight saving flag. The values of these | +| | numbers need not be within the ranges | +| | specified; for example, an hour of -1 means 1 | +| | hour before midnight. The origin-zero Gregorian | +| | calendar is assumed, with year 0 preceding year | +| | 1 and year -1 preceding year 0. The time is | +| | assumed to be in the local timezone. If the | +| | daylight saving flag is positive, the time is | +| | assumed to be daylight saving time; if zero, | +| | the time is assumed to be standard time; and if | +| | negative (the default), mktime() attempts to | +| | determine whether daylight saving time is in | +| | effect for the specified time. If datespec does | +| | not contain enough elements or if the resulting | +| | time is out of range, mktime() returns -1. | +'---------------------+-------------------------------------------------' +| strftime([format | Formats timestamp according to the | +| [, timestamp]]) | specification in format. The timestamp should | +| | be of the same form as returned by systime(). | +| | If timestamp is missing, the current time of | +| | day is used.If format is missing, a default | +| | format equivalent to the output of date(1) is | +| | used. See the specification for the strftime() | +| | function in ANSI C for the format conversions | +| | that are guaranteed to be available. A | +| | public-domain version of strftime(3) and a man | +| | page for it come with gawk; if that version was | +| | used to build gawk, then all of the conversions | +| | described in that man page are available to | +| | gawk. | +'---------------------+-------------------------------------------------' +| systime() | Returns the current time of day as the number | +| | of seconds since the Epoch (1970-01-01 00:00:00 | +| | UTC on POSIX systems). | +'---------------------'-------------------------------------------------' + + + =============== Internationalization (I18N) Functions ================ + +.---------------------.-------------------------------------------------. +| | | +| Function | | +| | | +| Description | | +| | | +'---------------------+-------------------------------------------------' +| bindtextdomain(directory [, domain]) | +| | +| Specifies the directory where gawk looks for the .mo files. It | +| returns the directory where domain is ``bound.'' The default domain | +| is the value of TEXTDOMAIN. If directory is the null string (""), | +| then bindtextdomain() returns the current binding for the given domain| +'---------------------+-------------------------------------------------' +| dcgettext(string [, domain [, category]]) | +| | +| Returns the translation of string in text domain domain for locale | +| category category. The default value for domain is the current value | +| of TEXTDOMAIN. The default value for category is "LC_MESSAGES". If | +| you supply a value for category, it must be a string equal to one of | +| the known locale categories. You must also supply a text domain. Use | +| TEXTDOMAIN if you want to use the current domain. | +'---------------------+-------------------------------------------------' +| dcngettext(string1 , string2 , number [, domain [, category]]) | +| | +| Returns the plural form used for number of the translation of string1 | +| and string2 in text domain domain for locale category category. The | +| default value for domain is the current value of TEXTDOMAIN. The | +| default value for category is "LC_MESSAGES". If you supply a value | +| for category, it must be a string equal to one of the known locale | +| categories. You must also supply a text domain. Use TEXTDOMAIN if | +| you want to use the current domain. | +'---------------------'-------------------------------------------------' + + + + + =============== GNU AWK's Command Line Argument Summary =============== + +.-------------------------.---------------------------------------------. +| | | +| Argument | Description | +| | | +'-------------------------+---------------------------------------------' +| -F fs | Use fs for the input field separator | +| --field-sepearator fs | (the value of the FS predefined variable). | +'-------------------------+---------------------------------------------' +| -v var=val | Assign the value val to the variable var, | +| --assign var=val | before execution of the program begins. | +| | Such variable values are available to the | +| | BEGIN block of an AWK program. | +'-------------------------+---------------------------------------------' +| -f program-file | Read the AWK program source from the file | +| --file program-file | program-file, instead of from the first | +| | command line argument. Multiple -f | +| | (or --file) options may be used. | +'-------------------------+---------------------------------------------' +| -mf NNN | Set various memory limits to the value NNN. | +| -mr NNN | The f flag sets the maximum number of | +| | fields, and the r flag sets the maximum | +| | record size. (Ignored by gawk, since gawk | +| | has no pre-defined limits) | +'-------------------------+---------------------------------------------' +| -W compat | Run in compatibility mode. In compatibility | +| -W traditional | mode, gawk behaves identically to UNIX awk; | +| --compat--traditional | none of the GNU-specific extensions are | +| | recognized. | +'-------------------------+---------------------------------------------' +| -W copyleft | Print the short version of the GNU copyright| +| -W copyright | information message on the standard output | +| --copyleft | and exit successfully. | +| --copyright | | +'-------------------------+---------------------------------------------' +| -W dump-variables[=file]| Print a sorted list of global variables, | +| --dump-variables[=file] | their types and final values to file. If no | +| | file is provided, gawk uses a file named | +| | awkvars.out in the current directory. | +'-------------------------+---------------------------------------------' +| -W help | Print a relatively short summary of the | +| -W usage | available options on the standard output. | +| --help | | +| --usage | | +'-------------------------+---------------------------------------------' +|-W lint[=value] | Provide warnings about constructs that | +|--lint[=value] | are dubious or non-portable to other AWK | +| | impl�s. With argument fatal, lint warnings | +| | become fatal errors. With an optional | +| | argument of invalid, only warnings about | +| | things that are actually invalid are | +| | issued. (This is not fully implemented yet.)| +'-------------------------+---------------------------------------------' +| -W lint-old--lint-old | Provide warnings about constructs that are | +| | not portable to the original version of | +| | Unix awk. | +'-------------------------+---------------------------------------------' +| -W gen-po--gen-po | Scan and parse the AWK program, and | +| | generate a GNU .po format file on standard | +| | output with entries for all localizable | +| | strings in the program. The program itself | +| | is not executed. | +'-------------------------+---------------------------------------------' +| -W non-decimal-data | Recognize octal and hexadecimal values in | +| --non-decimal-data | input data. | +'-------------------------+---------------------------------------------' +| -W posix--posix | This turns on compatibility mode, with the | +| | following additional restrictions: | +| | o \x escape sequences are not recognized. | +| | o Only space and tab act as field | +| | separators when FS is set to a single | +| | space, new-line does not. | +| | o You cannot continue lines after ? and :. | +| | o The synonym func for the keyword function| +| | is not recognized. | +| | o The operators ** and **= cannot be used | +| | in place of ^ and ^=.� The fflush() | +| | function is not available. | +'-------------------------+---------------------------------------------' +| -W profile[=prof_file] | Send profiling data to prof_file. | +| --profile[=prof_file] | The default is awkprof.out. When run with | +| | gawk, the profile is just a "pretty | +| | printed" version of the program. When run | +| | with pgawk, the profile contains execution | +| | counts of each statement in the program | +| | in the left margin and function call counts | +| | for each user-defined function. | +'-------------------------+---------------------------------------------' +| -W re-interval | Enable the use of interval expressions in | +| --re-interval | regular expression matching. Interval | +| | expressions were not traditionally | +| | available in the AWK language. | +'-------------------------+---------------------------------------------' +| -W source program-text | Use program-text as AWK program source | +| --source program-text | code. This option allows the easy | +| | intermixing of library functions (used via | +| | the -f and --file options) with source code | +| | entered on the command line. | +'-------------------------+---------------------------------------------' +| -W version | Print version information for this | +| --version | particular copy of gawk on the standard | +| | output. | +'-------------------------+---------------------------------------------' +| -- | Signal the end of options. This is useful | +| | to allow further arguments to the AWK | +| | program itself to start with a "-". This | +| | is mainly for consistency with the argument | +| | parsing convention used by most other POSIX | +| | programs. | +'-------------------------'---------------------------------------------' +###alle Leerzeile löschen +awk ’NF’ datei +###zähle Zeilen der Datei +awk ’END {print NR}’ +###Zeilennummern einfügen +awk ’{print NR, $0}’ +###jede dritte Zeile anzeigen +awk ’NR%3== 1’ +###Jede Eingabezeile mit mehr als vier Feldern (Wörtern) ausgeben: +NF > 4 +###Anzahl Eingabezeilen ausgeben: +END { print NR } +###Zehnte Eingabezeile ausgeben: +NR == 10 +###Gesamtzahl aller Felder (Wörter) aller Eingabezeilen ausgeben: +{ nw += NF } END { print nw } +###Anzahl aller Zeilen ausgeben, die Barbara enthalten: +/Barbara/ { ++cnt } END { print cnt } +###Jede Zeile ausgeben, die mindestens ein Feld (Wort) enthält: +NF > 0 +###Jede Zeile ausgeben, die länger als 80 Zeichen ist: +length($0) > 80 +###Die beiden ersten Felder (Worte) jeder Zeile vertauschen und dann die Zeile ausgeben: +{ tmp = $1; $1 = $2; $2 = tmp; print } +###Jede Zeile mit ihrer Zeilennummer davor ausgeben: +{ print NR, $0 } +###Jede Zeile ausgeben und vorher das zweite Feld (Wort) löschen: +{ $2 = ""; print } +###Jede Zeile ausgeben, die länger als 80 Zeichen ist: +length($0) > 80 +###Die beiden ersten Felder (Worte) jeder Zeile vertauschen und dann die Zeile ausgeben +tmp = $1; $1 = $2; $2 = tmp; print +### diff --git a/backend/capifax b/backend/capifax new file mode 100755 index 0000000..678e2a6 --- /dev/null +++ b/backend/capifax @@ -0,0 +1,343 @@ +#!/usr/bin/perl -w +# ______________________________________________________________________ +# +# Projekt: capifax +# Name: capifax +# Autor: mgoppold +# Revision: $Revision$ +# letzte Änderung: $Date$ +# durch: $Author$ +# Source: $HeadURL$ +# ______________________________________________________________________ +# +# CUPS backend for printing to capifax +# + +use Carp; +use File::Temp qw/ :mktemp /; +use File::Basename; +use MIME::Words qw(encode_mimewords); +use Mail::Send; +use MIME::Lite; +# use Config::General; + +my $CUPS_BACKEND_OK=0; +my $CUPS_BACKEND_FAILED=1; +my $CUPS_BACKEND_AUTH_REQUIRED=2; +my $CUPS_BACKEND_HOLD=3; +my $CUPS_BACKEND_STOP=4; +my $CUPS_BACKEND_CANCEL=5; + +my ($CUPS_SERVERROOT,$TMPDIR,$PRINTER); +my ($scheme,$uri,$realprinter,$archivserver); +my ($destdir,$destfile,$dest); +my ($ppdfile,$DefaultOutput,$DefaultCategory,$DefaultCompany); +my ($jahr,$monat,$tag,$hour,$min,$sec); +my ($job,$user,$title,$copies,$options,$filename); +my ($cmdln,$status); +my ($fh,$havetoremovetempfile); +my ($fhtif,$filenametif); +my ($fhpdf,$filenamepdf); +my (@optionlist); +my (%serverconfig,$CUPS_SERVERADMIN); +my ($msg,$unused1,$unused2,$subject,$mailtext); +my ($debug); +my (@jobfiles,$count_jobfiles,$suffix,$i); + +my ($FAXMSN,$FAXCONTROLLER,$FAXIDENT,$FAXHEADER,$FAX_GS_OPTIONS); + + +$FAXMSN="3556098"; +$FAXCONTROLLER="1"; +$FAXIDENT="+493713556098"; +$FAXHEADER="Mario Hoellein"; +$FAX_GS_OPTIONS="-q -dNOPAUSE -dBATCH -sDEVICE=tiffg3 -r204x196"; + + +$havetoremovetempfile=0; +$debug=1; + +# hier liegt Monat zw. 0 und 11 +($sec,$min,$hour,$tag,$monat, $jahr) = (localtime)[0,1,2,3,4,5]; +$monat+=1; +$jahr+=1900; +$monat=sprintf("%.2d",$monat); +$tag=sprintf("%.2d",$tag); +$sec=sprintf("%.2d",$sec); +$min=sprintf("%.2d",$min); +$hour=sprintf("%.2d",$hour); + +$_=$0; +SWITCH: { + $scheme = "capifax", last SWITCH if /\/capifax$/; + $scheme = "capifax_test", last SWITCH if /\/capifax_test$/; +} + +if (@ARGV == 0) { + print "direct $scheme \"Unknown\" \"Printing to $scheme\"\n"; + exit $CUPS_BACKEND_OK; +} + + +# in case of wrong number of arguments: print usage hint +if (@ARGV != 5 && @ARGV != 6) { + print " +Usage: $scheme job-id user title copies options [file] + example for device-URI: '$scheme://' + +Install a printqueue with lpadmin -p +-v $scheme:// -i /usr/share/cups/model/capifax.ppd -E + +"; + exit $CUPS_BACKEND_FAILED; +} + +# Flush everything immediately. +$|=1; + + +($job,$user,$title,$copies,$options,$filename)=@ARGV; + +$CUPS_SERVERROOT = $ENV{"CUPS_SERVERROOT"}; +$PRINTER = $ENV{"PRINTER"}; +$TMPDIR = $ENV{"TMPDIR"}; +#%serverconfig = ParseConfig($CUPS_SERVERROOT."/cupsd.conf"); +#$CPS_SERVERADMIN = $serverconfig{'ServerAdmin'}; +$CUPS_SERVERADMIN = "root\@tbz-pariv.lan"; + +if ($debug > 0) { + print STDERR "DEBUG: [Job $job:$scheme] job=$job\n"; + print STDERR "DEBUG: [Job $job:$scheme] user=$user\n"; + print STDERR "DEBUG: [Job $job:$scheme] title=$title\n"; + print STDERR "DEBUG: [Job $job:$scheme] copies=$copies\n"; + printf STDERR "DEBUG: [Job $job:$scheme] options=%s\n",$options?$options:"not set"; + printf STDERR "DEBUG: [Job $job:$scheme] filename=%s\n",$filename?$filename:"not set"; + printf STDERR "DEBUG: [Job $job:$scheme] CUPS_SERVERADMIN=%s\n",$CUPS_SERVERADMIN?$CUPS_SERVERADMIN:"not set"; +} + +# Wenn in den options schon Leerzeichen vorkommen: +# options=document-name=Allonge\ 56235:\ ComSell\ GmbH job-uuid=urn:uuid:4eaa0aff-f2b8-348c-5449-4934aff0d4fa +# kann optionlist nicht sauber trennen, deshalb werden die Leerzeichen schon hier rausgenommen +$options=~s/\\ //g; +@optionlist=split(/\s/,$options); +foreach $option (@optionlist) { + my ($var,$value)=split(/\s*=\s*/,$option,2); + print STDERR "DEBUG: [Job $job:$scheme] parse options ($var,$value)\n" if ($debug > 1); + $var =~ s/[ \.,;:*\-\+#~$"?&\/\\()\[\]{}]//g; # um gültige Var-Name zu erhalten + $value=~s/[{}]//g; # die {} entfernen weil eine Substitution von + # ${VAR} nicht geht wohl aber $VAR + $value=~s/\$(\w+)/${$1}/g; # Variablen auflösen + no strict 'refs'; + print STDERR "DEBUG: [Job $job:$scheme] parse options ($var,$value)\n" if ($debug > 1); + $$var = $value; + print STDERR "DEBUG: [Job $job:$scheme] parse options ($var,$$var)\n" if ($debug > 0); +} + +if ( $title ) { + # print STDERR "DEBUG: [Job $job:$scheme] ok title $title or $scheme\n"; + $title=~s/[[:punct:]]+/_/g; + $title=~s/[[:space:]]+/_/g; + if ( "$title" =~ /stdin/ && ${documentname} ) { + $title=${documentname}; + $title=~s/[[:punct:]]+/_/g; + $title=~s/[[:space:]]+/_/g; + } + else { + $title=~s/_stdin_/$scheme/g; + } +} +else { + # print STDERR "DEBUG: [Job $job:$scheme] no title use $scheme or ${documentname}\n"; + $title="$scheme"; + $title=${documentname} if (${documentname}); + $title=~s/[[:punct:]]+/_/g; + $title=~s/[[:space:]]+/_/g; +} + +$NUMBER=~s/[[:punct:]]+//g; +$NUMBER=~s/[[:space:]]+//g; + +if (! defined ($filename)) { + ($fh,$filename) = mkstemps( "${TMPDIR}/${job}_${scheme}_${title}_XXXXXX", ".prn"); + while () { + print $fh $_ ; + } + close($fh); + $havetoremovetempfile=1; + $jobfiles[0]=$filename; + $count_jobfiles=1; +} +else { + $jobfiles[0]=$filename; +} + +$user=$ENV{"USER"} if (! $user); +$user="cups" if (! $user); + +$user =~ tr/ .,;:*+#~$"?&\/\\()[]/_/; + +# get file to which the job is "printed" from device URI, so +# so that you can use this backend multiple times, for various +# "modarch" printers... + +$uri = $ENV{"DEVICE_URI"}; + +# load ppd-File-Options +$ppdfile=$ENV{"PPD"}; + + +if ( "$NUMBER" == "" ) { + if ( $CUPS_SERVERADMIN || $EMAIL ) { + my $recipient; + if ($EMAIL) { $recipient=$EMAIL; } else { $recipient=$CUPS_SERVERADMIN; } + $msg = Mail::Send->new() || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Fehlermail an $recipient\n"; + $msg->to($recipient); + $msg->subject("CUPS [Job $job:$scheme] Fehler: capifax"); + $fh = $msg->open; + print $fh "Fehler beim versenden des Faxes!\n"; + print $fh "Es wurde keine Faxnummer angegeben (Option NUMBER).\n\n"; + print $fh "z.B.: lp -d faxprinter -o NUMBER=003713556098 -o EMAIL=mhoellein\@freenet.de\n"; + $fh->close || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Fehlermail an $recipient\n"; + } + print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden des Faxes: Es wurde keine Faxnummer angegeben.!\n"; + print STDERR "WARNING: [Job $job:$scheme] fertig mit ret=$CUPS_BACKEND_FAILED.\n"; + exit $CUPS_BACKEND_HOLD; +} + +$suffix=""; +$i=1; +foreach $filename ( @jobfiles ) { + # TMPLPD.20041102113805.QSYSPRT.EGSKEM02.719 + # USER.20041102113805.NAME.PRINTER.ID + # ok ok ok ok ok + if ($count_jobfiles > 1) { + $suffix=sprintf ":%d",$i; + $i++; + } + + ($fhtif,$filenametif) = mkstemps( "${TMPDIR}/${job}_${scheme}_${title}_XXXXXX", ".tif"); + $cmdln="/usr/bin/gs $FAX_GS_OPTIONS -sOutputFile=$filenametif $filename "; + + if ($debug > 0) { + print STDERR "DEBUG: [Job $job:$scheme] CUPS_SERVERROOT=$CUPS_SERVERROOT\n"; + print STDERR "DEBUG: [Job $job:$scheme] filename=$filename\n"; + if ($debug > 1) { + my @vars = sort(keys(%ENV)); + foreach(@vars) { + print STDERR "DEBUG: [Job $job:$scheme] \$ENV{$_}=$ENV{$_}\n"; + } + } + } + + if ($> == 0) { + $cmdln = "su -c '".$cmdln."' lp"; + } + + print STDERR "DEBUG: [Job $job:$scheme] cmdln=$cmdln\n" if ($debug > 0); + $status=system ($cmdln); + if ( $status != 0 ) { + print STDERR "ERROR: [Job $job:$scheme] Fehler beim Aufbereiten des Faxes \[Fehlercode=$status\]\n"; + if ( $CUPS_SERVERADMIN ) { + $msg = Mail::Send->new() || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Fehlermail an $CUPS_SERVERADMIN\n"; + $msg->to($CUPS_SERVERADMIN); + $msg->subject("CUPS [Job $job:$scheme] Fehler: gs"); + $fh = $msg->open; + print $fh "Fehler beim Aufbereiten des Faxex!\n"; + print $fh "Die Kommandozeile war:\n"; + print $fh "$cmdln\n"; + print $fh "Der Fehlercode lautet: $status\n"; + $fh->close || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Fehlermail an $CUPS_SERVERADMIN\n"; + } + print STDERR "WARNING: [Job $job:$scheme] fertig mit ret=$CUPS_BACKEND_FAILED.\n"; + exit $CUPS_BACKEND_FAILED; + } + print STDERR "WARNING: [Job $job:$scheme] $cmdln\n"; + + ($fhpdf,$filenamepdf) = mkstemps( "${TMPDIR}/${job}_${scheme}_${jahr}${monat}${tag}${hour}${min}${sec}_${NUMBER}_${title}_XXXXXX", ".pdf"); + $cmdln="/usr/bin/tiff2pdf -z -p a4 -c capifax -a 'Sender: $EMAIL' -t capifax -k 'capifax ${title}' -s '${tag}.${monat}.${jahr}' -o $filenamepdf $filenametif"; + + if ($> == 0) { + $cmdln = "su -c '".$cmdln."' lp"; + } + + print STDERR "DEBUG: [Job $job:$scheme] cmdln=$cmdln\n" if ($debug > 0); + $status=system ($cmdln); + if ( $status != 0 ) { + print STDERR "ERROR: [Job $job:$scheme] Fehler beim Aufbereiten des Faxes \[Fehlercode=$status\]\n"; + if ( $CUPS_SERVERADMIN ) { + $msg = Mail::Send->new() || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Fehlermail an $CUPS_SERVERADMIN\n"; + $msg->to($CUPS_SERVERADMIN); + $msg->subject("CUPS [Job $job:$scheme] Fehler: gs"); + $fh = $msg->open; + print $fh "Fehler beim Aufbereiten des Faxes!\n"; + print $fh "Die Kommandozeile war:\n"; + print $fh "$cmdln\n"; + print $fh "Der Fehlercode lautet: $status\n"; + $fh->close || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Fehlermail an $CUPS_SERVERADMIN\n"; + } + print STDERR "WARNING: [Job $job:$scheme] fertig mit ret=$CUPS_BACKEND_FAILED.\n"; + exit $CUPS_BACKEND_FAILED; + } + print STDERR "WARNING: [Job $job:$scheme] $cmdln\n"; + $NUMBER="0".$NUMBER if ( length $NUMBER > 3 ); # Amtsnull davorschreiben + $cmdln="/usr/local/bin/capifax -ident '".$FAXIDENT."' -header '".$FAXHEADER."' -loglevel 0 -send ".$filenametif." ".$FAXCONTROLLER." ".$FAXMSN." ".$NUMBER; + + if ($> == 0) { + $cmdln = "su -c '".$cmdln."' lp"; + } + + print STDERR "DEBUG: [Job $job:$scheme] cmdln=$cmdln\n" if ($debug > 0); + if (open(PH,"$cmdln 2>&1 |")) { + while () { + $outmsg.=$_; + } + close(PH); + if ( $EMAIL ) { + $subject="CUPS [Job $job:$scheme] Protokoll des Faxes von MSN $FAXMSN an $NUMBER"; + $mailtext="IDENT: $FAXIDENT\nHEADER: $FAXHEADER\nMSN: $FAXMSN\nNUMBER: $NUMBER\n\nAusgabe des Faxprogramms:\n$outmsg\n\nEnde der automatisch erzeugten Mail."; + + $msg = MIME::Lite->new( + From =>$CUPS_SERVERADMIN, + To =>$EMAIL, + Subject =>encode_mimewords($subject), + Type =>'multipart/mixed' + ) || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Mail an $EMAIL\n"; + $msg->attach(Type =>'TEXT', + Data =>$mailtext, + ) || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Mail an $EMAIL\n"; + $msg->attach(Type =>'application/pdf', + Path =>$filenamepdf, + Filename =>basename($filenamepdf), + Disposition => 'attachment' + ) || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Mail an $EMAIL\n"; + $msg->send || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Mail an $EMAIL\n"; + + } + } + else { + if ( $CUPS_SERVERADMIN ) { + $msg = Mail::Send->new() || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Fehlermail an $CUPS_SERVERADMIN\n"; + $msg->to($CUPS_SERVERADMIN); + $msg->subject("CUPS [Job $job:$scheme] Fehler: capifax"); + $fh = $msg->open; + print $fh "Fehler beim versenden des Faxes!\n"; + print $fh "Die Kommandozeile war:\n"; + print $fh "$cmdln\n"; + print $fh "Konnte cmdln nicht ausführen!"; + $fh->close || print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden der Fehlermail an $CUPS_SERVERADMIN\n"; + } + print STDERR "ERROR: [Job $job:$scheme] Fehler beim versenden des Faxes: Konnte cmdln nicht ausführen!\n"; + print STDERR "WARNING: [Job $job:$scheme] fertig mit ret=$CUPS_BACKEND_FAILED.\n"; + exit $CUPS_BACKEND_FAILED; + } + print STDERR "WARNING: [Job $job:$scheme] $cmdln\n"; + +# if ($havetoremovetempfile) { +# unlink($filename); +# } +# unlink($filenametif); +# unlink($filenamepdf); +} + +print STDERR "WARNING: [Job $job:$scheme] fertig mit ret=$CUPS_BACKEND_OK.\n"; +exit $CUPS_BACKEND_OK; diff --git a/backend/mail b/backend/mail new file mode 100755 index 0000000..4d2d39f --- /dev/null +++ b/backend/mail @@ -0,0 +1,94 @@ +#!/usr/bin/perl +use strict; +use warnings; +use FileHandle; +use MIME::Entity; + +# CUPS-Backend, um aus einem Druckauftrag eine Mail zu generieren. +# Die Device-URI muss die Form +# +# mail:/user@computer.domain +# +# haben. Alles andere geht dann von selbst :-) Ein Device für den +# Versand an root@localhost wird dem Benutzer bei der Einrichtung +# schon vorgegeben. +# benötigt Debian-Paket libmime-perl + +unless(@ARGV){ + # Wird kein Parameter angegeben, will CUPS nur Infos über + # angeschlossene Drucker. Die sind Zeilenweise in der Form + # class uri model description + # class: file, direct, serial, network + print 'network mail "Unknown" "EMail-Address Mailer"',"\n"; + print 'network mail:/root@localhost "Unknown" "Mail to root"',"\n"; + exit; +} + +# Jetzt extrahiere ich die Parameter, die für mich interessant +sind. +# Entgegen der Dokumentation gibts nur 5-6 statt 6-7 Parameter +# (printer als erstes wird nicht angegeben) + +if($#ARGV<4 or $#ARGV>5){ + print STDERR "ERROR: mail job-id user title copies options [file]\n"; + exit 1; +} + +my($job,$user,$title,$copies,$options,$filename)=@ARGV; +my($deviceuri)=($ENV{DEVICE_URI} or ''); +my($email)=($deviceuri=~m!^mail:/(.*)$!); + +# Druckdaten lesen und MIME-Type feststellen: +my($file,$type); +if($filename){ + $type=`file -bi $filename`; + open $file, "<$filename"; +}else{ + $file=*STDIN; + $type='application/octet-stream'; +} +local $/; # slurp mode +my $text=<$file>; + +# Mail erzeugen: +my $mail=MIME::Entity->build( + From =>"CUPS mailer ($user)", + To =>$email, + Subject=>"CUPS printjob '$title'", + # Mail hat attachments und bestsht daher aus zwei Teilen: + Type =>'multipart/mixed', +); +$mail->attach(Data=><<"EOT"); +Hello $email, + +this mail contains a printjob. It was send to you from the CUPS +mail-backend. + +Device-URI.......: $deviceuri +Job-ID...........: $job +Sending User.....: $user +Documenttitle....: $title +Number of Copies.: $copies +MIME-Type........: $type + +CUPS-backend 'mail' written by Thomas Bayen. +EOT +$mail->attach( + Data =>$text, + Type =>$type, + # Druckjob wird nicht "inline" angezeigt, sondern immer als +Attachment: + Disposition=>'attachment', + # Encoding, damit Sonderzeichen und Binärdateien nicht kaputt gehen: + # Encoding =>'quoted-printable', # hängt sich leider weg!?! + Encoding =>'base64', # geht aber auch +); + +$mail->send; + +# So gehts auch: +#open PIPE,"|sendmail -t"; +#print PIPE $mail->stringify; +#close PIPE; + +exit 0; diff --git a/backend/modarch b/backend/modarch new file mode 100755 index 0000000..92d687a --- /dev/null +++ b/backend/modarch @@ -0,0 +1,777 @@ +#!/usr/bin/perl -w +# ______________________________________________________________________ +# +# Projekt: modprint_server +# Name: modarch +# Autor: mgoppold +# Revision: $Revision: 196 $ +# letzte Änderung: $Date: 2013-01-15 08:04:32 +0100 (Di, 15. Jan 2013) $ +# durch: $Author: mgoppold $ +# Source: $HeadURL: svn+ssh://svnserver/svn/modprint_server/trunk/cups/backend/modarch $ +# ______________________________________________________________________ +# +# CUPS backend for printing to modarch +# +# perltidy -b -syn -i=3 -ple -bbs -bbc -bbb -bar -msc=3 -l=1000 -ndnl -nwls='.' -nwrs='.' FILE + +use Carp; +use Cwd qw(chdir); +use Cwd qw(getcwd); +use File::Temp qw/ :mktemp /; +use File::Basename; +use Mail::Send; +use Net::CUPS; +use Net::FTP; +use Net::Netrc; +use Fcntl qw(:DEFAULT :flock); +use Data::Dumper; +use encoding 'iso 8859-15', Filter => 1; +use Encode; +use Archive::Tar; +use File::Type; + +BEGIN { push @INC, ( ".", "bin", "lib", "../lib", "/usr/share/modprint_server/lib" ) } +use ModPrint::Server; +use ModPrint::Server qw ( $debug $scheme ); + +# use Data::Hexdumper; + +# use Config::General; + +my ( $CUPS_SERVERROOT, $CUPS_REQUESTROOT, $CUPSVERSION ); +my ( $user_at_host, $TMPDIR, $PRINTER ); +my ( $scheme, $URI, $realprinter ); +my ( $archivserver, $default_archivserver ); +my ( $archivserverport,$default_archivserverport ); +my ( $archivuser, $default_archivuser ); +my ( $default_destdir ); +my ( $sshbin, $sshopt, $scpbin, $scpopt ); +my ( $destdir, $destfile, $dest ); +my ( $transmittprot, $default_transmittprot ); +my ( $PPDFILE, $DefaultOutput, $DefaultCategory, $DefaultCompany ); +my ( $DefaultHierarchic, $JobMail, $Untar, $wasTar ); +my ( $jahr, $monat, $tag, $hour, $min, $sec ); +my ( $job, $user, $title, $copies, $options, $filename ); +my ( $cmdln, $status, $cyclecountfile, $cyclecount ); +my ( $fh, @tempfilelist ); +my (@optionlist); +my ( %serverconfig, $CUPS_SERVERADMIN ); +my ( $msg, $unused1, $unused2 ); +my ($debug); +my ( @jobfiles, @jobfiles2, $count_jobfiles, $suffix, $jobbase, $i ); +my ( $cupsObject, $printerObject, $ppdObject ); + +# +# ----------------------------------------------------------------------------- +# + +sub send_message() { + my $subject = shift; + &debug_message( 2, "send_message to %s Subject %s\n", $CUPS_SERVERADMIN, $subject ); + if ($CUPS_SERVERADMIN) { + $msg = Mail::Send->new() || &error_message( "Fehler beim versenden der Fehlermail an %s\n", $CUPS_SERVERADMIN ); + $msg->to($CUPS_SERVERADMIN); + $msg->subject($subject); + $fh = $msg->open; + print $fh @_; + $fh->close || &error_message( "Fehler beim versenden der Fehlermail an %s\n", $CUPS_SERVERADMIN ); + } +} + +sub cleanupexit() { + my $retcode = shift; + foreach (@tempfilelist) { unlink or &die_message( "Fehler beim löschen der temporären Files\n") }; + exit $retcode; +} + +sub send_error_and_exit() { + my $retcode = shift; + my $subject = shift; + + # wenn $cyclecount < 1 Mail senden sonst nicht + &send_message( $subject, @_ ) if ( $cyclecount < 1 ); + &warn_message( "fertig mit ret=".$retcode."\n" ); + &cleanupexit($retcode); +} + +# +# ----------------------------------------------------------------------------- +# + +# hier liegt Monat zw. 0 und 11 +( $sec, $min, $hour, $tag, $monat, $jahr ) = (localtime)[ 0, 1, 2, 3, 4, 5 ]; +$monat += 1; +$jahr += 1900; +$monat = sprintf( "%.2d", $monat ); +$tag = sprintf( "%.2d", $tag ); +$sec = sprintf( "%.2d", $sec ); +$min = sprintf( "%.2d", $min ); +$hour = sprintf( "%.2d", $hour ); + +$_ = $0; +SWITCH: { + $scheme = "modarch", last SWITCH if /\/modarch$/; + $scheme = "modarch-test", last SWITCH if /\/modarch-test$/; + $scheme = "modarch_test", last SWITCH if /\/modarch_test$/; # obsolete! +} + +if ( @ARGV == 0 ) { + print "direct ".$scheme." \"Unknown\" \"archiv\"\n"; + print "file ".$scheme."://realprinter \"Unknown\" \"archiv and print\"\n"; + print "file ".$scheme."://realprinter[[ssh|ftp][[user\@]destserver[:port]][:destdir/destsubdir/destsubsubdir]] \"Unknown\" \"archiv to user\@destserver and print\"\n"; + print "file ".$scheme."://".$scheme."[[ssh|ftp][[user\@]destserver[:port]][:destdir/destsubdir/destsubsubdir]] \"Unknown\" \"archiv to user\@destserver and don't print\"\n"; + exit $CUPS_BACKEND_OK; +} + +# in case of wrong number of arguments: print usage hint +if ( @ARGV != 5 && @ARGV != 6 ) { + print " +Usage: ".$scheme." job-id user title copies options [file] + example for device-URI: '".$scheme."://real_printer_name' + '".$scheme."://real_printer_name/destserver' + '".$scheme."://real_printer_name/[ssh:]user\@destserver' + '".$scheme."://real_printer_name/ftp:user\@destserver' + '".$scheme."://real_printer_name/[[ssh|ftp][[user\@]destserver[:port]][:destdir/destsubdir/destsubsubdir]]' + +Install a printqueue with lpadmin -p +-v ".$scheme.":// -i /usr/share/cups/model/modarcha.ppd -E + +"; + exit $CUPS_BACKEND_FAILED; +} + +# Flush everything immediately. +$| = 1; + +( $job, $user, $title, $copies, $options, $filename ) = @ARGV; + +$CUPS_SERVERROOT = $ENV{"CUPS_SERVERROOT"}; +$CUPS_REQUESTROOT = $ENV{"CUPS_REQUESTROOT"}; +$PRINTER = $ENV{"PRINTER"}; +$TMPDIR = $ENV{"TMPDIR"}; +$URI = $ENV{"DEVICE_URI"}; # Bsp: "modarch://modarch" oder "modarch://PERWBA01" + +#%serverconfig = ParseConfig($CUPS_SERVERROOT."/cupsd.conf"); +#$CUPS_SERVERADMIN = $serverconfig{'ServerAdmin'}; +$CUPS_SERVERADMIN = "modarch\@localhost"; + +@tempfilelist = (); +$debug = 2; +$default_transmittprot= "ssh"; +$default_archivserverport= "22"; +$default_archivuser = $ENV{"DEFAULT_ARCHIVUSER"}?$ENV{"DEFAULT_ARCHIVUSER"}:"modarch"; +$default_archivserver = $ENV{"DEFAULT_ARCHIVHOST"}?$ENV{"DEFAULT_ARCHIVHOST"}:"localhost"; +$default_archivhome = $ENV{"DEFAULT_ARCHIVHOME"}?$ENV{"DEFAULT_ARCHIVHOME"}:"."; +$sshbin = "/usr/bin/ssh"; +$sshopt = "-2 -a -q -T -x -c blowfish -i ".$CUPS_SERVERROOT."/ssh.identity "; +$scpbin = "/usr/bin/scp"; +$scpopt = "-oProtocol=2 -c blowfish -p -q -i ".$CUPS_SERVERROOT."/ssh.identity "; +$cyclecountfile = $TMPDIR."/".$job.".cnt"; + +$ModPrint::Server::debug = $debug; +$ModPrint::Server::job = $job; +$ModPrint::Server::scheme = $scheme; + +# TODO &write_statfile("%d %s %s",$job,$scheme,"Test"); + +## cyclecountfile anlegen oder um 1 erhöhen +sysopen(FH, $cyclecountfile, O_RDWR | O_CREAT) or &die_message( "Fehler beim Lesen des Files: ".$cyclecountfile." ".$!."\n" ); +# autoflush FH +$ofh = select(FH); $| = 1; select ($ofh); +flock(FH, LOCK_EX) or &die_message( "Fehler beim write-lock für ".$cyclecountfile." ".$!."\n" ); +$cyclecount = || 0; +seek(FH, 0, 0) or &die_message( "Fehler beim schreiben von ".$cyclecountfile." ".$!."\n" ); +print FH $cyclecount+1, "\n" or &die_message( "Fehler beim schreiben von ".$cyclecountfile." ".$!."\n" ); +truncate(FH, tell(FH)) or &die_message( "Fehler beim schreiben von ".$cyclecountfile." ".$!."\n" ); +close(FH) or &die_message( "Fehler beim schließen von ".$cyclecountfile." ".$!."\n" ); + +&debug_message( 0, "job=%s\n", $job ); +&debug_message( 0, "user=%s\n", $user ); +&debug_message( 0, "title=%s\n", $title ); +&debug_message( 0, "copies=%s\n", $copies ); +&debug_message( 0, "options=%s\n", $options ? $options : "not set" ); +&debug_message( 0, "filename=%s\n", $filename ? $filename : "not set" ); +&debug_message( 0, "CUPS_SERVERADMIN=%s\n", $CUPS_SERVERADMIN ? $CUPS_SERVERADMIN : "not set" ); + +# Wenn in den options schon Leerzeichen vorkommen: +# options=document-name=Allonge\ 56235:\ ComSell\ GmbH job-uuid=urn:uuid:4eaa0aff-f2b8-348c-5449-4934aff0d4fa +# kann optionlist nicht sauber trennen, deshalb werden die Leerzeichen schon hier durch _ ersetzt +$options =~ s/\\ /_/g; +@optionlist = split( /\s/, $options ); +foreach $option (@optionlist) { + my ( $var, $value ) = split( /\s*=\s*/, $option, 2 ); + &debug_message( 1, "parse options ($var,$value)\n", $var, $value ); + + $var =~ s/[ \.,;:*\-\+#~$"?&\/\\()\[\]{}]//g; # um gültige Var-Name zu erhalten + $value =~ s/[{}]//g; # die {} entfernen weil eine Substitution von + # ${VAR} nicht geht wohl aber $VAR + $value =~ s/\$(\w+)/${$1}/g; # Variablen auflösen + no strict 'refs'; + &debug_message( 2, "parse options (%s,%s)\n", $var, $value ); + $$var = $value; + &debug_message( 1, "parse options (%s,%s)\n", $var, $$var ); +} + +# +# Im PassThrough Modus hat der "documentname" eine höhere Priorität als der "title" +# + +if ($title) { + my $utf8title = decode('utf8', $title); + $title=$utf8title if ( $utf8title !~ /\x{FFFD}/ ); + # es geht auch äöüÄÖÜß (Latin1 eingegeben) und \x{e4}\x{f6}\x{fc}\x{c4}\x{d6}\x{dc}\x{df} + $title =~ s/\xC3\xA4/ae/g; $title =~ s/\xC3\xB6/oe/g; $title =~ s/\xC3\xBC/ue/g; $title =~ s/\xC3\x84/Ae/g; $title =~ s/\xC3\x96/Oe/g; $title =~ s/\xC3\x9C/Ue/g; $title =~ s/\xC3\x9F/ss/g; + $title =~ s/\xE4/ae/g; $title =~ s/\xF6/oe/g; $title =~ s/\xFC/ue/g; $title =~ s/\xC4/Ae/g; $title =~ s/\xD6/Oe/g; $title =~ s/\xDC/Ue/g; $title =~ s/\xDF/ss/g; + if ( !$PassThrough ) { + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; + if ( "$title" =~ /(stdin|Untitled)/ && $documentname ) { + $title = $documentname; + $utf8title = decode('utf8', $title); + $title=$utf8title if ( $utf8title !~ /\x{FFFD}/ ); + $title =~ s/\xC3\xA4/ae/g; $title =~ s/\xC3\xB6/oe/g; $title =~ s/\xC3\xBC/ue/g; $title =~ s/\xC3\x84/Ae/g; $title =~ s/\xC3\x96/Oe/g; $title =~ s/\xC3\x9C/Ue/g; $title =~ s/\xC3\x9F/ss/g; + $title =~ s/\xE4/ae/g; $title =~ s/\xF6/oe/g; $title =~ s/\xFC/ue/g; $title =~ s/\xC4/Ae/g; $title =~ s/\xD6/Oe/g; $title =~ s/\xDC/Ue/g; $title =~ s/\xDF/ss/g; + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; + } + else { + $title =~ s/_stdin_/$scheme/g; + } + } + else { + $title = $documentname if ($documentname); + # print STDERR hexdump(data => $title), "\n"; + # &debug_message( 1, " title=%s\n", $title ); + $utf8title = decode('utf8', $title); + $title=$utf8title if ( $utf8title !~ /\x{FFFD}/ ); + # print STDERR hexdump(data => $title), "\n"; + # &debug_message( 1, " title=%s\n", $title ); + $title =~ s/\xC3\xA4/ae/g; $title =~ s/\xC3\xB6/oe/g; $title =~ s/\xC3\xBC/ue/g; $title =~ s/\xC3\x84/Ae/g; $title =~ s/\xC3\x96/Oe/g; $title =~ s/\xC3\x9C/Ue/g; $title =~ s/\xC3\x9F/ss/g; + $title =~ s/\xE4/ae/g; $title =~ s/\xF6/oe/g; $title =~ s/\xFC/ue/g; $title =~ s/\xC4/Ae/g; $title =~ s/\xD6/Oe/g; $title =~ s/\xDC/Ue/g; $title =~ s/\xDF/ss/g; + # &debug_message( 1, "## title=%s\n", $title ); + # print STDERR hexdump(data => $title), "\n"; + } +} +else { + $title = "$scheme"; + $title = $documentname if ($documentname); + my $utf8title = decode('utf8', $title); + $title=$utf8title if ( $utf8title !~ /\x{FFFD}/ ); + $title =~ s/\xC3\xA4/ae/g; $title =~ s/\xC3\xB6/oe/g; $title =~ s/\xC3\xBC/ue/g; $title =~ s/\xC3\x84/Ae/g; $title =~ s/\xC3\x96/Oe/g; $title =~ s/\xC3\x9C/Ue/g; $title =~ s/\xC3\x9F/ss/g; + $title =~ s/\xE4/ae/g; $title =~ s/\xF6/oe/g; $title =~ s/\xFC/ue/g; $title =~ s/\xC4/Ae/g; $title =~ s/\xD6/Oe/g; $title =~ s/\xDC/Ue/g; $title =~ s/\xDF/ss/g; + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; +} + +# wenn mehr als 1 File in einem Job werden alle ohne Filename geliefert! +if ( !defined($filename) ) { + ( $fh, $filename ) = mkstemps( $TMPDIR."/".$job."_".$scheme."_".$title."_XXXXXX", ".prn" ); + while () { + print $fh $_; + } + close($fh); + push @tempfilelist, $filename; +} + +$count_jobfiles = 1; +$jobbase = sprintf "%s/d%.5d", $CUPS_REQUESTROOT, $job; +$suffix = sprintf "-%.3d", $count_jobfiles; + +&debug_message( 2, "test jobfile[%d] %s \n", $count_jobfiles, $jobbase.$suffix ); +while ( -s $jobbase.$suffix ) { + push @jobfiles, $jobbase.$suffix; + $count_jobfiles++; + $suffix = sprintf "-%.3d", $count_jobfiles; + &debug_message( 2, "test jobfile[%d] %s \n", $count_jobfiles, $jobbase.$suffix ); +} +$count_jobfiles--; +&debug_message( 1, "found %d jobfiles\n", $count_jobfiles ); + +$user = $ENV{"USER"} if ( !$user ); +$user = "cups" if ( !$user ); + +$user =~ tr/ .,;:*+#~$"?&\/\\()[]/_/; + +# get file to which the job is "printed" from device URI, so +# so that you can use this backend multiple times, for various +# "modarch" printers... + +# $URI="modarch://realprinter[/[transmittprot:][[user\@]archivserver][:destdir/destsubdir/destsubsubdir]]"; +# $URI="modarch://realprinter/transmittprot:user\@archivserver:destdir/destsubdir/destsubsubdir"; +# +# $URI="modarch://modarch/archivserver"; # 0004 +# $URI="modarch://modarch/archivserver:destdir"; # 0005 +# $URI="modarch://modarch/ssh:esg-archiv"; # 0006 +# $URI="modarch://modarch/ssh:modarch\@esg-archiv"; # 0007 +# $URI="modarch://modarch/ssh:modarch\@esg-archiv:destdir/destsubdir/destsubsubdir"; # 0008 +# $URI="modarch://modarch/ftp:modarch\@esg-archiv:20021:destdir/destsubdir/destsubsubdir"; # 0010 + +# $URI="modarch://realprinter"; +# $URI="modarch://realprinter/archivserver"; +# $URI="modarch://realprinter/user\@archivserver"; +# $URI="modarch://realprinter/user\@archivserver:destdir/destsubdir/destsubsubdir"; +# $URI="modarch://realprinter/archivserver:destdir/destsubdir/destsubsubdir"; +# $URI="modarch://realprinter/:destdir/destsubdir/destsubsubdir"; + +( $unused1, $unused2, $realprinter, $archivserver ) = split( /\//, $URI, 4 ); + +if ( defined $archivserver && $archivserver =~ /^(ssh|ftp|transmittprot):/i ) { + ($transmittprot,$archivserver)=split(/:/,$archivserver,2); +} +$transmittprot=$default_transmittprot if (!defined $transmittprot); + +if ( defined $archivserver && $archivserver =~ /:/ ) { + if ( $archivserver =~ /:[0-9][0-9]+/ ) { + ($archivserver,$destdir)=split(/:/,$archivserver,2); + ($archivserverport,$destdir)=split(/:/,$destdir,2); + } + else{ + ($archivserver,$destdir)=split(/:/,$archivserver,2); + } +} +$archivserver=$default_archivserver if (! (defined $archivserver && length $archivserver)); +$archivuser=$default_archivuser if (! (defined $archivuser && length $archivuser)); + +if ( $archivserver =~ /\@/ ) { + ($archivuser,$archivserver)=split(/\@/,$archivserver,2); + $user_at_host=$archivuser."\@".$archivserver; +} +if (!$archivserverport) { + if ( $transmittprot =~ /^ssh:/i ) { + $archivserverport="22"; + } elsif ( $transmittprot =~ /^ftp:/i ) { + $archivserverport="20"; + } else { + $archivserverport=""; + } +} +else { + if ( $transmittprot =~ /^ssh:/i ) { + $sshopt.=" -p ".$archivserverport; + $scpopt.=" -P ".$archivserverport; + } +} +$user_at_host=$default_archivuser."\@".$archivserver if (!defined $user_at_host); +&debug_message( 0, "realprinter=%s\n", $realprinter ); +&debug_message( 0, "transmittprot=%s\n", $transmittprot ); +&debug_message( 0, "archivserver=%s\n", $archivserver ); +&debug_message( 0, "archivserverport=%s\n", $archivserverport ); +&debug_message( 0, "user_at_host=%s\n", $user_at_host ); + +$DefaultOutput = "archiv"; +$DefaultCategory = "misc"; +$DefaultCompany = "none"; +$DefaultHierarchic = "none"; +$JobMail = 0; +$Untar = 0; +$wasTar = 0; + +# das kann mit dem perl-Net-CUPS erledigt werden: +if ( 1 == 0 ) { + $cupsObject = Net::CUPS->new(); + $printerObject = $cupsObject->getDestination( $PRINTER ); + $ppdObject = $cupsObject->getPPD( $PRINTER ); + + #print STDERR "printerObject =".Dumper($printerObject)."\n"; + #print STDERR "ppdObject =".Dumper($ppdObject)."\n"; + #print STDERR "options =".Dumper($printerObject->getOptions())."\n"; + #print STDERR "option Output =".Dumper($printerObject->getOptionValue("Output"))."\n"; + + #&debug_message( 0, "Output via perl-Net-CUPS=%s\n", &getprinter_option("Output",$printerObject,$ppdObject)) ; + #&debug_message( 0, "Category via perl-Net-CUPS=%s\n", &getprinter_option("Category",$printerObject,$ppdObject)) ; + #&debug_message( 0, "Hierarchic via perl-Net-CUPS=%s\n", &getprinter_option("Hierarchic",$printerObject,$ppdObject)) ; + #&debug_message( 0, "Company via perl-Net-CUPS=%s\n", &getprinter_option("Company",$printerObject,$ppdObject)) ; + #&debug_message( 0, "JobMail via perl-Net-CUPS=%s\n", &getprinter_option("JobMail",$printerObject,$ppdObject)) ; + + $DefaultOutput = &getprinter_option("Output",$printerObject,$ppdObject); + $DefaultCategory = &getprinter_option("Category",$printerObject,$ppdObject); + $DefaultHierarchic = &getprinter_option("Hierarchic",$printerObject,$ppdObject); + $DefaultCompany = &getprinter_option("Company",$printerObject,$ppdObject); + $JobMail = 1 if ( &getprinter_option("JobMail",$printerObject,$ppdObject) =~ /mailyes/ ); + $Untar = 1 if ( &getprinter_option("Untar",$printerObject,$ppdObject) =~ /untaryes/ ); +} +else { + # load ppd-File-Options + $PPDFILE = $ENV{"PPD"}; + + open( PPD, "< $PPDFILE" ) || do { + &error_message( "Fehler beim Lesen des PPD-Files: ".$PPDFILE."\n" ); + &warn_message( "fertig mit ret=".$CUPS_BACKEND_FAILED."\n" ); + exit $CUPS_BACKEND_FAILED; + }; + + while () { + if (m!^\**DefaultOutput:\s*\"*(.*)\"*$!) { + chomp; + $DefaultOutput = $1; + } + elsif (m!^\**DefaultCategory:\s*\"*(.*)\"*$!) { + chomp; + $DefaultCategory = $1; + } + elsif (m!^\**DefaultHierarchic:\s*\"*(.*)\"*$!) { + chomp; + $DefaultHierarchic = $1; + } + elsif (m!^\**DefaultCompany:\s*\"*(.*)\"*$!) { + chomp; + $DefaultCompany = $1; + } + elsif (m!^\**DefaultJobMail:\s*\"*(.*)\"*$!) { + chomp; + $JobMail = 1 if ( $1 =~ /mailyes/ ); + } + elsif (m!^\**DefaultUntar:\s*\"*(.*)\"*$!) { + chomp; + $Untar = 1 if ( $1 =~ /untaryes/ ); + } + } + close PPD; +} + +&debug_message( 1, "archivserver=%s\n", $archivserver ); +&debug_message( 1, "DefaultCompany=%s\n", $DefaultCompany ); +&debug_message( 1, "DefaultOutput=%s\n", $DefaultOutput ); +&debug_message( 1, "DefaultCategory=%s\n", $DefaultCategory ); +&debug_message( 1, "DefaultHierarchic=%s\n", $DefaultHierarchic ); +&debug_message( 1, "DefaultJobMail=%s\n", $JobMail ); +&debug_message( 1, "DefaultUntar=%s\n", $Untar ); +&debug_message( 1, "SpecialOutput=%s\n", $SpecialOutput ? $SpecialOutput : "not set" ); +&debug_message( 1, "PassThrough=%s\n", $PassThrough ? $PassThrough : "not set" ); +&debug_message( 1, "documentname=%s\n", $documentname ? $documentname : "not set" ); +&debug_message( 1, "Project=%s\n", $Project ? $Project : "not set" ); +&debug_message( 1, "destdir=%s\n", $destdir ? $destdir : "not set" ); + +if (!defined $destdir ) { + $destdir = "incomming"; +} + +$destdir = $default_archivhome."/".$destdir if ($destdir !~ /\/(THUEGA|CAPSPARC)/i ); + +if ($destdir =~ /\/(THUEGA|CAPSPARC)/ ) { + my $append=""; + if ($Company) { + $append .= "/".$Company; + } + else { + $append .= "/".$DefaultCompany if ( $DefaultCompany !~ /none/i ); + } + $append .= "/asvu/spool"; + $_ = $Output ? $Output : $DefaultOutput; + SWITCH: { + $append .= "/test", last SWITCH if /^test$/i; + $append .= "/prod", last SWITCH if /^prod$/i; + $append .= "/prod", last SWITCH if /^print$/i; + $append .= "/prod", last SWITCH if /^printarchiv$/i; + $append .= "/misc", last SWITCH; + } + $append =~ tr/a-z/A-Z/; + $destdir .= $append; +} +else { + if ($SpecialOutput) { + $destdir .= "/".$SpecialOutput; + } + else { + $_ = $Output ? $Output : $DefaultOutput; + SWITCH: { + $destdir .= "/archiv", last SWITCH if /^archiv$/i; + $destdir .= "/print", last SWITCH if /^print$/i; + $destdir .= "/printarchiv", last SWITCH if /^printarchiv$/i; + $destdir .= "/scan", last SWITCH if /^scan$/i; + $destdir .= "/test", last SWITCH if /^test$/i; + $destdir .= "/prod", last SWITCH if /^prod$/i; + $destdir .= "/online", last SWITCH if /^online$/i; + $destdir .= "/nooutput", last SWITCH; + } + $_ = $Category ? $Category : $DefaultCategory; + SWITCH: { + $destdir .= "/misc", last SWITCH if /^misc$/i; + $destdir .= "/va", last SWITCH if /^va$/i; + $destdir .= "/svk", last SWITCH if /^svk$/i; + $destdir .= "/m", last SWITCH if /^mahn$/i; + $destdir .= "/sap", last SWITCH if /^sap$/i; + $destdir .= "/hr", last SWITCH if /^hr$/i; + $destdir .= "/kis", last SWITCH if /^kis$/i; + $destdir .= "/ja", last SWITCH if /^ja$/i; + $destdir .= "/kd", last SWITCH if /^kd$/i; + $destdir .= "/erech", last SWITCH if /^erech$/i; + $destdir .= "/net", last SWITCH if /^net$/i; + $destdir .= "/isu", last SWITCH if /^isu$/i; + $destdir .= "/core", last SWITCH if /^core$/i; + $destdir .= "", last SWITCH if /^none$/i; + $destdir .= "/nocategory", last SWITCH; + } + if ($Company) { + $destdir .= $Company; + } + else { + $destdir .= $DefaultCompany if ( $DefaultCompany !~ /none/i ); + } + } +} + +$_ = $Hierarchic ? $Hierarchic : $DefaultHierarchic; +SWITCH: { + $destdir .= "/".$jahr."/".$monat."/".$tag, last SWITCH if /^YMD$/i; + $destdir .= "/".$jahr."/".$monat, last SWITCH if /^YM$/i; + $destdir .= "/".$jahr, last SWITCH if /^Y$/i; + $destdir .= "/".$jahr."/".$monat."/".$tag."-".$job, last SWITCH if /^Job$/i; +} + +$status=0; +if ( $transmittprot eq "ssh" ) { + $cmdln = $sshbin." ".$sshopt." ".$user_at_host." \"mkdir -p ".$destdir."\""; + + if ( $> == 0 ) { + $cmdln = "su -c '".$cmdln."' lp"; + } + + &debug_message( 1, "cmdln=%s\n", $cmdln ); + $status = system($cmdln); +} +if ( $status != 0 ) { + &error_message( "Fehler bei der \Übertragung zum Archiv: ".$cmdln." \[Fehlercode=".$status."\]\n" ); + &send_error_and_exit( + $CUPS_BACKEND_FAILED, + "CUPS [Spool ".$job.":".$scheme."] Fehler: mkdir", + "Bei der Übertragung zum Archiv ging was schief!\n", + "Die Kommandozeile war:\n", + $cmdln."\n", + "Der Fehlercode lautet: ".$status."\n" + ) +} + +# +# Im Falle eines CAPS-Archiv-Dirs muessen die Includes angelegt werden: +# +if ( "$destdir" =~ m/printarchiv\/va/ && $title =~ m/capsdat/ && $transmittprot eq "ssh" ) { + + my $project_dir = ""; + foreach $d ( "/usr/share/caps_".$Project, "/usr/share/caps_esg3", "/usr/share/caps_guf", "/usr/share/caps_erw", "/usr/share/caps_fm", "/usr/share/caps_fm2", "/usr/share/caps_evk", "/usr/share/caps_lkw", "/usr/share/caps_egs", "/usr/share/caps_thv", "/usr/share/caps_esm", "/usr/share/caps_swg", "/usr/share/caps_swan", "/usr/share/caps_ems" ) { + next until -d $d; + $project_dir = $d; + } + &debug_message( 1, "cmdln=%s\n", $cmdln ); + $cmdln = $sshbin." ".$sshopt." ".$user_at_host." \"[ -d ".$destdir." ] && cd ".$destdir." && ".$project_dir."/bin/create_caps_links --cp && ".$project_dir."/bin/create_session_links --ar\""; + + if ( $> == 0 ) { + $cmdln = "su -c '".$cmdln."' lp"; + } + + &debug_message( 1, "cmdln=%s\n", $cmdln ); + $status = system($cmdln); + if ( $status != 0 ) { + &error_message( "Fehler bei der \Übertragung zum Archiv: ".$cmdln." \[Fehlercode=".$status."\]\n" ); + &send_error_and_exit( + $CUPS_BACKEND_FAILED, + "CUPS [Spool ".$job.":".$scheme."] Fehler: create_caps_links/create_session_links", + "Bei der Übertragung zum Archiv ging was schief!\n", + "Die Kommandozeile war:\n", + $cmdln."\n", + "Der Fehlercode lautet: ".$status."\n" + ) + } +} + +@jobfiles2=(); + +foreach $filename (@jobfiles) { + my $ft = File::Type->new(); + my $filetype=$ft->checktype_filename($filename); + &debug_message( 1, "filetyp=%s\n", $filetype ); + if ($filetype =~ /application\/x-tar/) { + + my $cwd = getcwd; + chdir($TMPDIR) or die_message("Konnte nicht in das TEMP. %s wechseln!",$TMPDIR); + + my $tar=Archive::Tar->new( $filename ); + $wasTar = 1; + $tar->extract(); + my @tarfiles=(); + foreach my $tc ($tar->list_files()) { push @tarfiles, $TMPDIR."/".$tc } + push @jobfiles2, @tarfiles; + push @tempfilelist, @tarfiles; + + chdir($cwd) or die_message("Konnte nicht in das Arbeitsverz. %s wechseln!",$cwd); + } + else { + push @jobfiles2, $filename; + } +} +$count_jobfiles=scalar @jobfiles2; + + +$suffix = ""; +$i = 1; +foreach $filename (@jobfiles2) { + + # TMPLPD.20041102113805.QSYSPRT.EGSKEM02.719 + # USER.20041102113805.NAME.PRINTER.ID + # ok ok ok ok ok + if ( $count_jobfiles > 1 && ($wasTar == 0) ) { + $suffix = sprintf ":%d", $i; + $i++; + } + if ($PassThrough) { + if ( $wasTar == 1 ) { + $destfile = basename($filename.$suffix); + } + else { + $destfile = $title.$suffix; + } + } + else { + $destfile = $user.".".$jahr.$monat.$tag.$hour.$min.$sec.".".$title.".".$realprinter.".".$job.$suffix; + } + $dest = $user_at_host.":".$destdir."/".$destfile; + + $cmdln = $scpbin." ".$scpopt." ".$filename." ".$dest; + + &debug_message( 1, "filename=".$filename."\n" ); + if ( $debug > 1 ) { + my @vars = sort( keys(%ENV) ); + foreach (@vars) { + &debug_message( 2, "\$ENV{".$_."}=".$ENV{$_}."\n" ); + } + } + &debug_message( 0, "archiv ".$filename." ".$dest."\n" ); + + if ( $transmittprot eq "ftp" ) { + + my $remfname; + my $remret; + + &debug_message( 0, "ftp: archivserver=".$archivserver."\n" ); + &debug_message( 0, "ftp: archivuser=".$archivuser."\n" ); + my $ftp = Net::FTP->new($archivserver, Debug => $debug>=1?$debug-1:0, Port=>$archivserverport) ; + $status=0; + if (defined($ftp)) { + &debug_message( 1, "ftp: session is open\n" ); + + # zur Authentifikation wird /root/.netrc benutzt das backend selbst läuft als root!!! + # machine localhost login modftp password "XYZ" + # chmod 600 /root/.netrc + + if ($ftp->login($archivuser) != 0) { + &debug_message( 1, "ftp: archivuser is logged in\n" ); + $remret=$ftp->quot("site","namefmt 1"); # lange Dateinamen erlauben + &debug_message( 2, "ftp: quot site ret=%s\n",$remret ); + if ($remret==2) { + &debug_message( 0, "ftp: quot site namefmt 1 ok\n" ); + } + else { + &error_message( "ftp: quot site namefmt 1 failed\n" ); + $status=1; + } + if ($ftp->cwd($destdir) == 0) { # Zielverz ext nicht + # Zielverz successive anlegen + foreach $p ( split(/\//, $destdir) ) { + if ($ftp->cwd($p) == 0) { # Teilverz. ext nicht + $ftp->mkdir($p); + &die_message("ftp: mkd/cwd %s failed\n",$p) if ( $ftp->cwd($p) == 0 ) + } + } + } + &debug_message( 1, "ftp: cwd ok\n" ); + $ftp->binary; + $remfname=$ftp->put($filename,$destfile); + if (length $remfname) { + &debug_message( 0, "ftp: put ".$filename." ".$remfname." ok\n" ); + } + else { + &error_message( "ftp: put failed\n" ); + $status=1; + } + + # Nach der Uebertragung einer .fin Datei auf dem Zielserver noch ein Remote-CMD anschubsen + if ( $filename =~ m/\.fin/ && $destdir =~ m/stsfil/i ) { + $bbdest=$PRINTER; + $bbdest=~s/^[ZRP]//; + $remfname=$ftp->put($filename,$bbdest); + if (length $remfname) { + &debug_message( 0, "ftp: put ".$filename." ".$remfname." ok\n" ); + } + else { + &error_message( "ftp: put failed\n" ); + $status=1; + } + $remret=$ftp->quot("rcmd","CALL PGM(THSAPUTIL/STSFIL10) PARM('".$bbdest."')"); + &debug_message( 0, "ftp: quot CALL ret=%s\n",$remret ); + if ($remret==2) { + &debug_message( 0, "ftp: quot CALL PGM(THSAPUTIL/STSFIL10) PARM('".$bbdest."') ok\n" ); + } + else { + &error_message( "ftp: quot CALL PGM(THSAPUTIL/STSFIL10) PARM('".$bbdest."') failed\n" ); + $status=1; + } + } + } + else { + &error_message( "ftp: archivuser login failed\n" ); + $status=1; + } + } + else { + &error_message( "ftp: session open failed\n" ); + $status=1; + } + } + else { + if ( $> == 0 ) { + $cmdln = "su -c '".$cmdln."' lp"; + } + &debug_message( 1, "cmdln=%s\n", $cmdln ); + $status = system($cmdln); + } + + if ( $status != 0 ) { + &error_message( "Fehler bei der \Übertragung zum Archiv: ".$dest." \[Fehlercode=".$status."\]\n" ); + &send_error_and_exit( + $CUPS_BACKEND_FAILED, + "CUPS [Spool ".$job.":".$scheme."] Fehler: scp", + "Bei der Übertragung zum Archiv ging was schief!\n", + "Die Kommandozeile war:\n", + $cmdln."\n", + "Der Fehlercode lautet: ".$status."\n" + ) + } + &warn_message( "Spool ".$job." erfolgreich archiviert nach ".$dest."\n" ); + + if ( $realprinter !~ m/$scheme/ ) { + $status=&execute_file_lp("localhost",$realprinter,$filename,"",$filename); + exit($status) if ($status!=0); + &warn_message( "Spool ".$job." erfolgreich gedruckt auf ".$realprinter."\n" ); + &info_message( "Spool ".$job." erfolgreich archiviert (".$dest.") und gedruckt (".$realprinter.")\n" ); + if ( $CUPS_SERVERADMIN && $JobMail ) { + &send_message( + "CUPS [Spool ".$job.":".$scheme."] archiviert und gedruckt", + "Spool ".$job." erfolgreich archiviert (".$dest.") und gedruckt (".$realprinter.").\n" + ) + } + } + else { + &warn_message( "Spool ".$job." erfolgreich archiviert nach ".$dest."\n" ); + if ( $CUPS_SERVERADMIN && $JobMail ) { + &send_message( + "CUPS [Spool ".$job.":".$scheme."] archiviert", + "Spool ".$job." erfolgreich archiviert (".$dest.").\n" + ); + } + } +} + +foreach (@tempfilelist) { unlink or &error_message( "Fehler beim löschen der temporären Files\n") }; + +&warn_message( "Spool ".$job." fertig mit ret=".$CUPS_BACKEND_OK."\n" ); + +# wenn Inhalt von $cyclecountfile >= 1 +# Mail alles wieder OK + +&send_message("CUPS [Spool ".$job.":".$scheme."] Störung behoben", + "Spool ".$job." erfolgreich verarbeitet.\n") if ($cyclecount>=1); + +unlink($cyclecountfile); + +exit($CUPS_BACKEND_OK); + diff --git a/backend/modpdf b/backend/modpdf new file mode 100755 index 0000000..abb8762 --- /dev/null +++ b/backend/modpdf @@ -0,0 +1,415 @@ +#!/usr/bin/perl -w +# ______________________________________________________________________ +# +# Projekt: modprint_server +# Name: modpdf +# Autor: mgoppold +# Revision: $Revision: 187 $ +# letzte Änderung: $Date: 2012-12-18 20:12:21 +0100 (Di, 18. Dez 2012) $ +# durch: $Author: mgoppold $ +# Source: $HeadURL: svn+ssh://svnserver/svn/modprint_server/trunk/cups/backend/modpdf $ +# ______________________________________________________________________ +# +# CUPS backend for printing to pdf +# +# perltidy -b -syn -i=3 -ple -bbs -bbc -bbb -bar -msc=3 -l=1000 -ndnl -nwls='.' -nwrs='.' FILE +# +# lpadmin -p MYPDFMULTI -v modpdf-test:// -i /usr/share/cups/model/Distiller.ppd -E +# lp -d MYPDFMULTI raster.ps -o PassThrough=1 -o destination=mgoppold@tbz-pariv.de +# lp -d MYPDFMULTI raster.ps -o PassThrough=1 -o destination=modarch@ardenne/mypdfs +# lp -d MYPDFMULTI raster.ps -o PassThrough=1 +# +# lpadmin -p MYPDFINCDIR -v modpdf-test://mypdfincdir -i /usr/share/cups/model/Distiller.ppd -E +# lpadmin -p MYPDFUAH -v modpdf-test://modarch@esg-archiv/incomming/test -i /usr/share/cups/model/Distiller.ppd -E +# lpadmin -p MYPDFMAIL -v modpdf-test://mgoppold@tbz-pariv.lan -i /usr/share/cups/model/Distiller.ppd -E + +use Carp; +use File::Temp qw/ :mktemp /; +use File::Basename; +use Mail::Send; +use Config::General; +use Email::Address; +use MIME::Words qw(encode_mimewords); +use MIME::Lite; + +BEGIN { push @INC, ( ".", "bin", "lib", "../lib", "/usr/share/modprint_server/lib" ) } +use ModPrint::Server; +use ModPrint::Server qw ( $debug $scheme ); + +# +# ----------------------------------------------------------------------------- +# + +my ( $CUPS_SERVERROOT, $SOFTWARE ); +my ( $scheme, $URI, $realprinter, $PRINTER ); +my ( $cmdln, $status, @tempfilelist ); +my ( $jahr, $monat, $tag, $hour, $min, $sec ); +my ( $job, $user, $title, $copies, $options, $filename, $filename2 ); +my ( $destfile, $transmitt, $default_pdfhome ); +my ( $PPDFILE, $JobMail ); +my ( $fh, $filetyp, $TMPDIR ); +my ( @optionlist, $SpecialOutput ); +my ( %serverconfig, $CUPS_SERVERADMIN ); +my ( $msg, $line, $cline ); +my ( $scpbin, $scpopt, $unused1, $unused2, @emails, $user_at_host ); +my ($debug); + +# +# ----------------------------------------------------------------------------- +# + +sub send_message() { + my $subject = shift; + if ($CUPS_SERVERADMIN) { + $msg = Mail::Send->new() || &error_message( "Fehler beim versenden der Fehlermail an %s\n", $CUPS_SERVERADMIN ); + $msg->to($CUPS_SERVERADMIN); + $msg->subject($subject); + $fh = $msg->open; + print $fh @_; + $fh->close || &error_message( "Fehler beim versenden der Fehlermail an %s\n", $CUPS_SERVERADMIN ); + } +} + +sub cleanupexit() { + my $retcode = shift; + foreach (@tempfilelist) { unlink or error_message( "Fehler beim löschen der temporären Files\n") }; + exit $retcode; +} + +sub send_error_and_exit() { + my $retcode = shift; + my $subject = shift; + &send_message( $subject, @_ ); + &warn_message( "fertig mit ret=".$retcode."\n" ); + &cleanupexit($retcode); +} + +# +# ----------------------------------------------------------------------------- +# + +@tempfilelist = (); +$debug = 1; + +# hier liegt Monat zw. 0 und 11 +( $sec, $min, $hour, $tag, $monat, $jahr ) = (localtime)[ 0, 1, 2, 3, 4, 5 ]; +$monat += 1; +$jahr += 1900; +$monat = sprintf( "%.2d", $monat ); +$tag = sprintf( "%.2d", $tag ); +$sec = sprintf( "%.2d", $sec ); +$min = sprintf( "%.2d", $min ); +$hour = sprintf( "%.2d", $hour ); + +$_ = $0; +SWITCH: { + $scheme = "modpdf", last SWITCH if /\/modpdf$/; + $scheme = "modpdf-test", last SWITCH if /\/modpdf-test$/; +} + +if ( @ARGV == 0 ) { + print "direct ".$scheme." \"Unknown\" \"Printing to ".$scheme."\"\n"; + print "file ".$scheme."://realprinter \"Unknown\" \"print to\"\n"; + print "file ".$scheme."://user\@host/dir \"Unknown\" \"copy to\"\n"; + print "file ".$scheme."://email\@example.de \"Unknown\" \"mail to\"\n"; + print "direct ".$scheme.":// \"Unknown\" \"print to\"\n"; + exit $CUPS_BACKEND_OK; +} + +# in case of wrong number of arguments: print usage hint +if ( @ARGV != 5 && @ARGV != 6 ) { + print " +Usage: ".$scheme." job-id user title copies options [file] + example for device-URI: '".$scheme."://realprinter eq ARCHIV ' + '".$scheme."://user\@host/dir eq modwork_tbz_p\@tbzwork/import' + '".$scheme."://email\@example.de eq modarch\@tbz-pariv.de' + +Install a printqueue with 'lpadmin -p -v ".$scheme.":// -i /usr/share/cups/model/Distiller.ppd -E +Option -o destination overwrites URI: lp -d MYPDF -o destination=modarch\@tbz-pariv.de file.pdf +"; + exit $CUPS_BACKEND_FAILED; +} + +# Flush everything immediately. +$| = 1; + +( $job, $user, $title, $copies, $options, $filename ) = @ARGV; + +$ModPrint::Server::debug = $debug; +$ModPrint::Server::job = $job; +$ModPrint::Server::scheme = $scheme; + +$SOFTWARE = $ENV{"SOFTWARE"} ? $ENV{"SOFTWARE"} : "CUPS/1.4.6"; +$TMPDIR = $ENV{"TMPDIR"} ? $ENV{"TMPDIR"} : "/tmp/"; +$CUPS_SERVERROOT = $ENV{"CUPS_SERVERROOT"}; +$PRINTER = $ENV{"PRINTER"}; +$PPDFILE = $ENV{"PPD"}; +$URI = $ENV{"DEVICE_URI"}; +$ENV{GS_OPTIONS} = "-sPAPERSIZE=a4 -I."; + +# %serverconfig = ParseConfig($CUPS_SERVERROOT."/cupsd.conf"); +# $CUPS_SERVERADMIN = $serverconfig{'ServerAdmin'}; +$CUPS_SERVERADMIN = "modarch\@localhost"; +$JobMail = 0; +$transmitt = "lp"; +$scpbin = "/usr/bin/scp"; +$scpopt = "-oProtocol=2 -c blowfish -p -q -i ".$CUPS_SERVERROOT."/ssh.identity "; +$user_at_host = "modarch\@localhost/incomming"; +@emails = (); + +&debug_message( 1, "job=%s\n", $job ); +&debug_message( 1, "user=%s\n", $user ); +&debug_message( 1, "title=%s\n", $title ); +&debug_message( 1, "copies=%s\n", $copies ); +&debug_message( 1, "options=%s\n", $options ? $options : "not set" ); +&debug_message( 1, "filename=%s\n", $filename ? $filename : "not set" ); +&debug_message( 1, "CUPS_SERVERADMIN=%s\n", $CUPS_SERVERADMIN ? $CUPS_SERVERADMIN : "not set" ); + +$default_pdfhome = $ENV{"DEFAULT_PDFHOME"}?$ENV{"DEFAULT_PDFHOME"}:"."; + +@optionlist = split( /\s/, $options ); +foreach $option (@optionlist) { + my ( $var, $value ) = split( /\s*=\s*/, $option, 2 ); + &debug_message( 2, "options: > (%s,%s)\n", $var, $value ); + $var =~ s/[ \.,;:*\-\+#~$"?&\/\\()\[\]{}]//g; # um gültige Var-Name zu erhalten + $value =~ s/[{}]//g; # die {} entfernen weil eine Substitution von + # ${VAR} nicht geht wohl aber $VAR + $value =~ s/\$(\w+)/${$1}/g; # Variablen auflösen + no strict 'refs'; + &debug_message( 2, "options: >> (%s,%s)\n", $var, $value ); + $$var = $value; + &debug_message( 2, "options: >>> (%s,%s)\n", $var, $value ); +} + +$user = $ENV{"USER"} if ( !$user ); +$user = "cups" if ( !$user ); +$user =~ tr/ .,;:*+#~$"?&\/\\()[]/_/; + +# +# Im PassThrough Modus hat der "documentname" eine höhere Priorität als der "title" +# +if ($title) { + if ( !$PassThrough ) { + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; + if ( "$title" =~ /(stdin|Untitled)/ && $documentname ) { + $title = $documentname; + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; + } + else { + $title =~ s/_stdin_/$scheme/g; + } + } + else { + $title = $documentname if ($documentname); + } +} +else { + $title = "$scheme"; + $title = $documentname if ($documentname); + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; +} + +if ( !defined($filename) ) { + ( $fh, $filename ) = mkstemps( $TMPDIR."/".$title."_XXXXXX", ".prn" ); + while () { + print $fh $_; + } + close($fh); + push @tempfilelist, $filename; +} + +( $unused1, $unused2, $realprinter, $savedir ) = split( /\//, $URI, 4 ); +&debug_message( 0, "realprinter=%s\n", $realprinter ); +if ( defined $destination ) { + ( $realprinter, $savedir ) = split( /\//, $destination, 4 ); + &debug_message( 0, "new realprinter=%s\n", $realprinter ); +} + +if ( !defined $savedir ) { + $savedir = ""; +} + +$savedir = $default_pdfhome."/".$savedir; + +&debug_message( 0, "savedir=%s\n", $savedir ); +if ( $realprinter =~ /\@/ && ( length $savedir ) ) { + $user_at_host = $realprinter; + $transmitt = "scp"; + &debug_message( 0, "user_at_host=%s\n", $user_at_host ); +} +elsif ( $realprinter =~ /\@/ ) { + @emails = Email::Address->parse($realprinter); + $transmitt = "mail"; + &debug_message( 0, "emails=%s\n", join( "|", @emails ) ); +} +&debug_message( 0, "transmitt=%s\n", $transmitt ); + +# +# ----------------------------------------------------------------------------- +# + +open( PPD, "< ".$PPDFILE ) || do { + printf STDERR "ERROR: [Job %d:%s] Fehler beim Lesen des PPD-Files: %s\n", $job, $scheme, $PPDFILE; + &cleanupexit($CUPS_BACKEND_FAILED); +}; +while () { + if (m!^\**DefaultJobMail:\s*\"*(.*)\"*$!) { + chomp; + $JobMail = 1 if ( $1 =~ /mailyes/ ); + } +} +close PPD; + +# +# ----------------------------------------------------------------------------- +# + +$filetyp = $ENV{"CONTENT_TYPE"}; + +if ($PassThrough) { + if ( $title =~ /.pdf$/ ) { + $destfile = $title; + } + else { + $destfile = $title; + $destfile =~ s/.e*ps$/.pdf/i; + $destfile =~ s/.pcl$/.pdf/i; + $destfile =~ s/.([0-9][0-9]*)$/.$1.pdf/i; + } +} +else { + $destfile = $user.".".$jahr.$monat.$tag.$hour.$min.$sec.".".$title.".".$PRINTER.".".$job.".pdf"; +} + +if ( + "$filetyp" =~ m/application\/postscript/i || + "$filetyp" =~ m/application\/caps-postscript/i || + "$filetyp" =~ m/application\/vnd.cups-raw/i || + "$filetyp" =~ m/application\/vnd.hp-hpgl/i + ) { + + &debug_message( 0, "filetyp=%s is OK\n", $filetyp ); + + $filename2 = $TMPDIR."/".$destfile; + push @tempfilelist, $filename2; + + if ( "$filetyp" =~ m/application\/postscript/i || + "$filetyp" =~ m/application\/caps-postscript/i ) { + $cmdln = "/usr/bin/gs -I. -dDisableFAPI -sDEVICE=pdfwrite -sOutputFile=".$filename2." -dNOPAUSE -DBATCH -dSAFER -dCompatibilityLevel=1.2 -f ".$filename; + } + if ( + "$filetyp" =~ m/application\/vnd.hp-hpgl/i || + "$filetyp" =~ m/application\/vnd.cups-raw/i + ) { + $cmdln = "/usr/bin/pcl6 -dDisableFAPI -sDEVICE=pdfwrite -sOutputFile=".$filename2." -dNOPAUSE -DBATCH ".$filename; + } + + if ( $> == 0 ) { $cmdln = "su -c '".$cmdln."' lp"; } + &debug_message( 1, "cmdln=%s\n", $cmdln ); + $status = system($cmdln); + if ( $status != 0 ) { + &error_message( "Fehler w\ährend der Konvertierung für Drucker PDF: ".$cmdln." \[Fehlercode=".$status."\]\n" ); + &send_error_and_exit( + $CUPS_BACKEND_FAILED, + "CUPS [Spool ".$job.":".$scheme."] Fehler: Konvertierung", + "Fehler während der Konvertierung für Drucker ".$PRINTER." (".$realprinter.")\n", + "Die Kommandozeile war:\n", + $cmdln."\n", + "Der Fehlercode lautet: ".$status."\n" + ); + } +} +elsif ( "$filetyp" =~ m/application\/pdf/i ) { + + &debug_message( 0, "filetyp=%s is OK\n", $filetyp ); + $filename2 = $filename; + +} +else { + &error_message( "Unbekannter Typ: ".$filetyp."\n" ); + &send_error_and_exit( + $CUPS_BACKEND_FAILED, + "CUPS [Spool ".$job.":".$scheme."] Fehler: unbekannter Typ", + "", + "Filetyp:", + $filetyp."\n", + "" + ); +} + +if ( $transmitt eq "scp" ) { + + $cmdln = $scpbin." ".$scpopt." ".$filename2." ".$user_at_host.":".$savedir."/".$destfile; + + if ( $> == 0 ) { $cmdln = "su -c '".$cmdln."' lp"; } + $status = system($cmdln); + if ( $status != 0 ) { + &error_message( "Fehler beim scp: ".$cmdln." \[Fehlercode=".$status."\]\n" ); + &send_error_and_exit( + $CUPS_BACKEND_FAILED, + "CUPS [Spool ".$job.":".$scheme."] Fehler: scp", + "Beim scp auf den ".$PRINTER." ging was schief\!", + "Die Kommandozeile war:\n", + $cmdln."\n", + "Der Fehlercode lautet: ".$status."\n" + ); + } + &info_message( $transmitt." ".$filename2." ".$user_at_host.":".$savedir."/".$destfile."\n" ); +} +elsif ( $transmitt eq "mail" ) { + my $recopients; + + foreach my $r (@emails) { + $recipents .= "," if ( length $recipents ); + $recipents .= $$r[1]; + } + + $msg = MIME::Lite->new( + From => encode_mimewords($CUPS_SERVERADMIN), + To => encode_mimewords($recipents), + Subject => encode_mimewords('PDF vom Druckserver'), + Type => 'multipart/mixed' + ) || &error_message( "Fehler beim versenden der Mail an ".$recipents." (create)\n" ); + $msg->attach( + Type => 'TEXT', + Data => "\n". + " Sehr geehrter Auftraggeber,\n\n". + " wir haben Ihren Druckjob ".$title." verarbeitet.\n". + " Im Anhang dieser Mail ist das entstandene ".$destfile." enthalten.\n\n". + " Mit freundlichen Grüßen\n". + " Ihre TBZ-PARIV GmbH\n\n". + " Diese Nachricht wurde automatisch generiert.\n" + ) || &error_message( "Fehler beim versenden der Mail an ".$recipents." (attach txt)\n" ); + $msg->attach( + Type => 'application/pdf', + Path => $filename2, + Filename => $destfile, + Disposition => 'attachment' + ) || &error_message( "Fehler beim versenden der Mail an ".$recipents." (attach pdf)\n" ); + $status=$msg->send || &error_message( "Fehler beim versenden der Mail an ".$recipents." (send)\n" ); + &info_message( $transmitt." ".$filename2." ".$recipents."\n" ); +} +else { + $status=&execute_file_lp("localhost",$realprinter,$destfile,"-o raw -o PassThrough=1",$filename2); +} + +&info_message( "Spool ".$job." fertig mit ret=".$status."\n" ); + +# +# ----------------------------------------------------------------------------- +# + +if ( $CUPS_SERVERADMIN && $JobMail ) { + &send_message( + "CUPS [Spool ".$job.":".$scheme."] verarbeitet", + "Spool ".$job." erfolgreich verarbeitet (".$realprinter.").\n" + ); +} + +# +# ----------------------------------------------------------------------------- +# +&cleanupexit($CUPS_BACKEND_OK); diff --git a/backend/modsave b/backend/modsave new file mode 100755 index 0000000..89f2f9e --- /dev/null +++ b/backend/modsave @@ -0,0 +1,100 @@ +#!/usr/bin/perl -w +# $Id: modsave 72 2012-03-21 14:23:40Z fjunge $ +# $HeadURL: svn+ssh://svnserver/svn/modprint_server/trunk/cups/backend/modsave $ +# +# CUPS backend for printing via CAPS +# +# Environment Variables: +# +# CHARSET - The character set used by the client for this print file +# CONTENT_TYPE - The original document type, such as "application/postscript" +# CUPS_DATADIR - The location of CUPS data files +# CUPS_SERVERROOT - The location of CUPS configuration files +# DEVICE_URI - The output device URI +# LANG - The language used by the client for this print file +# PATH - The execution path exported to the filter +# PPD - The full filename of the printer's PPD file +# PRINTER - The name of the printer queue +# RIP_CACHE - The maximum amount of memory each filter should use +# SOFTWARE - The name of the CUPS software, typically "CUPS/1.1" +# TZ - The local timezone +# USER - The name of the current user +# +# DEBUG: - a debug message +# INFO: - an informational message +# WARNING: - a warning message +# ERROR: - an error message +# PAGE: - a page accounting message +# export DEVICE_URI=caps://WORK/TST +# cat /etc/passwd | /usr/lib/cups/backend/caps 123 fjunge Test 1 "" +# +use File::Temp qw/ :mktemp /; + + +my $CUPS_SERVERROOT = $ENV{"CUPS_SERVERROOT"}; +my $scheme = "caps"; +my $LOGFILE="/var/log/cups/modsave.log"; +my $CUPS_BACKEND_OK = 0; +my $CUPS_BACKEND_FAILED = 1; +my $CUPS_BACKEND_AUTH_REQUIRED = 2; +my $CUPS_BACKEND_HOLD = 3; +my $CUPS_BACKEND_STOP = 4; +my $CUPS_BACKEND_CANCEL = 5; + +open(LOGFILE,">>$LOGFILE"); + +if (@ARGV == 0) { + print "file $scheme \"Unknown\" \"Printing with SAVE\"\n"; + close LOGFILE; + exit 0; +} +my $JOBNR=$ARGV[0]; +$PRINTER=$ENV{"PRINTER"}; +print LOGFILE "SAVE [$JOBNR]: start $PRINTER\n"; + +# in case of wrong number of arguments: print usage hint +if (@ARGV != 5 && @ARGV != 6) { + print " +Usage: save job-id user title copies options [file] + example for device-URI: 'modsave://{dirname}' + +Install a printqueue with 'lpadmin -p +-v modsave://{dirname} -E + +"; + close LOGFILE; + exit 1; +} + + +if (defined ($ARGV[5])) { + $file = $ARGV[5]; +} +else { + ($fh,$file) = mkstemps( "caps_XXXXXX", ".prn"); + while () { + print $fh $_ ; + } + close($fh); +} + + +$uri = $ENV{"DEVICE_URI"}; +my $sshto=$uri; +$sshto =~ s/^.*:\/\///; + +print LOGFILE "SAVE [$JOBNR]: URI=$uri sshto=$sshto (serverroot=$CUPS_SERVERROOT)\n"; +my $ret=0; +$ret=system ("scp \"${file}\" \"$sshto\" >> $LOGFILE 2>&1"); +if ( $ret == 0 ) { + print LOGFILE "SAVE [$JOBNR]: $file nach $sshto gespeichert\n"; + print STDERR "INFO: $file nach $sshto gespeichert\n"; + close LOGFILE; + exit $CUPS_BACKEND_OK; +} +else { + print LOGFILE "SAVE [$JOBNR]: Probleme beim scp von $file nach $sshto (ret=$ret)\n"; + print STDERR "ERROR: [$JOBNR]: Probleme beim scp von $file nach $sshto (ret=$ret)\n"; + close LOGFILE; + exit $CUPS_BACKEND_HOLD; +} diff --git a/backend/modzip b/backend/modzip new file mode 100755 index 0000000..fabd1fb --- /dev/null +++ b/backend/modzip @@ -0,0 +1,216 @@ +#!/usr/bin/perl -w +# ______________________________________________________________________ +# +# Projekt: modprint_server +# Name: modzip +# Autor: mgoppold +# Revision: $Revision: 96 $ +# letzte Änderung: $Date: 2012-09-20 12:40:26 +0200 (Do, 20. Sep 2012) $ +# durch: $Author: mgoppold $ +# Source: $HeadURL: svn+ssh://svnserver/svn/modprint_server/trunk/cups/backend/modarch $ +# ______________________________________________________________________ +# +# CUPS backend for zipping FILES and transmit via ftp +# +# perltidy -b -syn -i=3 -ple -bbs -bbc -bbb -bar -msc=3 -l=1000 -ndnl -nwls='.' -nwrs='.' FILE +# + +use Carp; +use File::Temp qw/ :mktemp /; +use File::Basename; +use Net::CUPS; +use Data::Dumper; +use IPC::Open3; +use File::Type; + +use Archive::Tar; +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); + +BEGIN { push @INC, ( ".", "bin", "lib", "../lib", "/usr/share/modprint_server/lib" ) } +use ModPrint::Server; +use ModPrint::Server qw ( $debug $scheme ); + +my ( $CUPSVERSION, $SOFTWARE, $PRINTER, $PPD, $TMPDIR, $PassThrough ); +my ( $job, $user, $title, $copies, $options, $filename ); +my ( $scheme, $uri, $realprinter, $realserver, $default_realserver, $unused1, $unused2,$backendstatus ); +my ( @optionlist, @tempfilelist ); +my ( $debug, $fh, $pid, $cmd_exit_status, $errmsg ); + +$debug = 2; +@optionlist = (); +@tempfilelist = (); +$default_realserver = $ENV{"DEFAULT_REALSERVER"}?$ENV{"DEFAULT_REALSERVER"}:"localhost"; + +$_ = $0; +SWITCH: { + $scheme = "modzip", last SWITCH if /\/*modzip$/; + $scheme = "modzip-test", last SWITCH if /\/*modzip-test$/; +} + +if ( @ARGV == 0 ) { + print "direct ".$scheme." \"Unknown\" \"modzip\"\n"; + print "file ".$scheme."://realprinter \"Unknown\" \"zip and transmit via realprinter\"\n"; + exit $CUPS_BACKEND_OK; +} + +# in case of wrong number of arguments: print usage hint +if ( @ARGV != 5 && @ARGV != 6 ) { + print " +Usage: ".$scheme." job-id user title copies options [file] + example for device-URI: '".$scheme."://real_printer_name' + +Install a printqueue with lpadmin -p +-v ".$scheme.":// -E + +"; + exit $CUPS_BACKEND_FAILED; +} + +# Flush everything immediately. +$| = 1; + +( $job, $user, $title, $copies, $options, $filename ) = @ARGV; + + +$ModPrint::Server::debug = $debug; +$ModPrint::Server::job = $job; +$ModPrint::Server::scheme = $scheme; +$backendstatus=$CUPS_BACKEND_OK; + +$SOFTWARE = $ENV{"SOFTWARE"} ? $ENV{"SOFTWARE"} : "CUPS/1.4.6"; +$TMPDIR = $ENV{"TMPDIR"} ? $ENV{"TMPDIR"} : "/tmp/"; +$PRINTER = $ENV{"PRINTER"}; +$PPD = $ENV{"PPD"}; + +debug_message( 0, "job=%s\n", $job ); +debug_message( 0, "user=%s\n", $user ); +debug_message( 0, "title=%s\n", $title ); +debug_message( 0, "copies=%s\n", $copies ); +debug_message( 0, "options=%s\n", $options ? $options : "not set" ); +debug_message( 0, "filename=%s\n", $filename ? $filename : "not set" ); +debug_message( 0, "PRINTER=%s\n", $PRINTER ? $PRINTER : "not set" ); + +# Wenn in den options schon Leerzeichen vorkommen: +# options=document-name=Allonge\ 56235:\ ComSell\ GmbH job-uuid=urn:uuid:4eaa0aff-f2b8-348c-5449-4934aff0d4fa +# kann optionlist nicht sauber trennen, deshalb werden die Leerzeichen schon hier durch _ ersetzt +$options =~ s/\\ /_/g; +@optionlist = split( /\s/, $options ); +foreach $option (@optionlist) { + my ( $var, $value ) = split( /\s*=\s*/, $option, 2 ); + if ( !defined $value ) { + + # ab cups>1.5 kann es Optionen ohne Wert geben + # [capspstopcl] options=finishings=3 number-up=1 OptionPostScript job-uuid=urn:uuid:110a4... + # [capspstopcl] options=finishings=3 number-up=1 noOptionPostScript job-uuid=urn:uuid:110a4... + if ( $var =~ /^no/ ) { + $var =~ s/^no//; + $value = 0; + } + else { + $value = 1; + } + } + debug_message( 3, "parse options ($var,$value)\n", $var, $value ); + + $var =~ s/[ \.,;:*\-\+#~$"?&\/\\()\[\]{}]//g; # um gültige Var-Name zu erhalten + $var = "Option_".$var; + $value =~ s/[{}]//g; # die {} entfernen weil eine Substitution von + # ${VAR} nicht geht wohl aber $VAR + $value =~ s/\$(\w+)/${$1}/g; # Variablen auflösen + no strict 'refs'; + debug_message( 3, "parse options (%s,%s)\n", $var, $value ); + $$var = $value; + debug_message( 2, "parse options (%s,%s)\n", $var, $$var ); +} + +# +# Im PassThrough Modus hat der "documentname" eine höhere Priorität als der "title" +# + +if ($title) { + if ( !$PassThrough ) { + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; + if ( "$title" =~ /(stdin|Untitled)/ && $documentname ) { + $title = $documentname; + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; + } + else { + $title =~ s/_stdin_/$scheme/g; + } + } + else { + $title = $documentname if ($documentname); + } +} +else { + $title = "$scheme"; + $title = $documentname if ($documentname); + $title =~ s/[[:punct:]]+/_/g; + $title =~ s/[[:space:]]+/_/g; +} + +# sicherstellen, dass wir mit einem File arbeiten können +if ( !defined($filename) ) { + ( $fh, $filename ) = mkstemps( $TMPDIR."/".$job."_".$scheme."_XXXXXX", ".prn" ); + while () { + print $fh $_; + } + close($fh); + push @tempfilelist, $filename; + $workdir=$TMPDIR; +} +else { + $workdir=dirname($filename); +} +chdir($workdir) or die_message("Konnte nicht in das Sessionverz. %s wechseln!",$workdir); +my $basefilename=basename($title,(".ps",".pcl",".pdf","_ps","_pcl","_pdf")); + + +$uri = $ENV{"DEVICE_URI"}; +( $unused1, $unused2, $realprinter, $realserver ) = split( /\//, $uri, 4 ); + +$realserver=$default_realserver if (! (defined $realserver && length $realserver)); + +my $ft = File::Type->new(); +my $filetype=$ft->checktype_filename($filename); + +$title =~ s/_ps$/_pcl/ if ( "$filetype" !~ m/postscript/i ); + +debug_message( 0, "filetyp %s\n", $filetype ); +debug_message( 0, "workdir %s \n", $workdir ); +debug_message( 0, "basefilename %s \n", $basefilename ); +debug_message( 0, "title %s \n", $title ); +debug_message( 0, "realprinter %s \n", $realprinter ); +debug_message( 0, "realserver %s \n", $realserver ); + +my $zip = Archive::Zip->new(); +my $file_member = $zip->addFile( $filename, $title ); +$file_member->desiredCompressionLevel(COMPRESSION_LEVEL_FASTEST); + +unless ( $zip->writeToFileNamed($TMPDIR."/".$basefilename.'.zip') == AZ_OK ) { + die_message('Schreibfehler bei der Erstellung von %s\n',$basefilename.'.zip'); +} +push @tempfilelist, $TMPDIR."/".$basefilename.".zip"; + +open( WH, "> ".$TMPDIR."/".$basefilename."F.fin" ) or die_message("Kann Datei %s nicht schreiben!\n",$basefilename."F.fin"); + print WH $basefilename.".zip\n"; + print WH $basefilename."F.fin\n"; +close(WH); +push @tempfilelist, $TMPDIR."/".$basefilename."F.fin"; + +chdir($TMPDIR) or die_message("Konnte nicht in das TEMP. %s wechseln!",$TMPDIR); +my $tar = Archive::Tar->new(); +$tar->add_files( $basefilename.".zip",$basefilename."F.fin" ); +$tar->write($TMPDIR."/".$basefilename.".tar"); +push @tempfilelist, $TMPDIR."/".$basefilename.".tar"; + + +$backendstatus=&execute_file_lp($realserver,$realprinter,$basefilename.".tar","-o raw -o PassThrough=1 -o Untar=1 ",$TMPDIR."/".$basefilename.".tar"); + +foreach (@tempfilelist) { unlink or &die_message( "Fehler beim löschen der temporären Files\n") }; + +&info_message( "Spool ".$job." fertig mit ret=".$backendstatus."\n" ); + +exit($backendstatus); diff --git a/backend/pdfdistiller b/backend/pdfdistiller new file mode 100644 index 0000000..c376edc --- /dev/null +++ b/backend/pdfdistiller @@ -0,0 +1,94 @@ +#!/bin/sh +# +# This script is intended to be used as a CUPS backend, to create +# PDF file on-the-fly. Just create a printer using the device uri +# pdf:/path/to/dir/. When printing to this printer, a PDF file +# will be generated in the directory specified. The file name will +# be either ".pdf" or "unknown.pdf", depending wether the +# jobname is empty or not. +# +# To use it, simply copy this script to your backend directory, and +# create a printer with the correct URI. That's it. +# +# Copyright (C) Michael Goffioul (kdeprint swing be) 2001 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +LOGFILE=/tmp/pdf.log +PDFBIN=`which ps2pdf` +FILENAME= +# this is borrowed from printpdf script for the filename +PRINTTIME=`date +%b%d-%H%M%S` + +echo "Executable: $PDFBIN" > $LOGFILE +echo "Arguments: |$1|$2|$3|$4|$5|$6|" >> $LOGFILE +echo $# $PRINTTIME >> $LOGFILE + +# case of no argument, prints available URIs +if [ $# -eq 0 ]; then + if [ ! -x "$PDFBIN" ]; then + exit 0 + fi + echo "direct pdf \"Unknown\" \"PDF Writing\"" + exit 0 +fi + +# case of wrong number of arguments +if [ $# -ne 5 -a $# -ne 6 ]; then + echo "Usage: pdf job-id user title copies options [file]" + exit 1 +fi + +# get PDF directory from device URI, and check write status +PDFDIR=${DEVICE_URI#pdf:} +if [ ! -d "$PDFDIR" -o ! -w "$PDFDIR" ]; then + echo "ERROR: directory $PDFDIR not writable" + exit 1 +fi + +echo "PDF directory: $PDFDIR" >> $LOGFILE + +# generate output filename +OUTPUTFILENAME= +if [ "$3" = "" ]; then + OUTPUTFILENAME="$PDFDIR/unknown.pdf" +else + # OUTPUTFILENAME="$PDFDIR/${3//[^[:alnum:]]/_}.pdf" + # I changed this to user name, and the printtime to track down who + # printed the PDF and when, samba printing just uses nobody + + OUTPUTFILENAME="$PDFDIR/$2-$PRINTTIME.pdf" + echo "PDF file: $OUTPUTFILENAME placed in: $PDFDIR" >> $LOGFILE +fi + +echo "Output file name: $OUTPUTFILENAME" >> $LOGFILE + +# run ghostscript +if [ $# -eq 6 ]; then + $PDFBIN $6 "$OUTPUTFILENAME" +#>& /dev/null +else + $PDFBIN - "$OUTPUTFILENAME" >& /dev/null +fi + +# modify ownership and permissions on the file +# - world readable +# - owns to user specified in argument +chmod a+r "$OUTPUTFILENAME" +if [ "$2" != "" ]; then + chown $2 "$OUTPUTFILENAME" +fi + +exit 0 diff --git a/bash.txt b/bash.txt new file mode 100644 index 0000000..4f9a212 --- /dev/null +++ b/bash.txt @@ -0,0 +1,67 @@ +###prüfen ob script syntaktisch richtig ist (im script) +set -n +###alle kommandos anzeigen, die ausgeführt werden (im script) +set -x +###wenn variable leer oder nicht existiert wird Wert darauf gesetzt +${Variablenname:-Wert} +###anzahl der zeichen in variable +${#Variablenname} +#Zufallszahl +RAND=`od -d -N2 -An /dev/urandom` +RAND=`cat /proc/sys/kernel/random/uuid | cut -c1-4 | od -d | head -1 | cut -d' ' -f2` + +###größe einer datei +stat -c%s file +### +${parameter:-word} ... wenn parameter leer oder nicht existiert wird word substituiert sonst parameter +${parameter:=word} ... wenn parameter leer oder nicht existiert ist parameter=word + substituiert +${parameter:?word} ... wenn parameter leer oder nicht existiert dann substituiert word und exit +${parameter:+word} ... wenn parameter existiert und nicht leer dann parameter=word + substituiert +${variable:start:n} ... gibt Inhalt von start beginnend n Zeichen der Variablen zurück +${variable:start} ... gibt Inhalt der Variablen ab start zurück +${variable: -n} ... gibt die letzten n Zeichen der Variable zurück +${variable%muster} ... Löscht kürzesten Teil der auf Muster passt, beginnend von hinten +${variable%%muster} ... Löscht längsten Teil der auf Muster passt, beginnend von hinten +${variable#muster} ... Löscht kürzesten Teil der auf Muster passt, beginnend von vorne +${variable##muster} ... Löscht längsten Teil der auf Muster passt, beginnend von vorne +${#variable} ... Länge der Variablen +${variable/muster} ... durchsucht Variable von hinten und entfernt zutreffendes Muster +${variable//muster} ... durchsucht Variable von vorne und entfernt zutreffendes Muster +${var/mus/str} ... durchsucht Variable von hinten und ersetzt erstes zutreffendes Muster mit String +${var//mus/str} ... durchsucht Variable von vorne und ersetzt alle zutreffenden Muster mit String +$* ... identisch zu $@ +${#foo[@]} ... Anzahl der Elemente des Arrays foo +${*:start:n} ... gibt n Elemente mit start beginnend des Arrays aus +"$*" ... Ausgabe "$1 $2 $3" +$@ ... Ausgabe der Positionsparameter ab $1 +"$@" ... Ausgabe "$1" "$2" "$3" +$# ... Anzahl der übergebenen Positionsparameter ohne $0 +$? ... Rückgabewert des unmittelbar zuvor ausgeführten Befehls +$$ ... PID der aktuellen Shell +$! ... PID des letzen Hindergrund-Jobs +$0 ... Name des aktuellen Befehls oder Scripts bei Funktionen: bash +$_ ... absoluter Pfad des aktuellen Befehls oder Scripts +###Ausgaben immer an der selben Stelle (kein Zeilenvorschub) +set -- $(stty size) # Größe des Terminals besorgen + LINES=$1 +COLUMNS=$2 + +Auf P steht die Pos, allerdings muß COLUMNS-xPos angegeben werden +Auf N seht der Auszugebende Text + +echo -en "\\033[300C\\033[$[${P}]D${N}" +###for Schleife von bis +for i in `seq 1 10`; +do + echo $i +done +###while Schleife von bis +COUNTER=0 +while [ $COUNTER -lt 10 ]; do + echo The counter is $COUNTER + let COUNTER=COUNTER+1 +done +###i++ +((i++)) +let i=i+1 + diff --git a/batman-adv.txt b/batman-adv.txt new file mode 100644 index 0000000..0dbaaba --- /dev/null +++ b/batman-adv.txt @@ -0,0 +1,7 @@ +###anzeigen der liste verfügbarer Gateways +batctl gwl +###Gateway mode anzeigen lassen +batctl gw_mode +### +batctl o + diff --git a/berufsbezeichnungen.txt b/berufsbezeichnungen.txt new file mode 100644 index 0000000..54b556b --- /dev/null +++ b/berufsbezeichnungen.txt @@ -0,0 +1,29 @@ +Vision Clearance Engineer - Fensterputzer +Waste Removal Engineer - Müllmann +Non Profit Manager - Ehrenamtler +Listbroker - sammelt schlicht und einfach Adressen +Mystery Fair Visitor - gehen auf Messen und testen dort zum Beispiel die Freundlichkeit der Service-Mitarbeiter +Facility Manager - Hausmeister +Food Stylist - macht Fotos von Nahrungsmitteln für die Werbung +Community Manager - ist für Kundenbindung übers Internet zuständig +Price Scout - späht die Preise der Konkurrenz aus +Domestic Engineer - Hausfrau +Treasurer - sorgt dafür das im Unternehmen immer genug Geld da ist +Content Manager - Online-Redakteur +Knowledge Navigator - Lehrer +Flueologist - Kaminkehrer, Schornsteinfeger +Head of Verbal Communications - Sekretärin +Petroleum Transfer Engineer - Tankwart +Foot Health Gain Facilitator - Fußpfleger +Cash Relation Officer - Bankier +Environment Improvement Technician - Gebäudereiniger, Putzfrau +Revenue Protection Officer - Fahrkartenkontolleur +Technical Horticultural Maintenance Officer - Gärtner +Space Consultant - Immobilienmakler +Media Distribution Officer - Zeitungsausträger +Dispatch Service Facilitator - Postler +Education Centre Nourishment Production Assistant - Kantinen Angestellte +Stock Replenishment Adviser - Regalauffüller +Wastewater Treatment Officer - Klärwerker +Crockery Cleansing Operative - Tellerwäscher +Coin Facilitation Engineer - Mautkassierer diff --git a/bewerbung.txt b/bewerbung.txt new file mode 100644 index 0000000..71f5daa --- /dev/null +++ b/bewerbung.txt @@ -0,0 +1,2 @@ +Zwischen Ihren Anforderungen und meinem Profil sehe ich eine große Schnittmenge. + diff --git a/bluetooth.txt b/bluetooth.txt new file mode 100644 index 0000000..c9adc8a --- /dev/null +++ b/bluetooth.txt @@ -0,0 +1,19 @@ +###scannen nach geräten +hcitool scan +###ein neues Gerät pairen / pair device +bluez-simple-agent hci# xx:xx:xx:xx:xx:xx +###gepairtes Gerät entfernen / remove a paired device +bluez-simple-agent hci# xx:xx:xx:xx:xx:xx remove +###bei tastatur oder maus zum testen +bluez-test-input connect xx:xx:xx:xx:xx:xx +###verbinden von gerät mit mac 00:0A:3A:27:62:CF +rfcomm connect 0 00:0A:3A:27:62:CF +###gerät anpingen, ob es noch da ist +l2ping +l2ping 00:0A:3A:27:62:CF +###Tastatur einrichten, bsp. Raspi +#installieren der pakete auf raspi fall noch nicht da +apt-get install bluez python-gobject +bluez-simple-agent hci0 11:22:33:44:55:66 +bluez-test-input connect 11:22:33:44:55:66 +bluez-test-device trusted 11:22:33:44:55:66 yes diff --git a/bmw.txt b/bmw.txt new file mode 100644 index 0000000..410a448 --- /dev/null +++ b/bmw.txt @@ -0,0 +1,210 @@ +#pass: doitrules +#pass: h3xpr0g +###codieren +Edit Profile +Passwort ist repxep +###SP-Daten kopieren +SP-DATEN-SGDAT nach \NSCEXPER\SGDAT +###Motor der in meinem ist sollte der folgende sein +M47D20TU2 +2,0 L (1995 cm³), 120 kW (163 PS), 340 Nm +###tool32 wofür? +mit Tool32 deutlich "tiefer" als mit INPA. Beispiele sind z.B. das man mit Tool32 in diversen SG die Fahrgestellnummer ändern kann, man kann den Wert der I-Stufe änden ohne zu flashen, man kann eine Störverriegelung der Standheizung aufheben und und und... +###das sollte in der obd.ini im windows verzeichnis drin sein drin sein +#entweder USB oder OBD je nach version testen +[OBD] + +Port=Com1 +HARDWARE=USB +###Fehlerspeicher löschen +1. INPA öffnen + +2. Nun müssen wir den Wagen auswählen, bei dem der Fehlerspeicher gelöscht werden soll. Bei mir ist es die F8 Taste , der BMW Z4 Modellreihe E85 + +3. Im nächsten Fenster wählen wir den obersten Eintrag “IDENT / read-clear error/info memory E85″ + +4. Nun befinden wir uns im Fehlerspeicher Hauptmenü des BMW’s + +5. Mit F4 kommen wir in den Fehlerspeicher-Modus + +6. Hier kann mit F1 der Fehlerspeicher gelesen werden + +7. Mit F2 wird der Fehlerspeicher gelöscht + +Optional Informationsspeicher auslesen und löschen +8. Mit F3 kann der Informationsspeicher ausgelesen werden + +9. Mit F4 wird der Info Speicher gelöschts +###Service zurückstellen (BMW neu) + +- Schlüssel in das Zündschloß einstecken +- Start/Stop Taste drücken (Wichtig: ohne die Kupplung oder das Bremspedal zu betätigen) und warten bis die Service-Meldung erlischt. +- Sofort nachdem die Service-Meldung erloschen ist, drücke und halte die Reset-Taste des Tageskilometerzählers. Nach 2 Sekunden erscheint ein Warndreieck, nach weiteren 2-3 Sekunden eine Ölkanne. +(Anmerkung: Wenn die Taste zu lange gehalten wird (~10 Sekunden), wird das Service-Menü übersprungen und es erscheint ein Menü mit den Einstellungen des Bussystems, wiederhole in diesem Fall den Vorgang ab Schritt 1.) +- Nun befindest du Dich im Service-Menü. Benutze den Drehknopf um durch die verschiedenen Menüpunkte zu navigieren. +- Sobald du den Menüpunkt hast den Du zurücksetzen möchtest drücke die Bordcomputertaste am Lenkstockschalter. Nun sollte die Meldung "Reset" im Display angezeigt werden. Drücke die Bordcomputertaste für etwa 3 Sekunden, daraufhin siehst Du eine Uhr deren Zeiger sich bewegen bis der Vorgang beendet ist. +- Nun kannst Du entweder einen weiteren Menüpunkt anwählen oder das Menü mit einer Betätigung der Start/Stop Taste verlassen. + +Achtung: Der Punkt "Bremsbeläge" lässt sich nur zurücksetzen, wenn neue Bremsbelagfühler verbaut wurden. Die alten sind in jedem Fall zu ersetzen, da diese einen veränderbaren Widerstand haben und nicht "digital" arbeiten, wie bei älteren Baureihen. +###Abkürzungen Steuergeräte und ihre Bedeutung +* DME - Digital Motor Elektronik +* DDE - Digitale Diesel Elektronik +* SRS – Airbag +* Sicherheits- Informationsmodul +* EGS – Automatikgetriebe inkl. SMG +* ABS - Antiblockiersystem +* DSC - Dynamische Stabilitäts- Kontrolle +* CAS –Car Access System +* A/C - Klimaanlage +* AIC/RLS – Regensensor +* Active Front Steering Lenksystem +* Auto Kommunikation Computer +* Audi System Controller +* Most CAN Gateway +* BMBT - On-Board Monitor 16:9 / 4:3 +* DSP - Digitaler Sound Prozessor +* EWS - Elektronische Wegfahrsperre +* HKM - Heckklappenmodul +* IKE - Kombiinstrument +* LCM – Licht Schalt Zentrum +* LEW – Lenkradwinkel Sensor +* SZM – Schaltzentrum Mittelkonsole +* LRA - Automatische Leuchtweitenregulierung +* NAV - Navigation System inkl. CCC +* Satellit Fahrzeugzentrum +* PDC - Park Distance Control +* RAD - Radio +* RDC - Reifendruck Kontorelle +* SES - Sprach Eingabe System +* Zentrales Gatewaymodul +* Zentrale Bedieneinheit +* TEL - Auto Telefon +* VID - Video Modul +* ZKE - Zentralverriegelung +* SH – Standheizgerät +* SHD – Schiebehebedach +* DWA – Diebstahlwarnanlage +* Zentrales Informations- Display +* Funktionszentrum +###Steuergeräte auf Werkseinstellungen setzen +Mache zuerst das Verzeichnis /Work total leer. Dann den Editor öffnen und eine leere Datei mit der Endung .MAN in dem Verzeichnis speichern. Dann die entsprechenden STG auslesen und die TRC's wie oben speichern. +Ich wiederhole das für jedes STG neu. +Wenn alles gesichert ist, dann eine leere .MAN über das ausgewählte STG jagen und die Werkseinstellung ist für das gewählte STG wieder hergestellt. +###Die Codierung +Im Arbeitsplatz in das Verzeichnis C:\NCSEXPER\WORK gehn da erstelt man zuerst eine neue datei FSW_PSW.MAN (so wies hier steht) diese einfach als text speichern. + +1. Das Diagnoste interface an den Laptop und den Diagnose-Port im Auto anschließen und den Zündschlüssel auf Zündungsstufe 2 stellen +2. "NCS Expert" vom Desktop starten +3. Im "NCS Expert": Datei -> Profil laden -> "Expertenmodus" auswählen -> Ok +(danach Profil editieren wählen passwort repxet eingeben FSW/PSW anklicken hacken setzen bei FSW/PSW Trace und FSW/PSW Manipulation mit man OK klicken das danach Trace=ON angezeigt wird OK anklicken) oder hier downloaden und im ordner NCSEXPER PFL einfügen +dann nicht mehr expertenmodus wählen sondern fisterprofile +4. F1 drücken ("FG/ZCS/FA") +5. F3 drücken ("ZCS aus SG") +6. Die Baureihe des Autos auswählen +(e46 z.b.) +7. "AKMB" auswählen +(bei FL Modellen AKMB bei VFL KMB) +(Im normal fall ist es immer das erste was angezeigt wird zumindest bei FL Modellen) +(Bei e90er Reihe ist es das CAS was ausgewählt weden muss) +8. Wenn es zu keine Fehler kommt -> F6 drücken ("Zurück") +9. F4 drücken ("SG bearbeiten") +10. Das Steuergerät auswählen, in dem etwas bearbeitet werden soll +z.B. für die Blinkerquittierung und auch andere Einstellungen das "GM5" auswählen +11. F2 drücken("Job ändern") +12. "Codierdaten lesen" auswählen -> Ok drücken +13. F3 drücken ("Job ausführen") +14. Nun wurde das Steuergerät ausgelesen und im Verzeichnis C:\NCSEXPER\WORK eine Datei FSW-PSW.TRC erstellt +16. Die Datei FSW-PSW.TRC kopieren und im selben Verzeichnis wieder einfügen +17. Die gerade eingefügte Datei umbenennen in FSW_PSW.MAN +18. Die FSW_PSW.MAN mit dem Windows-Editor öffnen +19. Hier müssen nun die Werte geändert werden, welche umcodiert werden sollen z.b. Beim öffnen 2mal blinken und beim schließen 1mal: +dafür sucht ihr im GM5 und entfernt einfach das nicht_ vor dem aktiv +DWA +nicht_aktiv + +QUIT_OPT_SCHAERF +nicht_aktiv + +QUIT_OPT_SCHAERF_KLAPPE +nicht_aktiv + +QUIT_OPT_ENTSCH +nicht_aktiv + +so das es so aussieht + +DWA +aktiv + +QUIT_OPT_SCHAERF +aktiv + +QUIT_OPT_SCHAERF_KLAPPE +aktiv + +QUIT_OPT_ENTSCH +aktiv + +20. Die geöffnete Datei speichern und schließen +21. Nun "NCS Expert" wieder maximieren +22. F2 drücken ("Job ändern") +23. "SG codieren" auswählen -> Ok drücken +24. F3 drücken ("Job ausführen") +25. Das Steuergerät wurde nun mit den neuen Werten codiert +So jetzt gaukelt ihr dem GM5 vor das es ein Diebstahlwarnanlage hat da nur so die Blinker beim öffnen und schließen vom Fzg. blinken ( wenn ihr zum :-) fahrt macht der das genauso) +###Fahrzeugaufträge / Codieren Anleitung +#von http://www.obdexpert.de/codieren/index.php?section=kat9 +Fahrzeugaufträge: + +Zuerst alle vorhandenen Steuergeräte einzeln mit NCS auslesen und die original Werte inkl. des Fahrzeugauftrags irgendwo separat abspeichern. Danach eine leere Datei FSW_PSW.MAN im Verzeichnis NCSEXPERT\WORK\ anlegen. + +- FA aus CAS oder LMA auslesen +- F1 FG/ZCS/FA +- F2 FA eingeben +- Baureihe E60 eingeben +- Fahrgestellnummer bestätigen +- in der Merkmalliste entsprechenden Eintrag zum löschen markieren und auf der Tastatur DEL drücken oder oben einen FA hinzufügen +- jetzt sollte das gelöschte Merkmal nicht mehr in der Liste erscheinen bzw. das neue Merkmal ganz unten stehen +- Button OK drücken +- F6 Zurück +- F4 SG bearbeiten +- CAS auswählen +- F2 Job ändern +- FA_WRITE auswählen und OK +- F3 Job ausführen +- F1 SG/SGET ändern +- LMA auswählen +- F2 Job ändern +- FA_WRITE auswählen und OK +- F3 Job ausführen +- F1 SG/SGET ändern +- zum FA passendes Steuergerät auswählen +- F2 Job ändern +- SG_CODIEREN auswählen und OK +- F3 Job ausführen +eventuell die 4 letzten Schritte wiederholen, falls noch mehr Steuergeräte von der Änderung betroffen sind. + +Wenn ihr euch unsicher seid, welche Steuergeräte von der Änderung betroffen sind, dann codiert einfach alle Steuergeräte. + +Die genauen Fahrzeugaufträge mit Beschreibung können mit dem Windows-Editor in folgender Datei eingesehen werden: + +NCSEXPERT\DATEN\E60\E60AT.000 + +Aktive Ergaenzungszeilen mit E müssen mit -, Kundendienst-Ergaenzungszeilen mit K müssen mit + und SA-Zeilen unter W müssen mit $ geschrieben werden. + +also z.B. + +-A090 für die 90AH AGM Batterie ++MUEB für die Codierung der LCI FL Scheinwerfer und Rückleuchten mit den BMW Kabeladaptern +$6FL für die USB Audio Schnittstelle + +Zusätzliche Zeichen im FA: + +Typschlüssel * +Zeitkriterium # + +Folgende Merkmale sind im FA-Stream vorhanden, werden jedoch nicht überprüft: + +Lackcode (Farbcode) % +Polstercode & +ZusBau | diff --git a/bootsplash.txt b/bootsplash.txt new file mode 100644 index 0000000..558b7f3 --- /dev/null +++ b/bootsplash.txt @@ -0,0 +1,6 @@ +###bootsplash bei openSUSE ändern +#in +vi /etc/sysconfig/bootsplash +#THEME="THEMENNAME" setzen +###initrd neu erzeugen +mkinitrd oder mkinitrd -s 800x600 diff --git a/bridge.txt b/bridge.txt new file mode 100644 index 0000000..e70eda1 --- /dev/null +++ b/bridge.txt @@ -0,0 +1,12 @@ +###bridge einrichten +brctl addbr br0 +###mehrere device an bridge binden (eth richtiges netzwerkinterface tap virtuelles) +brctl addif br0 eth0 +brctl addif br0 tap0 +###keinem der beiden eine ip geben aber up müssen sie sein +ifconfig eth0 up +ifconfig tap0 up +###bridge mit ip ausstatten, danach sollte rechner wieder über eth0 +###zu erreichen sein und auch tap z.b. aus emulation kann eine 172.17.6.0/24 +##ip haben und ist somit erreichbar +ifconfig br0 172.17.6.20 up diff --git a/buecher.txt b/buecher.txt new file mode 100644 index 0000000..135f566 --- /dev/null +++ b/buecher.txt @@ -0,0 +1,4 @@ +###kostenlose fachbücher von Galileo Computing +http://www.galileocomputing.de/katalog/openbook +###kostenlose Fachbücher von addison-wesley +http://www.addison-wesley.de/main/main.asp?page=ebooks/booklist&reihe=OSLIB diff --git a/buspirate.txt b/buspirate.txt new file mode 100644 index 0000000..3c0826c --- /dev/null +++ b/buspirate.txt @@ -0,0 +1,9 @@ +###verbinden mit buspirate +screen /dev/ttyUSB0 115200 8N1 +###I/O header auf dem board +GND +3,3 ++5V ADC +Vpu AUX1 +CLK MOSI +CS MISO +### diff --git a/chmod.txt b/chmod.txt new file mode 100644 index 0000000..b6970fa --- /dev/null +++ b/chmod.txt @@ -0,0 +1,2 @@ +###allen Nutzern rechte wie in /tmp, hinterher noch chmod 777 +chmod a+t /tmp diff --git a/convert.txt b/convert.txt new file mode 100644 index 0000000..250395b --- /dev/null +++ b/convert.txt @@ -0,0 +1,36 @@ +###resize (seitenverhältnis wird beachtet) +convert -resize 150x30 alt.png neu.png +###resize (seitenverhältnis wird NICHT beachtet) +convert -resize 150x30! alt.png neu.png +###eine Farbe durch eine andere ersetzen (white -> black) +convert test.jpg -fill black -opaque white new_test.jpg +###aus Bild eine Kohlezeichnung machen (-charcoal ->härte des stifts) +convert orginal_foto.jpg -charcoal 5 kohle_bild.jpg +###animation erstellen +convert -delay 10 *.jpg film.mng +###zwei bilder nebeneinander nach i_horizontal.jpg +convert +append i_left.jpg i_right.jpg i_horizontal.jpg +###zwei bilder untereinander nach i_vertical.jpg +convert -append i_top.jpg i_bottom.jpg i_vertical.jpg +###montage von 4 breit, 5 runter von +montage +frame +shadow +label -geometry 1188x645+0+0 -tile 4x5 in*.bmp out.bmp +###rahmen um bild +mogrify -bordercolor “#ff0000“ -border 1x1 bild.png +###schärfen +convert alt.png -sharpen 5 neu.png +###aufhellen +convert alt.png -sigmoidal-contrast 4,0% neu.png +###graustufen +convert alt.png -colorspace gray neu.png +###rot kanal extrahieren (anderen analog) +convert -channel R alt.png -separate neu.png +###monochrome +convert -channel R alt.png -separate neu.png +###negativ +convert alt.png -solarize 0% neu.png +###strudel +convert alt.png -swirl 90 neu.png +###beschriften +convert -font @d-worcti.ttf -pointsize 50 -pen white -draw "text 50,50 'Viele Hühner'" huehner.jpg huehner_schrift.jpg +#resize IMG_2025.CR2 auf 800x600 und dann von pos. 0.0 800x480 ausschneiden +convert IMG_2025.CR2 -resize 800x600 -crop 800x480+0+0 test.jpg diff --git a/cpio.txt b/cpio.txt new file mode 100644 index 0000000..e2ce4bf --- /dev/null +++ b/cpio.txt @@ -0,0 +1,14 @@ +###Erzeugen einer cpio-Datei, welche die Dateien des aktuellen Verzeichnisses enthält: +ls | cpio -o > verzeichnis.cpio +###Erzeugen einer cpio-Datei, welche die Dateien und Unterverzeichnisse des aktuellen Verzeichnisses enthält: +find . -depth -print | cpio -o > verzeichnis.cpio +###Wiederherstellen von Dateien aus einem cpio-Archiv: +cpio -i < archiv.cpio +###Auflisten der im Archiv enthaltenen Dateien, ohne diese zu extrahieren: +cpio -it < archiv.cpio +###Kopieren des aktuellen Verzeichnisses einschließlich aller Unterverzeichnisse nach /tmp/verzeichnis (entspricht in etwa cp -r * /tmp/verzeichnis): +find . -print -depth | cpio -pd /tmp/verzeichnis +###initrd erzeugen +find | cpio -H newc -o | gzip > ../initrd.gz +###entpacken initrd +cat initrd.gz | gzip -d | cpio -i diff --git a/crm.txt b/crm.txt new file mode 100644 index 0000000..276a6a8 --- /dev/null +++ b/crm.txt @@ -0,0 +1,38 @@ +###Cluster Resource Manager + +###folgende Konfigurationsdateien müssen vorhanden sein +#globale cluster-config +/etc/ha.d/ha.cf +#keys für authentication +/etc/ha.d/authkeys +###beispiel für autokeys-datei +auth num +num method secret +num method secret +num method secret +#num muss eindeutig sein +#method kann md5, sha1 oder crc sein +###beispiel ha.cf +autojoin none +mcast bond0 239.0.0.43 694 1 0 +bcast eth2 +warntime 5 +deadtime 15 +initdead 60 +keepalive 2 +node alice +node bob +crm respawn +###stoppen des hardbeat services +#node in standby setzen, damit das cluster nicht denkt das es ein notfall ist +hb_standby +#hardbeat stoppen +/etc/init.d/heartbeat stop +###neuen knoten hinzufügen +hb_addnode node +###node löschen +hb_delnode node +### + + + diff --git a/cubietruck.txt b/cubietruck.txt new file mode 100644 index 0000000..9b06fc6 --- /dev/null +++ b/cubietruck.txt @@ -0,0 +1,7 @@ +###wlan/bluetooth chip, funktioniert derzeit nicht +#Broadcom AP6210 +modprobe bcmdhd +###bluetooth aktivieren / firmware upload +./brcm_patchram_plus -d --patchram /lib/firmware/ap6210/bcm20710a1.hcd --enable_hci --bd_addr 11:22:33:44:55:66 --no2bytes --tosleep 1000 /dev/ttyS1 +hcitool dev + diff --git a/cul.txt b/cul.txt new file mode 100644 index 0000000..9275f4b --- /dev/null +++ b/cul.txt @@ -0,0 +1,7 @@ +###mit cul verbinden +screen /dev/ttyACM0 +###homematic sniffen +X21 +Ar +### + diff --git a/cul/culfw-1.44.tar.gz b/cul/culfw-1.44.tar.gz new file mode 100644 index 0000000..a12d4b7 Binary files /dev/null and b/cul/culfw-1.44.tar.gz differ diff --git a/cups.txt b/cups.txt new file mode 100644 index 0000000..f50f872 --- /dev/null +++ b/cups.txt @@ -0,0 +1,112 @@ +###Webseite zu cups +http://www.lug-kr.de/wiki/EigenesCupsBackend +###übergebene argumente im cups +argv[1] The job ID +argv[2] The user printing the job +argv[3] The job name/title +argv[4] The number of copies to print +argv[5] The options that were provided when the job was submitted +argv[6] The file to print (first program only) +###interne Variablen +APPLE_LANGUAGE The Apple language identifier associated with the job (Mac OS X only). +CHARSET The job character set, typically "utf-8". +CLASS When a job is submitted to a printer class, contains the name of the destination printer class. Otherwise this environment variable will not be set. +CONTENT_TYPE The MIME type associated with the file (e.g. application/postscript). +CUPS_CACHEDIR The directory where cache files can be stored. Cache files can be used to retain information between jobs or files in a job. +CUPS_DATADIR The directory where (read-only) CUPS data files can be found. +CUPS_FILETYPE The type of file being printed: "job-sheet" for a banner page and "document" for a regular print file. +CUPS_SERVERROOT The root directory of the server. +DEVICE_URI The device-uri associated with the printer. +FINAL_CONTENT_TYPE The MIME type associated with the printer (e.g. application/vnd.cups-postscript). +LANG The language locale associated with the job. +PPD The full pathname of the PostScript Printer Description (PPD) file for this printer. +PRINTER The queue name of the class or printer. +RIP_CACHE The recommended amount of memory to use for Raster Image Processors (RIPs). +TMPDIR The directory where temporary files should be created. +###Backends befinden sich meist unter +/usr/lib/cups/backend/ +###Backend PEMSPRT205 nutzen und dann an Druckserver //EMSSV027:515/EMSPRT205 schicken +lpadmin -p PEMSPRT205 -o printer-error-policy=retry-job -v lpd://EMSSV027:515/EMSPRT205 -E +###einsatzfähige Backends anzeigen +lpinfo -v +###anlegen einer warteschlange +lpadmin -p funprinter1000 -v parallel:/dev/lp0 -E -P /usr/share/cups/model/Postscript.ppd.gz +###kontrolle was angelegt wurde +lpstat -a funprinter1000 -p funprinter1000 -v funprinter1000 +#oder in /etc/cups/printers.conf +cat /etc/cups/printers.conf +###abfrage via web-frontend +http://localhost:631/printers/funprinter1000 +###ändern der Warteschlange (Beschreibung, Standort) +lpadmin -p funprinter1000 -D "ACME FunPrinter 1000" -L "2. floor: room 3" +###anzeige der druckerspezifischen Optionen und deren Voreinstellungen in /etc/cups/ppd/funprinter1000.ppd +lpoptions -p funprinter1000 -l +###Warteschlangen löschen +lpadmin -x funprinter1000 +###filter sind zu finden in +/usr/lib/cups/filter/ +###druck wiederholen +lp -i ISUDRUCK-159913 -H resume +###druck abbrechen +cancel ISUDRUCK-159913 + + +### +lpadmin -p ISUDRUCK -v isu:// -m isu.ppd -D "Eingang für RDI-Drucke Einzeldruck" -E +lpadmin -p ISUDRUCKE_1 -v isu:// -m isu.ppd -D "Eingang 1 für RDI-Drucke Einzeldruck" -E +lpadmin -p ISUDRUCKE_2 -v isu:// -m isu.ppd -D "Eingang 2 für RDI-Drucke Einzeldruck" -E +lpadmin -p ISUDRUCKE_3 -v isu:// -m isu.ppd -D "Eingang 3 für RDI-Drucke Einzeldruck" -E +lpadmin -p ISUDRUCKE_4 -v isu:// -m isu.ppd -D "Eingang 4 für RDI-Drucke Einzeldruck" -E +lpadmin -p ISUDRUCKE_1 -c ISUDRUCKE +lpadmin -p ISUDRUCKE_2 -c ISUDRUCKE +lpadmin -p ISUDRUCKE_3 -c ISUDRUCKE +lpadmin -p ISUDRUCKE_4 -c ISUDRUCKE +accept ISUDRUCKE +cupsenable ISUDRUCKE + +lpadmin -p ISUDRUCKM_1 -v isu:// -m isu.ppd -D "Eingang 1 für RDI-Drucke Massendruck" -E +lpadmin -p ISUDRUCKM_2 -v isu:// -m isu.ppd -D "Eingang 2 für RDI-Drucke Massendruck" -E +lpadmin -p ISUDRUCKM_3 -v isu:// -m isu.ppd -D "Eingang 3 für RDI-Drucke Massendruck" -E +lpadmin -p ISUDRUCKM_4 -v isu:// -m isu.ppd -D "Eingang 4 für RDI-Drucke Massendruck" -E +lpadmin -p ISUDRUCKM_1 -c ISUDRUCKM +lpadmin -p ISUDRUCKM_2 -c ISUDRUCKM +lpadmin -p ISUDRUCKM_3 -c ISUDRUCKM +lpadmin -p ISUDRUCKM_4 -c ISUDRUCKM +accept ISUDRUCKM +cupsenable ISUDRUCKM + +lpadmin -p PCOKTEIN -v lpd://IQ1/COKTEINF -m pxlmono.ppd -D "Conergos Test Einzeldruck" -E +lpadmin -p PCOKTMAS -v lpd://IQ1/COKTMAS -D "Conergos Test Massendruck PCL gezippt per ftp" -E +lpadmin -p PCOKTRDIZ -v lpd://IQ1/COKTMAS -D "Conergos Test Massendruck RDI gezippt per ftp" -E +lpadmin -p PCOKTPDF -v modpdf://RCOKTPDF -m Distiller.ppd -D "Conergos Test PDF-Erstellung" -E +lpadmin -p RCOKTPDF -v lpd://IQ1/COKTPDF -D "Conergos Test PDF-Ausgabe" -E + + +### die ETO soll nicht nach dem Schema lpadmin -p P{FIRMA}T{PRN} -v lpd://IQ1/{FIRMA}T{PRN}F eingerichtet werden +#### sondern lpadmin -p P{FIRMA}T{PRN} -v lpd://BB/{FIRMA}T{PRN}F also andrer HOST!!! +# +lpadmin -p COKEASYPROD -v modarch://modarch/thvsaptfr@localhost:CAPSPARC -m modarcha.ppd -o Output=prod -o Category=none -o Hierarchic=none -E +#lpadmin -p COKEASYPROD -o Output-default=prod -o Category-default=none -o Hierarchic-default=none -E +# +lpadmin -p COKEASYTEST -v modarch://modarch/thvsaptfr@localhost:CAPSPARC -m modarcha.ppd -o Output=test -o Category=none -o Hierarchic=none -E +#lpadmin -p COKEASYTEST -o Output-default=test -o Category-default=none -o Hierarchic-default=none -E +# +## Alle Drucker auf A4 setzten: +lpstat -v | grep -v null | awk '{print $3}' | sed -e "s/://g" | while read P; do lpadmin -p $P -o PageSize-default=A4; echo -n "." ;done; echo +# +## Alle ISU-Drucker auf TestJobToWorkflow=no setzten: +lpstat -v | grep ISUDRUCK | awk '{print $3}' | sed -e "s/://g" | while read P; do lpadmin -p $P -o TestJobToWorkflow-default=no; echo -n "." ;done; echo +# +## Alle File-Drucker auf Job-Retry setzten weil die ftp - Übertragung manschmal einen Timeout hat +lpstat -v| grep FILE | awk '{print $3}' | sed -e "s/://g" | while read P; do lpadmin -p $P -o printer-error-policy=retry-job;echo -n "." ;done;echo +# +### FILEDrucker mit Inhalt PDF +# lpadmin -x RGRZFILET1 +# lpadmin -x ZGRZFILET1 +# lpadmin -x PGRZFILET1 +# lpadmin -p RGRZFILET1 -v modarch://modarch/ftp:thvsaptfr@10.1.2.60:/thuega -D "Massendruck GRZ" -m modarcha.ppd -o SpecialOutput-default=stsfil -o Category-default=none -o Company-default=none -o Hierarchic-default=none -o Untar-default=untaryes -E +# lpoptions -p RGRZFILET1 -o SpecialOutput=stsfil -o Category=none -o Company=none -o Hierarchic=none -o Untar=untaryes +# lpadmin -p ZGRZFILET1 -v modzip://RGRZFILET1 -m pxlmono_caps.ppd -o OptionPostScript-default=True -o PageSize-default=A4 -E +# lpoptions -p ZGRZFILET1 -o OptionPostScript=True -o PageSize=A4 +# lpadmin -p PGRZFILET1 -v modpdf://ZGRZFILET1 -m Distiller.ppd -o PageSize-default=A4 -E +# diff --git a/dbox.txt b/dbox.txt new file mode 100644 index 0000000..9ea775d --- /dev/null +++ b/dbox.txt @@ -0,0 +1,8 @@ +Dbox Wohnzimmer + +DISEqC 1.1 +1 Thor/Intelsat 1.0 W +2 Hotbird 13.0 E +3 Astra 19.2 E +4 Astra / Eurobird 1 28.2 E + diff --git a/dd.txt b/dd.txt new file mode 100644 index 0000000..648ffdf --- /dev/null +++ b/dd.txt @@ -0,0 +1,10 @@ +###sichern einer platte über netzwerk +dd if=/dev/sda | ssh root@172.17.6.33 dd of=remotefile.img +###enormer geschwindigkeitszuwachs beim lesen und schreiben +dd if=/dev/sda of=remotefile.img bs=4096 +###sichern einer platte und zippen mit dd +dd if=/dev/sda bs=4k | gzip -c | dd of=/media/disk/image_dd.gz +###mbr sichern incl. partitionierung +dd if=/de/sda of=/tmp/mbr.img bs=512 count=1 +###mbr ohne partitionierung +dd if=/de/sda of=/tmp/mbr.img bs=446 count=1 diff --git a/ddc.txt b/ddc.txt new file mode 100644 index 0000000..e69de29 diff --git a/dell.txt b/dell.txt new file mode 100644 index 0000000..ecb5de7 --- /dev/null +++ b/dell.txt @@ -0,0 +1,4 @@ +###Displaytest bei Dell +d gedrÃckt halten und einschalten -> VollfarbflÃchen werden angezeigt +###Diagnose bei Dell +Fn und einschalten -> Diagnose wird gestartet diff --git a/dhcpd.txt b/dhcpd.txt new file mode 100644 index 0000000..91b7e0d --- /dev/null +++ b/dhcpd.txt @@ -0,0 +1,15 @@ +###DHCP / dhcp - Server dhcpd +#filename: /etc/dhcpd.conf +default-lease-time 86400; +max-lease-time 86400; + +subnet 192.168.0.0 netmask 255.255.255.0 { + range 192.168.0.2 192.168.0.250; + option subnet-mask 255.255.255.0; + option broadcast-address 192.168.0.255; + option routers 192.168.0.1; + option domain-name-servers 192.168.0.4, + 12.24.250.39, 12.24.250.40, 206.25.127.40; + option domain-name "chartermi.net"; +} + diff --git a/dlan.txt b/dlan.txt new file mode 100644 index 0000000..6f0230b --- /dev/null +++ b/dlan.txt @@ -0,0 +1 @@ +http://www.zibri.org/2009/03/powerline-ethernet-fun-and-secrets.html diff --git a/dns.txt b/dns.txt new file mode 100644 index 0000000..5ea68bf --- /dev/null +++ b/dns.txt @@ -0,0 +1,6 @@ +###DNS Server +#google +8.8.8.8 +8.8.4.4 +2001:4860:4860::8888 +2001:4860:4860::8844 diff --git a/dpkg.txt b/dpkg.txt new file mode 100644 index 0000000..65b089a --- /dev/null +++ b/dpkg.txt @@ -0,0 +1,45 @@ +###erstellen eines binary pakets +#in verz müssen die dateien sein und +#das DEBIAN verzeichnis mit den inhalten +dpkg -b verz paketname.deb +###entpaken eines DEB-Pakets +ar xv hello_1.3-13.deb +###installieren von paket +dpkg -i paket +###liste aller installierten Pakete +dpkg -l +dpkg --list +###liste der dateien im paket ausgeben, wenn es installiert ist +dpkg -L paket +###liste der dateien im paket ausgeben +dpkg -c paket +dpkg --contents paket +###Anzeigen der allgemeinen Informationen zu einem Paket +dpkg -s paket +###zu welchem packet gehört die datei +dpkg -S /usr/bin/bash +###löschen von paket, aber config da lassen +dpkg -r paket +###deb paket aus quellen erstellen +#im entpakten verzeichnis machen +dh_make -f ../source.tgz +#danach +dpkg-buildpackage +###paket aus quellen erstellen +dkms mkdeb -m sony-laptop-zseries -v 0.9np5 +###alle Pakete erneut installieren +COLUMNS=200 dpkg -l | awk '/^[hi]i/{print $2}' | xargs apt-get -y --reinstall install +###alle installierten Pakete suchen und nach /tmp/dpkg.log speichern +dpkg --get-selections | grep "\binstall" | awk '{print $1}' > /tmp/dpkg.log +###reinstallieren der Pakete aus /tmp/dpkg.log +xargs -n1 apt-get --reinstall install -y < /tmp/dpkg.log +###prüfen aller Pakete +debsums -a +###tastatur umstellen z.B. auf deutsch +dpkg-reconfigure keyboard-configuration +###hold package +echo "package hold" | sudo dpkg --set-selections +###unhold package +echo "package install" | sudo dpkg --set-selections +###alle Kernel entfernen, außer den aktuell benutzen +dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs apt-get -y purge diff --git a/drbd.txt b/drbd.txt new file mode 100644 index 0000000..47d9ff8 --- /dev/null +++ b/drbd.txt @@ -0,0 +1,140 @@ +###beispiel config für drbd +global { + usage-count yes; +} +common { + protocol C; +} +resource r0 { + on alice { + device /dev/drbd1; + disk /dev/sda7; + address 10.1.1.31:7789; + meta-disk internal; + } + on bob { + device /dev/drbd1; + disk /dev/sda7; + address 10.1.1.32:7789; + meta-disk internal; + } +} +###device metadaten erzeugen auf alice +drbdadm create-md r0 +###verknüpft drbd0 mit phy. Festplatte (das muss auf beiden nodes gemacht werden) (das muss auf beiden nodes gemacht werden) +drbdadm attach r0 +###device metadaten erzeugen +drbdadm create-md resource +###syncronisationsparameter setzen +drbdadm syncer resource +###verbinden +drbdadm connect resource +###hier sind die statusinfos im proc +cat /proc/drbd +###erstsyncronisation +drbdadm -- --overwrite-data-of-peer primary resource +###wenn splitbrain und bekannt ist welche node die richtigen daten hat +#auf node mit schlechten daten +drbdadm -- --discard-my-data connect all +#auf node mit guten daten +drbdadm connect all +### + + + + +###lvm mit drbd +We have two partitions, named /dev/sda1, and /dev/sdb1, which we intend to use as Physical Volumes. +Both of these PVs are to become part of a Volume Group named local. +We want to create a 10-GiB Logical Volume in this VG, to be named r0. +This LV will become the local backing device for our DRBD resource, also named r0, which corresponds to the device /dev/drbd0. +This device will be the sole PV for another Volume Group, named replicated. +This VG is to contain two more logical volumes named foo (4 GiB) and bar (6 GiB). +In order to enable this configuration, follow these steps: + +1. + Set an appropriate filter option in your /etc/lvm/lvm.conf: + + filter = ["a|sd.*|", "a|drbd.*|", "r|.*|"] + + This filter expression accepts PV signatures found on any SCSI and DRBD devices, while rejecting (ignoring) all others. + + After modifying the lvm.conf file, you must run the vgscan command so LVM discards its configuration cache and re-scans devices for PV signatures. +2. + Now, you may initialize your two SCSI partitions as PVs: + + pvcreate /dev/sda1 + Physical volume "/dev/sda1" successfully created + pvcreate /dev/sdb1 + Physical volume "/dev/sdb1" successfully created +3. + The next step is creating your low-level VG named local, consisting of the two PVs you just initialized: + + vgcreate local /dev/sda1 /dev/sda2 + Volume group "local" successfully created +4. + Now you may create your Logical Volume to be used as DRBD's backing device: + + lvcreate --name r0 --size 10G local + Logical volume "r0" created +5. + Repeat all steps, up to this point, on the peer node. +6. + Then, edit your /etc/drbd.conf to create a new resource named r0: + + resource r0 { + device /dev/drbd0; + disk /dev/local/r0; + meta-disk internal; + on host { + address address:port; + } + on host { + address address:port; + } + } + + After you have created your new resource configuration, be sure to copy your drbd.conf contents to the peer node. +7. + After this, initialize your resource as described in the section called “Enabling your resource for the first time” (on both nodes). +8. + Then, promote your resource (on one node): + + drbdadm primary r0 +9. + Now, on the node where you just promoted your resource, initialize your DRBD device as a new Physical Volume: + + pvcreate /dev/drbd0 + Physical volume "/dev/drbd0" successfully created +10. + Create your VG named replicated, using the PV you just initialized, on the same node: + + vgcreate replicated /dev/drbd0 + Volume group "replicated" successfully created +11. + Finally, create your new Logical Volumes within this newly-created VG: + + lvcreate --name foo --size 4G replicated + Logical volume "foo" created + lvcreate --name bar --size 6G replicated + Logical volume "bar" created + +The Logical Volumes foo and bar will now be available as /dev/replicated/foo and /dev/replicated/bar on the local node. + +To make them available on the peer node, first issue the following sequence of commands on the local node: + +vgchange -a n replicated + 0 logical volume(s) in volume group "replicated" now active +drbdadm secondary r0 + +Then, issue these commands on the peer node: + +drbdadm primary r0 +vgchange -a y replicated + 2 logical volume(s) in volume group "replicated" now active + +After this, the block devices /dev/replicated/foo and /dev/replicated/bar will be available on the peer node. + +Of course, the process of transferring volume groups between peers and making the corresponding logical volumes available can be automated. The Heartbeat LVM resource agent is designed for exactly that purpose. + + diff --git a/dvd.txt b/dvd.txt new file mode 100644 index 0000000..56eb094 --- /dev/null +++ b/dvd.txt @@ -0,0 +1,12 @@ +#DVD-Titel mit DVD:RIP auslesen. VOB-Dateien werden erstellt. +#Die VOB-Dateien zusammenfügen: cat *.vob > movie.vob +#Demultiplexen: tcextract -i movie.vob -t vob -x mpeg2 > movie.m2v +und danach: tcextract -i movie.vob -a 0 -x ac3 -t vob > movie.ac3 +#Verkleinern: tcrequant -i movie.m2v -o shrinked.m2v -f 1.5 +1.5 ist der Verkleinerungsfaktor (75%). Der Verkleinerungsfaktor lässt sich wie folgt berechnen: + Faktor = (video_size / (4700000000 - audio_size)) * 1.04 +#Multiplexen: mplex -f 8 -o final.mpg shrinked.m2v movie.ac3 +#Verzeichnisstruktur ertsellen: dvdauthor -o newdvd final.mpg +#IFO-files erstellen: dvdauthor -o newdvd -T +#Dateien brennen + diff --git a/efi.txt b/efi.txt new file mode 100644 index 0000000..5c4590e --- /dev/null +++ b/efi.txt @@ -0,0 +1,7 @@ +###32 bit grub-efi installieren +apt-get install grub-efi-ia32-bin +update-grub +###32-bit UEFI in bootimage einbauen +#bootia32.efi besorgen (https://github.com/jfwells/linux-asus-t100ta/blob/master/boot/bootia32.efi) +#bootmedium erzeugen +#cp bootia32.efi EFI/BOOT/ diff --git a/ethersex.txt b/ethersex.txt new file mode 100644 index 0000000..49bcff4 --- /dev/null +++ b/ethersex.txt @@ -0,0 +1,4 @@ +#1-wire Temperatursensor http://www.gtkdb.de/index_18_1040.html +#neuer Prozessor net-io http://www.gtkdb.de/index_18_1039.html +### + diff --git a/f-spot.txt b/f-spot.txt new file mode 100644 index 0000000..2239f08 --- /dev/null +++ b/f-spot.txt @@ -0,0 +1,8 @@ +###dateien anhand der md5sum suchen und doppelte anzeigen +sqlite3 ~/.gnome2/f-spot/photos.db "SELECT md5_sum FROM photos" |sort |uniq -c|sort |sed -e "s/ */ /" |cut -d" " -f 2 |sort |uniq -c +###anzahl der bilder anzeigen, für die die md5sum bereits berechnet ist +sqlite3 ~/.gnome2/f-spot/photos.db "SELECT count(*) FROM photos WHERE md5_sum IS not NULL AND md5_sum != ''" +###kopie der datenbank als textdatei anleigen +sqlite3 photos.db .dump > f-spot.dump +###textdatei wieder in datenbank konvertieren +sqlite3 photos.db < f-spot.dump diff --git a/fdisk.txt b/fdisk.txt new file mode 100644 index 0000000..104663b --- /dev/null +++ b/fdisk.txt @@ -0,0 +1,7 @@ +###wenn komplett-image einer Platte gemacht wurde und man einzelne Partitionen benötigt +fdisk -l -u imagefile +###dann offset berechnen, je nach dem was fdisk anzeigt +###loopdevice anlegen mit offset +losetup -o $offset /dev/loop0 imagefile +###mounten +mount -t vfat /dev/loop0 /mnt/ diff --git a/fenix.txt b/fenix.txt new file mode 100644 index 0000000..89d6829 --- /dev/null +++ b/fenix.txt @@ -0,0 +1,6 @@ +###Firmwaredownload +http://www.gawisp.com/perry/chipset_firmware/Type_M/ + +###testmode einschalten +rechte up+down+organe Taste drücken +### diff --git a/fetchmail.txt b/fetchmail.txt new file mode 100644 index 0000000..e69de29 diff --git a/ffmpeg.txt b/ffmpeg.txt new file mode 100644 index 0000000..103b4e3 --- /dev/null +++ b/ffmpeg.txt @@ -0,0 +1,2 @@ +###aufnahme von /dev/video0, audio von /dev/dep ... +/usr/bin/ffmpeg -ad /dev/dsp -vd /dev/video0 -s 640x480 -hq -r 30 -vcodec mpeg4 -acodec mp3 -b 300 -ab 128 ~/capture/$1.avi diff --git a/fhem.txt b/fhem.txt new file mode 100644 index 0000000..fa79b14 --- /dev/null +++ b/fhem.txt @@ -0,0 +1,467 @@ +###Namesschema +Prefix 1 ID Beschreibung + KG Kellergeschoß + EG Erdgeschoß + OG Obergeschoß + DG Dachgeschoß + GV Grundstück vorn + GH Grundstück hinten + NN Nicht definiert / spezifiziert + +Prefix 2 ID Beschreibung + bz Badezimmer + ez Esszimmer + fl Flur + ga Garage + hz Heizungskeller + k1 Kellerraum 1 + k2 Kellerraum 2 + k3 Kellerraum 3 + ku Küche + kz Kinderzimmer + mz Mehrzweckraum + sr Serverraum + sz Schlafzimmer + wc WC + wz Wohnzimmer + xx Nicht definiert / spezifiziert + +Prefix 3 ID Beschreibung + BM Bewegungsmelder + DI Dimmer + DS Dämmerungssensor + FB Fernbedienung + GD Gadetektor + GZ Gaszähler + HS Handsender + HZ Heizungsventil + MS Master/Slave Steckdose + NE Network + RM Rauchmelder + RO Rollade + RP Repeater + SA Schaltaktor, Bsp. Hutschien Hauslicht + SD Steckdose + TF Temperatur- und Luftfeuchtesensor + TK Tür- und Fensterkontakt + WD Wasserdetektor + WE Wetterstation + WS Wandschalter + XX Nicht definiert / spezifiziert +Postfix 1/2 ID Beschreibung + grp Gruppe + dum Dummy Device + log Loging + not Notify +###Namensschema Erdgeschoss-WohnungLinks-Esszimmer-TürFensterKontakt-ganz links im Raum +EG_WGL_EZ_TK_1 +###Beispiel TK aus Homematic in FHEM (https://forum.fhem.de/index.php/topic,51339.0.html) +define EG_WGL_EZ_TK_1 HMCCUCHN EG_WGL_EZ_TK_1 readonly +## Uns interessieren nur einige Datenpunkte +attr EG_WGL_EZ_TK_1 ccureadingfilter (ERROR|LOWBAT|STATE) +# Zeigt einen grünen/roten Punkt an +attr EG_WGL_EZ_TK_1 devStateIcon closed:10px-kreis-gruen open:10px-kreis-rot +attr EG_WGL_EZ_TK_1 event-on-change-reading .* +# Werte der CCU in den Readings ersetzen +attr EG_WGL_EZ_TK_1 substitute STATE!(0|false):closed,(1|true):open;;LOWBAT!(0|false):no,(1|true):yes + + +#Codebeispiele http://fhemwiki.de/index.php/Category:Code_Snippets +#HOWTO http://fhem.de/commandref.html#CUL +#http://www.technolust.de/?p=89 Beispiel Steckdose/Handsender ... +#http://blog.planet-rosemann.de/?p=20 +#http://www.fhemwiki.de/index.php/AVM_Fritz!Box Fritzbox 7390 fhem installation + +###AES Verschlüsselung einschalten/ausschalten +#ein 080801 +#aus 080800 +###fhem.cfg Beispiel +attr global autoload_undefined_devices 1 +attr global logfile /var/log/fhem/fhem-%Y-%m.log +attr global modpath /usr/share/fhem +attr global port 7072 global +attr global statefile /var/log/fhem/fhem.save +attr global verbose 3 + +define CUL CUL /dev/ttyACM0@38400 0000 +attr CUL rfmode HomeMatic +attr CUL hmProtocolEvents +set CUL hmPairForSec 600 + +define WEB FHEMWEB 8083 global +define WEBS FHEMWEB 8084 global + +define autocreate autocreate +attr autocreate autosave 1 +attr autocreate device_room %TYPE +attr autocreate filelog /var/log/fhem/%NAME-%Y.log +attr autocreate weblink 1 +attr autocreate weblink_co_Zuhause on ;; setstate watchdog_Handy_Nico_Abwesend defined");;\ + fhem("set myMPD playfile hallo-nico.mp3");;\ + }} + +# Nico_Zuhause auf off setzen nach 5 Minuten Abwesenheit +define watchdog_Handy_Nico_Abwesend watchdog Handy_Nico:absent 00:05 Handy_Nico:present set Nico_Zuhause off +attr watchdog_Handy_Nico_Abwesend regexp1WontReactivate 1 +room Plots +###Mail bei Fenster auf/zu +###http://fhemwiki.de/index.php/FHTTK:_Benachrichtigung_bei_offenem_Fenster +#in99_marte.pm +sub FHTTK_status { + my @fhttks = devspec2array("TYPE=CUL_FHTTK"); + my @wopen = (); + foreach(@fhttks) { + my $fhttk_window = ReadingsVal($_, "Window", "nA"); + push (@wopen,$_) if ($fhttk_window eq "Open" ); + } + my $num_wopen = @wopen; + my $resultstring=''; + if ( $num_wopen gt 0 ) { + $resultstring="folgende Fenster sind noch offen:\n\n"; + foreach(@wopen) { + $resultstring.="- ".$_."\n"; + Log 4, "FHTTK_status: ". $_. "noch offen"; + } + } else { + $resultstring="alle Fenster sind derzeit geschlossen."; + } + return $resultstring; +} +#in die Config +define n_Fenster notify .*:Window.*(Open|Closed) { \ + my $window_state=ReadingsVal("@", "Window", "nA");;\ + my $deftype=$defs{@}{TYPE};;\ + return if ( $deftype ne "CUL_FHTTK" );;\ + if ( $defs{@}{PREVSTATE} ne $window_state ) { \ + my $fhttk_status=FHTTK_status;;\ + my $subject="FHEM: Fenster @ ".$window_state;; \ + fb_mail('xxx@@xxx.de',$subject,$fhttk_status);;\ + Log 3, "@: Window ".$window_state;;\ + }\ +} + +###minimale config für fhem + attr global logfile /tmp/fhem.log + attr global statefile /tmp/fhem.save + attr global verbose 3 + attr global port 7072 + attr global modpath /usr/share/fhem + define FHZ FHZ /dev/tts/USB0 + + define lamp FS20 8765 01 +###loglevel - log hochsetzen bei Problemem +attr global verbose 5 +###CUL Devicename /dev/ttyACM* +define CUL_0 CUL /dev/ttyACM0@9600 1234 +define CUL_1 CUL /dev/ttyUSB0@38400 0000 nanoCUL +###CUL parameter per FHEM (http://www.computerhilfen.de/info/fhem-cul-kommandos-auflistung-der-befehle.html) +#Firmware anzeigen +get CUL1 raw V +#CUL Bootloader-Modus aktivieren +set CUL1 raw B01 +#Debug-Modus einschalten, um unbekannte Protokolle zu sehen +set CUL1 raw X25 +#Debug-Modus ausschalten +set CUL1 raw X21 +#LED am CUL ausschalten +set CUL1 raw l00 +#LED am CUL einschalten (blinkt bei Senden/Empfangen) +set CUL1 raw l01 +#LED am CUL einschalten (blinkt dauerhaft) +set CUL1 raw l02 +#Einstellen der Frequenz, zum Beispiel 464 Mhz +set CUL1 bWidth 464 +#Einstellen der Sendestärke (Standardwert ist hier x08 – sinnvoll sind hier die Werte x07 (+ 0db), x08 (+5 db) und x09 (+10 db)) +set CUL1 raw x09 +###Enigma2 Receiver +define vu ENIGMA2 +###Gerät anlegen, hier SOMFY Rolladen und als neue Fernbedienung FHEM nutzen +define rollladen1 SOMFY 000001 +#Programmtaste an original Fernbedieung 3 Sekunden drücken, Rollladen fährt kurz hoch und runter +set rollladen1 prog +# Rollladen fährt kurz hoch und runter, sollte sich jetzt steuern lassen über FHEM +###Rollläden in Gruppe zusammenfassen +define Rolllaeden structure room Schlafzimmer Kuechentuer Kuechenfenster Terrassenfenster Terrassentuer Arbeitszimmer +###eventMap - andere Bezeichnungen für on/off +attr Kuechenfenster,Kuechentuer,Terrassenfenster,Terrassentuer,Schlafzimmer eventMap on:schließen off:öffnen +###umbenennen von Geräten +rename old_name new_name +###speichern der config +save +###lanPing, Gerät vorhanden oder nicht +define lanGateWay1 PRESENCE lan-ping 192.168.178.21 +###das ganze per Bluetooth (http://www.computerhilfen.de/info/willkommen-zuhause-personenerkennung-mit-fhem.html) +define Handy_Nico PRESENCE local-bluetooth C0:00:05:AB:88:2B 10 60 +# Dummy definieren als Zuhause-Erkennung +define Nico_Zuhause dummy +attr Nico_Zuhause devStateIcon on:HOME_Status.1 off:HOME_Status.3 +attr Nico_Zuhause eventMap 1 +attr Nico_Zuhause icon icoHouse + +# Nico_Zuhause auf on setzen bei Anwesenheit +define Nico_Zuhause_Anwesend notify Handy_Nico:present { if (Value("Nico_Zuhause") ne "on") { + + + +# Dummy definieren als Zuhause-Erkennung +define Nico_Zuhause dummy +attr Nico_Zuhause devStateIcon on:HOME_Status.1 off:HOME_Status.3 +attr Nico_Zuhause eventMap 1 +attr Nico_Zuhause icon icoHouse + +# Nico_Zuhause auf on setzen bei Anwesenheit +define Nico_Zuhause_Anwesend notify Handy_Nico:present { if (Value("Nico_Zuhause") ne "on") { +###verbose/debugging +attr global verbose 5 +###Auflistung aller Geräte +list .* +#mit Definitionen +list .* DEF +#mit Definition und beginnend mit wz +list wz.* DEF +###Bilderrahmen mittels FHEM (http://www.fhemwiki.de/wiki/Digitaler_Bilderrahmen) +###CCU2 in FHEM einbinden +define HMCCU +define d_ccu HMCCU 192.168.178.20 +# Alle CCU Geräte einlesen (passiert beim define automatisch) +get d_ccu devicelist +# CCU Variable abholen und als Reading speichern +get d_ccu vars Anwesenheit +# Alle CCU Variablen abholen und als Reading speichern +get d_ccu vars .* +# Alle Kanäle und Datenpunkte eines CCU Geräts anzeigen (THERMOSTAT_WZ = Device-Name in CCU) +get d_ccu deviceinfo THERMOSTAT_WZ +# Datenpunkt lesen und als Reading speichern (THERMOSTAT-1 = Channel-Name in CCU) +get d_ccu datapoint THERMOSTAT-1.TEMPERATURE +# Alle / einige Datenpunkte eines Kanals lesen +get d_ccu channel LEQ1234567:1 +get d_ccu channel BidCos-RF.LEQ1234567:1 +get d_ccu channel LEQ1234567:2.RSSI.* LEQ1234567:0.^UNREACH$ +get d_ccu channel THERMOSTAT-1 +# Pumpe mit State-Channel = 1 +define d_Pumpe HMCCUDEV LEQ1234567 1 +# Attribut statevals sorgt dafür, dass man den Gerätestatus ohne devstate setzten kann +attr d_Pumpe statevals on:true,off:false +# Gelesene Werte ersetzen (get Befehle liefern true/false, RPC server liefert 0/1) +attr d_Pumpe substitute true:on,false:off,1:on,0:off +# Pumpe einschalten (2 Varianten, 1. Variante funktioniert wg. Attribut statevals) +set d_Pumpe on +set d_Pumpe devstate on +# TF-Haus-1 ist der Kanalname in der CCU, Device ist readonly (Sensor) +define d_tuer HMCCUCHN TF-Haus-1 readonly +# Gelesen Werte ersetzen (get Befehle liefern true/false, RPC server liefert 0/1) +attr d_tuer substitute true:open,false:closed,1:open,0:closed +###alle infos über hm-gerät stern +get d_ccu deviceinfo Stern +###rpcserver starten +attr d_ccu rpcserver on +###Device der CCU definieren +define EZLampe HMCCUDEV Stern 1 +### Attribut statevals sorgt dafür, dass man den Gerätestatus ohne devstate setzten kann +attr EZLampe statevals on:true,off:false +###Gelesene Werte ersetzen (get Befehle liefern true/false, RPC server liefert 0/1) +attr EZLampe substitute true:on,false:off,1:on,0:off +###Lampe einschalten (2 Varianten, 1. Variante funktioniert wg. Attribut statevals) +set EZLampe on +set EZLampe devstate on +###status von Homematic Device EZLampe erneuern +get EZLampe update State +###alles anzeigen Lassen +list EZLampe +###Update aller Devices (stresst die ccu) +get d_ccu update .* State +###Beispiel: Ein Wandthermostat hat im Kanal 2 einen Datenpunkt SET_TEMPERATURE, mit dem die Zieltemperatur gesetzt wird. Die Einstellung soll mit einem Slider in 1 Grad Schritten zwischen 10 und 25 Grad erfolgen +attr mydev controldatapoint 2.SET_TEMPERATURE +attr mydev webCmd control +attr mydev widgetOverride control:slider,10,1,25 +###alle Ereignisse in aktueller Telnetsitzung anzeigen lassen +inform timer +#ausschalten +inform off +###Gerät in Raum einordnen +attr room +###Gerät in bestimmte Gruppe +attr KuechenLicht group Licht +###Statusicons für Gerät anlegen (http://www.meintechblog.de/2015/04/5-tipps-um-fhem-schoener-zu-machen/) +attr Wz.Seitenfenster devStateIcon open:fts_window_1w_open@red tilted:fts_window_1w_tilt@red closed:fts_window_1w@green +###Raum in der Webansicht verstecken +attr WEB hiddenroom Unsorted +###Raum in der Phoneansicht vertecken +attr WEBphone hiddenroom FBDECT,Plots,Unsorted +###alias für Geräte +attr FBDECT_16 alias Stehlampe +###WifiLight (Rot an, Rot aus, Rot an, Rot aus, Rot an und fade auf Violett) +set KuechenLicht HSV 0,100,100 1 +set KuechenLicht HSV 0,100,0 1 q +set KuechenLicht HSV 0,100,100 1 q +set KuechenLicht HSV 0,100,0 1 q +set KuechenLicht HSV 0,100,100 1 q +set KuechenLicht HSV 300,100,50 10 q +#als notify +define test notify test:on {fhem "set Lampe HSV 0,100,100 1"; fhem "set Lampe HSV 0,100,0 1 q"; ..usw... } +#starten +trigger test on +###Sonnenuntergang +set KuechenLicht HSV 60,0,100; set KuechenLicht HSV 60,70,100 60 q; set KuechenLicht HSV 0,50,80 360 q; set KuechenLicht HSV 200,50,50 600 q; set KuechenLicht HSV 240,100,20 600 q; set KuechenLicht HSV 240,100,0 900 q +###eventmap und andere nützlichen Dinge +define Markise SOMFY 000003 +attr Markise IODev CUL433 +attr Markise devStateIcon auf:fts_shutter_10 ab:fts_shutter_100 stop:fts_shutter_50 +attr Markise enc-key A5 +attr Markise eventMap on:ab off:auf +attr Markise group Rolladen +attr Markise icon scene_terrace +attr Markise rolling-code 0025 +attr Markise room EG +attr Markise webCmd auf:ab:stop +###autosave jede Stunde +define fhem_save_at at *+01:00 save +###alle 3 Stunden statefile schreiben +define AutoSave at +*03:00:00 { WriteStatefile() } +###nanoCUL Absturz bei SOMFY verhindern +#raw Yr2 (2 Wiederholungen) +#bei jedem Rollladen "repetition" setzen +###CUL Frequenzen und andere Sachen setzen +#433er: CUL433 ccconf => freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB +#868er: CUL868 ccconf => freq:868.300MHz bWidth:101KHz rAmpl:33dB sens:8dB +set cul freq 433.920 +###Colorpicker für rgb Lampen im Webinterface einschalten +attr KuechenLicht webCmd RGB +attr KuechenLicht widgetOverride RGB:colorpicker,RGB +###Iconfabe auf den entsprechenden Wert setzen +attr KuechenLicht devStateIcon {Color_devStateIcon(ReadingsVal($name,"RGB","000000"))} +###notify events wenn was passiert (n_mySchalter1_on - notify für mySchalter an -> myLampe1 on +define n_mySchalter1_on notify mySchalter1:on set myLampe1 on +###Event für aus +define n_mySchalter1_off notify mySchalter1:off set myLampe1 off +###event abhängig von $EVENT +define n_mySchalter1 notify mySchalter1 set myLampe1 $EVENT +###Presens von Rechnern per lanping +define pi_Esszimmer PRESENCE lan-ping 192.168.178.49 +###Adresse bei lanping ändern +modify pi_Esszimmer lan-ping 192.168.178.55 +###somfy device anlegen +define FB_R2 SOMFY 000002 +###alle 2 Sekunden go-my beim Rolladen MK_2_tx senden um passenden rollcode zu finden +define somfy_sent_mk2 at +*00:00:02 set MK_2_tx go-my; +###logfile anlegen für somfy FHEMduino_SomfyR_31FB00 und das ganze als text +define FileLog +define FileLog_FHEMduino_SomfyR_31FB00 FileLog ./log/FHEMduino_SomfyR_31FB00-%Y.log FHEMduino_SomfyR_31FB00 +attr FileLog_FHEMduino_SomfyR_31FB00 logtype text +###somfy geräte verbinden - FB und FHEM +attr FHEMduino_SomfyR_D19A2F rawDevice 123456 +define markise SOMFY 123456 A0 0001 +###dynamische icons für die Rollläden +attr R_.* devStateIcon open:fts_garage_door_10@green down:fts_garage_door_100@black 100:fts_garage_door_100 closed:fts_garage_door_100 9\d.*:fts_garage_door_90 8\d.*:fts_garage_door_80 7\d.*:fts_garage_door_70 6\d.*:fts_garage_door_60 5\d.*:fts_garage_door_50 4\d.*:fts_garage_door_40 3\d.*:fts_garage_door_30 2\d.*:fts_garage_door_20 1\d.*:fts_garage_door_10 0\d.*:fts_garage_door_10 +###Calender (Sachsen_Ferien) anlegen der alle 86400 (24h) aktualiesiert wird +define Sachsen_Ferien Calendar ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Sachsen_2016.ics 86400 +#dummy anlegen ob ferien sind oder nicht, der sich das aus dem kalender rausholt +define Ferien dummy +define Sachsen_Ferien.notify notify Sachsen_Ferien { fhem "set Ferien ". (ReadingsVal("Sachsen_Ferien", "modeStart", "") =~ "schulferien" ? 1: 0) } +#je nachdem rollo hoch oder nicht +define RolloHoch at *07:00 { if ( !(Value("Ferien")) ) { fhem("set Rollo hoch");; } } +###Zeitsteuerung (http://www.fhemwiki.de/wiki/At) +define at +#lampe1 um 7 an +define morgens at *7:00:00 set lampe1 on +#alle zwei Stunden und 2 Minuten "lamp" einschalten +define MeineAktion at +*02:02:00 set lamp on +#in zwei Stunden und 2 Minuten "lamp" einschalten +define MeineAktion at +02:02:00 set lamp on +###Zeitsteuerung mit at +define a1 at 17:00:00 set lamp on # fhem command +define a2 at 17:00:00 { Log 1, "Teatime" } # Perl command +define a3 at 17:00:00 "/bin/echo "Teatime" > /dev/console" # shell command +define a4 at *17:00:00 set lamp on # every day +# relative ones +define a5 at +00:00:10 set lamp on # switch on in 10 seconds +define a6 at +00:00:02 set lamp on-for-timer 1 # Blink once in 2 seconds +define a7 at +*{3}00:00:02 set lamp on-for-timer 1 # Blink 3 times +# Blink 3 times if the piri sends a command +define n1 notify piri:on.* define a8 at +*{3}00:00:02 set lamp on-for-timer 1 +# Switch the lamp on from sunset to 11 PM +define a9 at +*{sunset_rel()} set lamp on +define a10 at *23:00:00 set lamp off +# More elegant version, works for sunset > 23:00 too +define a11 at +*{sunset_rel()} set lamp on-till 23:00 +# Only do this on weekend +define a12 at +*{sunset_rel()} { fhem("set lamp on-till 23:00") if($we) } +# Switch lamp1 and lamp2 on from 7:00 till 10 minutes after sunrise +define a13 at *07:00 set lamp1,lamp2 on-till {sunrise(+600)} +# Switch the lamp off 2 minutes after sunrise each day +define a14 at *{sunrise(+120)} set lamp on +# Switch lamp1 on at sunset, not before 18:00 and not after 21:00 +define a15 at *{sunset(0,"18:00","21:00")} set lamp1 on +###Ereignissteuerung {perl expression} "shellcmd" plain->fhem +define b3lampV1 notify btn3 set lamp $EVENT +define b3lampV2 notify btn3 { fhem "set lamp $EVENT" } +define b3lampV3 notify btn3 "/usr/local/bin/setlamp "$EVENT"" +define b3lampV3 notify btn3 set lamp1 $EVENT;;set lamp2 $EVENT +define wzMessLg notify wz:measured.* "/usr/local/bin/logfht $NAME "$EVENT"" +define LogUndef notify global:UNDEFINED.* "send-me-mail.sh "$EVENT"" +###backup von fhem als tar.gz anlegen, wird in /opt/fhem/backup abgelegt +backup +###Temperatursensor Batterietausch hinterlegen +setreading +setreading tempsensor Batteriewechsel 13.12.2014 +###auflistung für alle Batteriewechsel +list .* Batteriewechsel +###JeeLink definieren +define JeeLink JeeLink /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A501ZEAG-if00-port0@57600 +###JeeLink in Gruppe CUL +attr JeeLink group CUL +### +#dummy anlegen für Temperatur +define AussenTemp dummy +#alle 5 Minuten aus device T_Terrasse das reading Temp_Terrasse-1.TEMPERATURE herausholen +define at_AussenTemp at +*00:05:00 {my $d= ReadingsVal(T_Terrasse,Temp_Terrasse-1.TEMPERATURE,0);;fhem("set AussenTemp $d")} +#logfile anlegen +define FileLog_AussenTemp FileLog ./log/AussenTemp-%Y-%m-%d.log AussenTemp +attr FileLog_AussenTemp logtype text +###nur wenn sich das reading geändert hat ins logfile schreiben +attr AussenTemp event-on-change-reading state +#aber mindestens alle 15 Minuten einen Wert +attr AussenTemp event-min-interval state:900 +###nach Stromausfall Kühlschrank einschalten +define not_KuehlschrankAutoStart notify global:INITIALIZED set Kuehlschrank on +###Wettervorhersage einrichten +define MeinWetter Weather 12831893 3600 de +attr MeinWetter room Wettervorhersage +define FileLog_MeinWetter FileLog ./log/meinwetter-%Y-%m.log MeinWetter +attr FileLog_MeinWetter logtype text +attr FileLog_MeinWetter room Wettervorhersage +define weblink_meinwetter weblink htmlCode {WeatherAsHtml("MeinWetter",7)} +attr weblink_meinwetter room Wettervorhersage +###Unwetterkarte +define Unwetter_12345 UWZ DE 12345 3600 +attr Unwetter_12345 room NeuTest +define Unwetter_12345_Detailiert weblink htmlCode {UWZAsHtml("Unwetter_12345")} +attr Unwetter_12345_Detailiert room NeuTest,Wetter +define UnwetterKarte12345 weblink htmlCode {UWZAsHtmlKarteLand("Unwetter_12345","1234567890")} +attr UnwetterKarte12345 alias 1234567890 +attr UnwetterKarte12345 room NeuTest,Wetter +#im Frontend mit Titel anzeigen +define Unwetter_12345_Detailiert weblink htmlCode {"Das ist der Titel:
"UWZAsHtml("Unwetter_12345")} +###eigene readings erstellen, CustomReadings +define myReadings CustomReadings +attr myReadings interval 2 +attr myReadings readingDefinitions kernel:qx(uname -r 2>&1) +###Licht einschalten, wenn es dunkel ist und Fernseher läuft +define Licht_an_1 at *{sunset("REAL")} {if (Value ("TV") eq "present"){fhem ("set Licht on")}} +define Licht_an_2 notify TV:present {if (!isday("REAL")) {fhem ("set Licht on")}} +###Floorplan, sieht gut aus +http://www.meintechblog.de/2016/02/howto-fhem-floorplan-per-rpi2-touchscreen-steuern/#more-10537 +###Koordinaten (Wittgensdorf, Grüner Weg 20) setzen, für sunset, isday ... +attr global latitude 50.8763034 +attr global longitude 12.834976 +###raum umbennen +attr room=Diagramm room Diagramme +###perl code für readings +{ReadingsVal ("DEFINITIONS-NAME", "Vorlauf-Soll", "")} +###stateFormat Formatierung mittels Perlcode +attr stateFormat {sprintf ("%.2f °C",ReadingsVal ("T_Terrasse","Temp_Terrasse-1.TEMPERATURE", ""))} +###sortieren der Räume bzw. Links im Webinterface +attr WEB sortRooms Esszimmer Küche Arbeitszimmer Schlafzimmer Bad Wohnzimmer Keller Treppenhaus Terrasse Licht Wetterbericht +###icons für Räume +attr WEB roomIcons Wohnzimmer:scene_livingroom Küche:scene_cooking Bad:scene_bathroom Esszimmer:scene_dinner Schlafzimmer:scene_sleeping Arbeitszimmer:scene_office Terrasse:scene_terrace Treppenhaus:scene_stairs Keller:control_building_2_s_kg Licht:FS20.off Diagramme:time_graph Wetterbericht:weather_cloudy_light +###Bewegungsmelder, Filelog erzeugen diff --git a/fhem/fhem-5.1-fb7390.image b/fhem/fhem-5.1-fb7390.image new file mode 100644 index 0000000..9d3c8d2 Binary files /dev/null and b/fhem/fhem-5.1-fb7390.image differ diff --git a/fhem/fhem-fuer-Einsteiger_V1.pdf b/fhem/fhem-fuer-Einsteiger_V1.pdf new file mode 100644 index 0000000..b83a54d Binary files /dev/null and b/fhem/fhem-fuer-Einsteiger_V1.pdf differ diff --git a/fhem/fritzfonpic.sh b/fhem/fritzfonpic.sh new file mode 100644 index 0000000..36b9931 --- /dev/null +++ b/fhem/fritzfonpic.sh @@ -0,0 +1,38 @@ +#!/bin/sh +PHONEID=$2 +PHONEBOOKID=255 +PHONEBOOKTYPE=1 +IP=fritz.box + +PASSWD=PASSWORT_DER_FRITZBOX + +TMPFILE=$1 +CURL=$(which curl) + +login(){ +# neues Loginverfahren seit xx.04.76 + eval "$($CURL -s "http://$IP/cgi-bin/webcm" -d "getpage=../html/login_sid.xml" -d "sid=$cgisid" | sed -n 's,.*<\(Challenge\|iswriteaccess\|SID\)>\([^<]*\).*,\1=\2;,p')" + if [ "$iswriteaccess" = 0 ] && [ "$SID" = "0000000000000000" -o -z "$SID" ]; then + chksum="$(echo -n "$Challenge-$PASSWD" | sed -e 's,.,&\n,g' | tr '\n' '\0' | md5sum)" + eval "$($CURL -s "http://$IP/cgi-bin/webcm" -d "getpage=../html/login_sid.xml" -d "login:command/response=$Challenge-${chksum%% *}" | sed -n 's,.*\(.*\).*,SID=\1,p')" + cgisid="$SID" + echo -n "$cgisid" >/tmp/sid + fi +} + +change(){ + echo "CHANGE $cgisid" + $CURL -o /dev/null \ + -F "sid=$cgisid" \ + -F "PhonebookId=$PHONEBOOKID" \ + -F "PhonebookType=$PHONEBOOKTYPE" \ + -F "PhonebookEntryId=$PHONEID" \ + -F "PhonebookPictureFile=@$TMPFILE" \ + http://$IP/cgi-bin/firmwarecfg +} + +echo "login ...." +login +echo "change ...." +change + diff --git a/fhem/fritzfonpic_simple.sh b/fhem/fritzfonpic_simple.sh new file mode 100644 index 0000000..cb3724c --- /dev/null +++ b/fhem/fritzfonpic_simple.sh @@ -0,0 +1,7 @@ +#!/bin/sh +LASTTEMP=-2.1 +LASTHYGRO=88 +LASTWIND=3.0 +convert -pointsize 8 -weight Bold -font Helvetica -fill blue -draw "text 65,40 \"Temp: $LASTTEMP\"" -draw "text 65,60 \"Feuchte: $LASTHYGRO \"" -draw "text 65,80 \"Wind: $LASTWIND \"" fhem120.jpg fritzergebnis.jpg +./fritzfonpic.sh fritzergebnis.jpg 610 +./fritzfonpic.sh fritzergebnis.jpg 611 diff --git a/fhem/zufallRollladenSteuerung.fhem b/fhem/zufallRollladenSteuerung.fhem new file mode 100644 index 0000000..64c013a --- /dev/null +++ b/fhem/zufallRollladenSteuerung.fhem @@ -0,0 +1,15 @@ +Achtung: Dieses Skript ist so angelegt, dass es direkt in die FHEM Konfigurationsdatei „fhem.cfg“ kopiert werden kann – daher ist der „\“ am Ende der Zeile und die doppelten „;;“ wichtig. Kopiert man das Skript über die Web-Oberfläche in eine Definition, muss man den Backslash „\“ weglassen und darf eine Zeile nur mit einem „;“ abschließen. + +Dieses Skript wird mit einem „define“ Befehl jeden Morgen um 08:00 Uhr gestartet und erzeugt dann eine Zufallszahl zwischen 1 und 15. In der Woche werden die Rolläden dann zwischen 08:01:01 und 08:15:15 Uhr hochgefahren, am Wochenende erst zwischen 10:01:01 und 10:15:15 Uhr. + +define morgens_Schlafzimmer_Rollaeden at *08:00:00 {\ + if (!$we) {\ + my $Zufallszahl = int(rand(15) +1 );;\ + my $Uhr = "08:".$Zufallszahl.":".$Zufallszahl;;\ + fhem("define morgens_Schlafzimmer_Rollaeden_auf1 at *".$Uhr." { fhem('set SZ_ROLLADEN on') }");;\ + }else{\ + my $Zufallszahl = int(rand(15) +1 );;\ + my $Uhr = "10:".$Zufallszahl.":".$Zufallszahl;;\ + fhem("define morgens_Arbeitszimmer_Rollaeden_auf1 at *".$Uhr." { fhem('set SZ_ROLLADEN on') }");;\ + }\ +} diff --git a/find.txt b/find.txt new file mode 100644 index 0000000..cff1f5f --- /dev/null +++ b/find.txt @@ -0,0 +1,2 @@ +###dateien (png) größer 1700k +find -type f -size +1700k -name \*.png diff --git a/firewall.txt b/firewall.txt new file mode 100644 index 0000000..81383fd --- /dev/null +++ b/firewall.txt @@ -0,0 +1,341 @@ +###WEB-Seiten zum Thema Sicherheit/Firewall links +Mit den Protokollhelferlein der Paketfilter lassen sich in +NAT-Umgebungen hübsche Spielchen treiben. Siehe u.a.: +http://groups.google.com/groups?selm=5323.13182.1106115945@news.jors.net +http://www.bedatec.de/ftpnat/ +http://www.enyo.de/fw/security/java-firewall/ +http://groups.google.com/groups?selm=87br3weqso.fsf@mid.deneb.enyo.de +http://www.ulm.ccc.de/PersonalFirewalls +###limitiere Verbindungsversuche pro Minute auf 5 +iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource +iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --name DEFAULT --rsource -j DROP +###log scans +iptables -A FORWARD -p tcp --tcp-flags ALL SYN,FIN -j LOG --log-prefix " SYNFINSCAN " +iptables -A FORWARD -p tcp --tcp-flags ALL FIN -j LOG --log-prefix " FINSCAN " +iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j LOG --log-prefix " NULLSCAN " +iptables -A FORWARD -p tcp --tcp-flags ALL FIN,PSH,URG -j LOG --log-prefix " XMAS " +iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,ACK -m state --state NEW -j LOG --log-prefix " SPOOF_FALLOUT " +iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,ACK -m state --state NEW -j REJECT --reject-with icmp-host-unreachable +#noch mehr + +# Stealth Scans etc. DROPpen +# Keine Flags gesetzt +iptables -A INPUT -p tcp --tcp-flags ALL NONE -j MY_DROP +iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j MY_DROP + +# SYN und FIN gesetzt +iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP +iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP + +# SYN und RST gleichzeitig gesetzt +iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP +iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP + +# FIN und RST gleichzeitig gesetzt +iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP +iptables -A FORWARD -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP + +# FIN ohne ACK +iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP +iptables -A FORWARD -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP + +# PSH ohne ACK +iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP +iptables -A FORWARD -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP + +# URG ohne ACK +iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j MY_DROP +iptables -A FORWARD -p tcp --tcp-flags ACK,URG URG -j MY_DROP + +###VPN zu JOErICH +iptables -I POSTROUTING -t nat -o tap0 -d 192.168.111.0/24 -j MASQUERADE +route add -net 192.168.111.0 netmask 255.255.255.0 dev tap0 + +###modem auslesen am wan per http oder telnet (linksys) +ip addr add 169.254.1.3/24 dev vlan1 brd + +iptables -I POSTROUTING -t nat -o vlan1 -d 169.254.1.0/24 -j MASQUERADE + +###eine minifirewall (man koennte das auch ohne die eigene chain machen) +# Insert connection-tracking modules (not needed if built into kernel). + insmod ip_conntrack + insmod ip_conntrack_ftp + +# Create chain which blocks new connections, except if coming from inside. + iptables -N block + iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT + iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT + iptables -A block -j DROP + +# Jump to that chain from INPUT and FORWARD chains. + iptables -A INPUT -j block + iptables -A FORWARD -j block + +###eine minifirewall (ohne chains, nur ausgehende verbindungen) + INC_DEV="Netzwerkkarte wo Internet her kommt Bsp.: ppp0" + iptables -P INPUT DROP + iptables -P OUTPUT DROP + iptables -P FORWARD DROP + + iptables -I -m state --state ESTABLISHED,RELATED -j ACCEPT + iptables -I -m state --state NEW -i ! $INC_DEV -j ACCEPT + +###packetweg im kernel (linux) + _____ +Incoming / \ Outgoing + -->[Routing ]--->|FORWARD|-------> + [Decision] \_____/ ^ + | | + v ____ + ___ / \ + / \ |OUTPUT| + |INPUT| \____/ + \___/ ^ + | | + ----> Local Process ---- + +###generell zum NAT +DNAT in PREROUTING, +SNAT in POSTROUTING -> dann klappts auch mit dem Routing +###Masquerade/NAT out ppp0 +iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE + +###verbieten von NEW und INVALID / Disallow NEW and INVALID incoming or forwarded packets from ppp0. +iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP +iptables -A FORWARD -i ppp0 0 -m state --state NEW,INVALID -j DROP + +###IP forwarding anschalten +echo "1">/proc/sys/net/ipv4/ip_forward +###IP forwarding ausschalten +echo "0">/proc/sys/net/ipv4/ip_forward + +###masquerading +This is what most people want. If you have a dynamically allocated IP PPP dialup (if you don't know, you do have one), you simply want to tell your box that all packets coming from your internal network should be made to look like they are coming from the PPP dialup box. + + # Load the NAT module (this pulls in all the others). + modprobe iptable_nat + + # In the NAT table (-t nat), Append a rule (-A) after routing + # (POSTROUTING) for all packets going out ppp0 (-o ppp0) which says to + # MASQUERADE the connection (-j MASQUERADE). + iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE + + # Turn on IP forwarding + echo 1 > /proc/sys/net/ipv4/ip_forward + +This is a much more niche userbase, so I didn't worry about backwards compatibility as much. You can simply use `iptables -t nat' to do port forwarding. So for example, in Linux 2.2 you might have done: + + # Linux 2.2 + # Forward TCP packets going to port 8080 on 1.2.3.4 to 192.168.1.1's port 80 + ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80 + +Now you would do: + + # Linux 2.4 + # Append a rule pre-routing (-A PREROUTING) to the NAT table (-t nat) that + # TCP packets (-p tcp) going to 1.2.3.4 (-d 1.2.3.4) port 8080 (--dport 8080) + # have their destination mapped (-j DNAT) to 192.168.1.1, port 80 + # (--to 192.168.1.1:80). + iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080 -j DNAT --to 192.168.1.1:80 + +If you want this rule to alter local connections as well (i.e., even on the NAT box itself, trying to telnet to 1.2.3.4's port 8080 will get you to 192.168.1.1's port 80), you can insert the same rule in the OUTPUT chain (which is for local outgoing packets): + + # Linux 2.4 + iptables -A OUTPUT -t nat -p tcp -d 1.2.3.4 --dport 8080 -j DNAT --to 192.168.1.1:80 + +###NAT packete im kernel + + _____ _____ + / \ / \ + PREROUTING -->[Routing ]----------------->POSTROUTING-----> + \D-NAT/ [Decision] \S-NAT/ + | ^ + | __|__ + | / \ + | | OUTPUT| + | \D-NAT/ + | ^ + | | + --------> Local Process ------ + + +###Source NAT / SNAT +You want to do Source NAT; change the source address of connections to something different. This is done in the POSTROUTING chain, just before it is finally sent out; this is an important detail, since it means that anything else on the Linux box itself (routing, packet filtering) will see the packet unchanged. It also means that the `-o' (outgoing interface) option can be used. + +Source NAT is specified using `-j SNAT', and the `--to-source' option specifies an IP address, a range of IP addresses, and an optional port or range of ports (for UDP and TCP protocols only). + + ## Change source addresses to 1.2.3.4. + # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4 + + ## Change source addresses to 1.2.3.4, 1.2.3.5 or 1.2.3.6 + # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6 + + ## Change source addresses to 1.2.3.4, ports 1-1023 + # iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023 + +Masquerading + +There is a specialized case of Source NAT called masquerading: it should only be used for dynamically-assigned IP addresses, such as standard dialups (for static IP addresses, use SNAT above). + +You don't need to put in the source address explicitly with masquerading: it will use the source address of the interface the packet is going out from. But more importantly, if the link goes down, the connections (which are now lost anyway) are forgotten, meaning fewer glitches when connection comes back up with a new IP address. + + ## Masquerade everything out ppp0. + # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE + + +###Destination NAT / DNAT / Portforwarding +This is done in the PREROUTING chain, just as the packet comes in; this means that anything else on the Linux box itself (routing, packet filtering) will see the packet going to its `real' destination. It also means that the `-i' (incoming interface) option can be used. + +To alter the destination of locally-generated packets, the OUTPUT chain can be used, but this is more unusual. + +Destination NAT is specified using `-j DNAT', and the `--to-destination' option specifies an IP address, a range of IP addresses, and an optional port or range of ports (for UDP and TCP protocols only). + + ## Change destination addresses to 5.6.7.8 + # iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8 + + ## Change destination addresses to 5.6.7.8, 5.6.7.9 or 5.6.7.10. + # iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8-5.6.7.10 + + ## Change destination addresses of web traffic to 5.6.7.8, port 8080. + # iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 5.6.7.8:8080 + + ## Redirect local packets to 1.2.3.4 to loopback. + # iptables -t nat -A OUTPUT -d 1.2.3.4 -j DNAT --to 127.0.0.1 + +###Redirection / redirect +There is a specialized case of Destination NAT called redirection: it is a simple convenience which is exactly equivalent to doing DNAT to the address of the incoming interface. + + ## Send incoming port-80 web traffic to our squid (transparent) proxy + iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128 + + +Configuring a Stateful Linux Firewall with IPTables / NetFilter + +Tony Perrie + +January 9, 2002 + +Linux Packet Filtering Implementations + + * 1st Generation - Alan Cox's port of BSD UNIX's ipfw to Linux 1.1 + * 2nd Generation - Jos Vos and others added the ipfwadm tool in Linux 2.0. + * 3rd Generation - Rusty Russel and Michael Neuling made significant changes to ipfw, and ipchains was released in Linux 2.2. + * 4th Generation - Rusty Russel and others implemented a modular packet filter/mangler infrastructure called NetFilter for Linux 2.4. + +Routing Packets with SNAT + + * Source Network Address Translation enables you to get access to an external network (usually the Internet) from behind the firewall. + * Enable Packet Forwarding + o echo 1 > /proc/sys/net/ipv4/ip_forward + o Allows kernel-level IP Forwarding + o Disabled by default in most distros + o service network restart resets ip_forward to 0 (unless you've h4x0red /etc/init.d/network) + * Enable Masquerading + o Dynamic IP: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE + o Static IP: iptables -t nat -A POSTROUTING -o eth0 -j SNAT -to 24.0.0.0 + o This allows machines to masquerade from behind the firewall. + +Default Policies / Output Port Blocking + + * Default Policies + o iptables -P INPUT DROP + + This is a highly recommended as default. + + Basically drop everything unless told otherwise + o iptables -P OUTPUT ACCEPT + + Some suggest to default OUTPUT to DROP + + It's not really necessary though. + o iptables -P FORWARD ACCEPT + o This is needed for NAT / MASQUERADING + * Output Port Blocking + o Be careful blocking output ports. Blocking port 80 doesn't only stop hackers, it also stops IE, Netscape, Galeon, from accessing most web servers. + o iptables -A OUTPUT -o eth0 -p tcp -dport 31337 -j DROP + o iptables -A OUTPUT -o eth0 -p tcp -sport 31337 -j DROP + +Output Port Blocking / External Port Blocking + + * Output Port Blocking Continued + o Ports to block: 31337 , 31335, 27444, 27665, 20034 NetBus, 9704, 137-139 (smb), 1433, 2049, 5432, 5999, 6063, 5900-5910 (vnc) + * External Port Blocking + o Reject Ident Requests (ircers will probably want to accept ident) + o iptables -A FORWARD -i eth0 -p tcp -dport 113 -j REJECT + o iptables -A OUTPUT -o eth0 -p tcp -dport 113 -j REJECT + o Allow Nortel IPSEC Rekey Packets (IBM VPN) + o iptables -A FORWARD -i eth0 -p tcp -dport 500 -j ALLOW + o iptables -A OUTPUT -o eth0 -p tcp -dport 500 -j ALLOW + +Drop Bogus Packets / Log & Limit Suspicious Traffic + + * Drop Bogus Packets + o RESERVED_NET="0.0.0.0/8 1.0.0.0/8 2.0.0.0/8 5.0.0.0/8 7.0.0.0/8 ... " + + for NET in $RESERVED_NET; do + iptables -A FORWARD -d $NET -j DROP + done + + * Log Suspicious Packets + o Create a new chain called CHECK_FLAGS + o iptables -N CHECK_FLAGS + o iptables -A CHECK_FLAGS -p tcp -tcp-flags ALL FIN,URG,PSH -m limit -limit 5/minute -j LOG -log-level 6 -log-prefix "NMAP-XMAS:" + o iptables -A CHECK_FLAGS -p tcp -tcp-flags ALL FIN,URG,PSH -j DROP + +Jump to a Custom Chain / Define Stateful Rules + + * Jump to a Custom Chain + o iptables -A INPUT -i eth0 -j CHECK_FLAGS + o iptables -A FORWARD -i eth0 -j CHECK_FLAGS + * Define Stateful Rules + o iptables -A OUTPUT -m state -state INVALID -j DROP + o iptables -A OUTPUT -m state -state RELATED, ESTABLISHED -j ACCEPT + o iptables -A OUTPUT -i ! eth0 -m state -state NEW -j ACCEPT + o ACCEPT packets whose input interface is anything but the external interface. + +Blocking ICMP / Port Forwarding with DNAT + + * Port Forwarding + o Port Forwarding an IPSEC client/server on 500 using protocol 17 (needed for VPN access) + o iptables -t nat -A PREROUTING -i eth0 -p 17 -dport 500 -j DNAT -to 192.168.0.2:500 + o Port Forwarding WWW on Port 80 + o iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.2:80 + o forwarded packets back + o iptables -t nat -A POSTROUTING -o eth0 -p tcp -j SNAT -to IP_OF_FORWARDING_PC + * Blocking ICMP + o Using Default DROP for input blocks ICMP (Ping) + o iptables -A OUTPUT -i eth0 -p icmp -icmp-type 8 -j DROP + o iptables -A FORWARD -i eth0 -p icmp -icmp-type 8 -j DROP + o iptables -A OUTPUT -i eth0 -p icmp -icmp-type 8 -j ACCEPT + +ToS Packet Mangling / MAC Addresses as Filtering Criteria + + * ToS Packet Mangling + o Allows for Type-Of-Service Parameters to be set per protocol + o iptables -t mangle -A FORWARD -p tcp -dport 22 -j TOS -set-tos 16 + o iptables -t mangle -A FORWARD -p tcp -dport 80 -j TOS -set-tos 8 + * MAC Addresses as Filtering Criteria + o iptables -A FORWARD -m state -state NEW -m mac -mac-source 00:C7:8F:72:14 -j ACCEPT + o Allows a known MAC Address to be forwarded + +IBM-Rochester Nortel VPN Access + + ## OPENS NORTEL EXTERNAL PORT 500 + iptables -A OUTPUT -i eth0 -p tcp --dport 500 -j ACCEPT + iptables -A FORWARD -i eth0 -p tcp --dport 500 -j ACCEPT + ## PORT FORWARD FOR IPSEC "REKEYING" + iptables -t nat -A PREROUTING -i eth0 -p 17 --dport 500 -j DNAT --to 192.168.0.2:500 + + * Assumes 192.168.0.2 is the computer you are running the VPN client, and eth0 is external + +###DHCP / dhcp - Server dhcpd +#filename: /etc/dhcpd.conf +default-lease-time 86400; +max-lease-time 86400; + +subnet 192.168.0.0 netmask 255.255.255.0 { + range 192.168.0.2 192.168.0.250; + option subnet-mask 255.255.255.0; + option broadcast-address 192.168.0.255; + option routers 192.168.0.1; + option domain-name-servers 192.168.0.4, + 12.24.250.39, 12.24.250.40, 206.25.127.40; + option domain-name "chartermi.net"; +} +###ICMP die genutzt werden sollten +ICMP-Nachrichten des Typs 0, 3, 4, 8, 11 und 12 diff --git a/foremost.txt b/foremost.txt new file mode 100644 index 0000000..6defff1 --- /dev/null +++ b/foremost.txt @@ -0,0 +1,2 @@ +###filerecovery utility, Dateiwiderherstellung +foremost -t jpg,jpeg -i datenimage.img -o /recovery/foremost diff --git a/framebuffer.txt b/framebuffer.txt new file mode 100644 index 0000000..be98d7c --- /dev/null +++ b/framebuffer.txt @@ -0,0 +1,2 @@ +###Auflösungen Framebuffer herausfinden +hwinfo --framebuffer diff --git a/freifunk.txt b/freifunk.txt new file mode 100644 index 0000000..0010e6b --- /dev/null +++ b/freifunk.txt @@ -0,0 +1,14 @@ +###account +#user: person-mhoellein +#pass: LxkAymrACzrg2HHfjmD89hYf + +#node bernsdorfer str. die internet macht +74:ea:3a:be:20:24 40-183 +#meine nodes +40-72 64:70:02:3A:9B:CE +40-74 66:70:02:3A:B9:79 schlafzimmer +40-75 66:70:02:AE:79:97 wohnzimmer +40-79 5ghz A0:F3:C1:78:0C:7F / 2.4 ghza2:f3:c1:78:0c:80 arbeitszimmer +40-186 A0:F3:C1:66:BB:00 +###macs die ich rein bekomme +40-127 de:9f:db:90:27:b4 diff --git a/freifunk/config/batman-adv b/freifunk/config/batman-adv new file mode 100644 index 0000000..61d0814 --- /dev/null +++ b/freifunk/config/batman-adv @@ -0,0 +1,17 @@ +config 'mesh' 'bat0' + option 'interfaces' 'mesh' + option 'aggregated_ogms' + option 'ap_isolation' + option 'bonding' + option 'fragmentation' + option 'gw_bandwidth' + option 'gw_mode' + option 'gw_sel_class' + option 'log_level' + option 'orig_interval' + option 'vis_mode' + option 'bridge_loop_avoidance' + +# yet another batX instance +# config 'mesh' 'bat5' +# option 'interfaces' 'second_mesh' diff --git a/freifunk/config/dhcp b/freifunk/config/dhcp new file mode 100644 index 0000000..a041045 --- /dev/null +++ b/freifunk/config/dhcp @@ -0,0 +1,19 @@ +package dhcp + +config 'mesh' 'bat0' + option 'interfaces' 'mesh' +config dhcp 'lan' + option interface 'lan' + option ignore '1' + +config dhcp 'wan' + option interface 'wan' + option ignore '1' + +config dnsmasq + option nonegcache '1' + option authoritative '1' + option leasefile '/tmp/dhcp.leases' + option resolvfile '/etc/resolv.conf.auto' + option domain 'routers.chemnitz.freifunk.net' + diff --git a/freifunk/config/network b/freifunk/config/network new file mode 100644 index 0000000..e8cea77 --- /dev/null +++ b/freifunk/config/network @@ -0,0 +1,29 @@ +package network + + +config interface 'loopback' + option ifname 'lo' + option proto 'static' + option ipaddr '127.0.0.1' + option netmask '255.0.0.0' + +config interface 'lan' + option ifname 'eth1 wlan0' + option type 'bridge' + option proto 'static' + option ipaddr '10.8.40.72' + option netmask '255.255.248.0' + +config interface 'wan' + option ifname 'eth0' + option proto 'dhcp' + +config switch + option name 'switch0' + option reset '1' + option enable_vlan '1' + +config switch_vlan + option device 'switch0' + option vlan '1' + option ports '0 1 2 3 4' diff --git a/freifunk/config/system b/freifunk/config/system new file mode 100644 index 0000000..a4687b2 --- /dev/null +++ b/freifunk/config/system @@ -0,0 +1,42 @@ +config system + option hostname 'node-40-72' + option timezone 'CET-1CEST,M3.5.0,M10.5.0/3' + +config timeserver 'ntp' + list server 'de.pool.ntp.org' + option enable_server '0' + +config led 'led_wan' + option name 'WAN' + option sysfs 'tp-link:green:wan' + option trigger 'netdev' + option dev 'eth0' + option mode 'link tx rx' + +config led 'led_lan1' + option name 'LAN1' + option sysfs 'tp-link:green:lan1' + option trigger 'switch0' + option port_mask '0x04' + +config led 'led_lan2' + option name 'LAN2' + option sysfs 'tp-link:green:lan2' + option trigger 'switch0' + option port_mask '0x08' + +config led 'led_lan3' + option name 'LAN3' + option sysfs 'tp-link:green:lan3' + option trigger 'switch0' + option port_mask '0x10' +config led 'led_lan4' + option name 'LAN4' + option sysfs 'tp-link:green:lan4' + option trigger 'switch0' + option port_mask '0x02' + +config led 'led_wlan' + option name 'WLAN' + option sysfs 'tp-link:green:wlan' + option trigger 'phy0tpt' diff --git a/freifunk/config/wireless b/freifunk/config/wireless new file mode 100644 index 0000000..fc3244b --- /dev/null +++ b/freifunk/config/wireless @@ -0,0 +1,29 @@ +config wifi-device 'radio0' + option type 'mac80211' + option channel '11' + option macaddr '64:70:02:3a:9b:ce' + option hwmode '11ng' + option htmode 'HT20' + list ht_capab 'LDPC' + list ht_capab 'SHORT-GI-20' + list ht_capab 'SHORT-GI-40' + list ht_capab 'TX-STBC' + list ht_capab 'RX-STBC1' + list ht_capab 'DSSS_CCK-40' + option disabled '0' + +config wifi-iface + option device 'radio0' + option network 'lan' + option mode 'ap' + option ssid 'chemnitz.freifunk.net' + option encryption 'none' + +config wifi-iface + option device 'radio0' + option networt 'batmesh' + option mode 'adhoc' + option ssid 'peer.chemnitz.freifunk.net' + option bssid '02:ff:c0:00:00:00' + option encryption 'none' + diff --git a/freifunk/ffc b/freifunk/ffc new file mode 100755 index 0000000..cffe558 --- /dev/null +++ b/freifunk/ffc @@ -0,0 +1,208 @@ +#!/bin/bash + +# PLEASE KEEP VERSION INFORMATION UPDATED IN CASE YOU MAKE CHANGES TO THIS SCRIPT +VERSION="20130322" + +CONFDIR="/etc" +UPDATESRV="http://firmware.chemnitz.freifunk.net/autoupdate/attitude_adjustment/STABLE" +STATSRV="http://api.routers.chemnitz.freifunk.net/update.php" + +## Configuration and inputs +read_config() { + source $CONFDIR/ffc.conf + if [ "$REMOVEME" == "1" ]; then + echo "Dieser Router ist noch nicht konfiguriert." + echo "Bitte >> /usr/sbin/ffc firstboot << starten, um das Setup zu beginnen." + exit 2 + fi +} + +## Setup +setup_firstboot() { + source $CONFDIR/ffc.conf + if [ "$REMOVEME" != "1" ]; then + echo "! DIESER ROUTER IST BEREITS KONFIGURIERT !"; echo "" + fi + + # Gather all values needed for setup + echo "Willkommen zum Freifunk Chemnitz Router-Setup!"; echo "" + echo "Hilfe zu den Konfigurations-Flags gibt es unter:" + echo "http://www.chemnitz.freifunk.net/static-howto-setup"; echo "" + for key in "${SETUP[@]}"; do + eval val="\${$key[0]}" + echo -n "$key [$val]: "; read ans + ans=${ans:-$val} + sed -e "s/^$key=.*/$key=\"$ans\"/g" -i $CONFDIR/ffc.conf + done + + # Remove firstboot entry and perform configuration reload + sed -e "/^REMOVEME/d" -i $CONFDIR/ffc.conf + source $CONFDIR/ffc.conf + + echo ""; echo "---"; cat $CONFDIR/ffc.conf; echo "---"; echo "" + + # VTUN + echo -n "VTUN: " + if [ "$WANIF" ] && [ "$VTUNPSK" ]; then + sed -e "s/WANIF/$WANIF/g" -e "s/VTUNIF/$VTUNIF/g" -e "s/IPV4_1/$IPV4_1/g" -e "s/IPV4_2/$IPV4_2/g" -e "s/VTUNPSK/$VTUNPSK/g" -i $CONFDIR/vtund.conf + echo "OK" + else + echo "disabled" + fi + + # 5GHz + echo -n "5GHz: " + if [ "$WLANAP5GHZ" ] || [ "$WLANMESH5GHZ" ]; then + echo "OK" + else + echo "disabled" + fi + + # UCI + echo -n "UCI: " + uci import -m dhcp < $CONFDIR/ffc.uci.dhcp + uci import -m wireless < $CONFDIR/ffc.uci.wireless + uci set system.hostname="node-$IPV4_1-$IPV4_2" + uci set system.timezone="CET-1CEST,M3.5.0,M10.5.0/3" + uci commit + echo "OK"; +} + +setup_autostart() { + setup_mesh + if [ "$WANIF" ] && [ "$VTUNPSK" ]; then + vtund -p -t 30 node-${IPV4_1}-${IPV4_2} uplink-vtun.routers.chemnitz.freifunk.net + fi + + # Overwrite any maintenance or pre-configured network settings + ip addr flush dev $BRIDGEIF + ip addr add 10.8.${IPV4_1}.${IPV4_2}/21 brd 10.8.47.255 dev $BRIDGEIF + ip -6 addr add 2001:470:7b1d:ff::${IPV4_1}:${IPV4_2}/64 dev $BRIDGEIF + ip route add 10.8.0.0/16 via 10.8.47.254 dev $BRIDGEIF + ip link set up dev $BRIDGEIF + setup_firewall + + if [ -f "/tmp/ffc.selfupdate.conf" ]; then + source /tmp/ffc.selfupdate.conf + if [ "$POSTPONED" == "1" ]; then + ip route add default via 10.8.47.254 dev $BRIDGEIF + echo "nameserver 10.8.6.6" > /etc/resolv.conf + setup_selfupdate + fi + fi +} + +setup_mesh() { + read_config + ip link set up mtu 1528 multicast on dev $WLANMESH + batctl interface add $WLANMESH + if [ "$WLANMESH5GHZ" ]; then + ip link set up mtu 1528 multicast on dev $WLANMESH5GHZ + batctl interface add $WLANMESH5GHZ + fi + brctl addif $BRIDGEIF $BATMANIF + ip link set up dev $BATMANIF address 00:ff:c0:00:${IPV4_1}:${IPV4_2} +} + +setup_vtun() { + read_config + ip link set up mtu 1528 multicast on dev $VTUNIF + batctl interface add $VTUNIF + batctl bridge_loop_avoidance 1 + brctl addif $BRIDGEIF $BATMANIF + ip link set up dev $BATMANIF address 00:ff:c0:00:${IPV4_1}:${IPV4_2} +} + +setup_firewall() { + read_config + if [ -x "/usr/sbin/ffc-firewall-local" ]; then + /usr/sbin/ffc-firewall-local + fi +} + +setup_selfupdate() { + # Routers without native internet connection will have no default gateway yet + # to connect to the update server since the mesh has not yet been set up. + # We have to postpone all operations until the router is fully configured by autostart. + if [ ! "$(ip route show | grep default)" ]; then + echo "Keine Internetverbindung" + echo "POSTPONED=1" > /tmp/ffc.selfupdate.conf + exit 1 + fi + + wget -q -O /tmp/ffc "$UPDATESRV/ffc" + if [ $? -gt 0 ] && [ $(wc -c /tmp/ffc | awk '{print $1}') -lt 1000 ]; then + echo "Verbindung fehlgeschlagen" + exit 2 + fi + chmod +x /tmp/ffc + /bin/bash -n /tmp/ffc + if [ $? -gt 0 ]; then + echo "Syntax-Check fehlgeschlagen" + exit 2 + fi + mv /tmp/ffc /usr/sbin/ffc +} + +statistics() { + read_config + STATURL="$STATSRV?apikey=$APIKEY&version=$VERSION&type=statistics" + + # Network traffic + DATA="/sys/class/net/$BATMANIF/statistics" + if [ -d "$DATA" ]; then + VAL1=$(cat $DATA/rx_bytes) + VAL2=$(cat $DATA/tx_bytes) + STATURL="$STATURL&traffic=$VAL1;$VAL2" + unset VAL1 VAL2 + fi + + # Wired clients + DATA="" # TODO + if [ "$DATA" ]; then + VAL1="" + STATURL="$STATURL&clients_wired=$VAL1" + unset VAL1 + fi + + # Wireless clients 2.4GHz + DATA=$(iw dev $WLANAP station dump) + if [ "$DATA" ]; then + VAL1=$(echo "$DATA" | grep -e "^Station" | awk '{print $2}' | tr '\n' ';') + STATURL="$STATURL&clients_24ghz=$VAL1" + unset VAL1 + fi + + # Wireless clients 5GHz + if [ "$WLANAP5GHZ" ]; then + DATA=$(iw dev $WLANAP5GHZ station dump) + if [ "$DATA" ]; then + VAL1=$(echo "$DATA" | grep -e "^Station" | awk '{print $2}' | tr '\n' ';') + STATURL="$STATURL&clients_5ghz=$VAL1" + unset VAL1 + fi + fi + + wget -q -O /dev/null "$STATURL" +} + +# This function will be called once in a minute by crond +cron_sched() { + # Export statistics + statistics +} + +## Main function +case $1 in + autostart) setup_autostart ;; + firstboot) setup_firstboot ;; + selfupdate) setup_selfupdate ;; + statistics) statistics ;; + cron-scheduler) cron_sched ;; + setup-mesh) setup_mesh ;; + setup-vtun) setup_vtun ;; + setup-firewall) setup_firewall ;; + *) echo "Usage: autostart | firstboot | selfupdate | statistics | cron-scheduler | setup-mesh | setup-vtun | setup-firewall" ;; +esac + +exit 1 diff --git a/freifunk/ffc.conf b/freifunk/ffc.conf new file mode 100644 index 0000000..11984d1 --- /dev/null +++ b/freifunk/ffc.conf @@ -0,0 +1,14 @@ +SETUP=("IPV4_1" "IPV4_2" "BRIDGEIF" "WANIF" "WLANAP" "WLANMESH" "WLANAP5GHZ" "WLANMESH5GHZ" "BATMANIF" "VTUNIF" "VTUNPSK" "APIKEY") + +BATMANIF="bat0" +BRIDGEIF="br-lan" +IPV4_1="40" +IPV4_2="72" +WANIF="eth1" +WLANAP="wlan0" +WLANAP5GHZ="" +WLANMESH="wlan0-1" +WLANMESH5GHZ="" +VTUNIF="vtun0" +VTUNPSK="bfe79d1e9743a" +APIKEY="a2d37164fd32895b9015411abc3d7a46589b71d6" diff --git a/freifunk/ffc.uci.dhcp b/freifunk/ffc.uci.dhcp new file mode 100644 index 0000000..f6bb518 --- /dev/null +++ b/freifunk/ffc.uci.dhcp @@ -0,0 +1,12 @@ +package dhcp + +config dnsmasq + option nonegcache '1' + option authoritative '1' + option leasefile '/tmp/dhcp.leases' + option resolvfile '/etc/resolv.conf.auto' + option domain routers.chemnitz.freifunk.net + +config dhcp 'wan' + option interface 'wan' + option ignore '1' diff --git a/freifunk/ffc.uci.wireless b/freifunk/ffc.uci.wireless new file mode 100644 index 0000000..4aa50e2 --- /dev/null +++ b/freifunk/ffc.uci.wireless @@ -0,0 +1,41 @@ +package wireless + +config wifi-device 'radio0' + option channel '11' + option hwmode '11ng' + option disabled '0' + +config wifi-iface + option device 'radio0' + option network 'lan' + option mode 'ap' + option ssid 'chemnitz.freifunk.net' + option encryption 'none' + +config wifi-iface + option device 'radio0' + option networt 'batmesh' + option mode 'adhoc' + option ssid 'peer.chemnitz.freifunk.net' + option bssid '02:ff:c0:00:00:00' + option encryption 'none' + +config wifi-device 'radio1' + option channel '36' + option hwmode '11na' + option disabled '0' + +config wifi-iface + option device 'radio1' + option network 'lan' + option mode 'ap' + option ssid 'chemnitz.freifunk.net' + option encryption 'none' + +config wifi-iface + option device 'radio1' + option network 'batmesh' + option mode 'adhoc' + option ssid 'peer.chemnitz.freifunk.net' + option bssid '02:ff:c0:00:00:00' + option encryption 'none' diff --git a/freifunk/resolv.conf b/freifunk/resolv.conf new file mode 100644 index 0000000..76c959f --- /dev/null +++ b/freifunk/resolv.conf @@ -0,0 +1,2 @@ +search routers.chemnitz.freifunk.net +nameserver 127.0.0.1 diff --git a/freifunk/resolv.conf.auto b/freifunk/resolv.conf.auto new file mode 100644 index 0000000..9c468b3 --- /dev/null +++ b/freifunk/resolv.conf.auto @@ -0,0 +1,3 @@ +nameserver 8.8.8.8 +nameserver 8.8.4.4 +search routers.chemnitz.freifunk.net \ No newline at end of file diff --git a/freifunk/vtund.conf b/freifunk/vtund.conf new file mode 100644 index 0000000..03e1892 --- /dev/null +++ b/freifunk/vtund.conf @@ -0,0 +1,25 @@ +options { + port 5000; + bindaddr { + iface eth1; + }; + + syslog daemon; +} + +default { + compress yes; + encrypt no; + keepalive yes; + type ether; + proto tcp; + device vtun0; + + up { + program /usr/sbin/ffc "setup-vtun"; + }; +} + +node-40-72 { + passwd bfe79d1e9743a; +} diff --git a/fritzbox.txt b/fritzbox.txt new file mode 100644 index 0000000..884d2b9 --- /dev/null +++ b/fritzbox.txt @@ -0,0 +1,405 @@ +###platten immer mit gleichem namen, in autorun.sh im root +#begin script +#!/bin/sh +pfad=$(echo "$0" | sed "s/\/autorun.sh//") +mount | grep "/var/media/ftp/disk" >> /dev/null +mounted=$? +if [ "$mounted" ] + then umount "/var/media/ftp/disk/" +fi +mkdir /var/media/ftp/disk/ +echo "disk - $(date)" >> /tmp/mounttimes +mount -o bind $pfad /var/media/ftp/disk/ +#end schript +#oder als links +#begin script +#!/bin/sh +pfad=$(echo "$0" | sed "s/\/autorun.sh//") +echo "disk - $(date)" >> /tmp/mounttimes +ln -s -f $pfad /var/media/ftp/disk/ +#end script +#oder so +#begin script +#!/bin/sh +log=log_automount.txt +date > $log +mount >> $log +echo --------------found---------------- >> $log +#folgende Zeilen anpassen (die 5 ggf ersetzen): +mount |grep 5 | tail -n1 >> $log +mountpoint=`mount |grep -E 'uStor05|uStor15' | tail -n1 | cut -d " " -f 3` + +echo mountpoint is $mountpoint >> $log +ln -s -f $mountpoint +#end script +###samba (experten einstellungen) +[global] + log level = 3 + log file = /var/media/ftp/uStor11/samba_%m.log + unix charset = UTF-8 +###hosts +192.168.1.103 00:50:9C:31:98:3E lan dbox +###USB-automount +mount -o bind /var/tmp/flash/storage/storage /etc/hotplug/storage +mount -o bind /var/tmp/flash/storage/run_mount /etc/hotplug/run_mount +###matrixtunnel +- mittels openssl (auf kompi) einen selbstsigniertes zertifikat + hostkey generieren: + openssl genrsa -out host.key 2048 + openssl req -new -nodes -key host.key -out host.csr + openssl x509 -req -days 365 -in host.csr -signkey host.key -out host.cert +- host.key und host.cert auf den router kopieren +- matrixtunnel auf router starten: + matrixtunnel -A host.cert -p host.key -d 443 -r 80 +- mit einem browser https://meinrouter/ aufrufen +oder so +#beginScript +#!/bin/bash + +# Paßwortgeschützten Server Key erzeugen +openssl genrsa -des3 -out server.key 1024 + +# Ungeschützte Version extrahieren (der SSL-Server kann ja nicht +# vor der Benutzung selbst ein Paßwort eingeben) +openssl rsa -in server.key -out server.key.unsecure + +# Certificate Signing Request (CSR) mit persönlichen Daten erzeugen +openssl req -new -key server.key -out server.csr + +# Ein Jahr gültiges, selbst signiertes Zertifikat anfordern +openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt + +# CSR wird nicht mehr benötigt +rm server.csr + +# Schlüssel + Zertifikat (in dieser Reihenfolge!) +# in einer Datei zusammenführen +cat server.key.unsecure server.crt > stunnel-key.pem +#endScript + + +###unbedingt machen auf dem stick_root, sonst gehts nicht +mknod my_ext2_target_dir/dev/console c 5 1 +###user anlegen, gehen dann auch bei ftp +adduser -h /var/media/ftp user03 +adduser: /var/media/ftp: File exists +Changing password for user03 +New password: +Bad password: similar to username +Retype password: +Password for user03 changed by root +dann noch verzeichnisrechte setzen +###in debug oder rc.custom +/etc/hotplug/storage add 002 /proc/bus/usb/001/005 0 0 0 +/etc/hotplug/storage add 002 /proc/bus/usb/001/004 0 0 0 +/bin/sleep 5 +/usr/sbin/matrixtunnel -A /var/media/ftp/uStor21/host.cert -p /var/media/ftp/uStor21/host.key -d 443 -r 81 +/bin/sleep 2 +/bin/echo "abi:x:1001:1:Linux User,,,:/var/media/ftp/uStor11/abi:/bin/sh" >> /etc/passwd +/bin/echo "marco:x:1002:1:Linux User,,,:/var/media/ftp/uStor11/marco:/bin/sh" >> /etc/passwd +/bin/echo "thomas:x:1003:1:Linux User,,,:/var/media/ftp/uStor11/thomas/:/bin/sh" >> /etc/passwd + +###reboot per telefon +reboot der Box #990*15901590* +telefon neustart #96*5* +telnet an #96*7* +telnet aus #96*8* +uptime #96*9* + +### + * distclean: Löscht alle Dateien, die evtl. durch den make-Prozeß erstellt werden. Nach distclean sollten nur noch die Dateien übrig sein, die man am Anfang heruntergeladen hat (dist wie distribution). In manchen Fällen kann es sein, daß Dateien, die automatisch erstellt werden können, für deren Erstellung aber seltene Toos oder viel Zeit gebraucht wird, Bestandteil der Distribution sind und daher mit distclean nicht gelöscht werden. Insbesondere wird mit distclean normalerweise auch die Konfiguration gelöscht, da diese ja auch nicht Bestandteil der Distribution ist. + * dirclean: Bei Freetz werden damit die ausgepackten Verzeichnisse der Pakete gelöscht, also insbesondere die Verzeichnisse unter source und packages. + * clean: Damit werden normalerweise die Dateien gelöscht, die durch den Build-Prozeß erstellt werden, also Programme, Libraries und Object-Dateien, aber nicht die Konfiguration. +## +1. Aufräumen: + + * make clean + ... + + * make -clean (Quelle): + räumt das spezifizierte Paket auf + Z.B. räumt make mc-clean das Paket "Midnight Commander" (mc) auf. + Was ist der Unterschied zwischen make -clean und make -dirclean, oder gibt es das nicht? + + * make common-clean (Quelle): + ... + + * make common-dirclean (Quelle): + ... + + * make common-distclean (Quelle): + ... + + * make dirclean (Quelle): + ... + + * make distclean (Quelle): + ... + + * make config-clean-deps (Quelle): + Wenn bei make menuconfig Pakete abgewählt wurden, sind ggfs. noch Shared Libraries ausgewählt, die nicht mehr benötigt werden (dies kann menuconfig nicht automatisch erkennen). Diese kann man dann manuell unter 'Advanced Options'!'Shared Libraries' abwählen - die benötigten lassen sich nicht deaktivieren. Alternativ kann man dies automatisch mittels make config-clean-deps erledigen lassen. + + * make kernel-dirclean (Quelle): + löscht den aktuell entpackten Source Tree des Kernels, um von komplett sauberen Kernel Sourcen zu kompilieren - Alternative(?): + + * make kernel-clean (Quelle): + siehe make kernel-dirclean + + * make kernel-toolchain-dirclean + * make target-toolchain-dirclean (Quelle): + löscht die Toolchain - + Aber was ist der Unterschied zwischen kernel-toolchain-dirclean und target-toolchain-dirclean? + + +2. Vorbereitungen: + + * make world (Quelle): + Vorraussetzung ist eine Toolchain (siehe Cross-Compiler / Toolchain erstellen). Sollten jemals Probleme mit nicht vorhandenen Verzeichnissen auftauchen, so kann ein make world Abhilfe schaffen. In der Regel sollte das aber nicht nötig sein. + Ist das noch aktuell? + + * make kernel-toolchain (Quelle): + kompiliert den Kernel und auch für das target (Fritzbox) + Aus historischen Gründen wurde die Bezeichnung als kernel-toolchain belassen, obwohl damit wie gesagt nicht nur der Kernel gebaut wird, sondern auch Pakete (s.u.). + + * make target-toolchain (Quelle): + kompiliert die Pakete für das target (Fritzbox) + + * make kernel-menuconfig (Quelle): + Die Konfiguration des Kernels wird danach wieder nach ./make/linux/Config. zurückgespeichert. + Ist das noch aktuell? + + * make kernel-precompiled (Quelle): + Damit werden der Kernel und die Kernel Module kompiliert. + Ist das noch aktuell? + + * make menuconfig (Quelle): Zum Konfigurieren von Freetz kommt das Programm conf/mconf zum Einsatz, welches dem ein oder anderen vielleicht von der Konfiguration des Linux Kernels bekannt ist. Die ncurses Variante mconf kann mit dem Kommando make menuconfig aufgerufen werden. + Eine Hilfe zu den einzelnen Punkten kann übrigens direkt in menuconfig durch Eingabe von "?" aufgerufen werden. +## + + +###USB-automount +mount -o bind /var/tmp/flash/storage/storage /etc/hotplug/storage +mount -o bind /var/tmp/flash/storage/run_mount /etc/hotplug/run_mount + +###rc.customs +/etc/hotplug/storage add 002 /proc/bus/usb/001/003 0 0 0 + +###downgrade mod +sed "s/{CONFIG_VERSION_MAJOR}.*/{CONFIG_VERSION_MAJOR}.01.01/1" /etc/version > /var/tmp/version +chmod +x /var/tmp/version +mount -o bind /var/tmp/version /etc/version + +####portforwarding auf die box selbst per original menü +#begin scrip +pr=`find /var/html/ -name portrule.js` +sed 's/return g_mldIpAdr0000/return null/' $pr > /var/tmp/portrule.js +mount -o bind /var/tmp/portrule.js $pr + +cat > /var/tmp/unhiderules << 'EOF' +#! /bin/sh + +# Die VOIP-Regel "ausblenden" +EXCLUDE="0\.0\.0\.0\:5060" + +#PW extrahieren +local PWD=$(/bin/allcfgconv -C ar7 -c -o - | sed -ne '/^webui[[:space:]]*{/,/^}/{ +/=/{s/[[:space:]]*=[[:space:]]*/=/;s/^[[:space:]]*//;p} +}' | grep '^password=' | cut -d '"' -f2) + ret=$? + if [ $ret != 0 ]; then + echo "ERROR: Unhide_local_PFWD (exit code $ret)" >&2 + exit $ret + fi +#oder für voip password +allcfgconv -C voip -c -o /var/tmp/voip.cfg + +# 0.0.0.0:xx 0.0.0.0:yy ersetzen durch 0.0.0.0:xx 127.0.0.1:yy +cat /var/flash/ar7.cfg | sed "/dslifaces/,/} {/ {/forward/,/}/ {/$EXCLUDE/! s/\(.*0\.0\.0\.0.*\)\(0\.0\.0\.0\)\(.*\)/\1127\.0\.0\.1\3/}}" > /var/tmp/tmpar7.cfg +cat /var/tmp/tmpar7.cfg > /var/flash/ar7.cfg + +# Die "neuen" Regeln einlesen lassen, so dass sie per GUI erreichbar sind (die 0.0.0.0-er Regeln sind nicht "ansprechbar": +killall -9 ctlmgr && sleep 1 && /usr/bin/ctlmgr +sleep 5 + +# ... und nun das Aendern auf 0.0.0.0 per GUI "emulieren" +# +TESTSTRING="127.0.0.1" +NEUEIP="0.0.0.0" +# Die Rules finden ... +rules="`wget -q -O - "http://127.0.0.1/cgi-bin/webcm?getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3Apagename=portfw&var%3Amenu=internet&var%3Apagemaster=" | grep -v $EXCLUDE |grep -A 6 $TESTSTRING | grep "uiDoEdit" | sed "s/.*uiDoEdit('\(.*\)').*/\1/"`" + +if [ "$rules" != "" ]; then + # ... POST_DATA String "basteln" + PDATA="getpage=/usr/www/all/html/query.txt&login:command/password=$pw&id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet" + for myrule in `echo "$rules" | tr '\n' ' '`; do + PDATA="${PDATA}&var:rule=${myrule}&var:isnew=0&var:isexp=0&forwardrules:settings/${myrule}/fwip=$NEUEIP" + done + echo -n "$PDATA" | REQUEST_METHOD="POST" REMOTE_ADDR="127.0.0.1" CONTENT_TYPE="application/x-www-form-urlencoded" CONTENT_LENGTH=${#PDATA} /usr/www/html/cgi-bin/webcm > /dev/null +fi +# ... fertig +EOF +sh /var/tmp/unhiderules +#end script +###Fehler: no gettext support in C library +rm make/config.cache && make +###sane geht nicht +dll-preload.c sollte so aussehen: +static struct backend preloaded_backends[] = { +{ 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }} +}; +###Faxen per linux +Standardmäßig wird versucht, sich mit dem Host 'fritz.box' zu verbinden. IP-Adresse und Port lassen sich über Environment Variablen festlegen: + +export FB_REMOTE_CAPI_IP=192.168.178.1 +export FB_REMOTE_CAPI_PORT=5031 + +Weitere Einstellungen: + +export FB_REMOTE_CAPI_DEBUG=X (Debug-Ausgabe. 0=nichts, 3=alles) +export FB_REMOTE_CAPI_TCP=1 (Remote-CAPI an=1, aus=0) +export FB_REMOTE_CAPI_DEV=1 (Device-CAPI an=1, aus=0) + +Mithilfe von capiinfo kann man nun prüfen, ob alles funktioniert. capiinfo befindet sich ebenfalls im libcapi20_fb Paket. +Troubleshooting + +# ./capiinfo +Number of Controllers : 0 +could not register - (0x1009) + + 1. + Ist der Capi-over-TCP auf der Fritz!Box eingeschaltet (an: #96*3*, aus: #96*2*)? + 2. + Ist die IP-Adresse und der Port korrekt? Es wird standardmäßig versucht, sich mit fritz.box:5031 zu verbinden. + 3. + Sind die Softlinks unter /usr/lib korrekt? + 4. + ldd capiinfo eingeben und prüfen, ob libcapi20.so.3 auch auf /usr/lib/libcapi20.so.3 zeigt. + +Faxen mit capifax + +Für das Faxen unter Linux wird ein SoftDSP benötigt, da die CAPI der Fritz!Box kein T.30 Modem zur Verfügung stellt. Es sind daher folgende Libraries notwending: + + * + libtiff-3.8.2 + * + spandsp-0.0.5_pre4 + +capifax selbst besteht aus der Anwendung 'capifax' und der Library 'libcapifax.so'. Der Hilfe-Text zu capifax sieht folgendermaßen aus: + +usage: capifax [OPTIONS] +OPTIONS: + -send [tiff_file] [controller] [msn] [target_no] + -receive [path] [controller] [msn] + -rate [2400|4800|9600|14400] + -ident "+00 00 0000000" + -header "My Name" + -ecm [on|off] + -loglevel [0-3] + +Faxe versenden (Ctrl. 1, externer ISDN): + +capifax -send /home/maz/mytiff.tiff 1 12345 20354321 + +Faxe empfangen (Ctrl. 4, Analog): + +capifax -receive /home/maz 4 12345 +###Zeit stellen per Telefon +#83*hhmmddmmyyyy +###Passwörter in Plain ausgeben aus ar7.cfg +allcfgconv -C ar7 -c -o - +###Sicherheitsstufe konfigurieren +# with x being one of the following values: +# 0 : no restrictions +# 1 : only configuration files without shell commands might be edited +# 2 : no configuration files might be edited +echo x > /tmp/flash/security +modsave +###Character Device erstellen +Der ds-mod benutzt auch ein solches character devices, welches Dateien mit Hilfe eines Tiny Flash Filesystems (TFFS) dauerhaft und veränderbar im Flash abspeichert, um die Konfiguration zu sichern. Vorraussetzung ist eine Minor Nummer, die von keinem anderen character device in /var/flash/ verwendet wird (der ds-mod benutzt die Minor 0x3c), die Major Nummer kann aus /proc/devices ausgelesen werden: + +mknod /var/flash/ c + +Da dieses character device in der Ramdisk unter /var/ erzeugt wurde, muss dieser Befehl jedesmal beim Neustart ausgeführt werden. Der Inhalt bleibt aber erhalten. Zum Bearbeiten solcher character devices niemals vi verwenden! Dafür gibt es das Wrapper-Skript nvi. + +ACHTUNG: Die Flash Partition des TFFS ist sehr klein und nicht geeignet Dateien > 10-30 KB aufzunehmen (je nach Größe der anderen Dateien). + +Der aktuelle Füllstand kann wie folgt ausgelesen werden: + +echo 'cleanup' > /proc/tffs +echo 'info' > /proc/tffs +cat /proc/tffs | grep '^fill=' +###Gast WLAN aufspannen mit der Fritzbox (soll nicht immer funktionieren) +#Hiermit wird auf dem Basisgerät wifi0 eine zweite WLAN-Schnittstelle als AP eingerichtet +wlanconfig ath1 create wlandev wifi0 wlanmode ap +#Hier ist wichtig, den gleichen Kanal wie an der Hauptschnittstelle anzugeben, sonst sendet ath1 nicht. +iwconfig ath1 essid "GAST" channel 48 #hier absturz wenn freq +#Konfiguration der IP-Adresse +#Jetzt lässt sich ein Client bereits zum offen funkenden Gastnetz verbinden. +#Dazu ist dem Client manuell eine IP-Adresse aus dem Gast-IP-Bereich zuzuweisen, +#z. B. 192.168.179.101 und die für ath1 eingestellte IP als Default-Gateway einzustellen. +#Dann kann die Standard-Adresse der Fritz!Box als DNS-Server genommen werden und schon +#hat man Internet-Zugang über die Box. +ifconfig ath1 192.168.179.1 netmask 255.255.255.0 up +#Mit einem Editor in der Kopie sind die Werte bei "interface" und "bss" von ath0 in ath1 +#zu ändern und anschließend eine zweite hostapd-Instanz zu starten. +cp /var/tmp/hostapd_topology-ath0 /var/tmp/hostapd_topology-ath1 +hostapd -B /var/tmp/hostapd_topology-ath1 +###komilieren von neuen paketen +wget http://code.ximeta.com/dev/current/o....mipsel.tar.gz +tar xzf ndas-1.1-10.mipsel.tar.gz +export PATH=$PATH:/home/userid/ds26-15.2/toolchain/kernel/bin::/home/userid/ds26-15.2/toolchain/target/bin +export NDAS_KERNEL_PATH=/home/userid/ds26-15.2/source/ref-8mb_26-04.33/kernel/linux +export NDAS_KERNEL_VERSION=2.6.13.1 +export NDAS_KERNEL_ARCH=mips +export NDAS_CROSS_COMPILE=mipsel-unkown-linux-gnu- +export NDAS_CROSS_COMPILE_UM=mipsel-linux- +export NDAS_EXTRA_CFLAGS="-mlong-calls -DNDAS_SIGPENDING_OLD" +make ARCH=mips CC=mipsel-unknown-linux-gnu-gcc +###privoxy user.action +{{alias}} ++crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies +-crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies + allow-all-cookies = -crunch-all-cookies -session-cookies-only -filter{content-cookies} + allow-popups = -filter{all-popups} -filter{unsolicited-popups} ++block-as-image = +block{Blocked image request.} +handle-as-image +-block-as-image = -block +fragile = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -prevent-compression +shop = -crunch-all-cookies allow-popups +myfilters = +filter{html-annoyances} +filter{js-annoyances} +filter{all-popups}\ + +filter{webbugs} +filter{banners-by-size} +allow-ads = -block -filter{banners-by-size} -filter{banners-by-link} +{ allow-all-cookies } +{ -filter{all-popups} } +.banking.example.com +{ -filter } +stupid-server.example.com/ +{ +block{Nasty ads.} } +www.example.com/nasty-ads/sponsor.gif +{ +block-as-image } +{ fragile } +{ allow-ads } +{ +set-image-blocker{blank} } +###compiling für fritzbox +wget http://code.ximeta.com/dev/current/o....mipsel.tar.gz +tar xzf ndas-1.1-10.mipsel.tar.gz +export PATH=$PATH:/home/userid/ds26-15.2/toolchain/kernel/bin::/home/userid/ds26-15.2/toolchain/target/bin +export NDAS_KERNEL_PATH=/home/userid/ds26-15.2/source/ref-8mb_26-04.33/kernel/linux +export NDAS_KERNEL_VERSION=2.6.13.1 +export NDAS_KERNEL_ARCH=mips +export NDAS_CROSS_COMPILE=mipsel-unkown-linux-gnu- +export NDAS_CROSS_COMPILE_UM=mipsel-linux- +export NDAS_EXTRA_CFLAGS="-mlong-calls -DNDAS_SIGPENDING_OLD" +make ARCH=mips CC=mipsel-unknown-linux-gnu-gcc +###Faxdrucker einrichten unter Linux, ppd in ppd verzeichnis, backend in backend +lpadmin -p faxprinter -v capifax:// -i /usr/share/cups/model/capifax.ppd -E +###Seriennummer der unterschiedlichen Versionen der 7270 (zweiter block) +293 - HWRev 122 (8MB/7270_V1) - AVM-Branding +294 - HWRev 122 (8MB/7270_V1) - 1und1-Branding +304 - HWRev 139 (16MB/7270_V2) - AVM-Branding +305 - HWRev 139 (16MB/7270_V2) - 1und1-Branding +xxx - HWRev 145 (16MB/7270_V3) - ???-Branding - 7270_V3 +307 - HWRev 139 (16MB/7270_V2) - AVME-Branding Internationale-Version? +310 - HWRev 139 (16MB/7270_V2) - AVME-Branding A-/CH-Version? +###vlan +#http://www.ip-phone-forum.de/showthread.php?t=212727&highlight=vconfig +###Fritzbox IP Adresse +169.254.1.1 diff --git a/fritzbox.txt~ b/fritzbox.txt~ new file mode 100644 index 0000000..156551c --- /dev/null +++ b/fritzbox.txt~ @@ -0,0 +1,302 @@ +###platten immer mit gleichem namen, in autorun.sh im root +#begin script +#!/bin/sh +pfad=$(echo "$0" | sed "s/\/autorun.sh//") +mount | grep "/var/media/ftp/disk" >> /dev/null +mounted=$? +if [ "$mounted" ] + then umount "/var/media/ftp/disk/" +fi +mkdir /var/media/ftp/disk/ +echo "disk - $(date)" >> /tmp/mounttimes +mount -o bind $pfad /var/media/ftp/disk/ +#end schript +#oder als links +#begin script +#!/bin/sh +pfad=$(echo "$0" | sed "s/\/autorun.sh//") +echo "disk - $(date)" >> /tmp/mounttimes +ln -s -f $pfad /var/media/ftp/disk/ +#end script +#oder so +#begin script +#!/bin/sh +log=log_automount.txt +date > $log +mount >> $log +echo --------------found---------------- >> $log +#folgende Zeilen anpassen (die 5 ggf ersetzen): +mount |grep 5 | tail -n1 >> $log +mountpoint=`mount |grep -E 'uStor05|uStor15' | tail -n1 | cut -d " " -f 3` + +echo mountpoint is $mountpoint >> $log +ln -s -f $mountpoint +#end script +###samba (experten einstellungen) +[global] + log level = 3 + log file = /var/media/ftp/uStor11/samba_%m.log + unix charset = UTF-8 +###hosts +192.168.1.103 00:50:9C:31:98:3E lan dbox +###USB-automount +mount -o bind /var/tmp/flash/storage/storage /etc/hotplug/storage +mount -o bind /var/tmp/flash/storage/run_mount /etc/hotplug/run_mount +###matrixtunnel +- mittels openssl (auf kompi) einen selbstsigniertes zertifikat + hostkey generieren: + openssl genrsa -out host.key 2048 + openssl req -new -nodes -key host.key -out host.csr + openssl x509 -req -days 365 -in host.csr -signkey host.key -out host.cert +- host.key und host.cert auf den router kopieren +- matrixtunnel auf router starten: + matrixtunnel -A host.cert -p host.key -d 443 -r 80 +- mit einem browser https://meinrouter/ aufrufen +oder so +#beginScript +#!/bin/bash + +# Paßwortgeschützten Server Key erzeugen +openssl genrsa -des3 -out server.key 1024 + +# Ungeschützte Version extrahieren (der SSL-Server kann ja nicht +# vor der Benutzung selbst ein Paßwort eingeben) +openssl rsa -in server.key -out server.key.unsecure + +# Certificate Signing Request (CSR) mit persönlichen Daten erzeugen +openssl req -new -key server.key -out server.csr + +# Ein Jahr gültiges, selbst signiertes Zertifikat anfordern +openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt + +# CSR wird nicht mehr benötigt +rm server.csr + +# Schlüssel + Zertifikat (in dieser Reihenfolge!) +# in einer Datei zusammenführen +cat server.key.unsecure server.crt > stunnel-key.pem +#endScript + + +###unbedingt machen auf dem stick_root, sonst gehts nicht +mknod my_ext2_target_dir/dev/console c 5 1 +###user anlegen, gehen dann auch bei ftp +adduser -h /var/media/ftp user03 +adduser: /var/media/ftp: File exists +Changing password for user03 +New password: +Bad password: similar to username +Retype password: +Password for user03 changed by root +dann noch verzeichnisrechte setzen +###in debug oder rc.custom +/etc/hotplug/storage add 002 /proc/bus/usb/001/005 0 0 0 +/etc/hotplug/storage add 002 /proc/bus/usb/001/004 0 0 0 +/bin/sleep 5 +/usr/sbin/matrixtunnel -A /var/media/ftp/uStor21/host.cert -p /var/media/ftp/uStor21/host.key -d 443 -r 81 +/bin/sleep 2 +/bin/echo "abi:x:1001:1:Linux User,,,:/var/media/ftp/uStor11/abi:/bin/sh" >> /etc/passwd +/bin/echo "marco:x:1002:1:Linux User,,,:/var/media/ftp/uStor11/marco:/bin/sh" >> /etc/passwd +/bin/echo "thomas:x:1003:1:Linux User,,,:/var/media/ftp/uStor11/thomas/:/bin/sh" >> /etc/passwd + +###reboot per telefon +reboot der Box #990*15901590* +telefon neustart #96*5* +telnet an #96*7* +telnet aus #96*8* +uptime #96*9* + +### + * distclean: Löscht alle Dateien, die evtl. durch den make-Prozeß erstellt werden. Nach distclean sollten nur noch die Dateien übrig sein, die man am Anfang heruntergeladen hat (dist wie distribution). In manchen Fällen kann es sein, daß Dateien, die automatisch erstellt werden können, für deren Erstellung aber seltene Toos oder viel Zeit gebraucht wird, Bestandteil der Distribution sind und daher mit distclean nicht gelöscht werden. Insbesondere wird mit distclean normalerweise auch die Konfiguration gelöscht, da diese ja auch nicht Bestandteil der Distribution ist. + * dirclean: Bei Freetz werden damit die ausgepackten Verzeichnisse der Pakete gelöscht, also insbesondere die Verzeichnisse unter source und packages. + * clean: Damit werden normalerweise die Dateien gelöscht, die durch den Build-Prozeß erstellt werden, also Programme, Libraries und Object-Dateien, aber nicht die Konfiguration. +## +1. Aufräumen: + + * make clean + ... + + * make -clean (Quelle): + räumt das spezifizierte Paket auf + Z.B. räumt make mc-clean das Paket "Midnight Commander" (mc) auf. + Was ist der Unterschied zwischen make -clean und make -dirclean, oder gibt es das nicht? + + * make common-clean (Quelle): + ... + + * make common-dirclean (Quelle): + ... + + * make common-distclean (Quelle): + ... + + * make dirclean (Quelle): + ... + + * make distclean (Quelle): + ... + + * make config-clean-deps (Quelle): + Wenn bei make menuconfig Pakete abgewählt wurden, sind ggfs. noch Shared Libraries ausgewählt, die nicht mehr benötigt werden (dies kann menuconfig nicht automatisch erkennen). Diese kann man dann manuell unter 'Advanced Options'!'Shared Libraries' abwählen - die benötigten lassen sich nicht deaktivieren. Alternativ kann man dies automatisch mittels make config-clean-deps erledigen lassen. + + * make kernel-dirclean (Quelle): + löscht den aktuell entpackten Source Tree des Kernels, um von komplett sauberen Kernel Sourcen zu kompilieren - Alternative(?): + + * make kernel-clean (Quelle): + siehe make kernel-dirclean + + * make kernel-toolchain-dirclean + * make target-toolchain-dirclean (Quelle): + löscht die Toolchain - + Aber was ist der Unterschied zwischen kernel-toolchain-dirclean und target-toolchain-dirclean? + + +2. Vorbereitungen: + + * make world (Quelle): + Vorraussetzung ist eine Toolchain (siehe Cross-Compiler / Toolchain erstellen). Sollten jemals Probleme mit nicht vorhandenen Verzeichnissen auftauchen, so kann ein make world Abhilfe schaffen. In der Regel sollte das aber nicht nötig sein. + Ist das noch aktuell? + + * make kernel-toolchain (Quelle): + kompiliert den Kernel und auch für das target (Fritzbox) + Aus historischen Gründen wurde die Bezeichnung als kernel-toolchain belassen, obwohl damit wie gesagt nicht nur der Kernel gebaut wird, sondern auch Pakete (s.u.). + + * make target-toolchain (Quelle): + kompiliert die Pakete für das target (Fritzbox) + + * make kernel-menuconfig (Quelle): + Die Konfiguration des Kernels wird danach wieder nach ./make/linux/Config. zurückgespeichert. + Ist das noch aktuell? + + * make kernel-precompiled (Quelle): + Damit werden der Kernel und die Kernel Module kompiliert. + Ist das noch aktuell? + + * make menuconfig (Quelle): Zum Konfigurieren von Freetz kommt das Programm conf/mconf zum Einsatz, welches dem ein oder anderen vielleicht von der Konfiguration des Linux Kernels bekannt ist. Die ncurses Variante mconf kann mit dem Kommando make menuconfig aufgerufen werden. + Eine Hilfe zu den einzelnen Punkten kann übrigens direkt in menuconfig durch Eingabe von "?" aufgerufen werden. +## + + +###USB-automount +mount -o bind /var/tmp/flash/storage/storage /etc/hotplug/storage +mount -o bind /var/tmp/flash/storage/run_mount /etc/hotplug/run_mount + +###rc.customs +/etc/hotplug/storage add 002 /proc/bus/usb/001/003 0 0 0 + +###downgrade mod +sed "s/{CONFIG_VERSION_MAJOR}.*/{CONFIG_VERSION_MAJOR}.01.01/1" /etc/version > /var/tmp/version +chmod +x /var/tmp/version +mount -o bind /var/tmp/version /etc/version + +####portforwarding auf die box selbst per original menü +#begin scrip +pr=`find /var/html/ -name portrule.js` +sed 's/return g_mldIpAdr0000/return null/' $pr > /var/tmp/portrule.js +mount -o bind /var/tmp/portrule.js $pr + +cat > /var/tmp/unhiderules << 'EOF' +#! /bin/sh + +# Die VOIP-Regel "ausblenden" +EXCLUDE="0\.0\.0\.0\:5060" + +#PW extrahieren +local PWD=$(/bin/allcfgconv -C ar7 -c -o - | sed -ne '/^webui[[:space:]]*{/,/^}/{ +/=/{s/[[:space:]]*=[[:space:]]*/=/;s/^[[:space:]]*//;p} +}' | grep '^password=' | cut -d '"' -f2) + ret=$? + if [ $ret != 0 ]; then + echo "ERROR: Unhide_local_PFWD (exit code $ret)" >&2 + exit $ret + fi + +# 0.0.0.0:xx 0.0.0.0:yy ersetzen durch 0.0.0.0:xx 127.0.0.1:yy +cat /var/flash/ar7.cfg | sed "/dslifaces/,/} {/ {/forward/,/}/ {/$EXCLUDE/! s/\(.*0\.0\.0\.0.*\)\(0\.0\.0\.0\)\(.*\)/\1127\.0\.0\.1\3/}}" > /var/tmp/tmpar7.cfg +cat /var/tmp/tmpar7.cfg > /var/flash/ar7.cfg + +# Die "neuen" Regeln einlesen lassen, so dass sie per GUI erreichbar sind (die 0.0.0.0-er Regeln sind nicht "ansprechbar": +killall -9 ctlmgr && sleep 1 && /usr/bin/ctlmgr +sleep 5 + +# ... und nun das Aendern auf 0.0.0.0 per GUI "emulieren" +# +TESTSTRING="127.0.0.1" +NEUEIP="0.0.0.0" +# Die Rules finden ... +rules="`wget -q -O - "http://127.0.0.1/cgi-bin/webcm?getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3Apagename=portfw&var%3Amenu=internet&var%3Apagemaster=" | grep -v $EXCLUDE |grep -A 6 $TESTSTRING | grep "uiDoEdit" | sed "s/.*uiDoEdit('\(.*\)').*/\1/"`" + +if [ "$rules" != "" ]; then + # ... POST_DATA String "basteln" + PDATA="getpage=/usr/www/all/html/query.txt&login:command/password=$pw&id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet" + for myrule in `echo "$rules" | tr '\n' ' '`; do + PDATA="${PDATA}&var:rule=${myrule}&var:isnew=0&var:isexp=0&forwardrules:settings/${myrule}/fwip=$NEUEIP" + done + echo -n "$PDATA" | REQUEST_METHOD="POST" REMOTE_ADDR="127.0.0.1" CONTENT_TYPE="application/x-www-form-urlencoded" CONTENT_LENGTH=${#PDATA} /usr/www/html/cgi-bin/webcm > /dev/null +fi +# ... fertig +EOF +sh /var/tmp/unhiderules +#end script +###Fehler: no gettext support in C library +rm make/config.cache && make +###sane geht nicht +dll-preload.c sollte so aussehen: +static struct backend preloaded_backends[] = { +{ 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }} +}; +###Faxen per linux +Standardmäßig wird versucht, sich mit dem Host 'fritz.box' zu verbinden. IP-Adresse und Port lassen sich über Environment Variablen festlegen: + +export FB_REMOTE_CAPI_IP=192.168.178.1 +export FB_REMOTE_CAPI_PORT=5031 + +Weitere Einstellungen: + +export FB_REMOTE_CAPI_DEBUG=X (Debug-Ausgabe. 0=nichts, 3=alles) +export FB_REMOTE_CAPI_TCP=1 (Remote-CAPI an=1, aus=0) +export FB_REMOTE_CAPI_DEV=1 (Device-CAPI an=1, aus=0) + +Mithilfe von capiinfo kann man nun prüfen, ob alles funktioniert. capiinfo befindet sich ebenfalls im libcapi20_fb Paket. +Troubleshooting + +# ./capiinfo +Number of Controllers : 0 +could not register - (0x1009) + + 1. + Ist der Capi-over-TCP auf der Fritz!Box eingeschaltet (an: #96*3*, aus: #96*2*)? + 2. + Ist die IP-Adresse und der Port korrekt? Es wird standardmäßig versucht, sich mit fritz.box:5031 zu verbinden. + 3. + Sind die Softlinks unter /usr/lib korrekt? + 4. + ldd capiinfo eingeben und prüfen, ob libcapi20.so.3 auch auf /usr/lib/libcapi20.so.3 zeigt. + +Faxen mit capifax + +Für das Faxen unter Linux wird ein SoftDSP benötigt, da die CAPI der Fritz!Box kein T.30 Modem zur Verfügung stellt. Es sind daher folgende Libraries notwending: + + * + libtiff-3.8.2 + * + spandsp-0.0.5_pre4 + +capifax selbst besteht aus der Anwendung 'capifax' und der Library 'libcapifax.so'. Der Hilfe-Text zu capifax sieht folgendermaßen aus: + +usage: capifax [OPTIONS] +OPTIONS: + -send [tiff_file] [controller] [msn] [target_no] + -receive [path] [controller] [msn] + -rate [2400|4800|9600|14400] + -ident "+00 00 0000000" + -header "My Name" + -ecm [on|off] + -loglevel [0-3] + +Faxe versenden (Ctrl. 1, externer ISDN): + +capifax -send /home/maz/mytiff.tiff 1 12345 20354321 + +Faxe empfangen (Ctrl. 4, Analog): + +capifax -receive /home/maz 4 12345 diff --git a/fstab.txt b/fstab.txt new file mode 100644 index 0000000..ee67b39 --- /dev/null +++ b/fstab.txt @@ -0,0 +1,14 @@ +###beispiel einer fstab +/dev/disk/by-id/scsi-SATA_ST3250310AS_6RY6LCN7-part2 / xfs defaults 1 1 +/dev/disk/by-id/scsi-SATA_ST3250310AS_6RY6LCN7-part3 /home xfs defaults 1 2 +/dev/disk/by-id/scsi-SATA_ST3250310AS_6RY6LCN7-part1 swap swap defaults 0 0 +proc /proc proc defaults 0 0 +sysfs /sys sysfs noauto 0 0 +debugfs /sys/kernel/debug debugfs noauto 0 0 +usbfs /proc/bus/usb usbfs noauto 0 0 +devpts /dev/pts devpts mode=0620,gid=5 0 0 +/openSUSE/DVD/openSUSE103-1.img /openSUSE/DVD/DVD1 iso9660 ro,loop 0 0 +/openSUSE/DVD/openSUSE103-2.img /openSUSE/DVD/DVD2 iso9660 ro,loop 0 0 +# +homeserver:/home /net/homeserver nfs rw,nosuid,nodev,hard,intr,addr=172.17.6.25 0 0 + diff --git a/ftp.txt b/ftp.txt new file mode 100644 index 0000000..e15045b --- /dev/null +++ b/ftp.txt @@ -0,0 +1,18 @@ +###Verbindung zu Server +ftp server +###User angeben, wenn verbunden +user mhoellein +###Kommandos +dir Anschauen des aktuellen Verzeichnisses +cd Verzeichnis wechseln +get eine Datei holen +mget mehrere Dateien unter Verwendung der Jokerzeichen * und ? holen +ascii ASCII-Modus zur Übertragung von Textdateien +binary Binarymodus zur Übertragung ausführbarer Programme +bye Abbau der Verbindung +close Schließen der Verbindung zum FTP-Server. Dabei wird FTP nicht verlassen. +delete Löschen von ferne_Datei auf dem FTP-server +lcd Wechseln des Verzeichnisses auf dem lokalen Rechner +mdelete Löschen von mehreren Dateien auf dem FTP-Server. Metazeichen (*, ? usw.) sind erlaubt. +put Kopieren einer Datei des lokalen Rechners zum FTP-Server +mput Wie Kommando put, aber mehrere Dateien können angegeben werden. Metazeichen (*, ? usw.) sind erlaubt. diff --git a/gcc.txt b/gcc.txt new file mode 100644 index 0000000..779133d --- /dev/null +++ b/gcc.txt @@ -0,0 +1,7 @@ +###aus Quelltextdatei eine Objektdatei erzeugen +gcc -c source1.c +gcc -c source2.c +###Linken der Objektdateien zu einem ausführbaren Programm +gcc -o program source1.o source2.o +### + diff --git a/gimp.txt b/gimp.txt new file mode 100644 index 0000000..037c408 --- /dev/null +++ b/gimp.txt @@ -0,0 +1,25 @@ +###Tonwerte ausrichten +Schritt eins in dem Drei-Punkte-Programm für frischere Bilder besteht darin, die Tonwerte neu auszurichten: Öffnen Sie Ihre Aufnahme in Gimp und duplizieren Sie im Ebenen-Reiter die Hintergrundebene. So wirken die folgenden Änderungen nur auf die oben im Ebenenstapel liegende Kopie des Hintergrunds und Sie haben immer einen Vergleich zum Original. + +Rufen Sie nun die Tonwerteinstellungen auf und betrachten Sie das Histogramm. Hat es links und/oder rechts keine Erhebungen oder stark abgeflachte Werte, tun Sie Folgendes: Ziehen Sie den jeweils äußeren kleinen Pfeil, der sich unterhalb des Histogramms befindet, vorsichtig so weit hinein, bis die ersten Werte ansteigen. Betrachten Sie stets das Ergebnis im Hintergrund. Sie sehen, dass sich die Farben intensivieren. Ist das Bild nun insgesamt etwas zu dunkel, verschieben Sie den mittleren Pfeil für die Gammawerte etwas nach links; dadurch hellen Sie die Mittelwerte auf. + +Öffnen Sie erneut den Dialog "Werte", erkennen Sie, dass das Histogramm Streifen hat - es ist zerrissen. Da Gimp mit acht Bit pro Kanal arbeitet, mussten sich die verbleibenden Tonwerte auf die gesamte ursprüngliche Strecke neu verteilen und die Bereiche dazwischen können nicht automatisch aufgefüllt werden. In der Praxis heißt das, dass Sie die beschriebene Art der Wertekorrektur bei ein und demselben Foto nicht zu oft durchführen sollten. Wenn Sie mit dem Ergebnis nicht zufrieden sind, machen Sie also besser die vorherige Korrektur mit Strg-Z rückgängig, um anschließend bei zurückgesetzten Tonwerten von vorne zu beginnen. +###Kontrast +Als Nächstes gilt es, die Kontraste zu erhöhen. Automatisch geht das über "Farben/Helligkeit/Kontrast". Bessere Ergebnisse erzielen Sie jedoch, wenn Sie sich manuell an den optimalen Kontrast herantasten. Stärkere Kontraste erhalten Sie, indem Sie den Unterschied zwischen dem Weiß- und den Schwarzpunkt erhöhen.Um das zu erreichen, verwenden Sie das Kurvenwerkzeug, das sich im Menü "Farben" unter dem Eintrag "Kurven" befindet. Neben den "Werten" gehört dieses Werkzeug zu den wichtigsten in der Bildbearbeitung. Im Hintergrund des Kurven-Dialogs sehen Sie zur besseren Orientierung das Histogramm abgebildet. Indem Sie mit der Maus auf die diagonal verlaufende Linie klicken, setzen Sie Ankerpunkte, mit deren Hilfe Sie die Linie biegen und damit die Tonwerte zueinander verändern können. + +Im rechten oberen Bereich bearbeiten Sie die hellen, in der Mitte die grauen Teile des Bildes und links unten die Schatten. Ziehen Sie die Linie hinauf, erhöhen Sie die Helligkeit, hinunter verstärken Sie die Schatten. Verformen Sie die Linie zu einer leichten S-Kurve, erhöhen Sie den Kontrast. Dabei ist es wichtig, die automatische Vorschau im Bildfenster im Blick zu behalten, um kein übertriebenes Ergebnis zu erhalten. + +Das Kurven-Werkzeug ist hocheffizient und komplex gleichermaßen. Gehen Sie damit sehr vorsichtig um! Schon kleinste Bewegungen wirken sich recht deutlich aus. Ist das Bild nach der Erhöhung des Kontrasts zu dunkel, setzen Sie in der Mitte der Kurve einen Anker und ziehen sie ein wenig nach oben - damit hellen Sie die Mitten auf. +###Schärfen +Nun kommt der letzte Schritt, das Nachschärfen. Bitte führen Sie das Schärfen grundsätzlich immer erst am Schluss durch. Stellen Sie sicher, dass Sie das Bild im Bildfenster bei einer 1:1-Ansicht sehen. Werfen Sie dazu einen Blick auf die Statusleiste und stellen Sie dort gegebenenfalls über das Drop-down-Menü den Zoom-Faktor 100 Prozent ein.Das Schärfen ist immer ein diffiziles Unterfangen: Schärft man zu schwach, bleibt das Ergebnis unscharf. Schärft man zu stark, besteht die Gefahr, dass sich unschöne Halos - also helle Lichtkränzchen an den Kanten - bilden. Es gibt zwei Tricks, mit denen Sie Ihre Aufnahmen genau richtig schärfen. + +Duplizieren Sie zunächst die oberste Ebene, um ein Original der ungeschärften Version zu behalten. Öffnen Sie anschließend über das Menü "Filter/Verbessern" den Dialog zum "Unscharf Maskieren". Dieser Filter schärft entlang von Kanten. Was als Kante gilt, legen Sie mit dem Regler "Schwellwert" fest. Je kleiner der Schwellwert, desto eher werden benachbarte Pixel als Kante gewertet und geschärft und umso stärker wirkt der Filter. Der Radius bestimmt den Umfang der Kontrasterhöhung entlang der Kanten. Je höher der Wert, desto stärker der Filter. Mit "Menge" bestimmten Sie die Stärke des gesamten Filters. + +Sein verwirrender Name hat übrigens, wie auch viele andere Funktionen der digitalen Bildbearbeitung, seinen Ursprung in der analogen Fotografie: Damals hat man ein unscharfes Negativ über das Original gelegt und anhand der Unterschiede in der Helligkeit die Kanten festgelegt. Entlang der Kanten wurden die Schatten und Lichter verstärkt und dadurch der Kontrast erhöht. Stellen Sie im "Unscharf Maskieren"-Dialog eine etwas zu starke Schärfung ein, etwa mit einem Radius von 14, einer Menge von 0,84 und dem Schwellwert 0 und kontrollieren Sie das Ergebnis im Vorschaubereich. Hier dürfen ruhig dort und da Halos auftreten. Nun stellen Sie im Reiter "Ebenen" den Modus der oberen, geschärften Ebene auf "Wert" und reduzieren ihre Deckkraft über den Schieberegler. Damit justieren Sie die Schärfe ganz exakt und bringen so die Halos zum Verschwinden. Im letzten Schritt vereinen Sie das Original und die geschärfte Ebene über das Kontextmenü der obersten Ebene. Wählen Sie dort "Nach unten vereinen". +###Schärfen noch besser +Diese Technik zum Schärfen lässt sich durch einen weiteren Trick noch verfeinern. Dabei schärft man nur in einem Kanal des Bildes, dem Helligkeitskanal. Sie packen damit das Übel sozusagen an der Wurzel, weil Sie genau dort schärfen, wo die Helligkeitsunterschiede am deutlichsten vorhanden sind.Üblicherweise liegt ein Bild in RGB-Farben vor - die Farben setzen sich also aus den Kanälen Rot, Grün und Blau zusammen. Die Kanäle sehen Sie in Gimp, indem Sie im rechten Dock - dort wo sich der Ebenen-Dialog befindet - auf die zweite Lasche klicken, um den Kanäle-Dialog in den Vordergrund zu rücken. Gimp bietet die Umwandlung in zahlreiche weitere Farbräume, darunter auch HSV an. Dabei steht H für Hue (Farbton), S für Saturation (Sättigung) und V für Value (Helligkeitswert). + +Bevor Sie beginnen, duplizieren Sie zunächst die Hintergrundebene, dadurch haben Sie später einen Vergleich mit dem Original. Die Profifotografen schärfen nur im Helligkeitskanal. Um das Bild in seine farbigen Bestandteile zu teilen, wählen Sie im Menü "Farben/Komponenten/Zerlegen" und aktivieren im folgenden Dialog die Auswahl "HSV". + +Gimp teilt das Bild dann in die drei Kanäle und legt automatisch eine neue Datei mit einer Graustufen-Darstellung des neuen Farbraums an. Im Ebenen-Fenster sehen Sie die einzelnen Kanäle des HSV-Models. Blenden Sie nun durch Klick auf das Auge im Ebenen-Dialog alle bis auf die Ebene "Wert" aus und stellen Sie sicher, dass sie markiert ist. Zum Schärfen dieser Ebene rufen Sie - wie oben beschrieben - den Filter "Unscharf Maskieren" auf. Wenn Sie nur im Helligkeitskanal arbeiten, können Sie es ruhig ein wenig mit dem Schärfen übertreiben; es dürfen sogar leichte Farbkränze hervortreten. Bestätigen Sie den Filter mit einem Klick auf Ok. Zum Überführen der Ebenen in die ursprüngliche Datei wählen Sie "Farben/Komponenten/Wieder zusammenfügen".Ist die Schärfung zu stark, kehren Sie zurück in die noch geöffnete HSV-Datei, machen hier den letzten Schritt mit Strg-Z rückgängig und öffnen erneut den Filter "Unscharf Maskieren". Experimentieren Sie mit dem Filter weiter und fügen Sie dann das Bild wieder zusammen. Bitte betrachten Sie das Schärfen-Ergebnis stets bei einem Zoom-Faktor von 100 bis maximal 150 Prozent, denn andere Stufen zeigen das Resultat falsch an, vor allem krumme Zoom-Stufen, wie zum Beispiel 75,95 Prozent. +### diff --git a/git.txt b/git.txt new file mode 100644 index 0000000..baf8ddf --- /dev/null +++ b/git.txt @@ -0,0 +1,4 @@ +###git auschecken bzw. clonene +git clone http://gittoclone.de +###update +git pull diff --git a/gmt.txt b/gmt.txt new file mode 100644 index 0000000..18fabfc --- /dev/null +++ b/gmt.txt @@ -0,0 +1,5 @@ +###Karten ändern +###Höhelinien einfügen +gmt-f 5,25 -m HOEHE -jo gmapsupp.img Topo\ D\ SRTM/*.img +### + diff --git a/gpg.txt b/gpg.txt new file mode 100644 index 0000000..b6c3dfb --- /dev/null +++ b/gpg.txt @@ -0,0 +1,29 @@ +###Schlüssel erstellen +gpg --gen-key +###Mailadressen zu Schlüssel hinzufügen +bash$ gpg --list-secret-keys +/home/test/.gnupg/secring.gpg +------------------------------ +sec 1024D/12C03930 2003-04-02 Test Benutzer +ssb 2048g/6A253071 2003-04-02 +asgard$ gpg --edit-key 12C03930 +Befehl> help +Befehl> adduid +[...] +Befehl> save +###Schlüssel an Key-Server schicken +gpg --keyserver --send-key +###Widerruf-Zertifikat erstellen +gpg --output revcert.asc --gen-revoke +###Signieren von Schlüsseln +gpg --sign-key +gpg --default-key --sign-key +###öffentlichen Schlüssel importieren +gpg --import public_key.txt +###editieren eines Schlüssels +gpg --edit-key [UID] +###datei verschlüsseln (secret.blubb) (armor damit output ascii ist) +gpg --recipient "Mario Höllein" --encrypt --armor secret.blubb +###datei entschlüsseln +gpg --recipient "Simon Hecht" --decrypt secret.blubb.gpg > secret_encrypted_gpg.blubb +gpg --recipient "Simon Hecht" --decrypt secret.blubb.asc > secret_encrypted_asc.blubb diff --git a/gpsbabel.txt b/gpsbabel.txt new file mode 100644 index 0000000..40eacbf --- /dev/null +++ b/gpsbabel.txt @@ -0,0 +1,18 @@ +###kml zu gpx, vereinfachen des tracks auf 50 Punkte +gpsbabel -r -t -i kml -f .kml -x simplify,count=50 -o gpx -c ISO-8859-1 -F +###aus gpx eine Route mit Waypoints machen, als gdb +gpsbabel -i gpx -f test.gpx -x transform,wpt=trk -o gdb -F te.gdb +###übertragen aufs garmin +gpsbabel -r -t -i gpx -f .gpx -o garmin -F usb: +### +gpsbabel -r -t -i gpx -f Tour3.gpx -x simplify,count=500 -o garmin -F usb: +###route erzeugen, vereinfachen und dann gleich auf gps +gpsbabel -r -t -i gpx -f Tour3.gpx -x simplify,count=250 -x transform,rte=trk -o garmin -F usb: +###track erzeugen, vereinfachen und dann gleich aufs gps +gpsbabel -r -t -i gpx -f Tour3.gpx -x simplify,count=250 -x transform,wpt=trk -o garmin -F usb: +~ +~ +~ +~ +~ +~ diff --git a/grep.txt b/grep.txt new file mode 100644 index 0000000..64004d4 --- /dev/null +++ b/grep.txt @@ -0,0 +1,19 @@ +###nur dateien wo tofind drin ist +grep -l tofind * +###alles was in datei ist und in daten wird nicht mit nach neu geschrieben +grep -v -f datei daten > neu +###findet $DATA2 in datei in Spalte 76 +grep -E "^(\^[^^]*\^,){76}\^0*${DATA2}\^" datei +###sucht nach Nummer 3100032 oder 3100034 in allen modscan_ama*.dat Dateine recursiv - schneller als find +grep -RE '310003(2|4)' --include \*modscan_ama\*.dat +###mehrere ergebnisse von grep in skript weiterverarbeiten +IFS=$(echo -en "\n\b") +foo=($(grep regex file.csv)) +length=`echo "${#foo[@]}"` +length=`expr $length - 1` +for i in `seq 0 $length`; +do + ${foo[$i]} + #mache deine Sachen mit dem Zeuch +done +### diff --git a/growisofs.txt b/growisofs.txt new file mode 100644 index 0000000..126ae7f --- /dev/null +++ b/growisofs.txt @@ -0,0 +1,8 @@ +### +growisofs -use-the-force-luke=notray -use-the-force-luke=4gms -dvd-compat -speed=2 -use-the-force-luke=tracksize:3358607 -use-the-force-luke=tty -Z /dev/sr0=/home/mhoellein/dvd.img +###brennt ein ISO9660 mit Joliet und Rock-Ridge Erweiterung auf DVD oder Bluray +growisofs -Z /dev/dvd -R -J /some/files +###anhängen von weiteren Dateien an gleiche DVD oder Bluray +growisofs -M /dev/dvd -R -J /more/files +###finalisieren der DVD oder Bluray +growisofs -M /dev/dvd=/dev/zero diff --git a/grub.txt b/grub.txt new file mode 100644 index 0000000..c4f842e --- /dev/null +++ b/grub.txt @@ -0,0 +1,26 @@ +###grub hintergrundbild ändern +#bild back.jpg 800x600 +pfad="wo gearbeitet wird /home/mhoellein oder ..." +bild="pfad incl. bild" +mkdir -p ${pfad}/cpio +mkdir -p ${pfad}/cpio/work +cd ${pfad}/cpio/work +cp /boot/message . +cpio -idv < message +mv message ../message-old +cp ${bild} back.jpg +ls | cpio -ov > ../message +cd .. +su +cp message /boot/message +exit +rm -Rf work +###menüeinträge ändern +vi /boot/grub/menu.lst +###Framebuffer Auflösungen +Farbtiefe + 640x480 800x600 1024x768 1280x1024 1600x1200 +256 (8bit) 0x301 0x303 0x305 0x307 0x31C +32000 (15bit) 0x310 0x313 0x316 0x319 0x31D +65000 (16bit) 0x311 0x314 0x317 0x31A 0x31E +16.7(24bit) 0x312 0x315 0x318 0x31B 0x31F diff --git a/hal.txt b/hal.txt new file mode 100644 index 0000000..f6356ae --- /dev/null +++ b/hal.txt @@ -0,0 +1,2 @@ +###alles anzeigen lassen +lshal diff --git a/heimnetz.txt b/heimnetz.txt new file mode 100644 index 0000000..e30feec --- /dev/null +++ b/heimnetz.txt @@ -0,0 +1,67 @@ +###Geräte und mac adressen +vu eth0 00:1D:EC:05:90:CF 192.168.178.25 +homeserver eth0 00:15:C5:70:A5:02 192.168.178.24 +alienware wlan0 A0:88:B4:53:D6:38 192.168.178.27 +alienware eth0 5c:26:0a:61:39:e5 +homematic eth0 00:1A:22:00:9F:DD 192.168.178.28 +cam_flur wlan0 00:E0:4C:AE:C5:4E 192.168.178.29 +cam_stube wlan0 00:12:7B:54:F3:2C 192.168.178.30 +cam_schlafzimmer eth0 00:EA:21:62:1B:16 192.168.178.41 +cam_schlafzimmer wlan0 00:EA:21:62:1B:16 192.168.178.41 +bluray eth0 50:85:69:65:65:80 192.168.178.32 +bob eth0 B8:27:EB:15:55:AB 192.168.178.62 +nexus4 wlan0 10:68:3F:4D:98:8C 192.168.178.23 +nexus5 wlan0 BC:F5:AC:F7:DB:11 192.168.178.20 +nexus7-susi wlan0 30:85:A9:DE:33:1F 192.168.178.21 +nexus7-mario wlan0 50:46:5D:7B:38:A5 192.168.178.26 +nexus10 wlan0 08:D4:2B:18:76:C2 192.168.178.22 +onkyo eth0 00:09:B0:C9:18:4E 192.168.178.33 +tv eth0 E8:5B:5B:21:43:1E 192.168.178.31 +archos wlan0 +defy wlan0 +xbmc-ug wlan0 00:e0:4c:00:21:67 192.168.178.27 +xbmc-ug eth0 B8:27:EB:C7:31:0C 192.168.178.37 +xbmc-og eth0 B8:27:EB:81:F4:7D 192.168.178.39 +xbmc-og wlan0 00:1F:1F:AC:63:EB 192.168.178.53 +switch-stube lan 2C:36:F8:4B:66:4E 192.168.178.253 +cubietruck lan 02:99:0a:82:93:e6 192.168.178.35 +cubietruck wlan0 00:90:4c:11:22:33 +vaio wlan0 00:24:2B:ED:53:0E 192.168.178.34 +vaio eth0 00:1D:BA:BB:30:97 + + +#Grüner Weg +MAC:IP:Schnittstelle:DNS:TYP:SEC.ID:ORT: +00:1A:22:05:C8:9B 192.168.178.20 eth0 ccu2 CCU2 +00:1A:22:05:FE:A9 192.168.178.21 eth0 langateway Langateway +00:1A:22:05:FF:95 192.168.178.45 eth0 langateway2 Langateway +00:01:C0:18:AC:CE 192.168.178.25 eth0 homeserver Mintbox2 +F4:06:8D:47:40:A5 dlan internet DLAN-Adapter Esszimmer Vitriene dLAN 500 duo +F4:06:8D:83:DE:90 192.168.178.32 dlan Esszimmer DLAN-Adapter Sec.ID NBRO-XZEG-YTLO-QLVI überall mal +F4:06:8D:83:DE:8C 192.168.178.35 dlan Schlafzimmer DLAN-Adapter Sec.ID MLPA-YBNF-RRDS-AZLG Schlafzimmer dLAN 500 WiFi +F4:06:8D:7A:56:C8 192.168.178.34 dlan Marlies DLAN-Adapter Sec.ID Marlies Wohnzimmer +F4:06:8D:83:DE:8A 192.168.178.35 dlan +F4:06:8D:7D:4A:9C 192.168.178.30 dlan Arbeitszimmer DLAN-Adapter Sec.ID ISPZ-KHIT-YLBZ-DYQS Arbeitszimmer dLAN 500 AV Wireless+ +F4:06:8D:4C:0E:9F dlan EinliegerWohnung DLAN-Adapter Sec.ID QCNF-EWGD-UCLT-SPQL Einlieger Wohnung dLAN 500 duo +A0:F8:95:F5:CA:34 192.168.178.50 wlan tel-Marlies Wiko Telefon +AC:CF:23:9E:2A:4C 192.168.178.52 wlan milight Milight-Bridge Esszimmer Vitriene +54:E4:BD:15:B3:92 192.168.178.61 wlan orbsmart-schlafzimmer Orbsmart Schlafzimmer + 192.168.178.55 wlan0 raspberrypi Raspberry Pi +B8:27:EB:15:55:AB 192.168.178.62 eth0 raspberrypi Raspberry Pi +BC:05:43:2B:06:50 192.168.178.12 Fritz.Box Esszimmer +C8:0E:14:28:2B:C5 192.168.178.2 Fritz.Box Wohnzimmer +CE:05:43:2B:06:55 Fritz.Box7390 2.4GHz +CE:05:43:12:57:31 Fritz.Box7390 5.0GHz +C8:0E:14:28:2B:C8 Fritz.Box7490 5.0GHz +C8:0E:14:28:2B:C7 Fritz.Box7490 2.4GHz +BC:05:43:12:57:31 + +78:F8:82:6D:70:D9 192.168.178.11 wlan tel-mario Nexus5x überall +78:F8:82:B7:49:EB 192.168.178.101 wlan tel-susi Nexus5x + +D4:40:F0:1E:6D:7F Speedport Hybrid LAN +D4:40:F0:1E:6D:80 Speedport Hybrid WAN +D4:40:F0:1E:6D:83 Speedport Hybrid WLAN + + + diff --git a/homematic.txt b/homematic.txt new file mode 100644 index 0000000..fb7d9b2 --- /dev/null +++ b/homematic.txt @@ -0,0 +1,136 @@ +#http://www.homematic-inside.de/ +###Telnet einschalten +system.Exec("/usr/sbin/inetd"); +###verstecktes Analysemenü +http://[CCU-IP]/tools/devconfig.cgi?sid=[Session-ID] +#oder immer per Menü +CP_DEVCONFIG=1 in /etc/config +### +###wiederbeleben per tftp +dhcp.conf +host homematic { + hardware ethernet 00:1a:22:xx:xx:xx; + fixed-address 192.168.0.11; + filename "linux-2.6.uImage"; + server-name "192.168.0.10"; + next-server 192.168.0.10; +} + +inetd.conf +tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp + +mkdir /tmp/cramfs +mount -t cramfs -o loop boot_cramfs /tmp/cramfs + + +Re: Firmware neu flashen? + +Beitragvon dirch » 27.10.2008, 15:52 +Achtung: Diese Vorgehensweise ist nicht ganz trivial und sollte daher nur von Leuten durchgefuehrt werden die genau wissen was sie tun. Im schlimmsten Falle koennt ihr die Firmware auf der Zentrale so zerstoeren dass sie zum Hersteller eingeschickt werden muss! Ich uebernehme natuerlich keine Garantie fuer das oben geschriebene bzw. fuer alle Schaeden die ihr mit Hilfe dieser Anleitung an euren Zentralen verursacht. + +So, auf nen standard Debian/*buntu sind folgende Pakete noetig um die CCU uebers Netz zu booten, zumindest habe ich sie hier benutzt. Die Konfiguration von anderen Daemons oder unterschiedlichen Versionen mag abweichen. + + +- openbsd-inetd (0.20050402-6) +- dhcp3-server (3.0.4-13) +- tftpd (0.17-15) +- nfs-kernel-server (1.0.10-6+etch.1) + + +IP der Zentrale: 192.168.0.11 +IP des linux Servers: 192.168.0.10 +(alle weiteren Beschreibungen und Konfig-Auszuege beziehen sich auf diese IP Adressen. Natuerlich koennen auch andere verwendet werden!) + +dhcpd ist eingerichtet fuer 192.168.0.0/24 + +Datei: /etc/dhcp3/dhcpd.conf + +Code: Alles auswählen + host homematic { + hardware ethernet 00:1a:22:xx:xx:xx; + fixed-address 192.168.0.11; + filename "linux-2.6.uImage"; + server-name "192.168.0.10"; + next-server 192.168.0.10; + } + + + + +Datei: /etc/inetd.conf + +Code: Alles auswählen + tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp + + + + +Aktuelle Firmware (z.B hm-ccu-firmware-1.300.img) entpacken. Entweder mit winrar oder in .tar.gz umbenennen. +Das dort enthaltene boot_cramfs mounten: + +Code: Alles auswählen + mkdir /tmp/cramfs + mount -t cramfs -o loop boot_cramfs /tmp/cramfs + + +und uImage ins TFTP verzeichnis kopieren + +Code: Alles auswählen + cp /tmp/cramfs/uImage /srv/tftp/linux-2.6.uImage + chmod +r /srv/tftp/linux-2.6.uImage + + +Verzeichnis fuers NFS-root anlegen + +Code: Alles auswählen + mkdir /nfsroot_hss + tar -xzf /tmp/root_fs.tar.gz -C /nfsroot_hss + + + +Datei: /etc/exports + +Code: Alles auswählen + /nfsroot_hss 192.168.0.11(rw,sync,no_root_squash) + + +Dienste neu starten: + +Code: Alles auswählen + /etc/init.d/nfs-kernel-server restart + /etc/init.d/inetd restart + /etc/init.d/dhcp3-server restart + +#fstab muss nur angepasst werden! +none /proc proc defaults 0 0 +#/dev/mtdblock1 /boot cramfs defaults,noatime 0 0 +/dev/mtdblock2 / yaffs defaults,noauto,ro,noatime 0 0 +/dev/mtdblock3 /usr/local yaffs defaults,rw,noatime 0 0 +tempfs /var tmpfs defaults,size=32m 0 0 +devpts /dev/pts devpts defaults 0 0 + +in + +none /proc proc defaults 0 0 +#/dev/mtdblock1 /boot cramfs defaults,noatime 0 0 +/nfsroot_hss / yaffs defaults,noauto,ro,noatime 0 0 +tempfs /var tmpfs defaults,size=32m 0 0 +devpts /dev/pts devpts defaults 0 0 + + + +Bevor ihr die Box nun uebers Netz bootet solltet ihr noch die Eintraege in /nfsroot_hss/etc/fstab anschauen und korrigieren, ggf. moechtet ihr auch noch das script in /nfsroot_hss/etc/rc anpassen. + +Nun zum booten selber, resettet die box (ueber den kleinen reset knopf und haltet dann SOFORT alle 3 fronttasten fuer ca. 5 sekunden gedrueckt. Nun sollte die box erst einen bootp/dhcp request, dann einen TFTP request und zuletzt eine NFS Verbindung in den logs (z.b. /var/log/daemon.log) sehen: + +Das eigentliche aufspielen oder neu flaschen der Software ist damit noch nicht geschehen, bislang wurde die Firmware der Zentrale weder geloescht noch sonst irgendwie veraendert. + +Um so eine neue Software aufzuspielen solltet ihr (sofern nicht schon vorhanden) telnet ins nfsroot installieren um euch auf der box anmelden zu koennen. Ein Beispiel wie das flashen funktioniert koennt ihr euch im update_script (aus http://www.homematic.com/firmware/hm-cc ... 300.tar.gz ) anschauen. + +Ich hoffe das die Beschreibung irgendwem einmal hilft, mir hat es auf jeden Fall schon das Einschicken an den Hersteller erspart +###Signalstärke aller Sender anzeigen +#einloggen wegen der Session id, hier sid=@4W4X9HQhUS@ dann URL aufrufen +http://ip-ccu/tools/devconfig.cgi?sid=@4W4X9HQhUS@ +#oder alternativ in /etc/config/tweaks anlegen mit +CP_DEVCONFIG=1 +### diff --git a/homematic/alleAktorenInEinemGewerkeAuschalten b/homematic/alleAktorenInEinemGewerkeAuschalten new file mode 100644 index 0000000..2cb3afe --- /dev/null +++ b/homematic/alleAktorenInEinemGewerkeAuschalten @@ -0,0 +1,12 @@ +var i = dom.GetObject("NAME DES GEWERKES"); +string itemID; +foreach(itemID, i.EnumUsedIDs()) +{ + var item = dom.GetObject(itemID); + if (item.IsTypeOf(OT_CHANNEL)) + { + var device = dom.GetObject(item.Device()); + if ((device.HssType().Find("HM-LC-Sw") >= 0) && (item.State())) { item.State(0); } + if ((device.HssType().Find("HM-LC-Dim") >= 0) && (item.State())) { item.State(0.00); } + } +} diff --git a/homematic/backup-ccu2.bash b/homematic/backup-ccu2.bash new file mode 100644 index 0000000..c83c0ab --- /dev/null +++ b/homematic/backup-ccu2.bash @@ -0,0 +1,46 @@ +#!/bin/bash +# http://www.lxccu.com/manuals:manual-ccu2-backup +# Homematic CCU Backup Script fuer crontab +# Erstellt am 13.03.11 von Danny B. +# Angepasst am 05.08.14 von PaulG4H + +# Parameter +backupdir="/home/backup/" +host="192.168.216.28" +user="backup" +password="XXXYYYZZZ" + +# Voraussetzung: Nutzer hinzufügen, Passwort setzen, Typ Administrator +# +# crontab Zeile alle 2 Stunden prüfen ob das letzte Backup älter als 2 Tage +# ist, dann Backup; es werden max 5 Backups aufgehoben: +# 0 0-23/2 * * * mario [ -z "$(find /home/backup/ -name homematic-ccu2\* -mtime -2)" ] && ping -q -n -c 1 -W 1 192.168.216.28 > /dev/null 2>&1 && bin/backup-ccu2.bash && find /home/backup/ -name homematic-ccu2\* | sort -r | sed -e "1,5d" | xargs -r rm -f ; true + +############### Es sind keine weiteren Anpassung ab hier Notwendig + +SCRIPTNAME=${0##*/} + +[ -d run ] && cd run + +run=$SCRIPTNAME.lastrun + +# Homematic Login +wget --post-data '{"method":"Session.login","params":{"username":"'$user'","password":"'$password'"}}' http://$host/api/homematic.cgi -O hm.login.response -q >$run 2>&1 + +# Login-Pruefung +loginerror=`cat hm.login.response|cut -d "," -f3|awk '{print $2}'` +if [ "$loginerror" != "null}" ]; then + echo "Fehler beim Homematic-Login !"|tee -a $run + cat hm.login.response|grep message|cut -d '"' -f4|tee -a $run + exit 1 +fi +sessionid=`cat hm.login.response|cut -d "," -f2|awk '{print $2}'|cut -d '"' -f2` + +# Backupdatei herunterladen +wget "http://$host/config/cp_security.cgi?sid=@$sessionid@&action=create_backup" -O $backupdir/homematic-ccu2-$host-$(date +%Y%m%d).tar.sbk -q >>$run 2>&1 + +# Homematic Logout +wget --post-data '{"method":"Session.logout","params":{"_session_id_":"'$sessionid'"}}' http://$host/api/homematic.cgi -O hm.logout.response -q >>$run 2>&1 + +# temp. Dateien loeschen +rm hm.login.response hm.logout.response >>$run 2>&1 diff --git a/homematic/batterie_pruefung b/homematic/batterie_pruefung new file mode 100644 index 0000000..c68c9aa --- /dev/null +++ b/homematic/batterie_pruefung @@ -0,0 +1,38 @@ +var myAssembly = dom.GetObject("Batterie betrieben"); +string itemID; +string text = ""; +integer counter = 0; + +foreach(itemID, myAssembly.EnumUsedIDs()) { + var item = dom.GetObject(itemID); + var device = + dom.GetObject(item.Device()); + var interface = dom.GetObject(item.Interface()); + + string interface_name = interface.Name(); + string device_address = device.Address(); + + device_address = device_address.StrValueByIndex(":", 0); + + string channel_name = interface_name # "." # device_address # ":0.LOWBAT"; + var channel = dom.GetObject(channel_name); + + + if ( (channel.State() == true) && (channel.Value() == true) ) { + if ( counter == 0 ) { + text = item.Name(); + } else { + text = text # ", " # + item.Name(); + } + } + counter = counter + 1; +} + +if ( text != "" ) { + string stdout; + string stderr; + var batmeldung = system.Date("%d.%m.%Y %H:%M:%S") + " - Komponenten " + text + " melden niedrigen Batteriestand!"; + var WarnRep = dom.GetObject("WarnReport"); + WarnRep.Variable(batmeldung); system.Exec("/etc/config/addons/email/email 03", &stdout, &stderr); +} diff --git a/homematic/fenster_offen_als_string b/homematic/fenster_offen_als_string new file mode 100644 index 0000000..2e77eb6 --- /dev/null +++ b/homematic/fenster_offen_als_string @@ -0,0 +1,85 @@ + boolean firstWindow = true; + + string textReplace = "Fenster "; + integer textReplaceLength = textReplace.Length(); + + string i; + string list = ""; + + var sec=dom.GetObject("Fenster_Tueren"); + string lastWindow = " unknown "; + integer numberOfOpenWindows = 0; + foreach(i,sec.EnumUsedIDs()) + { + var item=dom.GetObject(i); + if(item.IsTypeOf(OT_CHANNEL)) + { + var dev=dom.GetObject(item.Device()); + if((dev.HssType()=="HM-Sec-SCo") || (dev.HssType()=="HM-Sec-SC-2")) + { + var state=item.DPByHssDP("STATE"); + if(state.Value()) + { + numberOfOpenWindows=numberOfOpenWindows+1; + lastWindow = i; + } + } + } + } + + if (numberOfOpenWindows > 1) + { + list="Die Fenster "; + } + else + { + list="Das Fenster "; + } + sec=dom.GetObject("Fenster_Tueren"); + foreach(i,sec.EnumUsedIDs()) + { + var item=dom.GetObject(i); + if(item.IsTypeOf(OT_CHANNEL)) + { + var dev=dom.GetObject(item.Device()); + if((dev.HssType()=="HM-Sec-SCo") || (dev.HssType()=="HM-Sec-SC-2")) + { + var state=item.DPByHssDP("STATE"); + if(state.Value()) + { + string itemName = dev.Name().ToString(); + ! entferne den textReplace + if(itemName.Length() >= textReplaceLength) + { + itemName = itemName.Substr(textReplaceLength, itemName.Length() - textReplaceLength); + } + + if (firstWindow == false) + { + if (i == lastWindow) + { + list=list+" und "; + } + else + { + list=list+", "; + } + } + else + { + firstWindow = false; + } + list=list+itemName; + } + } + } + } + + if (numberOfOpenWindows > 1) + { + list=list+" sind noch offen ..."; + } + else + { + list=list+" ist noch offen ..."; + } diff --git a/homematic/gestoerte_geraete_suchen b/homematic/gestoerte_geraete_suchen new file mode 100644 index 0000000..8d79381 --- /dev/null +++ b/homematic/gestoerte_geraete_suchen @@ -0,0 +1,17 @@ +string itemID; +string address; +object aldp_obj; +string channel; +var x; + +foreach(itemID, dom.GetObject(ID_DEVICES).EnumUsedIDs()) { + address = dom.GetObject(itemID).Address(); + aldp_obj = dom.GetObject("AL-" # address # ":0.UNREACH"); + if (aldp_obj) { + if (aldp_obj.Value()) { + foreach (channel, dom.GetObject(itemID).Channels().EnumUsedIDs()) { + x = dom.GetObject(channel).State(); + } + } + } +} diff --git a/homematic/gestoerte_geraete_suchen.png b/homematic/gestoerte_geraete_suchen.png new file mode 100644 index 0000000..e536dac Binary files /dev/null and b/homematic/gestoerte_geraete_suchen.png differ diff --git a/homematic/hmcompanion/ReadMe.txt b/homematic/hmcompanion/ReadMe.txt new file mode 100644 index 0000000..f25870d --- /dev/null +++ b/homematic/hmcompanion/ReadMe.txt @@ -0,0 +1,203 @@ +HMCompanion V0.14 +================= +Geschrieben von Oliver Wagner + +1. Was ist HMCompanion? +----------------------- +HMCompanion ist eine Middleware, welche ich gebaut habe, um mein Homematic-System via CCU besser +in meine Hausautomation integrieren zu können. Es handelt sich um einen Server-Prozess, der +auf der einen Seite mit der CCU kommuniziert und auf anderen Seite mittels einfacher +TCP-Textkommandos ansteuerbar ist. Dies ermöglicht eine sehr einfache Integration in +PHP, Bash-Scripte etc. Desweiteren arbeitet HMCompanion auch als sehr effizienter Cache +für den Status aller Channel auf der CCU, so daß z.B. für Visualisierung auf diese +Daten ohne Verzögerung zugegriffen werden kann. + +HMCompanion ist in Java geschrieben und funktioniert auf jeder Plattform mit mindestens +einer Java-1.5-JRE (also NICHT direkt auf der CCU selbst) + + +2. Grobe Struktur der CCU-Software +----------------------------------- +Um die Funktionsweise von HMCompanion zu verstehen, ist es sinnvoll, einen groben Überblick +über die Struktur der CCU-Software zu haben. + +Die CCU-Software besteht aus mehreren Schichten: + +Auf der untersten Ebene liegen drei Daemon-Prozesse, welche die Kommunikation mit den +Hardwarekomponenten vornehmen: + +rfd -- mit den BidCoS-Funk-Komponenten (direkt oder über HM-CFG-LAN) (Port 2001) +hs485d -- mit den HomeMatic-Wired-Komponenten (Port 2000) +pfmd -- mit der Hardware der CCU selbst (Port 2002) + +Diese Prozesse besitzen jeweils eine xmlrpc-Schnittstelle, über welche sie angesteuert werden +können und über welche Ereignisse (z.B. Status-Änderungen) gemeldet werden. Auf dieser Ebene existieren +Geräte und Kanäle nur als Adressen. + + +--------+ + | WebUI | + +--------+ + | JSON-RPC + +---------+ + |Webserver| + +---------+ + | HMScript (und xmlrpc) + +--------+ + |ReGa HSS| + +--------+ + / xml | \ + / rpc | \ ++---+ +-------+ +----+ +|rfd| |hs485d | |pfmd| ++---| +-------+ +----+ + | (TCP/IP) ++----------+ +|HM-CFG-LAN| ++----------+ + +Über diesen Prozessen liegt die von EQ-3 als "Logikschicht" bezeichnete Ebene (ReGa, von "Residential Gateway"). +Diese managt die Konfiguration der Hardwarekomponenten, führt WebUI-Programme aus, handhabt die Abarbeitung +von HMScript und ähnliches. Auf dieser Ebene werden auch die Namen und Bezeichnungen der Geräte verwaltet +(in der "homematic.regadom"-Datenbank). + +Diese Logikschicht wiederum besitzt zwei Schnittstellen: Zum einen die Möglichkeit, über eine TCL-Bibliothek +HMScript-Befehle auszuführen zu lassen, zum anderen ist über einen Webserver damit ein JSON-RPC-API +realisiert, welches wiederum von der WebUI verwendet wird. Das WebUI wiederum ist eine browserseitige +AJAX-Applikation, welche die Daten der ReGa visualisiert und die ReGa (via JSON-RPC) ansteuert. + +Die JSON-API-Befehle kann man mittels http://homematic-ip/api/homematic.cgi einsehen. Wer telnet-Zugang auf +die CCU hat, kann den TCL-Quelltext der einzelnen über das API verfügbaren Methoden im Verzeichnis /www/api/methods +einsehen. Diese lassen auch interessante Rückschlüsse auf interne HMScript- und xmlrpc-Aufrufe zu. + +Eine Dokumentation der XML-RPC-Schnittstelle findet sich unter http://www.homematic.com/index.php?id=156 + + +3. Kommunikation HMCompanion und CCU +------------------------------------ +HMCompanion kommuniziert auf zwei Ebenen mit der CCU: + +a) Es benutzt xmlrpc, um direkt Befehle an rfd, hs485 und pfmd zu schicken. +a.1) Es meldet sich mittels des xmlrpc-Befehls "init" als zusätzliche Logikschicht an den Daemonen an, um +von diesen über Ereignisse informiert zu werden. Dies macht die Installation von tcpdump o.ä. auf der CCU +selbst unnötig. + +Die xmlrpc-Kommunikation geht über die entsprechenden Schnittstellen der drei Serverdienste. Es wird das +proprietäre binärkodierte Format der CCU-Komponenten verwendet. + +b) Es benutzt HMScript, um von der CCU eine Liste aller Geräte mit Namen zu erhalten, damit diese dann +mittels GET, SET etc. per Namen angesprochen werden können. + +HMScript wird mittels eines HTTP POST an die URL http://:8181/tclrega.exe ausgeführt. + + +4. Benutzung von HMCompanion +---------------------------- +HMCompanion wird mit folgendem Befehl gestartet: + +java -jar hmcompanion.jar -server + +HMCompanion registriert sich dann zuerst per xmlrpc-API bei den drei Daemon-Prozessen, um Events zu erhalten, +fordert danach per HMScript die ReGa-Geräteliste an und wartet dann auf TCP-Verbindungen zum +angegebenen Port. + +Zum Beispiel mittels + + telnet localhost 6770 + +kann man sich dann mit dem HMCompanion verbinden und Befehle abschicken. Mittels "HELP" erhält man +eine Auflistung aller verfügbaren Befehle. Ein Beispiel: Aktuellen Status eines Channel-Attributes abrufen: + +GET Wetterstation + +Attribut setzen: + +SET "Licht Kellerflur" STATE on + +Bei SET/GET können jeweils sowohl die BidCoS-Adressen der Channel als auch die im WebUI zugewiesene +Namen verwendet werden. Bei Set/SetParam können auch Wildcards verwendet werden, z.B. + +SET "*Licht*" STATE on + +setzt alle Komponenten mit Namen, die "Licht" enthalten, auf ein. Das Auslesen von Attributen von +mehreren Geräten ist mittels des Befehls "MGET" möglich. + +Da in den xmlrpc-Requests die Datentypen der Parameter eine Rolle spielen, rät HMCompanion anhand des +Formats: + + on/true, off/false -> Boolean + Integer-Zahl (nur 0-9) -> Integer + Dezimalzahl (d.h. mit Dezimalpunkt) -> Dezimalzahl + alles andere -> String + +Dies bedeutet, dass man Parameter, die als Dezimalzahl erwartet werden (z.B. LEVEL), immer auch als +Dezimalzahl übergeben muss, also "0.0" statt "0" und "1.0" statt "1", ansonsten wird der Request vom +jeweiligen Daemon ignoriert. + +HMCompanion speichert den aktuellen Stand aller Channel-Attribute beim Beenden in der Datei "hmc.cache" +und lädt diesen beim Start wieder. Dies dient insbesondere für Geräte, die nur alle 24h o.ä. ein Update +schicken. + +Wird HMCompanion auf einem Server-System betrieben, macht es Sinn, die Speicherzuteilung der JavaVM +mittels "-Xmx64M" auf 64MB zu beschränken: + + java -Xmx64M -jar hmcompanion.jar -server + + +5. History +---------- +V0.2 - erste funktionale Version + +V0.3 - verwendet XMLRPC-BIN auch für eingehende Requests, kein Apache ws-xmlrpc mehr nötig + - Dump-Format für strukturierte Antworten verbessert + - Serialization-Fehler beim Cache-Schreiben behoben + - Neues Kommando "CGET", um alle Attribute eines Kanals in einem für Cacti lesbarem Format + auszugeben + +V0.4 - SET funktioniert nun auch wieder mit reinen BidCoS-Adressen anstatt nur mit ReGa-Namen + - neuer Befehl "SETPARAM", um einen einzelnen Konfigurationsparameter via der xmlrpc-Methode + "putParamset" zu setzen. Beispiel z.B. zum Setzen eines Temperaturreglers auf Automatik: + SETPARAM GEQ00xxxxx:2 MASTER MODE_TEMPERATUR_REGULATOR 1 + +V0.5 - SET und SETPARAM akzeptieren nun Wildcards (*) für Channelnamen. Heissen z.B. alle + Thermostat-Steuerkanäle "Thermostat 1", kann man mit + SETPARAM "Thermostat * 1" MASTER MODE_TEMPERATUR_REGULATOR 1 + alle gleichzeitig auf Modus "Auto" setzen. + +V0.6 - Watchdog: Wird nun mehr als 180s kein Callback empfangen, werden die init-Requests erneut + geschickt (z.B. nach einem Reboot der CCU) + - Neuer Befehl "HMSet " als Shortcut zum Setzen einer HMScript-Variable + - Neuer Befehl "HMGet " als Shortcut zum Lesen einer HMScript-Variable + - Neuer Befehl "HMRun " als Shortcut zum Starten von HMScript-Programmen + +V0.7 - Mittels "HMGet -timestamp variable" (Textform) oder "HMGet -timestampts variable" (Sekunden seit 1970) + kann nur die Last-Modification-Timestamp einer Variable abgefragt werden + - "HMSet" benutzt nun .State(v) statt .Variable(v), damit eventuelle Events auf den Systemvariablen ausgelöst werden + - Neues Kommando MGET um ein Attribut von einer Menge von Geräten abzufragen, z.B. "MGET PIR* motion". + Das Ausgabeformat ist "Gerätename:Wert" + +V0.8 - Hinweis auf "undokumentierte Schnittstellen" entfernt, da nun durch EQ-3 offengelegt + - Beim Beenden von HMC wird nun ein de-init an die xmlrpc-Server geschickt + - Neuer Befehl "STATS" um Statistiken über von den xmlrpc-Servern erhaltene Nachrichten im Cacti-Format zu bekommen + - QUIT hat nun eine Option "-exit", mit der HMC beendet werden kann + +V0.9 - Clientverbindungen setzen nun SO_KEEPALIVE + - REQ unterstützt nun auch die Angabe von Arrays und Strukturen mit der [ Array ] bzw. { key1 value1 key2 value2 } + Notation + - GUI-Betriebsmodus zum Setzen der Interface/Roaming-Parameter (einfach ohne Parameter staten) + +V0.10 - GUI-Modus: Button zum schnellen Refresh der RSSI-Informationen hinzugefügt + - GUI-Modus: Schnittstellen werden nun in der CCU-Reihenfolge angezeigt, mit dem Default-Interface zuerst + +V0.11 - GUI-Modus: Buttons zum Setzen aller Devices auf Roaming Off, auf Default == Interface mit dem besten RSSI-Wert + und Roaming On für alle Fernbedienungen + +V0.12 - Synchronisationsproblem beim Request-Handling konnte dazu führen, das mehrere schnell hintereinander + abgesendete "SET" (o.ä.)-Befehle zu einem Deadlock führten + - Server-Sockets werden nun alle mit SO_REUSEADDR generiert, um schnellen Neustart möglich zu machen + +V0.13 - Client-Verbindungen benutzen nun unabhängig vom Systemzeichensatz immer UTF-8 + +V0.14 - Optionales Authentifizerungstoken für Client-Verbindungen: Wird HMC mit "homematicip -server 6770 " gestartet, + werden weitere Befehle nur nach Authentifizerung mit "AUTH " angenommen. + + \ No newline at end of file diff --git a/homematic/hmcompanion/hmcompanion.jar b/homematic/hmcompanion/hmcompanion.jar new file mode 100644 index 0000000..59920d9 Binary files /dev/null and b/homematic/hmcompanion/hmcompanion.jar differ diff --git a/homematic/hmcompanion/hmcompanion_src_v014.zip b/homematic/hmcompanion/hmcompanion_src_v014.zip new file mode 100644 index 0000000..ff30161 Binary files /dev/null and b/homematic/hmcompanion/hmcompanion_src_v014.zip differ diff --git a/homematic/hmcompanion/hmcompanion_v014.zip b/homematic/hmcompanion/hmcompanion_v014.zip new file mode 100644 index 0000000..6430d98 Binary files /dev/null and b/homematic/hmcompanion/hmcompanion_v014.zip differ diff --git a/homematic/licht_aus b/homematic/licht_aus new file mode 100644 index 0000000..29f5301 --- /dev/null +++ b/homematic/licht_aus @@ -0,0 +1,17 @@ +Alles im Gewerk "Gewerkename" wird abgeschaltet +var myAssembly = dom.GetObject("Gewerkename"); +string itemID; +foreach(itemID, myAssembly.EnumUsedIDs()) { + var item = dom.GetObject(itemID); + if (item.IsTypeOf(OT_CHANNEL)) { + var device = dom.GetObject(item.Device()); + if (device.HssType() == "HM-LC-Sw1-Pl") { item.State(0); } + if (device.HssType() == "HM-LC-Sw1-FM") { item.State(0); } + if (device.HssType() == "HM-LC-Sw2-FM") { item.State(0); } + if (device.HssType() == "HM-LC-Sw1-PB-FM") { item.State(0); } + if (device.HssType() == "HM-LC-Sw2-PB-FM") { item.State(0); } + if (device.HssType() == "HM-LC-Dim1L-Pl") { item.State(0.00); } + if (device.HssType() == "HM-LC-Dim1L-CV") {item.State(0.00); } + } +} + diff --git a/homematic/meldungen_bestaetigen b/homematic/meldungen_bestaetigen new file mode 100644 index 0000000..908c011 --- /dev/null +++ b/homematic/meldungen_bestaetigen @@ -0,0 +1,13 @@ +string itemID; +string address; +object aldp_obj; + +foreach(itemID, dom.GetObject(ID_DEVICES).EnumUsedIDs()) { + address = dom.GetObject(itemID).Address(); + aldp_obj = dom.GetObject("AL-" # address # ":0.STICKY_UNREACH"); + if (aldp_obj) { + if (aldp_obj.Value()) { + aldp_obj.AlReceipt(); + } + } +} diff --git a/homematic/meldungen_bestaetigen.png b/homematic/meldungen_bestaetigen.png new file mode 100644 index 0000000..611efd5 Binary files /dev/null and b/homematic/meldungen_bestaetigen.png differ diff --git a/homematic/oled_Display_Programm b/homematic/oled_Display_Programm new file mode 100644 index 0000000..d4bee08 --- /dev/null +++ b/homematic/oled_Display_Programm @@ -0,0 +1,427 @@ +! ### Homatic-Statusanzeige HM-Dis-WM55 #### +! ### Stausanzeige 2 , Vers. 1.0; +! ### Anzeige der Zysternen Füllstand, Zysternen Filter stand, Außentemperatur, Status der Türen, Fenster und Lichter + +!! Universalprogramm zum Füllen +!! (c) DrTob +!! optimized by thkl +!! changed by wortmann30 +!! Seitenzähler von Brufi + +!! Das Script holt sich jetzt die Seriennummer des Displays selbst aus der Auslösebedinung des Programms + +! Farben +! 0x80 weiß +! 0x81 rot +! 0x82 orange +! 0x83 gelb +! 0x84 gruen +! 0x85 blau + +! Symbole +! 0x80 AUS +! 0x81 EIN +! 0x82 OFFEN +! 0x83 geschlossen +! 0x84 fehler +! 0x85 alles ok +! 0x86 information +! 0x87 neue nachricht +! 0x88 servicemeldung +! 0x89 Signal grün +! 0x8A Signal gelb +! 0x8B Signal rot + +! Zugriff auf vordefinierte Texte +! +! 0x80 Text 0 (Kanal 1 Text Zeile 1) +! 0x81 Text 1 (Kanal 1 Text Zeile 2) +! 0x82 Text 2 (Kanal 2 Text Zeile 3) +! 0x83 Text 3 (Kanal 2 Text Zeile 4) +! 0x84 Text 4 (Kanal 3 Text Zeile 5) +! 0x85 Text 5 (Kanal 3 Text Zeile 6) +! 0x86 Text 6 (Kanal 4 Text Zeile 7) +! 0x87 Text 7 (Kanal 4 Text Zeile 8) +! 0x88 Text 8 (Kanal 5 Text Zeile 9) +! 0x89 Text 9 (Kanal 5 Text Zeile 10) +! 0x8A Text 10 (Kanal 6 Text Zeile 11) +! 0x8B Text 11 (Kanal 6 Text Zeile 12) +! 0x8C Text 12 (Kanal 7 Text Zeile 13) +! 0x8D Text 13 (Kanal 7 Text Zeile 14) +! 0x8E Text 14 (Kanal 8 Text Zeile 15) +! 0x8F Text 15 (Kanal 8 Text Zeile 16) +! 0x90 Text 16 (Kanal 9 Text Zeile 17) +! 0x91 Text 17 (Kanal 9 Text Zeile 18) +! 0x92 Text 18 (Kanal 10 Text Zeile 19) +! 0x93 Text 19 (Kanal 10 Text Zeile 20) + +string zeile1 = ""; +string color1 = "0x80"; +string icon1 = ""; + +string zeile2 = ""; +string color2 = "0x80"; +string icon2 = ""; + +string zeile3 = ""; +string color3 = "0x80"; +string icon3 = ""; + +string zeile4 = ""; +string color4 = "0x80"; +string icon4 = ""; + +string zeile5 = ""; +string color5 = "0x80"; +string icon5 = ""; + +string zeile6 = ""; +string color6 = "0x80"; +string icon6 = ""; + +! ####### wie viele Seiten auf dem Display sollen durchlaufen werden? ########### + +integer seitenzahl = 4; + +! ############################################################### + +! ####################### Zähler entsprechend der Anzahl Tastendrücke verändern ################# + + +integer obj = dom.GetObject("seitenzaehler01"); ! ######## rausholen + +integer xyz = obj.State(); + + +if (xyz == seitenzahl) { + obj.Variable(1); +} +else { + xyz = xyz + 1; ! ######## incrementieren + obj.Variable(xyz); ! ######### reinschreiben +} + +! ################################################################################################ + + + + +! --------- Anfang Ermitteln der Systemzustände und Zuweisung zu den einzelnen Zeilen ------------- + +! ### Systemvariable seitenzaehler01 holen ### + +var seitenZaehler = dom.GetObject("seitenzaehler01"); + + +! ###################### Seite 1 ###################### + + +if (seitenZaehler.State()==1){ + + +! ### Schlafmodus an oder aus? #### + +var oSysvar = dom.GetObject("Schlafmodus"); +if (oSysvar.State()==1){ + +zeile1 = ""; +color1 = "0x80"; +icon1 = ""; +zeile2 = "Schlafen:"; +color2 = "0x80"; +icon2 = ""; +zeile3 = ""; +color3="0x80"; +icon3 = ""; +zeile4 = "ange-"; +color4="0x81"; +icon4 = ""; +zeile5 = "schaltet"; +color5 = "0x81"; +icon5 = ""; +zeile6 = ""; +color6 = "0x80"; +icon6 = ""; +} +else +{ + +zeile1 = ""; +color1 = "0x80"; +icon1 = ""; +zeile2 = "Schlafen:"; +color2 = "0x80"; +icon2 = ""; +zeile3 = ""; +color3="0x80"; +icon3 = ""; +zeile4 = "ausge-"; +color4 = "0x84"; +icon4 = ""; +zeile5 = "schaltet"; +color5 = "0x84"; +icon5 = ""; +zeile6 = ""; +color6 = "0x80"; +icon6 = ""; +} +} +! ###################### Seite 2 ###################### + + +if (seitenZaehler.State()==2){ + +! ### Wecker 6 Uhr #### + +var oSysvar = dom.GetObject("wecker6Uhr"); +if (oSysvar.State()==2){ + +zeile1 = ""; +color1 = "0x80"; +icon1 = ""; +zeile2 = "Wecker:"; +color2 = "0x80"; +icon2 = ""; +zeile3 = ""; +color3="0x80"; +icon3 = ""; +zeile4 = "6 Uhr"; +color4="0x85"; +icon4 = ""; +zeile5 = "einge-"; +color5 = "0x81"; +icon5 = ""; +zeile6 = "schaltet"; +color6 = "0x81"; +icon6 = ""; +} +else +{ + +zeile1 = ""; +color1 = "0x80"; +icon1 = ""; +zeile2 = "Wecker:"; +color2 = "0x80"; +icon2 = ""; +zeile3 = ""; +color3="0x80"; +icon3 = ""; +zeile4 = "6 Uhr"; +color4="0x85"; +icon4 = ""; +zeile5 = "ausge-"; +color5 = "0x84"; +icon5 = ""; +zeile6 = "schaltet"; +color6 = "0x84"; +icon6 = ""; +} +} + +! ###################### Seite 3 ###################### + + +if (seitenZaehler.State()==3){ + +! ### Wecker 8 Uhr #### + +var oSysvar = dom.GetObject("wecker8Uhr"); +if (oSysvar.State()==2){ + +zeile1 = ""; +color1 = "0x80"; +icon1 = ""; +zeile2 = "Wecker:"; +color2 = "0x80"; +icon2 = ""; +zeile3 = ""; +color3="0x80"; +icon3 = ""; +zeile4 = "8 Uhr"; +color4="0x85"; +icon4 = ""; +zeile5 = "einge-"; +color5 = "0x81"; +icon5 = ""; +zeile6 = "schaltet"; +color6 = "0x81"; +icon6 = ""; +} +else +{ + +zeile1 = ""; +color1 = "0x80"; +icon1 = ""; +zeile2 = "Wecker:"; +color2 = "0x80"; +icon2 = ""; +zeile3 = ""; +color3="0x80"; +icon3 = ""; +zeile4 = "8 Uhr"; +color4="0x85"; +icon4 = ""; +zeile5 = "ausge-"; +color5 = "0x84"; +icon5 = ""; +zeile6 = "schaltet"; +color6 = "0x84"; +icon6 = ""; +} +} + +! ###################### Seite 4 ###################### + + +if (seitenZaehler.State()==4){ + +! ### Übersicht #### + +zeile1 = "Übersicht:"; +color1 = "0x80"; +icon1 = ""; + +! #### Zeile 2 und 3 - Alle Fenster zu? Wie viele sind offen? ####### +! # Gewerk mit dem Namen Fenster wird gezählt + +var obj = dom.GetObject("Fenster"); + string itemID; + var cntopen=0; + foreach(itemID, obj.EnumUsedIDs()) { + var item = dom.GetObject(itemID); + if(item.IsTypeOf(OT_CHANNEL)) + { + var state=item.DPByHssDP("STATE"); + if(state.Value()<>0) + { + cntopen=cntopen+1; + } + } +} + +if (cntopen>0) { + zeile2 = cntopen # " Fenster"; + color2 = "0x81"; + icon2 = ""; + zeile3 = "offen"; + color3 = "0x81"; + icon3 = ""; +} + +else { + zeile2 = "Fenster zu"; + color2 = "0x84"; + icon2 = ""; +} + +! #### Zeile 4 und 5 Temperatur/Luftfeuchte Bad + + +var akttemp = dom.GetObject("BidCos-RF.XYZ1234567:1.TEMPERATURE").Value(); +akttemp = akttemp.ToString(1); + +zeile4 = "Bad:"; + color4 = "0x80"; + icon4 = ""; + zeile5 = ""#akttemp#" C"; + color5 = "0x80"; + icon5 = ""; + + +! #### Zeile 6 Luftfeuchte + +var channel=dom.GetObject("Wetter_Temperatur"); +var temp = channel.Value(); +if (temp > -10.0) +{ temp = temp.ToString(1); + zeile6 = "Außen: "#temp#" C"; + color6 = "0x80"; +} +else +{ temp = temp.ToString(1); + zeile6 = "Außen: "#temp#" C"; +} +color6 = "0x80"; +icon6 = ""; + + + + + +} + +! ###################### Seite 5 ###################### + + + +if (seitenZaehler.State()==5){ + + +! ### Platz für weiere Seiten... + + +} + + + +! --------- Ende Ermitteln der Systemzustände und Zuweisung zu den einzelnen Zeilen ------------- + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! System Routine do not change anything below ! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +string splitter="|"; +string msgBuffer = zeile1 # splitter # color1 # splitter # icon1 # "\t"; +msgBuffer = msgBuffer # zeile2 # splitter # color2 # splitter # icon2 # "\t"; +msgBuffer = msgBuffer # zeile3 # splitter # color3 # splitter # icon3 # "\t"; +msgBuffer = msgBuffer # zeile4 # splitter # color4 # splitter # icon4 # "\t"; +msgBuffer = msgBuffer # zeile5 # splitter # color5 # splitter # icon5 # "\t"; +msgBuffer = msgBuffer # zeile6 # splitter # color6 # splitter # icon6; + +string substitutions = "A,0x41\tB,0x42\tC,0x43\tD,0x44\tE,0x45\tF,0x46\tG,0x47\tH,0x48\tI,0x49\tJ,0x4A\tK,0x4B\tL,0x4C\tM,0x4D\tN,0x4E\tO,0x4F\tP,0x50\tQ,0x51\tR,0x52\tS,0x53\tT,0x54\tU,0x55\tV,0x56\tW,0x57\tX,0x58\tY,0x59\tZ,0x5A"; +substitutions = substitutions # "\ta,0x61\tb,0x62\tc,0x63\td,0x64\te,0x65\tf,0x66\tg,0x67\th,0x68\ti,0x69\tj,0x6A\tk,0x6B\tl,0x6C\tm,0x6D\tn,0x6E\to,0x6F\tp,0x70\tq,0x71\tr,0x72\ts,0x73\tt,0x74\tu,0x75\tv,0x76\tw,0x77\tx,0x78\ty,0x79\tz,0x7A"; +substitutions = substitutions # "\t0,0x30\t1,0x31\t2,0x32\t3,0x33\t4,0x34\t5,0x35\t6,0x36\t7,0x37\t8,0x38\t9,0x39\t ,0x20\t!,0x21\t\",0x22\t%,0x25\t&,0x26\t=,0x27\t(,0x28\t),0x29\t*,0x2A\t+,0x2B\t,,0x2C\t-,0x2D\t.,0x2E\t/,0x2F"; +substitutions = substitutions # "\tÄ,0x5B\tÖ,0x23\tÜ,0x24\tä,0x7B\tö,0x7C\tü,0x7D\tß,0x5F\t:,0x3A\t;,0x3B\t@,0x40\t>,0x3E"; + +string bufferLine; +string substEntry; +integer i; +string char; +string line; +string icon; + +string command = "0x02"; +foreach(bufferLine, msgBuffer) { + line = bufferLine.StrValueByIndex(splitter, 0); + icon = bufferLine.StrValueByIndex(splitter, 2); + if ((line <> "") || (icon <> "")) { + command = command # ",0x12"; + if ((line.Substr(0,2) == "0x") && (line.Length() == 4)) { + command = command # "," # line; + i = 12; + } + else { + i = 0; + } + while ((i < line.Length()) && (i < 12)) { + char = line.Substr(i, 1); + foreach(substEntry, substitutions){ + if (char == substEntry.Substr(0,1)){command = command # substEntry.Substr(1,5);} + } + i = i + 1; + } + command = command # ",0x11," # bufferLine.StrValueByIndex(splitter, 1); + if (icon <> "") { + command = command # ",0x13," # icon; + } + } + command = command # ",0x0A"; +} +command = command # ",0x03"; + +dom.GetObject("BidCos-RF." # dom.GetObject("$src$").Name().StrValueByIndex(".",1) # ".SUBMIT").State(command); + +! ##### FERTIG ##### diff --git "a/homematic/uebersicht_seriennummern_ger\303\244te.txt" "b/homematic/uebersicht_seriennummern_ger\303\244te.txt" new file mode 100644 index 0000000..a68713d --- /dev/null +++ "b/homematic/uebersicht_seriennummern_ger\303\244te.txt" @@ -0,0 +1,51 @@ +Name;Serial +Leistungsmesser;KEQ0967529 +Außentermometer;IEQ0404373 +G;LEQ1281842 +Bewegungsmelder;IEQ0403020 +Bewegungsmelder;IEQ0403115 +;MEQ0723481 +;MEQ0723536 +;MEQ1511239 + +Serial; +IEQ0022180;Rauchmelder +IEQ0073222;Zwischenstecker Schaltaktor Schwibbogen Esszimmer +IEQ0204812;mag. Fenstersensor Kellertür +IEQ0379540;Zwischenstecker Schaltaktor Schwibbogen 1 +IEQ0402876;Bewegungsmelder Susi Esszimmer +IEQ0403020;Bewegungsmelder Keller +IEQ0403115;Bewegungsmelder Flur Keller +IEQ0404373;Temperatursensor Außen +JEQ0036584;Schwibbogen Wohnzimmer Zwischenstecker +JEQ0036838;Lampe Esszimmer Zwischenstecker +JEQ0055766;Schwibbogen Küche Susi Zwischenstecker +KEQ0967529;Leistungsmesser Zwischenstecker +KEQ1063946;Keymatic +KEQ1064575; +LEQ1281842;Außenbewegungsmelder +MEQ0179649;Statusdisplay Haustür +MEQ0179654;Statusdisplay 2 +MEQ0593287 +MEQ0593353 +MEQ0593392 +MEQ0720337;opt. Fenstersensor Fenster Treppenhaus +MEQ0720388;opt. Fenstersensor Fenster Küche Susi Seite +MEQ0720393 +MEQ0720576;opt. Fenstersensor Terrassentür Marlies +MEQ0720579 +MEQ0720862;opt. Fenstersensor Susi Küche hinten +MEQ0723481;opt. Fenstersensor Terrassentür Esszimmer +MEQ0723536 +MEQ0723538 +MEQ0723615 +MEQ0753178;opt. Fenstersensor Küche Marlies +MEQ0753190;opt. Fenstersensor Fenster Wohnzimmer Terrasse Marlies +MEQ0753191 +MEQ0753192 +MEQ0755999;Schaltaktor Unterputz einfach Ambilight +MEQ1511239;Hutschienenaktor Hauslicht + +MEQ0460679;RF-LAN Gateway Wohnung +MEQ0461000;RF-LAN Gateway Marlies +MEQ0461672;CCU2 diff --git a/hostapd.txt b/hostapd.txt new file mode 100644 index 0000000..74bfffa --- /dev/null +++ b/hostapd.txt @@ -0,0 +1,4 @@ +###hostapd konfiguration testen +hostapd -dd /etc/hostapd/hostapd.conf +### + diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf new file mode 100644 index 0000000..f1c96a0 --- /dev/null +++ b/hostapd/hostapd.conf @@ -0,0 +1,74 @@ +# Nur fuer den Bridge-Betrieb, fuer AP auskommentieren +bridge=br0 + +# Schnittstelle und Treiber +interface=wlan0 +driver=iwl4965 + +# WLAN-Konfiguration +ssid=RaspberryAPi +channel=1 + +# ESSID sichtbar +ignore_broadcast_ssid=0 + +# Ländereinstellungen +country_code=DE +ieee80211d=1 + +# Übertragungsmodus +hw_mode=g + +# Optionale Einstellungen +# supported_rates=10 20 55 110 60 90 120 180 240 360 480 540 + +# Draft-N Modus aktivieren / optional nur für entsprechende Karten +ieee80211n=1 + +# wmm-Funktionalität (fuer draft-n) +wmm_enabled=1 + +# Übertragungsmodus / Bandbreite 40MHz / siehe iw list +# ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40] + +# Beacons +beacon_int=100 +dtim_period=2 + +# MAC-Authentifizierung +macaddr_acl=0 + +# max. Anzahl der Clients +max_num_sta=20 +# Größe der Datenpakete/Begrenzung +rts_threshold=2347 +fragm_threshold=2346 + +# hostapd Log Einstellungen +logger_syslog=-1 +logger_syslog_level=2 +logger_stdout=-1 +logger_stdout_level=2 + +# temporäre Konfigurationsdateien +dump_file=/tmp/hostapd.dump +ctrl_interface=/var/run/hostapd +ctrl_interface_group=0 + +# Authentifizierungsoptionen +auth_algs=3 + +# Verschlüsselung / hier rein WPA2 +wpa=2 +rsn_preauth=1 +rsn_preauth_interfaces=wlan0 +wpa_key_mgmt=WPA-PSK +rsn_pairwise=CCMP + +# Schlüsselintervalle / Standardkonfiguration +wpa_group_rekey=600 +wpa_ptk_rekey=600 +wpa_gmk_rekey=86400 + +# Zugangsschlüssel (PSK) / hier in Klartext (ASCII) +wpa_passphrase=SicheresWLANpa$$w0r7!! diff --git a/hostapd/instant_AP.sh b/hostapd/instant_AP.sh new file mode 100644 index 0000000..f3d1742 --- /dev/null +++ b/hostapd/instant_AP.sh @@ -0,0 +1,348 @@ +#!/bin/bash +## Instant WLAN Access-Point +## elektronenblitz63 ubuntuusers.de 2012 +## published under GPL v3 +## +## Version 1.6.0 vom 31.Januar 2012 +# Bridged-Modus möglich +# kleinere Fehler beseitigt +# Ausgaben verbessert +# +## Version 1.5.2 vom 12.November 2011 +# voreingestellte freie DNS geändert +# Restart des Network-Managers erst bei -stop +# entferne iptables-Filter bei -stop +## +## Beispielkonfiguration der dnsmasq.conf +## +# # DHCP-Server dnsmasq aktiv für Interface +# +# interface=wlan0 + +## DHCP-Server dnsmasq nicht aktiv für Interface +# +# no-dhcp-interface=eth0 + +# # IP-Adressbereich / Lease-Time +# dhcp-range=192.168.3.20,192.168.3.25,infinite +# +## Ende Beispielkonfiguration dnsmasq.conf + +## freie Variablen + +## Konfiguration der Ethernet-Schnittstelle +## LAN statisch (Standard ist automatisch über DHCP) / Startoption [-f] +laniface=eth0 +laddress=192.168.178.6 +lbroadcast=192.168.178.255 +lnetmask=255.255.255.0 +lgateway=192.168.178.1 +lmacaddress=00:12:79:c0:49:ae +# +## Konfiguration der WLAN-Schnittstelle +## WLAN statisch +wlaniface=wlan0 +waddress=192.168.3.1 +wbroadcast=192.168.3.255 +wnetmask=255.255.255.0 +iptablemask=192.168.0.0/24 + +### manuelle DNS (drei DNS Einträge, 1xDomain und 1xSearch sind möglich) +# Beispiel +# dns="nameserver 192.168.178.1 nameserver 192.168.178.1 nameserver 192.168.178.1 domain fritz.box search fritz.box" +dns="nameserver 8.8.4.4 nameserver 8.8.8.8 nameserver 213.73.91.35" + +## dnsmasq-base Konfiguration +# DHCP-Adresspool umfasst x-Adressen +ipaddresses=10 + +# Basisadresse DHCP-Adresspool (WLAN-IP + X) +wlanbaseip=1 + +# Lease-Time +leasetime=infinite + +## MAC-Adresse (optional) (Startoption [-m]) +lmacaddress=00:12:79:c0:49:ae + +## Pause vor LAN-Verbindungstest +pause=4 + +## Proxyserver (squid) +proxy="squid" + +## Proxy Server auf Port x (squid 3128 / tinyproxy 3128 / polipo 8123) +proxyport=3128 + +## Bridge-Konfiguration +## vor Ubuntu 11.x - /usr/sbin/brctl +## ab Ubuntu 11.x - /sbin/brctl +br_util=/sbin/brctl +bridge0=br0 +brdelay=5 +brstp=0 + +## Steuerung Dienste +## alt +# hostapdrestart="/etc/init.d/hostapd" +## neu +hostapdservice="service hostapd" + +## Ende freie Variablen +## +# Skript +# +pingout="" + +## aut. Adressberechnung DHCP-Range für dnsmasq +## gemäß Vorgabe WLAN-Schnittstelle +ipaddresses=$[$ipaddresses+$wlanbaseip] + baseendaddr="`echo $waddress | tr -s . " " | awk {'print $4'}`" + basestartaddr="`echo $waddress | tr -s . " " | awk {'print $1,$2,$3'} | tr -s " " .`" + endaddr="$basestartaddr""."$[$startaddr+$ipaddresses] + startaddr="$basestartaddr""."$[$baseendaddr+$wlanbaseip] + +pingout="" +A=1 +B=0 +D=0 +P=0 +Br=0 + +if [ "$1" = "-h" ]; then +echo Verwendung: instant_AP.sh [-start] [-restart] [-stop] [-D] [-d] [-f] [-m] [-h] [-B] +echo Syntax: +echo "sudo ./instant_AP.sh wie [-d] startet mit Standardparametern (DHCP)" +echo "sudo ./instant_AP.sh -f statische LAN-Konfiguration" +echo "sudo ./instant_AP.sh -f -m statische LAN-Konfiguration, MAC-Änderung" +echo "sudo ./instant_AP.sh -D verwendet dnsmasq.conf und nicht dnsmasq-base" +echo "sudo ./instant_AP.sh -start -f statische LAN-Konfiguration" +echo "sudo ./instant_AP.sh -restart -f statische LAN-Konfiguration" +echo "sudo ./instant_AP.sh -B Bridged-Modus ohne DHCP-Server. Dynamische und Statische Schnittstellenparameter werden ignoriert" +echo "sudo ./instant_AP.sh -stop beendet den AP" +echo "Ende" + exit +fi + +while getopts ":DdfmhPB" OPTION ; do + case $OPTION in + D) echo "vewende dnsmasq.conf und nicht dnsmasq-base"; D=1;; + d) echo "konfiguriere LAN über DHCP"; A=1;; + f) echo "konfiguriere LAN statisch"; A=2;; + m) echo "MAC-Change LAN ein"; B=1;; + P) echo "Portumleitung für Proxy-Server Port" $proxyport "aktiviert"; P=1;; + B) echo "Bridge-Modus aktiviert"; Br=1;; + esac + done + +echo "starte gewählte Konfiguration ..." + sleep 2 + +if [ "$Br" = "1" ]; then A=3 + echo "Bridge-Mode aktiviert - Sonstige Parameter für Schnittstelleneinstellungen werden ignoriert" + fi + +if [ "$1" != "-start" ]; then + echo "stoppe alle Dienste, und Verbindungen, lösche Itables-Filter ..." + +# Konfiguration löschen +/sbin/iptables -F + /sbin/iptables -X + /sbin/iptables -t nat -F + +defgw="`route -n | grep UG | awk {'print $2'}`" + /sbin/route del default gw $defgw $laniface + echo '' | tee /etc/resolv.conf + +$hostapdservice stop + /sbin/ifconfig $wlaniface down + sleep 1 + /sbin/iwconfig $wlaniface mode managed + sleep 1 + /sbin/ifconfig $laniface down + sleep 1 + /usr/bin/killall dnsmasq + /sbin/sysctl -w net.ipv4.ip_forward=0 + /sbin/modprobe -rfv iptable_nat ipt_MASQUERADE xt_conntrack iptable_filter + +## Bridge löschen +/sbin/ifconfig $bridge0 down + sleep 1 + $br_util delif $bridge0 $laniface + $br_util delif $bridge0 $wlaniface + $br_util delbr $bridge0 + +if [ "$1" = "-stop" ]; then + echo + echo "reaktiviere Network-Manager." + service network-manager start + service network-manager restart +echo "WLAN Access-Point Konfiguration beendet." + exit + fi + fi + +## MAC-Adresse abgleichen +if [ "$B" = "1" ]; then + currentmac="`ifconfig $laniface | grep Adresse | awk {'print $6'}`" + echo Schnittstelle $laniface, MAC-Adresse: $currentmac + echo Vorgabe: $lmacaddress + + if [ "$currentmac" = "$lmacaddress" ]; then + echo Übereinstimmende MAC-Adresse +else + /sbin/ifconfig $laniface down + /sbin/ip link set dev $laniface addr $lmacaddress + +currentmac="`ifconfig $laniface | grep Adresse | awk {'print $6'}`" + echo versuche MAC-Adresse zu ändern ... + echo Schnittstelle $laniface, MAC-Adresse: $currentmac + +if [ "$currentmac" = "$lmacaddress" ]; then + echo Änderung der MAC-Adresse erfolgreich! + else + echo Änderung der MAC-Adresse nicht erfolgreich! +echo fahre fort ... +fi + fi + fi + +# Grundkonfiguration +echo beende Network-Manager + service network-manager stop + echo "starte alle Dienste, und Verbindungen ..." + +# LAN aut.m über DHCP nur wenn kein Bridged-Mode gewählt +if [ "$Br" = "0" ] & [ "$A" = "1" ]; then + echo "starte automatische LAN-Verbindung ..." + /sbin/dhclient $laniface +fi + +# LAN statisch nur wenn kein Bridged-Mode gewählt +if [ "$Br" = "0" ] & [ "$A" = "2" ]; then + echo "starte statische LAN-konfiguration ..." + /sbin/ifconfig $laniface down + sleep 2 + /sbin/ifconfig $laniface $laddress broadcast $lbroadcast netmask $lnetmask + sleep 2 + echo + +echo setze Gateway und Route ... + /sbin/route add default gw $lgateway $laniface + sleep 1 + echo + +echo setze DNS +echo '# erzeugt durch instant_AdHoc.sh' | tee /etc/resolv.conf + echo $dns | awk {'print $1,$2'} | tee -a /etc/resolv.conf + echo $dns | awk {'print $3,$4'} | tee -a /etc/resolv.conf + echo $dns | awk {'print $5,$6'} | tee -a /etc/resolv.conf + echo $dns | awk {'print $7,$8'} | tee -a /etc/resolv.conf + echo $dns | awk {'print $9,$10'} | tee -a /etc/resolv.conf + fi + sleep $pause + +## Vorbereitung Bridge +if [ "$Br" = "1" ]; then + +## vorhandene Schnittstellenkonfiguration löschen +/sbin/ifconfig $wlaniface down + sleep 1 + /sbin/ifconfig $wlaniface up + sleep 1 + /sbin/ifconfig $wlaniface 0.0.0.0 + sleep 1 + /sbin/ifconfig $laniface down + sleep 1 + /sbin/ifconfig $laniface up + sleep 1 + +## Bridge anlegen + $br_util addbr $bridge0 + $br_util addif $bridge0 $laniface + $br_util stp $bridge0 $brstp + $br_util setfd $bridge0 $brdelay + sleep 2 + +## Dienste steuern +service dnsmasq stop + echo "fordere IP-Adresse für Bridge an ..." + /sbin/dhclient $bridge0 + $hostapdservice restart + $br_util addif $bridge0 $wlaniface +else + +## ohne Bridge-Mode +## WLAN-Schnittstelle statisch konfigurieren +echo "WLAN-Schnittstelle initialisieren ..." + /sbin/ifconfig $laniface up + sleep 1 + /sbin/ifconfig $wlaniface $waddress broadcast $wbroadcast netmask $wnetmask + $hostapdservice restart + echo +echo "starte IP-Forward, Masquerading und NAT" +/sbin/iptables -A FORWARD -o $laniface -i $wlaniface -s $iptablemask -m conntrack --ctstate NEW -j ACCEPT + /sbin/iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT + /sbin/iptables -t nat -A POSTROUTING -o $laniface -j MASQUERADE + /sbin/sysctl -w net.ipv4.ip_forward=1 +fi + +## dnsmasq-base starten +echo + echo starte dnsmasq-base +if [ "$D" = "0" ]; then + echo DHCP-Range dnsmasq-base - Startadresse: $startaddr Endadresse: $endaddr + /usr/sbin/dnsmasq -i $wlaniface -I $laniface -F $startaddr,$endaddr,$leasetime + echo +else + +## dnsmasq neu starten +echo "verwende dnsmasq.conf" + /etc/init.d/dnsmasq restart + echo fertig ... +fi + +## Portumleitung für Squid Proxyserver +if [ "$P" = "1" ]; then + /sbin/iptables -t nat -A PREROUTING -i $wlaniface -p tcp --dport 80 -j REDIRECT --to-port $proxyport + +## optional Port 443 HTTPS +# /sbin/iptables -t nat -A PREROUTING -i $wlaniface -p tcp --dport 443 -j REDIRECT --to-port $proxyport + + echo "Port 80 (HTTP) " $wlaniface "auf Port $proxyport umgeleitet ("$proxy "Proxyserver)" + echo "Starte" $proxy "Proxyserver ..." + sleep 2 + +if [ "$proxy" != "squid" ]; then + /etc/init.d/$proxy restart + else + service squid start -n + fi +fi + +## Ausgabe der aktuellen Konfiguration + echo "DNS-Konfiguration" + cat /etc/resolv.conf + echo + /sbin/route -n + echo + +if [ "$Br" = "1" ]; then + echo "Konfiguration Bridge:" + $br_util show + echo + /sbin/ifconfig $bridge0 | egrep 'Link|inet Adresse' + echo +fi + echo "Konfiguration LAN:" + /sbin/ifconfig $laniface | egrep 'Link|inet Adresse' + echo + echo "Konfiguration WLAN:" + /sbin/ifconfig $wlaniface | egrep 'Link|inet Adresse' + echo + /sbin/iwconfig $wlaniface | egrep 'IEEE|Power|Mode' + echo + /sbin/iwconfig mon.$wlaniface + +exit 0 + diff --git a/htc_touch_hd.txt b/htc_touch_hd.txt new file mode 100644 index 0000000..968790c --- /dev/null +++ b/htc_touch_hd.txt @@ -0,0 +1,46 @@ +###font cache vergrößern / Increase font cache +To increase the font cache, speeding up font rendering at the cost of a bit of memory: +HKLM\SYSTEM\GDI\GLYPHCACHE\limit = 16384 (DWORD decimal) +To change it back to the default: +HKLM\SYSTEM\GDI\GLYPHCACHE\limit = 8192 (DWORD decimal) +You can set the value to pretty much anything you like +###filesystem cache / Enable FileSystem cache +To enable the FileSystem cache, speeding up overall performance at the risk of the cache not being written on a sudden reset: +HKLM\System\StorageManager\FATFS\EnableCache = 1 (DWORD decimal) +To disable again: +HKLM\System\StorageManager\FATFS\EnableCache = 0 (DWORD decimal) +Note that by default, the cache size is zero, and you will see no effect. See "Increase FileSystem cache" to incease the cache size +Increase FileSystem cache +To increase the file system cache: +HKLM\System\StorageManager\FATFS\CacheSize = 4096 (DWORD decimal) +To return the file system cache to zero: +HKLM\System\StorageManager\FATFS\CacheSize = 0 (DWORD decimal) +You can set the value to pretty much anything you like +###filesystem filter cache / Increase FileSystem filter cache +To enable the file system filter cache, speeding up overall performance with file mangement: +HKLM\System\StorageManager\Filters\fsreplxfilt\Rep lStoreCacheSize = 4096 (DWORD decimal) +To return the file system filter cache to zero: +HKLM\System\StorageManager\Filters\fsreplxfilt\Rep lStoreCacheSize = 0 (DWORD decimal) +You can set the value to pretty much anything you like +###Kameramodien hinzufügen +###Burst +Mobile Device\HKEY_LOCAL_MACHINE\Software\HTC\Camera\P6 +set "Enable" on "1" +###Sports +Mobile Device\HKEY_LOCAL_MACHINE\Software\HTC\Camera\P8 +set "Enable" on "1" +###Video Share +Mobile Device\HKEY_LOCAL_MACHINE\Software\HTC\Camera\P9 +set "Enable" on "1" +###GPS Photo +Mobile Device\HKEY_LOCAL_MACHINE\Software\HTC\Camera\P10 +set "Enable" on "1" +###vier spalten in Programme und Settings +HKLM\Software\Microsoft\Shell\IconConfig\HorizontalIconSpacing = 112 (DWORD Decimal) +HKLM\Software\Microsoft\Shell\IconConfig\VerticalIconSpacing = 115 (DWORD Decimal) +HKLM\Software\Microsoft\Shell\IconConfig\IconTitleFontSize = 6 (DWORD Decimal) +###hardreset / hard reset +VOLUME UP und VOLUME DOWN drücken und power -> VOLUME UP und VOLUME DOWN gedrückt halten -> DISPLAY HR -> VU+VD loslassen, VU drücken -> HR +###Alben in TouchFlow +Verzeichnis mit Musik einfach auf Speicherkarte +Bild mit in dem Verzeichnis als folder.jpg speichern (max. größe 1024x768) diff --git a/hwinfo.txt b/hwinfo.txt new file mode 100644 index 0000000..814cc03 --- /dev/null +++ b/hwinfo.txt @@ -0,0 +1,2 @@ +###Vesa Modien der Graka rausfinden +hwinfo --framebuffer diff --git a/hybrid.txt b/hybrid.txt new file mode 100644 index 0000000..117e8ac --- /dev/null +++ b/hybrid.txt @@ -0,0 +1,4 @@ +###Einrichtung fritz.box hinter hybrid so das es funktionieren sollte +http://blog.qyz.de/index.php?/archives/1-FRITZ!Box-hinter-Speedport-Hybrid-fuer-Telefonie-Telekom-ALL-IP-nutzen.html +###algemeine infos +https://telekomhilft.telekom.de/t5/Telefonie-Internet/Fritzbox-hinter-dem-SP-Hybrid-Erfahrungen/td-p/1307741/page/216 diff --git a/ic.txt b/ic.txt new file mode 100644 index 0000000..c982d60 --- /dev/null +++ b/ic.txt @@ -0,0 +1,7 @@ +DL 020 D = 74 LS 20 = Dual 4-Input NAND Gate +DL 030 D = 74 LS 30 = 8-Input NAND Gate +DL 257 D = 74 LS 257 = 3-STATE Quad 2-Data Selectors/Multiplexers + + + +Schieberegister 74xx595, 74xx165 diff --git a/iceland.txt b/iceland.txt new file mode 100644 index 0000000..a9578cf --- /dev/null +++ b/iceland.txt @@ -0,0 +1,16 @@ +###Fahrplätze +bei der Autobahn, bei Röhrsdorf in Richtung Hof + +###ersatzteile +Ersatzteile sind die gleichen wie beim Rex-X (außer Querlenker) +###sprit +Ich bleibe bei 16% Reicht vollkommen. Alles höhere belastet nur unnötig den Motor +###Kerzen +Du benötigst eine Kerze mit kurzem Gewinde +###Leerlaufgemisch einstellen +Die Leerlaufgemisch-Schraube befindet sich unter der Stange, welche Vergaser mir Servo verbindet. +###Wasserdichtigkeit der Servos und Empfänger +"Wet Protect" von Graupner einsprühen +### +Lager für die Kupplung: 8x5x2,5 -> 4 Stück ohne Flansch oder 2 mit Flansch +### diff --git a/icinga.txt b/icinga.txt new file mode 100644 index 0000000..2deb3da --- /dev/null +++ b/icinga.txt @@ -0,0 +1,13 @@ +###Befehle Versenden mittels Weboberfläche geht nicht +service icinga stop +dpkg-statoverride --update --add nagios nagios 751 /var/lib/icinga/ +dpkg-statoverride --update --add nagios www-data 2710 /var/lib/icinga/rw/ +service icinga start +### DISK CRITICAL - /home/name/.gvfs is not accessible beheben +#in /etc/nagios-plugins/config/disk.cfg folgendes bei check_disk und check_all_disks hinzufügen +-A -i '.gvfs' +# 'check_disk' command definition +define command{ + command_name check_disk + command_line /usr/lib/nagios/plugins/check_disk -w '$ARG1$' -c '$ARG2$' -p '$ARG3$' -A -i '.gvfs' + } diff --git a/icmp.txt b/icmp.txt new file mode 100644 index 0000000..dbb3736 --- /dev/null +++ b/icmp.txt @@ -0,0 +1,38 @@ +###ICMP Typen +Typ | Mitteilung | Familie | RFC +----+-------------------------+-----------------+----- + 0 | Echo Reply | Query (Reply) | 792 + 3 | Destination unreachable | Error | 1122 + 4 | Source Quench | Error | 792 + 5 | Redirect | Error | 792 + 8 | Echo Request | Query (Request) | 792 + 9 | Router Advertisement | Query (Reply) | 1256 + 10 | Router Soliciation | Query (Request) | 1256 + 11 | Timer Exceeded | Error | 1122 + 12 | Parameter Problem | Error | 792 + 13 | Timestamp Request | Query (Request) | 792 + 14 | Timestamp Reply | Query (Reply) | 792 + 17 | Address Mask Request | Query (Request) | 950 + 18 | Address Mask Reply | Query (Reply) | 950 +###Message Code +Code | Bedeutung +-----+----------------------- + 0 | Network Unreachable + 1 | Host Unreachable + 2 | Protocol Unreachable + 3 | Port Unreachable + 4 | Fragmentation required but DF Bit is Set + 5 | Source Route Failed + 6 | Destination Network Unknown + 7 | Destination Host Unknown + 8 | Source Host Isolated (obsolete) + 9 | Destination Network Administratively Prohibited (obsolete) + 10 | Destination Host Administratively Prohibited (obsolete) + 11 | Destination Network Unreachable for Type-of-Service + 12 | Destination Host Unreachable for Type-of-Service + 13 | Communication Administratively Pohibited + 14 | Host Precedence Violation + 15 | Precedence Cutoff in Effect +###ping ipv6 mtu=1336 keine Fragmentierung erlauben 4 pings +ping6 -M do -s 1336 -c 4 www.t-online.de + diff --git a/imap.txt b/imap.txt new file mode 100644 index 0000000..c92f69b --- /dev/null +++ b/imap.txt @@ -0,0 +1,48 @@ +###imap Sitzung +S: * OK IMAP4rev1 Service Ready +C: a001 login mrc secret +S: a001 OK LOGIN completed +C: a002 select inbox +S: * 18 EXISTS +S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) +S: * 2 RECENT +S: * OK [UNSEEN 17] Message 17 is the first unseen message +S: * OK [UIDVALIDITY 3857529045] UIDs valid +S: a002 OK [READ-WRITE] SELECT completed +C: a003 fetch 12 full +S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" + RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" + "IMAP4rev1 WG mtg summary and minutes" + (("Terry Gray" NIL "gray" "cac.washington.edu")) + (("Terry Gray" NIL "gray" "cac.washington.edu")) + (("Terry Gray" NIL "gray" "cac.washington.edu")) + ((NIL NIL "imap" "cac.washington.edu")) + ((NIL NIL "minutes" "CNRI.Reston.VA.US") + ("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL + "") + BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028 + 92)) +S: a003 OK FETCH completed +C: a004 fetch 12 body[header] +S: * 12 FETCH (BODY[HEADER] {342} +S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT) +S: From: Terry Gray +S: Subject: IMAP4rev1 WG mtg summary and minutes +S: To: imap@cac.washington.edu +S: cc: minutes@CNRI.Reston.VA.US, John Klensin +S: Message-Id: +S: MIME-Version: 1.0 +S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII +S: +S: ) +S: a004 OK FETCH completed +C: a005 store 12 +flags \deleted +S: * 12 FETCH (FLAGS (\Seen \Deleted)) +S: a005 OK +FLAGS completed +C: a006 logout +S: * BYE IMAP4rev1 server terminating connection +S: a006 OK LOGOUT completed +###auth umschalten +###login +a login user pass/hash +### diff --git a/infos.txt b/infos.txt new file mode 100644 index 0000000..ce6b5c7 --- /dev/null +++ b/infos.txt @@ -0,0 +1,9 @@ +###ports die listen sind +lsof -i -P |awk '/LISTEN/ {print $1"/"$3"/"$8}' | sort -u + +###aufgebaute verbindungen +lsof -i -P |awk '/ESTABLISHED/ {print $1"/"$3"/"$8}' | sort -u + +###überwachung mit watch +#alle 5 sekunden wird uptime gemacht +watch -n 5 uptime postel diff --git a/initrd.txt b/initrd.txt new file mode 100644 index 0000000..2561660 --- /dev/null +++ b/initrd.txt @@ -0,0 +1,6 @@ +###module in initrd hinzufügen +vi /etc/sysconfig/kernel +bei INITRD_MODULES hinzufügen und dann mkinitrd rufen +###bootsplash auflösung ändern in initrd +mkinitrd -s 1024x768 + diff --git a/iodine.txt b/iodine.txt new file mode 100644 index 0000000..5f5dfcd --- /dev/null +++ b/iodine.txt @@ -0,0 +1,5 @@ +###Tunneling Traffic via DNS +###on server +./iodined -fP test 10.0.0.1 test.asdf +###on client +./iodine -fP test 192.168.0.1 test.asdf diff --git a/iodine/iodine_start_on_laptop.sh b/iodine/iodine_start_on_laptop.sh new file mode 100644 index 0000000..fa3f33b --- /dev/null +++ b/iodine/iodine_start_on_laptop.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# are we root? +if ! [ $UID == 0 ] ; then + echo "IODINE SETUP: use 'sudo $0'"; + exit 0; +fi; + +#$1 says whether we use clearcode or stoynov.com +if [ -z $1 ] ; then + echo 'IODINE SETUP: first param must be 1(i.clearcode.org) or 2(i.stoynov.com)'; + exit 0; +fi; + +if [ $1 == 1 ] ; then + endpoint_domain='i.clearcode.org' + endpoint_net='192.168.14.0/24' + endpoint_gw='192.168.14.1' +fi; + +if [ $1 == 2 ] ; then + endpoint_domain='j.stoynov.com' + endpoint_net='192.168.15.0/24' + endpoint_gw='192.168.15.1' +fi; + +# get the first dns from resolv.conf and use it. +abused_nameserver=`cat /etc/resolv.conf | grep nameserver | head -1 | awk '{print $2}'` +abused_nameserver=8.8.4.4 +echo ">>>>>>>>>>>>>>>>>>>USING DNS: $abused_nameserver" + +# kill iodine if any and remove old routes +killall iodine +route delete 8.8.8.8 > /dev/null +route delete 8.8.4.4 > /dev/null + +# get the default gateway for iodine +default_gateway=`netstat -rn | grep default | awk '{print $2}'` + +#when I die, restore the default gateway, use trap to get Ctrl+C +function disconnect() { + # kill the process with id coming as a parameter + kill -9 $1; + route add default $default_gateway; +} +#disconnect and exit +function cleanup() { + disconnect $(pgrep iodine); + exit 0; +} +trap "cleanup" SIGINT + +#dns query types +dns_query_types="TXT CNAME NULL" + +function connect() { + # start iodine (possible dns types are CNAME, TXT, NULL), -F puts a pid file with the processId inside + iodine_output=$(./iodine -T CNAME -r -P "peshev sucks" -F /var/run/iodine.pid $abused_nameserver $endpoint_domain 2>&1 | tee /dev/tty) + + #remote_net from iodine_output + remote_net=$(echo $iodine_output | grep -o "Adding route [0-9\.]*/[0-9]\{1,2\} to [0-9\.]*" | awk '{print $3}') + + #remote_net is something like 192.168.15.2/27 and should be 192.168.15.0/27 + remote_net=$(./ipcalc -nb $remote_net | grep Network | awk '{ print $2}') + + #tunX_ip (tunX_ip) from iodine_output + tunX_ip=$(echo $iodine_output | grep -o "Adding route [0-9\.]*/[0-9]\{1,2\} to [0-9\.]*" | awk '{print $5}') + + #remote_gateway (gateway on iodine) from iodine_output + remote_gateway=$(echo $iodine_output | grep -o "Server tunnel IP is [0-9\.]*" | awk '{print $5}') + + # route to nameserver to be abused + route add -host $abused_nameserver $default_gateway + # route to remote network via tunX_ip (necessary because my mac sucks) + route add -net $remote_net $tunX_ip + # change default gateway from system default to iodine + route delete default + route add default $remote_gateway + + # time to download 100kb file in seconds (1.34). We remove the dot for easy comparison (1.34 -> 134) + echo TESTING SPEED; + t=$( { time -p curl -s ftp://speedtest:speedtest@ftp.otenet.gr/test100k.db; } 2>&1 ) + seconds=$(echo $t | awk '{ print $2;}' | tr -d . ); + echo SECONDS: $seconds; +} +connect; + +echo 'READY...READY...READY...READY...READY...' + +while true; do sleep 10000; done; diff --git a/iodine/iodine_start_openwrt_as_server.sh b/iodine/iodine_start_openwrt_as_server.sh new file mode 100644 index 0000000..466ff42 --- /dev/null +++ b/iodine/iodine_start_openwrt_as_server.sh @@ -0,0 +1,25 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006-2011 OpenWrt.org + +START=50 + +start_instance () { +local section="$1" +config_get address "$section" 'address' +config_get password "$section" 'password' +config_get tunnelip "$section" 'tunnelip' +config_get tld "$section" 'tld' + +service_start /usr/sbin/iodined -l "$address" -c -s -P "$password" $tunnelip "$tld" & +sleep 1 +ifconfig dns0 $tunnelip netmask 255.255.255.0 +} + +start() { +config_load 'iodined' +config_foreach start_instance 'iodined' +} + +stop() { +service_stop /usr/sbin/iodined +} diff --git a/ip.txt b/ip.txt new file mode 100644 index 0000000..fc5fbd9 --- /dev/null +++ b/ip.txt @@ -0,0 +1,85 @@ +###IPv6 test im Internet +http://test-ipv6.com/ +###ipv6 ausschalten +echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 +###ipv6 dauerhaft ausschalten +echo "net.ipv6.conf.all.disable_ipv6 = 1" > /etc/sysctl.d/01-disable-ipv6.conf +###route adden +ip route add table local broadcast 10.107.0.0 dev wlan0 proto kernel scope link src 192.168.210.79 +ip route add 10.107.1.55 via 192.168.210.1 src 192.168.210.79 +###ip addr show / anzeigen interfaces mit dazugehörigen ip´s +ip addr show +###alle routen anzeigen +ip addr show +###ip adressen setzen auf ein interface und dann anzeigen +ip addr add 10.8.1.10/24 broadcast 10.8.1.255 dev eth0 +ip addr add 10.8.2.10/24 broadcast 10.8.2.255 dev eth0 +ip addr add 10.1.2.3/24 dev eth0 +ip addr show eth0 +###routing policy database (rpdb) anzeigen +ip rule show +###SourceRouting + #SourceRouting Tabelle erstellen + echo 100 SourceRouting >> /etc/iproute2/rt_tables + #ip 192.168.100.100 eintragen + ip rule add from 192.168.100.100 table SourceRouting + #zur sicherheit noch mal anschauen + ip rule show + #hier das routing für die in SourceRouting Tabelle stehende eintragen + ip route add default via 192.168.1.254 dev eth0 table SourceRouting +###Generelle 2-Wege-Routen, multipath route + #routing über 2 verschieden Provider + #Provider 1 132.230.129.1 + #Provider 2 80.168.20.125 + #Routing Tabellen Route1 und Route2 anlegen + echo 100 Route1 >> /etc/iproute2/rt_tables + echo 100 Route2 >> /etc/iproute2/rt_tables + #jetzt die einzelnen netze oder ip über die routen + ip route add 132.230.129.0/28 dev eth0 src 132.230.129.1 table Route1 + ip route add default via 132.230.129.15 table Route1 + ip route add 80.168.20.0/25 dev eth1 src 80.168.20.125 table Route2 + ip route add default via 80.168.20.126 table Route2 + #die routing rules legen fest, welche Tabelle für welche IP herangezogen wird + ip rule add from 132.230.129.1 table Route1 + ip rule add from 80.168.20.125 table Route2 + #Main Routing Tabelle für das lokale Routing in beide Netzwerke konfigurieren + ip route add 132.230.129.0/28 dev eth1 src 132.230.129.1 + ip route add 80.168.20.0/25 dev eth2 src 80.168.20.125 + #default route für "main" Routing Table setzen, weight 1 ist die Verteilung - hier gleichmäßig + ip route add default scope global nexthop via 132.230.129.14 dev eth1 weight 1 nexthop via 80.168.20.126 dev eth2 weight 1 + #so kann man es machen, wenn man es als backup route machen will + #erst mal alle routen löschen + ip -4 addr flush label "eth0" + #default setzen (kernel nimmt immer die route mit der kleinsten metric) + ip route add default via 132.230.129.14 dev eth0 metric 1 + #falls oben nicht geht, dann nimm die + ip route add default via 80.168.20.126 dev eth0 metric 5 +###multipath route last verteilen auf zwei interface +ip route add default scope global nexthop dev ppp0 nexthop dev ppp1 +###dienste basiertes routing (hier ssh) + #ssh pakete markieren mit 1 + iptables -A OUTPUT -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-Mark 1 + #ssh routing Tabelle erstellen + echo 200 ssh >> /etc/iproute2/rt_tables + #fw Markierung eintragen in Tabelle + ip rule add fwmark 1 table ssh + #wo die ssh packete langeschickt werden sollen + ip route add default via 192.168.1.254 dev eth0 table ssh +###tabelle local anzeigen +ip route show table local +###alle anzeigen +ip route show table all +###alle gecachten routen anzeigen +ip route show cache all +###nat einer ip +ip route add nat 205.254.211.17 via 192.168.100.17 +###nat eines teil netzes +ip route add nat 205.254.211.32/29 via 192.168.100.32 +###löschen einer route +ip route del 10.38.0.0/16 via 192.168.100.1 dev eth3 +###ändern defaul route +ip route change default via 192.168.99.113 dev eth0 +###alle aus tabelle main löschen +ip route flush table main +###alle 10.38er routen löschen +ip route flush 10.38.0.0/16 diff --git a/iphone.txt b/iphone.txt new file mode 100644 index 0000000..fd6fce0 --- /dev/null +++ b/iphone.txt @@ -0,0 +1,2 @@ +###netzmonitor einschalten +*3001#12345#* diff --git a/iw.txt b/iw.txt new file mode 100644 index 0000000..5bce699 --- /dev/null +++ b/iw.txt @@ -0,0 +1,21 @@ +###was passiert auf den wlan0-1 interface gerade +iw dev wlan0-1 station dump +###statistik für station mit mac +iw dev wlan1 station get +###monitor interface erstellen +iw dev wlan0 interface add fish0 type monitor flags none +###delete / löschen eines interfaces +iw dev fish0 del +###regulator domain ändern +#alpha2 ist der countrycode +#bei FR sind 20dBm möglich +#bei US sind 27dBm möglich, erlaubt sind bis 1 Watt in den USA +#erst FR dann US sonst geht 27dBm nicht! +iw reg set alpha2 +###txpower Sendeleistung ändern +iw dev wlan0 set txpower fixed 2000 +###scannen +iw dev wlan0 scan +###bei events was anzeigen +iw event +### diff --git a/java.txt b/java.txt new file mode 100644 index 0000000..9e1a896 --- /dev/null +++ b/java.txt @@ -0,0 +1,27 @@ +###Paketieren mir jar +jar cvfe firststeps.jar de.kompf.tutor.Hello -C bin . +###remote debug mit eclipse +Um die VM ordnungsgemäß im Debug-Modus zu starten, benötigen wir 4 Parameter: + +Parameter Bedeutung/Funktion/Zweck +-Xdebug Startet in Debugging-Modus +-Xnoagent Deaktiviert den Support fürm Old Jave Debugger (oldjdb) +-Djava.compiler=NONE "-D" setzt verschiedene Parameter. java.compiler=NONE bedeutet, dass der JIT-Compiler deaktiviert wird. +-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6754 "-Xrunjdwp" setzt die eigendlichen Debugging-Parameter. transport liegt die Verbindungsart fest. server sagt, dass er als Server auf Verbindungen warten soll. suspend sagt, dass er mit der Ausführung warten soll, bis ein Debugger verbindet. (In diesen Fall soll er NICHT warten.) address legt den Port fest, auf dem auf eine Verbindung gewartet werden soll. + +Bsp.: +java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6754 -jar rdbdemo.jar + +Nun müssen wir als Erstes die Debug-Konfiguration in Eclipse öffnen: + +Hier Doppelklick auf "Remote Java Application": + +Daraufhin legt Eclipse automatisch eine Konfiguration für das momentan ausgewählte Projekt an. Hier müssen nur noch wenige Einstellungen getroffen werden. Wir müssen lediglich den Hostname/IP des Hosts, auf dem die Anwendung im Debug-Modus läuft und den Port anpassen. + +Nun können wir unsere eingerichtete Konfiguration starten: + +Damit lässt sich die Anwendung remote genauso wie lokal debuggen. Inkl. Threads pausieren, Breakpoints, Variablenzugriff, zeilenweises abarbeiten und was es sonst noch so alles gibt. + +### +###tempdir, temporäres Verzeichnis +System.getProperty("java.io.tmpdir") diff --git a/jeelink.txt b/jeelink.txt new file mode 100644 index 0000000..3e43dc4 --- /dev/null +++ b/jeelink.txt @@ -0,0 +1,27 @@ +###data rate 8.842 kbps +2r +###version ausgeben +v +###m bestimmt welche data rates der toggle mod verwendet (default 3), m ist bitcodiert +1: 17.241 kbps +2: 9.579 kbps +4: 8.842 kbps +3m -> wechselt zwischen 17.241 kbps und 9.579 kbps +5m -> wechselt zwischen 17.241 kbps und 8.842 kbps +7m -> wechselt zwischen allen drei data rates +###commands +a - activity LED (0=off, 1=on)" "\n" +c - TX data rate (0: 17.241 kbps, 1: 9.579 kbps, 2: 8.842 kbps)" "\n" +d - DEBUG mode (0=suppress TX and bad packets)" "\n" +h - height above sea level (m)" "\n" +f - frequency (5 kHz steps e.g. 868315)" "\n" +m - toggle mode (1: 17.241 kbps, 2: 9.579 kbps, 4: 8.842 kbps)" "\n" +p - show raw payload data (0=off, 1=on, 2=only undecoded)" "\n" +r - data rate (0: 17.241 kbps, 1: 9.579 kbps, 2: 8.842 kbps)" "\n" +s - send the bytes ti the address id" "\n" +t - toggle data rate intervall (0=no toggle, >0=seconds)" "\n" +v - version and configuration report" "\n" +x - used for tests" "\n" +y - Relay (0=no relay, 1=Relay received packets)" "\n" +z - 1 = display analyzed frame data instead of normal data" "\n" + diff --git a/josm.txt b/josm.txt new file mode 100644 index 0000000..3ceca00 --- /dev/null +++ b/josm.txt @@ -0,0 +1,6 @@ +###Taggen von Hausnummern +addr:city Chemnitz +addr:country DE +addr:housenumber 6 +addr:postcode 09131 +addr:street Orthstraße diff --git a/lan_boot.txt b/lan_boot.txt new file mode 100644 index 0000000..6d1d2d0 --- /dev/null +++ b/lan_boot.txt @@ -0,0 +1,42 @@ +###dhcp einrichten +dhcpd.conf + +subnet 172.17.6.0 netmask 255.255.255.0 { + range 172.17.6.80 172.17.6.90; + default-lease-time 14400; + max-lease-time 172800; +} +group { + #tftpserver + next-server 172.17.6.31; + #bootimage + filename "pxelinux.0" + + host test { hardware ethernet 00:00:00:00:00:00:00; } + #weitere hostst genauso +} + +###tftpserver entweder per xinitd oder so starten +protokoll udp +wait yes +user root +server /usr/sbin/in.tftpd +#optionen für tftpd +args -s /srv/tftpboot -r blksize + + +###erzeugen bootimage +cp -a boot/loader/linux boot/loader/initrd boot/loader/message boot/loader/memtest /srv/tftpboot +cp -a /usr/share/syslinux/pxelinux.0 /srv/tftpboot +cp -a boot/loader/isolinux.cfg /srv/tftpboot/pxelinux.cfg/default + +vi /srv/tftpboot/pxelinux.cfg/default +###alles mit gfxboot, readinfo, framebuffer entfernen + +###append Zeile hinzufügen +insmod=e100 +netdevice=eth0 +install=nfs://172.17.6.31/usr/local/dist/SUSE +append initrd=initrd ramdisk_size=65536 insmod=e100 install=nfs://172.17.6.31/usr/local/dist/SUSE + + diff --git a/ldap.txt b/ldap.txt new file mode 100644 index 0000000..878cbde --- /dev/null +++ b/ldap.txt @@ -0,0 +1,40 @@ +### +ssl start_tls +nss_map_attribute uniqueMember member +pam_filter objectclass=posixAccount +nss_base_passwd dc=tbz-pariv,dc=lan +nss_base_shadow dc=tbz-pariv,dc=lan +nss_base_group dc=tbz-pariv,dc=lan +host ldap +base dc=tbz-pariv,dc=lan +ldap_version 3 +###anzeige aller Nutzer wie passwd +ldapsearch -x -b 'dc=tbz-pariv,dc=lan' +### +ldapsearch -x -b dc=tbz,dc=lan "objectclass=phonebook" +### +ldapadd -x -D cn=Administrator,dc=tbz,dc=lan -W -f user.ldif +### +ldapsearch -x -b 'dc=tbz,dc=lan' "(objectClass=inetOrgPerson)" +### +ldapsearch -x -W -D 'cn=Administrator,dc=tbz,dc=lan' -b "" -s base -H ldap://localhost "cn=hein" +### +LDAP ist ein Protokoll der Anwendungsschicht (Applicationlayer) nach dem für TCP verwendeten DoD-Vier-Schichten-Modell und arbeitet mittels genau spezifizierter Zugriffs-Prozesse: + + bind: Mit der bind-Direktive vermittelt man dem Directory-Server über eine dn, wer den Zugriff durchführen möchte (entweder anonym, per Passwort-Authentifizierung oder anders) + baseDN: Die BaseDN definiert, wo im Verzeichnisbaum abwärts die Suche nach bestimmten Objekten gestartet werden soll. Diese Suche kann festgelegt werden auf eine Suche über + genau dieses Objekt (base) + dieses Objekt und alles darunter (sub) + eine Ebene unterhalb des BaseDNs (one) + +Ansonsten gelten die notwendigen Such-Spezifikationen wie Suchoperator (Beispiel (&(mail=joe*)(ou=People))), Server-Benennung (zum Beispiel ldap.acme.com) oder Port-Benennung. + +Beispiel für eine LDAP-Suchanfrage durch ein einfaches Kommandozeilenprogramm: + +ldapsearch -h ldap.acme.com -p 389 -s sub -D "cn=Directory Manager,o=acme" -W -b "ou=personen,o=acme" "(&(mail=joe*)(c=germany))" mail + +Erklärung: Das Kommandozeilenprogramm kontaktiert über LDAP den Directory-Server ldap.acme.com (Port 389) und meldet sich über den Account des Directory Managers an diesem System an. Die Anfrage zielt auf alle Benutzereinträge (unterhalb des Zweiges ou=personen,o=acme) und sucht nach Personen aus Deutschland, deren Mailadresse mit joe beginnt ((&(mail=joe*)(c=germany))). Werden Personen gefunden, die auf diesen Filter passen, so wird deren Mailadresse zurückgegeben (mail). + +ldapsearch -h ldap.acme.com -p 389 -s sub -D "cn=Directory Manager,o=acme" -W -b "ou=personen,o=acme" "(&(mail=joe*)(c=germany))" mail +### + diff --git a/log4j2.txt b/log4j2.txt new file mode 100644 index 0000000..415ec72 --- /dev/null +++ b/log4j2.txt @@ -0,0 +1,5 @@ +###link zu java-Datei:Zeilennummer +(%F:%L) +###Ausgabe @Zeilennummer +@%L + diff --git a/luks.txt b/luks.txt new file mode 100644 index 0000000..c7ec5fa --- /dev/null +++ b/luks.txt @@ -0,0 +1,145 @@ +###luks einrichten (schnell-script) +#!/bin/sh +#read -p "Key für firma vorhanden? (j/n) " -n 1 jn +#case $jn in +# j) echo " gut"; +# ;; +# n) echo +# echo erstelle neuen Key für Firma!; +# read -p "Firmenkürzel eingeben (z.B. erw): " ant +# dd if=/dev/urandom of=/tmp/key.bin bs=4k count=1 +# base64 /tmp/key.bin > /tmp/key.${ant} +# rm -rf /tmp/key.bin +# echo "neuer Key für $ant erstellt in /tmp/key.${ant}" +# ;; +# *) echo +# echo "keine Ahnung!"; +# echo "und Tschüss"; +# exit +# ;; +#esac +# +#read -p "Platte verschlüsseln? (j/n) " -n 1 ant +#case $ant in +# j) echo " schön, los gehts"; +# ;; +# n) echo " schade, schluß"; +# exit +# ;; +# *) echo +# echo "keine Ahnung!"; +# echo "und Tschüss"; +# exit +# ;; +#esac +# +#echo "Devices:" +#fdisk -l | egrep "^(Platte|Disk) /" +#read -p "device eingeben (Bsp.: /dev/sdb): " device +#fdisk $device <&2 +#sleep 5 +#mkdir /usb 1&>2 +#mount -t ext2 /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /usb 1&>2 +#sleep 5 +#cat /usb/root.key +#umount /usb 1&>2 +###crypttab +# target name|source device|key file|options +# root /dev/vg1/vol1 none luks,retry=1,cipher=aes-cbc-essiv:sha256,keyscript=/path/to/keyscript +###/etc/initramfs-tools/modules alle eintragen was benötigt wird +aes-x86_64 +dm-crypt +dm-mod +sha256 +sd_mod +usb_storage +usb-storage +ehci_hcd +ohci_hcd +#danach +update-initramfs -u +###fstab anpassen +/dev/mapper/home /home ext3 realtime 0 2 diff --git a/lvm.txt b/lvm.txt new file mode 100644 index 0000000..fa2e82f --- /dev/null +++ b/lvm.txt @@ -0,0 +1,54 @@ +###erstellt /etc/lvmtab und /etc/lvmtab.d +vgscan -v +### +vgchange -a y +###anlegen der physical volumes (hier zwei) +#platten müssen id 8e haben, lvm +pvcreate /dev/hdb5 +pvcreate /dev/hdb6 +###volume group einrichten, danach gibt es /dev/volg1 +vgcreate volg1 /dev/hdb5 /dev/hdb6 +###anlegen der "partition" im volume group (hier 1000MB, name logv1) /dev/volg1/logv1 +lvcreate -n logv1 -L 1000M volg1 +###dateisystem erzeugen, bsp. und dann verwenden +mkfs -t ext2 /dev/volg1/logv1 +###logisches volume vergrössern +lvextend -L 1300M /dev/volg1/logv1 +###logisches volume verkleinern +lvreduce -L-800M /dev/volg1/logv1 +###volumen group vergrösser (fügt /dev/hdb7 zu volg1 hinzu) +vgextend volg1 /dev/hdb7 +###anzeige der größe einer volume group +vgdisplay /dev/volg1 +###anzeigen ob phy. medium in volume group daten enthält +pvdisplay -v /dev/hdb7 +###/dev/hdb7 aus volume group rausnehmen (muss leer sein) +vgreduce volg1 /dev/hdb7 +###lvm beenden +vgchange -a n +###alle daten von /dev/hdb6 auf alle anderen verteilen, damit man es raus nehmen kann (muss genug platz sein auf den anderen) +pvmove -v /dev/hdb6 +###moven auf bestimmtes volume +pvmove -v /dev/hdb6 /dev/hdb7 +###umbenennen von vg +vgrename /dev/volg1 /dev/volgroup1 +###umbenennen von lv +lvrename /dev/volgroup1/logv1 /dev/volgroup1/logvol1 +###legt snapshot mysnap an (/dev/volg1/mysnap), der solange gültig ist, bis 500M unterschiedlich sind zum normalen volume +lvcreate -L 500M --snapshot -n mysnap /dev/volg1/logv1 +###umzug einer vg auf einen anderen rechner +#dateisysteme aushängen +unmount /mnt/design/ +#vg als inaktiv markieren +vgchange -an design +#exportieren der vg +vgexport design +#jetz platten in neuen rechner rein und dann +pvscan +#dann importieren der vg +vgimport design +#aktivieren der vg +vgchange -ay design +#dateisystem mounten +mount /dev/design/ /mnt/design/ +### diff --git a/macadressen.txt b/macadressen.txt new file mode 100644 index 0000000..81c3ac0 --- /dev/null +++ b/macadressen.txt @@ -0,0 +1,10 @@ +hame a2 +eth0 9C:41:7C:4D:A8:78 +wlan0 +ifb0 1E:1D:EA:9A:41:DB +ifb1 42:29:AC:F8:5C:50 + +3040 +wlan0: F8:1A:67:4D:6E:D1 +wlan0-1: F8:1A:67:4D:6E:D2 +eth0: F8:1A:67:4D:6E:D3 diff --git a/mail.txt b/mail.txt new file mode 100644 index 0000000..3b5e76f --- /dev/null +++ b/mail.txt @@ -0,0 +1,2 @@ +### +mail -S sendcharsets=iso-8859-15 -S encoding=8bit -S from='Mario Höllein' -s "env äöüß iso" -s "modscan_ama $1 Anzahl Dateien: $3" $MAIL_TO < /dev/null diff --git a/make.txt b/make.txt new file mode 100644 index 0000000..7b64f1b --- /dev/null +++ b/make.txt @@ -0,0 +1,59 @@ +###Regel ist wie folgt aufgebaut +Target [ weitere Targets] :[:] [ Vorbedingungen] [; Kommandos] +[ Kommandos ] +[ Kommandos ] + ... +#z.B. +hello: + @echo hello world +diskfree:; df -h +### + +###Automatische Variablen +$@ Der Name des Target. +$% Der Member-Name, falls das Target sich in einem Archiv befindet. +$< Der Name der ersten (oder einzigen) Vorbedingung. +$? Leerzeichen-getrennte Liste all derer Dateien aus der Vorbedingung, die neuer als das Target sind. +$^ +$+ Leerzeichen-getrennte Liste aller Vorbedingungen. Bei $^ sind zusätzlich die Doppelten entfernt. +$* Der Stamm des Dateinamens, auf den die implizite Regel zugetroffen hatte. +$(@D) +$(@F) Verzeichnis und Dateiname von $@ +$(*D) +$(*F) Verzeichnis und Dateiname von $* +$(%D) +$(%F) Verzeichnis und Dateiname von $% +$( ~/tine20_db_dump +###Datenbank aus dump wiederherstellen +mysql -u root -p < japomen_20090220_1106.sql +###alle vorhanden Datenbanken anzeigen +show databases; +###anlegen einer neuen Datenbank +create database datenbank_name; +###zur Datenbank datenbank_name wechseln +use datenbank_name; +###tabellen der datenbank anzeigen +show tables; +###Spaltennamen der Tabelle users anzeigen +show columns from users; +###Tabelleneigenschaften anzeigen +show table status; +###Tabelle anlegen +create table tablename (name VARCHAR(20), besitzer VARCHAR(20),gattung VARCHAR(20), geburtstag DATE, todestag DATE); +###update einer zeile +update tabellenname set spalte=wert where spalte='irgendwas'; +###Zeile löschen +DELETE FROM tabelle WHERE bedingung; +###neuen localen Nutzer anlegen ohne Passwort der auf alles Zugriff hat +GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' +###Passwort für Nutzer monty setzen +set password for 'monty'@'localhost' = password('secretpass'); +###auto update aus +alter table klima_new change time time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP +###doppelte einträge in time Spalte entfernen +select * from klima where position='Terrasse' group by time; +###Tabelle umbenennen +alter table klima_new rename klima; +###anzeigen der eigenschaften der Tabellenspalten +SHOW FIELDS FROM tbl_name; +###Datentyp einer Spalte ändern +ALTER TABLE tbl_name MODIFY column3 varchar(50); +###eine Spalte einer Tabelle löschen +ALTER TABLE tbl_name DROP COLUMN column3; +###Tabelle löschen +DROP TABLE tbl_name; +###neuen Nutzer anlegen +CREATE USER 'neuer_benutzer'@localhost IDENTIFIED BY "pass"; diff --git a/netcat.txt b/netcat.txt new file mode 100644 index 0000000..e521e53 --- /dev/null +++ b/netcat.txt @@ -0,0 +1,7 @@ +###netcat daten übers netz per netcat +#sender +echo t |netcat server port +#empfänger +netcat -p port -l +### + diff --git a/nfs.txt b/nfs.txt new file mode 100644 index 0000000..e686bea --- /dev/null +++ b/nfs.txt @@ -0,0 +1,11 @@ +###debug einschalten +RPC debugging: + echo 2048 > /proc/sys/sunrpc/rpc_debug + grep . /proc/net/rpc/*/content + ls -l /proc/fs/nfsd + cat /proc/fs/nfs/exports +NFS debugging: + # turn on linux nfs debug + echo 1 > /proc/sys/sunrpc/nfs_debug + # turn off linux nfs debug + echo 0 > /proc/sys/sunrpc/nfs_debug diff --git a/nmap.txt b/nmap.txt new file mode 100644 index 0000000..bed894b --- /dev/null +++ b/nmap.txt @@ -0,0 +1,23 @@ +###Portscan von 192.168.0.1, Port 80 +nmap -p 80 192.168.0.1 +###Portscan von 192.168.0.1, 192.168.0.2, 192.168.0.3 mit Ports 80, 81, 82 +nmap -p 80,81,82 192.168.0.1,2,3 +namp -p 80-82 192.168.0.1-3 +###192.168.0.0/24 Port 80 scannen +nmap -p 80 "192.168.0.*" +###Standartscan von Host 192.168.0.1 Ports 1-1024 +nmap 192.168.0.1 +###Ping Scan +nmap -sP 192.168.0.1-100 +nmap -sL 192.168.0.1-100 +###TCP Scan +nmap -sT 192.168.0.1 +nmap -sR 192.168.0.1 +###SYN Scan +nmap -sS 192.168.0.1 +###Fingerprint -O (versucht BS zu ermitteln) +nmap -sT -O 192.168.0.1 +### +nmap -sVC -O -T4 host +###using nmap to map your network with zenmap +nmap -T4 -A -v -PE -PA21,23,25,69,80,135,137,138,139,443,515,631,5432 172.17.6.0-254 diff --git a/nutzer.txt b/nutzer.txt new file mode 100644 index 0000000..02f76d3 --- /dev/null +++ b/nutzer.txt @@ -0,0 +1,19 @@ +###nutzer anlegen / homebereich anlegen / ssh-key erzeugen +MYUSER=modarch +MYGROUP=modarch +MYUID=21 +MYGID=23 +MYUSERHOME=/home/$MYUSER + +groupadd -g $MYGID $MYGROUP +useradd -u $MYUID -g $MYGROUP -s /bin/bash -c "modarch system account" $MYUSER +usermod -G $MYGROUP $MYUSER +usermod -G $MYGROUP wwwrun +usermod -G trusted $MYUSER + +echo "Passwort für $MYUSER vergeben ..." +passwd $MYUSER +mkdir -p $MYUSERHOME +chown $MYUSER: $MYUSERHOME + +sudo -u $MYUSER ssh-keygen -t rsa # mit 3xEnter diff --git a/nvidia.txt b/nvidia.txt new file mode 100644 index 0000000..c6c7c97 --- /dev/null +++ b/nvidia.txt @@ -0,0 +1,8 @@ +###Über und Untertakten der Nvidia Grafikkarte +/etc/X11/xorg.conf +Section “Screen” +Identifier “Screen0″ +… +add this string +Option “Coolbits” “1″ +### diff --git a/o2.txt b/o2.txt new file mode 100644 index 0000000..5d6bff6 --- /dev/null +++ b/o2.txt @@ -0,0 +1,32 @@ +###Multicard SMS Konfiguration +#sms auf Gerät wo es eingegeben wird +*125# +#SMS immer auf Gerät was auch Anfrufe empfängt +*125*0# +#auf Karte 1 +*125*1# +#legt dir die SMS auf Karte 2 +*125*2# +###Multicard MMS Konfigurieren +#MMS immer auf Gerät was auch Anfrufe empfängt +*126*0# +#legt dir die MMS auf Karte 1 +*126*1# +###Die Codes für O2 Multicard auf einen Blick +*120# +###Die Übersicht Ihrer aktiven SIM-Karten +*121# +###Info, welche Ihrer SIM-Karten Anrufe zuerst empfängt +*122# +###Zuweisung Anrufe für aktuelles Gerät +*123# +###Weiterleitungsprioritäten für Anrufe setzen (Ziffer ist Priorität) +*123*Ziffer# +###Multicard Standarteinstellung wieder herstellen +*128# +###LBS Konfiguration +#auf Gerät was Anrufe erhält +*127# +#auf Karte 1 +*127*1# + diff --git a/openssl.txt b/openssl.txt new file mode 100644 index 0000000..1f28280 --- /dev/null +++ b/openssl.txt @@ -0,0 +1,182 @@ +###CA erzeugen +#Die Gültigkeit setzen wir mit 10 Jahren bewusst sehr hoch an. +#Läuft die CA aus, so werden nämlich auch alle damit signierten Serverzertifikate ungültig. +#Die CA enthält einen geheimen Schlüssel, welcher automatisch erzeugt und in der +#Datei cakey.pem abgelegt wird. Das CA-Zertifikat wird nach cacert.pem geschrieben. +#Der folgende Befehl erzeugt das einen Schlüssel für das Zertifikat mit einer Länge von 2048 Bit +openssl req -new -x509 -newkey rsa:2048 -keyout cakey.pem -out cacert.pem -days 3650 +#Wer den geheimen Schlüssel der CA kennt, kann damit beliebige Serverzertifikate signieren. +#Deshalb wird diese Schlüsseldatei nicht im Klartext auf der Festplatte abgelegt, +#sondern mit einer Passphrase verschlüsselt. Diese Passphrase benötigen Sie immer dann, +#wenn Sie mit der CA neue Zertifikate ausstellen wollen: +Enter PEM pass phrase: geheimes_Passwort +Verifying - Enter PEM pass phrase: geheimes_Passwort +#Nun werden Sie gebeten, Daten einzugeben, welche die CA identifizieren. +#Diese werden dem Client angezeigt, wenn er aufgefordert wird, das Zertifikat +#zu akzeptieren oder abzulehnen. Der Code für Deutschland ist DE. +#Wenn Sie ein Feld leerlassen möchten, so geben Sie einen Punkt ein. +#Ansonsten wird der in eckigen Klammern stehende Defaultwert eingetragen: +----- +You are about to be asked to enter information that will be incorporated +into your certificate request. +What you are about to enter is what is called a Distinguished Name or a DN. +There are quite a few fields but you can leave some blank +For some fields there will be a default value, +If you enter '.', the field will be left blank. +----- +Country Name (2 letter code) [AU]: DE +State or Province Name (full name) [Some-State]:Sachsen +Locality Name (eg, city) []:Chemnitz +Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hinz und Kunz AG +Organizational Unit Name (eg, section) []:. +#Das Feld Common Name (CN) ist hier der offizielle Name der Zertifizierungsstelle. +#Für Ihre eigene CA können Sie einfach Ihren eigenen Namen eintragen: +Common Name (eg, YOUR name) []: Mario Höllein +Email Address []: mhoellein@hoellein.at +#Fertig. Folgende zwei Dateien sind entstanden: +root@linux# ll +insgesamt 9 +drwxr-xr-x 2 root root 112 2006-04-30 12:08 . +drwx------ 12 root root 600 2006-04-30 11:54 .. +-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem +-rw-r--r-- 1 root root 963 2006-04-30 12:08 cakey.pem +#Vorsichtshalber sollten Sie die Rechte so setzen, dass die Schlüsseldatei nur für root lesbar ist: +#Sie können nun ausprobieren, ob sie den Schlüssel mit der Passphrase wieder öffnen können: +root@linux# openssl rsa -in cakey.pem -noout -text +Enter pass phrase for cakey.pem: wrzlprmpft +Private-Key: (1024 bit) +modulus: + 00:d5:a5:37:51:e9:d9:fa:e3:97:e7:46:b2:88:1a: + b5:46:80:47:76:14:ae:2b:8b:3e:35:5c:ab:15:84: + 53:d9:63:2e:7f:08:4b:ec:77:db:02:45:f8:c7:46: + 58:cd:2d:f9:29:4d:96:3d:d8:6c:5d:9f:79:8a:04: + cf:b7:3a:89:da:a9:63:9f:44:b3:83:cf:0d:70:7d: + ... +###Schlüssel für das Serverzertifikat erzeugen +#Nachdem wir nun eine eigene CA haben, kann diese nun endlich für unseren Server +#ein Zertifikat herausgeben. Dazu erzeugen wir zunächst einen 2048 Bit langen RSA Schlüssel, +#der mit AES 128 verschlüsselt auf der Platte abgelegt wird (ja wirklich, auch hier wieder ein verschlüsselter Schlüssel). +#Die Passphrase muss diesmal nicht sonderlich geheim sein, da wir sie ohnehin im Anschluss wieder entfernen werden. +#OpenSSL lässt allerdings keine leere Phrase zu: +root@linux# openssl genrsa -out serverkey.pem -aes128 2048 -days 3650 +Generating RSA private key, 2048 bit long modulus +....+++ +.......................................+++ +e is 65537 (0x10001) +Enter pass phrase for serverkey.pem: jaja +Verifying - Enter pass phrase for serverkey.pem: jaja +#So. Nun entfernen wir die Passphrase wieder. Warum? +#Der Serverdienst (Apache, Cyrus, etc.) muss schließlich in der Lage sein, den Schlüssel ohne Ihr Zutun zu lesen. +#Oder wollen Sie bei jedem Booten des Servers ein Passwort eingeben müssen? +root@linux# openssl rsa -in serverkey.pem -out serverkey.pem +Enter pass phrase for serverkey.pem: jaja +writing RSA key +###Certificate Signing Request erzeugen +#Der nächste Schritt zum eigenen Zertifikat ist ein CSR. Dies muss dann nur noch von der CA signiert werden. +#Hier sind wieder Angaben analog zum Erstellen der CA nötig, was oft Verwirrung stiftet. +#Die allgemeinen Daten kann man ggfl. gleich wie oben eingeben: +root@linux# openssl req -new -key serverkey.pem -out req.pem -nodes +You are about to be asked to enter information that will be incorporated +into your certificate request. +What you are about to enter is what is called a Distinguished Name or a DN. +There are quite a few fields but you can leave some blank +For some fields there will be a default value, +If you enter '.', the field will be left blank. +----- +Country Name (2 letter code) [AU]: DE +State or Province Name (full name) [Some-State]:Sachsen +Locality Name (eg, city) []:Chemnitz +Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hinz und Kunz AG +Organizational Unit Name (eg, section) []:. +#ACHTUNG, jetzt kommt das Wichtige: +#Beim Serverzertifikat ist der Common Name von entscheidender Bedeutung. Hier muss der DNS-Name stehen, +#unter dem der Client den Server anspricht! Wird das Zertifikat für eine HTTPS-Verbindung zu www.hoellein.at +#verwendet, so muss der Common Name eben genau www.hoellein.at heißen. Anderfalls wird der Browser das +#Zertifikat nicht akzeptieren, da er davon ausgehen muss, auf dem falschen Server gelandet zu sein. +Common Name (eg, YOUR name) []: www.hoellein.at +Email Address []: mario@hoellein.at +#Weitere Optionen kann man einfach leer lassen: +A challenge password []: +An optional company name []: +#Mittlerweile tummeln sich schon vier Dateien in unserem Verzeichnis: +root@linux# ll +insgesamt 17 +drwxr-xr-x 2 root root 168 2006-04-30 12:29 . +drwx------ 12 root root 600 2006-04-30 11:54 .. +-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem +-rw------- 1 root root 963 2006-04-30 12:08 cakey.pem +-rw-r--r-- 1 root root 1017 2006-04-30 12:29 req.pem +-rw-r--r-- 1 root root 1679 2006-04-30 12:21 serverkey.pem +###OpenSSL-Konfiguration anpassen +#Leider kann man bei OpenSSL nicht alle Daten als Kommandozeilenargumente übergeben. +#Einige Einstellungen muss man lästigerweise in der Datei /etc/ssl/openssl.cnf ändern, +#bevor man signieren kann. Öffnen Sie diese Datei und passen Sie folgende Zeilen in der +Sektion [ CA_default ] an: +dir = . # Where everything is kept +new_certs_dir = $dir # default place for new certs +private_key = $dir/cakey.pem # The private key +RANDFILE = $dir/.rand # private random number file +default_days = 3650 # how long to certify for +#Das Feld default_days ist auf 365 Tage voreingestellt und gibt die Gültigkeit des Zertifikates an. +#Abgelaufene Zertifikate sind im Übrigen ein sehr häufiges Problem. Wenn es soweit ist, kennt sich +#damit nämlich schon lange keiner mehr aus. Deswegen können Sie wie im Beispiel angegeben die +#Lebensdauer z.B. auf 10 Jahre heraufsetzen. +#Wenn Sie beim Serverzertifikat keinen Bundesstaat angegeben haben, +#benötigen Sie noch folgende Änderung unter [ policy_match ]: +stateOrProvinceName = optional +#Nun muss man noch einige Dateien anlegen: +root@linux# echo 01 > serial +root@linux# touch index.txt +###Serverzertifikat signieren +#Kommen wir zum feierlichen Abschluss: Unsere CA signiert nun das Zertifikat: +root@linux# openssl ca -in req.pem -notext -out servercert.pem -config ./openssl.cnf +Enter pass phrase for ./cakey.pem: wrzlprmpft + +... + +Certificate is to be certified until Apr 27 10:45:36 2016 GMT (3650 days) +Sign the certificate? [y/n]: y + + +1 out of 1 certificate requests certified, commit? [y/n] y +Write out database with 1 new entries +Data Base Updated +###Zertifikate installieren +#Wohin sie die Zertifikate installieren, hängt natürlich vom jeweiligen Serverdienst ab. +#Was allen gemeinsam ist: Sie benötigen nur die Dateien cacert.pem, servercert.pem und serverkey.pem. +#Die Datei cakey.pem wird nicht benötigt. Sie sollte am besten auch nicht auf dem Server liegen +#sondern an einer sicheren Stelle auf einem anderen Rechner. + +###überprüfen einer signierten nachricht +openssl dgst -sha1 -verify pubkey.pem -signature foo-1.23.tar.gz.sha1 foo-1.23.tar.gz +###extract infos vom zertifikat +openssl x509 -text -in cert.pem +###wer hat das zertifikat herausgegeben, who issued the cert? +openssl x509 -noout -in cert.pem -issuer +###zu wem wurde es herausgegeben, to whom was it issued? +openssl x509 -noout -in cert.pem -subject +###zeitraum der gültigkeit, for what dates is it valid? +openssl x509 -noout -in cert.pem -dates +###the above, all at once +openssl x509 -noout -in cert.pem -issuer -subject -dates +###hashwert des zertifikats, what is its hash value? +openssl x509 -noout -in cert.pem -hash +###what is its MD5 fingerprint? +openssl x509 -noout -in cert.pem -fingerprint +###public key extrahieren +openssl x509 -text -in cert.pem -pubkey +###konvertieren von PEM nach DER +openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER +###konvertiert ein Zertifikat in einen Zertifikatrequest +openssl x509 -x509toreq -in cert.pem -out req.pem -signkey key.pem +###konvertiert einen zertifikatsrequest in ein selbst unterschriebenes zertifikat +openssl x509 -req -in careq.pem -extfile openssl.cnf -extensions v3_ca -signkey key.pem -out cacert.pem +###Sign a certificate request using the CA certificate above and add user certificate extensions +openssl x509 -req -in req.pem -extfile openssl.cnf -extensions v3_usr -CA cacert.pem -CAkey key.pem -CAcreateserial +###Set a certificate to be trusted for SSL client use and change set its alias to "Mario's Class 1 CA" +openssl x509 -in cert.pem -addtrust clientAuth -setalias "Mario's Class 1 CA" -out trust.pem +###base64 codieren von datei test.txt nach test_b64.txt (nutzt impliziet -e) +openssl enc -base64 -in test.txt -out test_b64.txt +###decoden von test_b64.txt nach test.txt (base64) +openssl enc -d -base64 -in test_b64.txt +### diff --git a/openswan.txt b/openswan.txt new file mode 100644 index 0000000..1e64e4e --- /dev/null +++ b/openswan.txt @@ -0,0 +1,167 @@ +###openswan starten +ipsec setup start +###openswan stoppen +ipsec setup stop +###openswan status (tunnel aktiv oder nicht) +ipsec setup status +###verbindung vpn hinzufügen (conn vpn) +ipsec auto --add vpn +###verbindung vpn entfernen (conn vpn) +ipsec auto --delete vpn +###tunnel vpn aufbauen +ipsec auto --up vpn +ipsec auto --verbose --up vpn +###tunnel vpn abbauen +ipsec auto --down vpn +###hilfe +ipsec --help +###hilfe für setup +ipsec setup --help +###hilfe für auto +ipsec auto --help +###wack +ipsec whack --debug-crypt +ipsec whack --debug-all +###hilfe für wack +ipsec whack --help + +###beispielconf für cisco concentrator (hier gew) +###beispielconf für checkpoint vpn (köln) +# /etc/ipsec.conf - Openswan IPsec configuration file +# RCSID $Id: ipsec.conf.in,v 1.15.2.6 2006/10/19 03:49:46 paul Exp $ + +# This file: /usr/share/doc/packages/openswan/ipsec.conf-sample +# +# Manual: ipsec.conf.5 + + +version 2.0 # conforms to second version of ipsec.conf specification + +# basic configuration +config setup + interfaces="ipsec0=eth0" + #interfaces=%defaultroute + # plutodebug / klipsdebug = "all", "none" or a combation from below: + klipsdebug="none" + plutodebug="none" + # "raw crypt parsing emitting control klips pfkey natt x509 private" + # eg: plutodebug="control parsing" + # + # ONLY enable plutodebug=all or klipsdebug=all if you are a developer !! + # + # NAT-TRAVERSAL support, see README.NAT-Traversal + #nat_traversal=yes + # virtual_private=%v4:10..0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12 + # + # Certificate Revocation List handling: + #crlcheckinterval=600 + #strictcrlpolicy=yes + # + # Change rp_filter setting? (default is 0, disabled) + # See also setting in the /etc/sysctl.conf file! + #rp_filter=%unchanged + # + # Workaround to setup all tunnels immediately, since the new default + # of "plutowait=no" causes "Resource temporarily unavailable" errors + # for the first connect attempt over each tunnel, that is delayed to + # be established later / on demand. + # With "plutowait=yes" plutio waits for each negotiation attempt + # that is part of startup to finish, before proceeding with the next. + #plutowait=yes + # + # enable this if you see "failed to find any available worker" + #nhelpers=0 + +conn halb + leftsubnet=10.102.0.0/16 + also=common + auto=start +conn egs + leftsubnet=10.114.0.0/16 + also=common + auto=start + +conn guf + leftsubnet=10.118.0.0/16 + also=common + auto=start + +conn esm + leftsubnet=10.115.0.0/16 + also=common + auto=start + +conn evk + leftsubnet=10.113.0.0/16 + also=common + auto=start + +conn lkw + leftsubnet=10.111.0.0/16 + also=common + auto=start + +conn thv + leftsubnet=10.100.0.0/16 + also=common + auto=start + +conn swan + leftsubnet=10.120.0.0/16 + also=common + auto=start + +conn erw + leftsubnet=10.110.0.0/16 + also=common + auto=start + +conn common + #das sollte alles stimmen + type=tunnel + #ext ip cpfw + left=212.184.19.93 + #ext ip tbz + leftnexthop=194.113.71.71 + #vpn client + #right=172.17.1.7 + right=10.130.4.1 + #nächster rechner + rightnexthop=10.130.4.2 + #wir nutzen ike + keyexchange=ike + ######## + #das sollte die Renegotioate IKE sein + ikelifetime=1440m + #das sollte phase1 3des sha1 dh2 sein + ike=3des-sha1-modp1024 + #wir nutzen esp + auth=esp + #wir nutzen PSK aus /etc/ipsec.secret + authby=secret + #perfect forward secrecy + pfs=yes + #3des sha1 dh2 für esp + esp=3des-sha1-1024 + #das sollte die Renegotiate Ipsec sein + keylife=3600s + #kein aggressive mode (ist immer an) + aggrmode=no + #test + pfsgroup=modp1024 + #leftsubnet=10.102.0.0/16 + rightsubnet=10.130.4.0/24 +# auto=start +#Disable Opportunistic Encryption +include /etc/ipsec.d/examples/no_oe.conf + +###ipsec.secrets (tbz) +#10.130.4.1 212.184.19.93: PSK "WMrcPncRz3HW" +#172.17.1.7 212.184.19.93: PSK "WMrcPncRz3HW" +212.184.19.93 172.17.1.7: PSK "WMrcPncRz3HW" +212.184.19.93 10.130.4.1: PSK "WMrcPncRz3HW" +80.228.110.21 10.130.4.1: PSK "superdau" +@sslvpn 80.228.110.21: PSK "superdau" +#@sslvpn 80.228.110.21 : PSK "superdau" + +### diff --git a/openvpn.txt b/openvpn.txt new file mode 100644 index 0000000..506b9b3 --- /dev/null +++ b/openvpn.txt @@ -0,0 +1,833 @@ +###Key erzeugen für neuen Nutzer bei TBZ +#in Arbeitsverzeichnis wechseln +cd /media/SAVE/vpn/openVPN/createUserKey +#conf exportieren +export OPENSSL_CONF=/media/SAVE/vpn/openVPN/createUserKey/openssl_tbzvpn.cnf +#neuen key mit request erzeugen +openssl req -nodes -new -keyout Sven.key -out Sven.csr +#client key signieren +openssl ca -out Sven.crt -in Sven.csr + + +###Openvpn mit einem verteiltem (static key) Schlüssel betreiben +# Preshared Key erzeugen +openvpn --genkey --secret static.key +# server.conf erstellen +dev tun +ifconfig 10.8.0.1 10.8.0.2 +secret static.key +# client.conf erstellen +remote myremote.mydomain +dev tun +ifconfig 10.8.0.2 10.8.0.1 +secret static.key +###openvpn beispiel config tbz server +port 1194 +proto udp +mode server +tls-server +dev tap +ca /etc/ssl/vpn/keys/ca.crt +key /etc/ssl/vpn/keys/server.key +cert /etc/ssl/vpn/keys/server.crt +dh /etc/ssl/vpn/keys/dh2048.pem +ifconfig 192.168.156.1 255.255.255.0 +ifconfig-pool 192.168.156.10 192.168.156.50 +push "route-gateway 192.168.156.1" +push "route 172.17.6.0 255.255.255.0 192.168.156.1" +;push redirect-gateway +link-mtu 1400 +mssfix +keepalive 10 120 +auth SHA1 +cipher AES-256-CBC +user nobody +group nobody +persist-key +persist-tun +comp-lzo +verb 3 + +###openvpn beispiel config tbz client +client +dev tap +proto udp +remote ww2.tbz-pariv.de 1194 +resolv-retry infinite +nobind +persist-key +persist-tun +ca ca.crt +cert ${name}.crt +key ${name}.key +ns-cert-type server +comp-lzo +verb 3 +cipher AES-256-CBC +auth SHA1 + +###openvpn beispiel init scrip tbz +#!/bin/sh +. /etc/rc.status + +### BEGIN INIT INFO +# Provides: openvpn +# Required-Start: $network +# Required-Stop: $network +# Default-Start: 3 5 +# Default-Stop: 0 1 2 6 +# Description: Start the openvpn daemon +### END INIT INFO + +openvpn="" +openvpn_locations="/usr/sbin/openvpn /usr/local/sbin/openvpn" +for location in $openvpn_locations +do + if [ -f "$location" ] + then + openvpn=$location + fi +done + +# openvpn directory +work=/etc/openvpn + +# Lockfile +lock="/var/lock/subsys/openvpn" + +# PID directory +piddir="/var/run/openvpn" + +# openvpn da +if ! [ -f $openvpn ] +then + echo "openvpn binary not found" + exit 0 +fi +rc_reset +case "$1" in + start) + echo -n $"Starting openvpn: " + /sbin/modprobe tun >/dev/null 2>&1 + if [ ! -d $piddir ]; then + mkdir -p $piddir + fi + + if [ -f $lock ]; then + for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do + if [ -s $pidf ]; then + kill `cat $pidf` >/dev/null 2>&1 + fi + rm -f $pidf + done + rm -f $lock + sleep 2 + fi + rm -f $piddir/*.pid + cd $work + c=${work}/server.conf + startproc $openvpn --daemon --writepid $piddir/openvpn.pid --config $c --cd $work + touch $lock + rc_status -v + ;; + stop) + echo -n $"Shutting down openvpn: " + for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do + if [ -s $pidf ]; then + kill `cat $pidf` >/dev/null 2>&1 + fi + rm -f $pidf + done + rm -f $lock + rc_status -v + ;; + restart) + $0 stop + sleep 2 + $0 start + ;; + status) + if [ -f $lock ]; then + for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do + if [ -s $pidf ]; then + kill -USR2 `cat $pidf` >/dev/null 2>&1 + fi + done + echo "Status written to /var/log/messages" + echo -n $"openvpn: " + rc_status -v + else + echo -n $"openvpn: service not started" + checkproc $openvpn + rc_status -v + exit + fi + ;; + *) + echo "Usage: openvpn {start|stop|restart|status}" + exit 1 + ;; + +esac +exit 0 + +### +Filename Needed By Purpose Secret +ca.crt server + all clients Root CA certificate NO +ca.key key signing machine only Root CA key YES +dh{n}.pem server only Diffie Hellman parameters NO +server.crt server only Server Certificate NO +server.key server only Server Key YES +client1.crt client1 only Client1 Certificate NO +client1.key client1 only Client1 Key YES +client2.crt client2 only Client2 Certificate NO +client2.key client2 only Client2 Key YES + + +/usr/share/doc/packages/openvpn + +###root zertifikat erstellen und openssl.conf anpassen, damit die auf das aktuelle root-zert. zeigt +#Bsp.: +openssl req -nodes -new -x509 -keyout tmp-ca.key -out tmp-ca.crt + +###Diffie Hellman Parameter file erzeugen, für tls-server, wollen wir ja +###2048 ist sicherer aber auch ein bissl langsamer +#Bsp.: +openssl dhparam -out dh1024.pem 1024 + +###client zert. erzeugen +openssl req -nodes -new -keyout mycert.key -out mycert.csr + +###dann dieses client zert. auf dem server signieren +openssl ca -out mycert.crt -in mycert.csr +###dann mycert.crt zurück zum client kopieren und nutzen + + +###anschauen der crl (Certificate Revocation List) als ascii +openssl crl -in crl.pem -noout -text + +###openssl.cnf anpassen +* default_days (spezifiziert wie lange das Zertifikat gültig sein soll, 3650 sind 10 Jahre) +* dir (falls ihr ein anderes Verzeichnis nehmen wollt) +* certificate (zu my-ca.crt) +* private_key (zu my-ca.key) +* default_bits (zu 2048 für mehr Sicherheit) +###ca erstellen +openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 3650 + +###server/client certs +openssl req -nodes -new -keyout server.key -out server.csr +openssl ca -out server.crt -in server.csr +openssl req -nodes -new -keyout client.key -out client.csr +openssl ca -out client.crt -in client.csr + +###dh-key +openssl dhparam -out dh2048.pem 2048 + +###iptables +iptables -t filter -A INPUT --protocol udp --dport 5000 -j ACCEPT -i eth1 # eth1 ist das Interface an dem der AP hängt +iptables -t filter -A INPUT -j REJECT -i eth1 + + # easy-rsa parameter settings + + # NOTE: If you installed from an RPM, + # don't edit this file in place in + # /usr/share/openvpn/easy-rsa -- + # instead, you should copy the whole + # easy-rsa directory to another location + # (such as /etc/openvpn) so that your + # edits will not be wiped out by a future + # OpenVPN package upgrade. + + # This variable should point to + # the top level of the easy-rsa + # tree. + export D=`pwd` + + # This variable should point to + # the openssl.cnf file included + # with easy-rsa. + export KEY_CONFIG=$D/openssl.cnf + + # Edit this variable to point to + # your soon-to-be-created key + # directory. + # + # WARNING: clean-all will do + # a rm -rf on this directory + # so make sure you define + # it correctly! + export KEY_DIR=$D/keys + + # Issue rm -rf warning + echo NOTE: when you run ./clean-all, I will be doing a rm -rf on $KEY_DIR + + # Increase this to 2048 if you + # are paranoid. This will slow + # down TLS negotiation performance + # as well as the one-time DH parms + # generation process. + export KEY_SIZE=1024 + + # These are the default values for fields + # which will be placed in the certificate. + # Don't leave any of these fields blank. + export KEY_COUNTRY=KG + export KEY_PROVINCE=NA + export KEY_CITY=BISHKEK + export KEY_ORG="OpenVPN-TEST" + export KEY_EMAIL=" + me@myhost.mydomainThis e-mail address is being protected from spambots, you need JavaScript enabled to view it + " + +easy-rsa/clean-all + + #!/bin/sh + + # + # Initialize the $KEY_DIR directory. + # Note that this script does a + # rm -rf on $KEY_DIR so be careful! + # + + d=$KEY_DIR + + if test $d; then + rm -rf $d + mkdir $d && \ + chmod go-rwx $d && \ + touch $d/index.txt && \ + echo 01 >$d/serial + else + echo you must define KEY_DIR + fi + +easy-rsa/build-dh + + #!/bin/sh + + # + # Build Diffie-Hellman parameters for the server side + # of an SSL/TLS connection. + # + + if test $KEY_DIR; then + openssl dhparam -out ${KEY_DIR}/dh${KEY_SIZE}.pem ${KEY_SIZE} + else + echo you must define KEY_DIR + fi + +easy-rsa/build-ca + + #!/bin/sh + + # + # Build a root certificate + # + + if test $KEY_DIR; then + cd $KEY_DIR && \ + openssl req -days 3650 -nodes -new -x509 -keyout ca.key -out ca.crt -config $KEY_CONFIG && \ + chmod 0600 ca.key + else + echo you must define KEY_DIR + fi + +easy-rsa/build-inter + + #!/bin/sh + + # + # Make an intermediate CA certificate/private key pair using a locally generated + # root certificate. + # + + if test $# -ne 1; then + echo "usage: build-inter "; + exit 1 + fi + + if test $KEY_DIR; then + cd $KEY_DIR && \ + openssl req -days 3650 -nodes -new -keyout $1.key -out $1.csr -config $KEY_CONFIG && \ + openssl ca -extensions v3_ca -days 3650 -out $1.crt -in $1.csr -config $KEY_CONFIG + else + echo you must define KEY_DIR + fi + +easy-rsa/build-key + + #!/bin/sh + + # + # Make a certificate/private key pair using a locally generated + # root certificate. + # + + if test $# -ne 1; then + echo "usage: build-key "; + exit 1 + fi + + if test $KEY_DIR; then + cd $KEY_DIR && \ + openssl req -days 3650 -nodes -new -keyout $1.key -out $1.csr -config $KEY_CONFIG && \ + openssl ca -days 3650 -out $1.crt -in $1.csr -config $KEY_CONFIG && \ + chmod 0600 $1.key + else + echo you must define KEY_DIR + fi + +easy-rsa/build-key-pass + + #!/bin/sh + + # + # Similar to build-key, but protect the private key + # with a password. + # + + if test $# -ne 1; then + echo "usage: build-key-pass "; + exit 1 + fi + + if test $KEY_DIR; then + cd $KEY_DIR && \ + openssl req -days 3650 -new -keyout $1.key -out $1.csr -config $KEY_CONFIG && \ + openssl ca -days 3650 -out $1.crt -in $1.csr -config $KEY_CONFIG && \ + chmod 0600 $1.key + else + echo you must define KEY_DIR + fi + +easy-rsa/build-req + + #!/bin/sh + + # + # Build a certificate signing request and private key. Use this + # when your root certificate and key is not available locally. + # + + if test $# -ne 1; then + echo "usage: build-req "; + exit 1 + fi + + if test $KEY_DIR; then + cd $KEY_DIR && \ + openssl req -days 3650 -nodes -new -keyout $1.key -out $1.csr -config $KEY_CONFIG + else + echo you must define KEY_DIR + fi + +easy-rsa/build-req-pass + + #!/bin/sh + + # + # Like build-req, but protect your private key + # with a password. + # + + if test $# -ne 1; then + echo "usage: build-req-pass "; + exit 1 + fi + + if test $KEY_DIR; then + cd $KEY_DIR && \ + openssl req -days 3650 -new -keyout $1.key -out $1.csr -config $KEY_CONFIG + else + echo you must define KEY_DIR + fi + +easy-rsa/sign-req + + #!/bin/sh + + # + # Sign a certificate signing request (a .csr file) + # with a local root certificate and key. + # + + if test $# -ne 1; then + echo "usage: sign-req "; + exit 1 + fi + + if test $KEY_DIR; then + cd $KEY_DIR && \ + openssl ca -days 3650 -out $1.crt -in $1.csr -config $KEY_CONFIG + else + echo you must define KEY_DIR + fi + + +###Zertifikate sperren +Aus OpenVPN Wiki +Wechseln zu: Navigation, Suche + +In Firmen ist es häufig nötig, erstellte Zertifikate wieder einzuziehen, z.B. wenn ein Notebook geklaut wurde oder wenn ein Mitarbeiter geht. + +Um sich das Leben einfacher zu machen, gibt es eine CRL (Certificate Revocation List), die überprüft ob ein Zertifikat noch gültig ist. Dabei holt sie sich in Periodischen Abständen ihre Informationen aus der index.txt. Ich mache es absichtlich etwas ausführlicher, um auch Einsteigern, das Leben zu erleichtern. + + +Wir kopieren uns zuerst die openssl.cnf in ein Arbeitsverzeichnis, wer Probleme mit dem Auffinden hat benutzt 'find'. + + +Erstellen eines Arbeitsverzeichnises zwecks Übersichtlichkeit + +mkdir /opt/sslcnf + + +Suchen der openssl.cnf (bei mir /etc/ssl/ ) + +find / -name openssl.cnf + + +Kopieren ins Arbeitsverzeichnis + +cp /etc/ssl/openssl.cnf /opt/sslcnf/ + + +Damit Openssl auch weiß, welche Konfig wir nun verwenden: + +export OPENSSL_CONF=/opt/sslcnf/openssl.cnf + +Kleiner Nachtrag: Linux hat die Angewohntheit bei neuen Shells den neuen eintrag einfach rauszukicken. Wer sichergehen will, dass immer die OPENSSL_CONF verwendet wird, wechselt nach /etc und legt eine profile.local an in die er dann den "export ..." Befehl hineinschreibt. + +Überprüfung, ob OPENSSL_CONF richtig gesettz wurde + +env | grep OPENSSL_CONF + + +Nun erstellen wir uns eine index.txt und serial, falls noch nicht geschehen (sollte aber jeder haben, wenn man sich ans OpenVPN Tutorial gehalten hat) + +ovpn:/opt/sslcnf # touch index.txt + +ovpn:/opt/sslcnf # touch serial && echo 01 >> serial + +Die Serial wird mit jedem erstellten Zertifikat hochgezählt, wir beginnen bei 1 Smile + +Dannach gehts weiter mit ein paar Anpassungen der openssl.cnf, dabei gehe ich aber nur auf die Grundlegenden Einstellungen für unsere CRL ein + +dir = /opt/sslcnf # Die Variable für unser AV +certs = /pfad zu certs # Wo liegen unsere Certs? +crl_dir = $dir/crl # Da liegt unsere crl +database = $dir/index.txt # Unsere index.txt +#unique_subject = no # Set to 'no' to allow creation of + # several ctificates with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = /pfad zur vpn-ca # unser stammzertifikat +serial = $dir/serial # unsere serial datei +#crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CR +L +crl = $dir/crl.pem # die CRL Datei +private_key = $dir/private/cakey.pem# unser privater Key +RANDFILE = $dir/private/.rand # private random number file + + +Wollen wir schon ein Zertifikat verbieten, dann machen wir das mit dem Befehl: + +ovpn:/opt/sslcnf # openssl ca -revoke /opt/openvpn/certs/client1_cert.pem + + +Daraufhin ein paar Meldungen und die Bitte, das Passwort für unseren cakey einzugeben: + +Using configuration from /opt/openssl.cnf +5194:error:0E06D06C:configuration file routines:NCONF_get_string:no value:conf_lib.c:329:group=CA_default name=unique_subject +Enter pass phrase for /opt/openvpn/certs/vpn-cakey.pem: +DEBUG[load_index]: unique_subject = "yes" +Adding Entry with serial number 03 to DB for /C=DE/ST=Some-State/L=munic/O=bea/CN=04 +Revoking Certificate 03. +Data Base Updated + + +Daraufhin wird die index.txt automatisch erweitert: + +R 160515125947Z 060531105703Z 03 unknown /C=DE/ST=Some-State/L=munic/O=bea/CN=04 + +Das R steht für Revoked, V für Valid und E für Expired. + +Nachdem dies geschehen ist, erstellen wir uns die CRL. Mit -crlhours 1 geben wir an, wie oft diese aktualisiert wird (jede Stunde..) + +ovpn:/opt/sslcnf # openssl ca -gencrl -crlhours 1 -out crl.pem + + +Da man mit 'less crl.pem' nur kryptisches gekürzel erhält sehen wir uns die Datei mit folgedem Befehl an: + +openssl crl -in crl.pem -noout -text + + +Das ganze sollte dann ungefähr so aussehen: + +Certificate Revocation List (CRL): + Version 1 (0x0) + Signature Algorithm: md5WithRSAEncryption + Issuer: /C=DE/L=munic/O=bea/CN=02 + Last Update: May 31 09:29:18 2006 GMT + Next Update: Jun 30 09:29:18 2006 GMT +Revoked Certificates: + Serial Number: 03 + Revocation Date: May 31 08:16:21 2006 GMT + Signature Algorithm: md5WithRSAEncryption + 12:e3:03:df:55:a0:5b:37:93:8a:48:43:00:c3:fc:b4:e8:fd: + e3:f9:c0:29:2e:da:b6:a8:ef:d1:f0:6b:a9:5b:b6:9c:d9:4c: + df:a1:87:e6:cd:f0:5d:cd:58:25:41:eb:9a:a2:73:ce:41:ae: + 1c:82:c5:ba:f6:6b:b8:7a:7b:b8:49:82:cc:63:32:d7:9e:4d: + 88:46:86:11:4c:82:1c:58:b8:b7:ad:1a:ca:4c:af:fd:dd:8a: + c1:c3:7f:2d:46:da:24:2c:59:6e:4e:c9:16:a3:79:27:95:82: + dc:7d:44:b3:95:38:0f:71:bf:6f:e3:66:d8:1e:3b:d6:27:14: + 94:75:39:51:51:b8:c8:19:9c:8e:22:8b:b7:f0:19:0f:bd:db: + 05:24:db:23:e8:25:6a:28:ca:38:cc:ea:3a:ea:0a:c0:51:04: + 5f:df:ad:63:58:ca:be:c9:01:2d:e4:40:7a:ba:15:30:04:c5: + 1a:e9:7a:cc:2c:05:39:5b:86:46:0a:87:f5:17:15:5e:78:64: + 98:6d:25:93:11:39:e5:a7:43:e6:db:f0:21:30:4d:8f:34:e2: + 8c:d6:22:c5:68:d9:f6:6a:c9:b7:6f:5c:b0:0b:a5:5e:75:00: + af:65:70:60:8f:05:8e:95:03:10:75:05:06:6d:60:1f:69:1b: + 12:68:12:c1 + + +Als letztes sagen wir unserem VPN Server noch, dass wir mit einer CRL Liste arbeiten, die er sich doch bitte ansehen soll. Dazu fügen wir folgende Zeile in die VPN-Konfig + +crl-verify /opt/sslcnf/crl.pem + + +Wenn wir nun mit dem revoke-befehl (siehe oben) Zertifikate aussperren, wird diese in einer Stunde in unsere CRL eingetragen. Wer nicht warten will, erstellt sich nach dem revoke eine neue CRL mit gleichem Namen, die alte wird überschrieben. + +Sollte aus Versehen ein Zertifikat gesperrt werden, löscht man den entsprechenden Eintrag aus der index.txt, wartet auf die nächste Aktualisierung oder erstellt die CRL neu. +############ + +############ +Erstellen von Zertifikaten auf dem Server + +Wir melden uns zuerst mit Putty [7] an unseren Server an. Bevor wir mit der Schlüsselerstellung anfangen, noch ein Hinweis. Es wird bei der Erstellung der Schlüssel auch eine Abfrage gestartet, wo Land, Stadt, Benutzer E-Mail usw. eingegeben werden müssen. +Dafür kann man immer die gleiche Bezeichnung nehmen mit einer Ausnahme --> der CommonName muss immer verschieden sein. + +So nun geht?s los: + +Erst wechseln wir in das ssl Verzeichniss + +cd /etc/ssl/ + +Der übersicht halber erstellen wir ein Unterverzeichnis "Zertifikate" wo wir später unsere ganzen erstellten Zertifikate ablegen. + +mkdir Zertifikate + +Jetzt erstellen wir die Schlüssel für unser CA ( Certifikate Authority ) + +openssl genrsa -aes256 -out private/vpn-cakey.pem 2048 + +openssl: startet die Prozedur +genrsa: generiert die Schlüssel +-aes256: ist der Verschlüsselungsalgorithmus +-out: benennt oder erstellt die Ausgabedatei + +Beim ausführen werden wir aufgefordert ein Passwort einzugeben (Enter Pass Phrase for vpn-cakey.pem: ). Diese wird später gebraucht um unsere Zertifikate zu verifizieren. + +Danach erstellen wir unser CA + +openssl req -new -x509 -days 365 -key private/vpn-cakey.pem -out vpn-ca.pem -set_serial 1 + +req: erstellt eine Anfrage ( Request ) +-new: sagt das wir eine neue Anfrage schicken +-x509: verwendeter Standart für das CA +-days: solange ist das Zertifikat gültig +-key: der verwendete Masterschlüssel zum erstellen des CA +-set_serial: die Seriennummer die hochgezählt wird. + +Jetzt müssen noch die Clientzertifikate erstellt werden. Der Serverschlüssel wird als erstes von den Schlüsselpaaren erstellt + +touch index.txt && echo "01" > serial + +index.txt: damit man später die Zertifikate sperren kann +echo ?01? > serial: um eine 1 in die Serialdatei zu schreiben + +Jetzt erstellen wir die Zertifikatanfrage und den Schlüssel + +openssl req -new -newkey rsa:2048 -out Zertifikate/server_csr.pem -nodes -keyout private/server_key.pem -days 365 + +newkey: erstellt einen neuen Schlüsselbund +rsa:2048: ist die Schlüssellänge (1024 sollten aber auch ausreichen aber 2048 ist besser) +-nodes: es wird kein Passwort auf das Zertifikt gelegt ( sollte aber bei den Clientzertifikaten nicht verwendet werden ) +-keyout: Ausgabe des Schlüssel in die Datei +server_csr.pem: Zertifikatanfrage + +So jetzt der Schlüssel und das signierte Zertifikat + +openssl x509 -req -in Zertifikate/server_csr.pem -out Zertifikate/server_cert.pem -CA vpn-ca.pem -CAkey private/vpn-cakey.pem + -CAserial serial -days 365 + +-in: sagt uns welche Zertifikatanfrage verarbeitet werden soll +-out: Zertifikatname +-CA: für das Unterzeichnen des Zertifikates +-Cakey: Masterschlüssel für das erstellen des Zertifikates + +Nun die Clients ( im Prinzip daselbe wie beim Server ) + +openssl req -new -newkey rsa:2048 -out Zertifikate/Client1_csr.pem -keyout private/Client1_key.pem -days 365 + +openssl x509 -req -in Zertifikate/Client1_csr.pem -out Zertifikate/Client1_cert.pem -CA vpn-ca.pem + -CAkey private/vpn-cakey.pem -CAserial serial -days 365 + +Zum Schluss noch den Diffie Hellman Parameter [9] erzeugen. + +openssl dhparam -out dh2048.pem 2048 + +Da das erzeugen des Diffie Hellman Parameter sehr lange dauert reichen hier auch 1024 für den normalen gebrauch völlig aus. Muss dann aber in der Config von 2048 auf 1024 geändert werden. +[bearbeiten] Erstellen der Config-Dateien + +Nun müssen wir die Configdateien für den Server und für den Client erstellen. Dieses habe ich auf meinen Windowsrechner mit dem Texteditor gemacht. Beim speichern ist darauf zu achten, dass die Config für den Server unter "Server.ovpn" und die Config für den Windows Client unter "Client.ovpn" gespeichert werden. Bei Speicher darauf achten das die endung ".ovpn" bleibt. +[bearbeiten] Server-Config (Server.ovpn) + +# Port Standardport 1194 +port 1194 + +# Die Revoke Liste überprüfen +#crl-verify /etc/ssl/crl.pem + +# TCP oder UDP? +proto udp +mode server +tls-server + +dev tap + +#Unsere Server IP +ifconfig 192.168.100.1 255.255.255.0 +ifconfig-pool 192.168.100.2 192.168.100.9 +#Server IP Adresse (Adressbereich. in dem Fall alles von 10.10.10.0) +#server + +#Wo liegen unsere Zertifikate +ca /etc/ssl/vpn-ca.pem +cert /etc/ssl/Zertifikate/server_cert.pem +key /etc/ssl/private/server_key.pem + +#Diffie-Hellmann Parameter +dh /etc/ssl/dh2048.pem + +#Die Selbe IP in der nächsten Sitzung vergeben +#ifconfig-pool-persist ipp.txt + +#IPs in den IP Tables eintragen, DNS neu vergeben und über Den Server das Routing machen, dass man z.B. über den Tunnel auf ein +# lokales Intranet zuzugreifen +#push "route 10.0.0.0 255.0.0.0" +#push "dhcp-option DNS 192.168.1.xyz" +#push "redirect-gateway" +#push "route 0.0.0.0 0.0.0.0" + +#Authentifizierungsmethode +auth SHA1 + +#Verschlüsselungs Algorithmus +cipher aes-256-cbc + +#Benutze Komprimierung +comp-lzo + +#Setzt die Rechte +user nobody +group nogroup + +#Wird wegen user nobody/group nobody benötigt. +persist-key +persist-tun + +#Logging 0, (Zum testen:5) +verb 7 + +Weitere Befehle kann man sich auch noch hier [10] anschauen. + +Bitte die Client-Config nicht blind kopieren. Es muss noch die "Serveradresse" durch die IP von deinem Server ersetzt werden. +[bearbeiten] Client-Config (Client.ovpn) + +#Festlegen als was fungiert wird +tls-client +pull + +# Methode festlegen tun oder tap +dev tap + +# Protokoll auswaehlen udp oder tcp +proto udp + +# IP/Name und Port des Servers +remote Serveradresse 1194 + +# Auflösen des Hostnames des Servers (wegen nicht permanent mit dem Internet verbundenen Rechnern) +resolv-retry infinite + +# Localen Port festlegen oder freigeben +nobind + + +# Verbindung immer gleich halten +persist-key +persist-tun + +#zu verwendende Zertifikate und Schlüssel +ca C:\\Programme\\Openvpn\\config\\vpn-ca.pem +cert C:\\Programme\\Openvpn\\config\\Client1_cert.pem +key C:\\Programme\\Openvpn\\config\\Client1_key.pem + +# Verschlüsselung +cipher AES-256-CBC + +# Komprimiernug +comp-lzo + +# Authentifizierungsmethode +auth SHA1 + +# "Gesprächigkeit" des Tunnels +verb 3 + +# Silence repeating messages +mute 20 + +Weitere Befehle kann man sich auch noch hier [10] anschauen. +So nun folgende Dateien mit WinSCP [8] auf unseren Clientrechner unter "C:\Prorgamme\OpenVPN\config" kopieren + +vpn-ca.pem +client1_cert.pem +client1_key.pem +Client.ovpn + +Wir sind fast fertig mit der Installation. +Nur noch unsere erstellte "Server.ovpn" mit WinSCP [8] auf den Server unter + +/etc/openvpn/ + +kopieren. + +Um spätere Warnungen zu vermeiden ändern wir noch die Rechte der "server_key.pem" ab: + + chmod 600 /etc/ssl/private/server_key.pem + +[bearbeiten] Serverconfig testen + +Bevor wir den Tunnel starten, sollten wir die Config mal testen: + +openvpn --config /etc/openvpn/Server.ovpn + +Hier sollten keine Fehler auftauchen. +[bearbeiten] Tunnel starten + +Wenn wir beim Configtest keine Fehler erhalten haben können wir das ganze jetzt starten: + +openvpn /etc/openvpn/Server.ovpn + +Sobald der Server läuft können wir versuchen, uns mit dem Client zu verbinden: +Am Client auf Start -> Programme -> OpenVPN -> OpenVPN GUI + +In der Taskleiste erscheint dann ein Symbol mit 2 roten Bildschirmen und einer Weltkugel. Dieses Symbol klicken wir mit der ?rechten Maustaste? an Dann gehen wir im Auswahlfeld auf "Verbinden", geben unser Passwort ein und klicken auf ?Ok?. Nun wird eine Verbindung zum Server aufgebaut. Dies sieht man daran, das das VPN-Symbol von rot auf gelb wechselt. Ist der Verbindungsaufbau abgeschlossen erscheint das VPN-Symbol in grün. + +Und "Hurra" wir haben einen VPN-Tunnel zu unserem Server aufgebaut. + +So dies ist eine kleine Anleitung wie ich meine erste VPN-Verbindung mit OpenVPN aufgebaut habe. +############ diff --git a/openwrt.txt b/openwrt.txt new file mode 100644 index 0000000..6d9eecf --- /dev/null +++ b/openwrt.txt @@ -0,0 +1,290 @@ +###scripte: openwrt +###usbstick 3g/umts nutzen +###www: http://wiki.openwrt.org/doc/recipes/3gdongle +#benötigte Paktet installieren +opkg install comgt kmod-usb2 kmod-usb-acm kmod-usb-ohci kmod-usb-serial-option kmod-usb-serial-wwan kmod-usb-uhci usb-modeswitch usb-modeswitch-data +#Netzwerk konfigurieren +edit file: /etc/config/network +# +config interface wan + option ifname ppp0 + option pincode 1234 + option device /dev/ttyUSB0 + option apn your.apn + option service umts + option proto 3g + option username yourusername + option password yourpassword +# +#chatscripte einrichten +edit file: /etc/chatscripts/3g.chat +# +ABORT BUSY +ABORT 'NO CARRIER' +ABORT ERROR +REPORT CONNECT +TIMEOUT 12 +"" "AT&F" +OK "ATE1" +OK 'AT+CGDCONT=1,"IP","$USE_APN"' +ABORT 'NO CARRIER' +TIMEOUT 15 +OK "ATD*99***1#" +CONNECT ' ' +#wenn man das noch mit einfügt dann wird die Signalqualität mit angezeigt +"" "AT+CSQ" +#starten der wan Verbindung +ifup wan +###Signalstärke anzeigen lassen +gcom info -d /dev/ttyUSBx +###firewall für wan +file: /etc/config/firewall +# +config 'zone' + option 'name' 'wan' + option 'input' 'REJECT' + option 'output' 'ACCEPT' + option 'forward' 'REJECT' + option 'masq' '1' + option 'mtu_fix' '1' + option 'network' 'wan' +# +###loadbalancer für multiwan +file: +config 'interface' 'wan' + option 'proto' '3g' + option 'service' 'umts' + option 'device' '/dev/ttyUSB0' + option 'apn' 'vpn' + option 'pincode' '' + option 'username' 'vpn' + option 'password' 'vpn' + option 'maxwait' '20' + option 'defaultroute' '0' + +config 'interface' 'wan2' + option 'proto' '3g' + option 'service' 'umts' + option 'device' '/dev/ttyUSB3' + option 'apn' 'erainternet' + option 'pincode' '' + option 'username' 'erainternet' + option 'password' 'erainternet' + option 'maxwait' '10' + option 'defaultroute' '0' +###uci nutzen import von dhcp.conf und merge die schon vorhanden werte +uci import -m dhcp < /etc/config/dhcp.conf +###anzeigen aller werte +uci show +###setzen eines bestimmten werte +uci set .
[.