Sonntag, 17. April 2016

Den eigenen SSH Public Key auf einem UniFi Access Point hinterlegen

Um sich ohne Passwort auf einen UniFi Access Point einzuloggen, ist der SSH Public Key auf dem Access Point in folgender Datei zu hinterlegen:

Persistent

Folgende Anpassungen überlebt Reboots des Access Points und ist dementsprechend die einzig zuverlässige Variante ohne böse Überraschungen.

Auf dem Server, der als UniFi-Controller dient, legt man eine Datei namens config.properties an, die folgende Zeilen enthält:

config.system_cfg.1=sshd.auth.key.1.status=enabled
config.system_cfg.2=sshd.auth.key.1.value=AAA...== Beschreibung des Public Keys 1
config.system_cfg.3=sshd.auth.key.1.type=ssh-rsa

config.system_cfg.4=sshd.auth.key.2.status=enabled
config.system_cfg.5=sshd.auth.key.2.value=AAA...== Beschreibung des Public Keys 2
config.system_cfg.6=sshd.auth.key.2.type=ssh-rsa

config.system_cfg.7=sshd.auth.key.3.status=enabled
config.system_cfg.8=sshd.auth.key.3.value=AAA...== Beschreibung des Public Keys 3
config.system_cfg.9=sshd.auth.key.3.type=ssh-rsa

config.system_cfg.10=sshd.auth.key.4.status=enabled
config.system_cfg.11=sshd.auth.key.4.value=AAA...== Beschreibung des Public Keys 4
config.system_cfg.12=sshd.auth.key.4.type=ssh-rsa

Im obigen Beispiel konfiguriere ich insgesamt vier Public Keys (sshd.auth.key.1 bis sshd.auth.key.4). Wer nur einen Schlüssel hinterlegen muss, pflegt dementsprechend nur die ersten drei Zeilen in die Datei ein.

Dem Wert sshd.auth.key.1.value weist man den ganzen Public Key zu, ohne aber den Typ (bei mir ssh-rsa) zu erwähnen. Auch Anführungszeichen sind nicht nötig, wenn dem Public Key noch eine Beschreibung mit Leerschlägen folgt (ist bei mir der Fall).

Der Pfad zu dieser Datei hängt vom Betriebssystem und den im Controller definierten Site-Namen ab. Bei mir (Debian GNU/Linux, Site-Name „default“) lautet der Pfad /var/lib/unifi/sites/default/config.properties.

Die Inspiration für dieses Prozedere habe ich dem Artikel UniFi – Add Custom SSH Keys to Your UniFi Devices entnommen.

Den Site-Namen findet man mit folgender Anleitung heraus: UniFi – config.properties File Explanation. Weitere Optionen (bspw. Public Keys, die nur auf einzelne Access Points ausgerollt werden) findet man im Artikel UniFi – How to make persistent changes to UAP(s) system.cfg.

Nicht persistent

Folgende, je nach Firmware unterschiedliche Methoden, erlauben ebenfalls den passwortlosen Login. Nach dem nächsten Neustart des Access Points müssen die Schritte aber zwingend wiederholt werden — die Anpassungen sind nicht persistent.

Firmware 3.4.19

/etc/persistent/.ssh/authorized_keys

Via: ssh key based auth

Wie ich im Januar 2017 bemerken musste, konnte ich mich so nicht mehr mit meinen SSH-Schlüsseln auf die UniFi Access Points einloggen. Nach einer Stunde debuggen dann endlich die Erkenntnis:

Firmware 3.7.28.5442

/etc/dropbear/authorized_keys

Evtl. ist auch noch folgender Befehl nötig (das merke ich spätestens beim nächsten Reboot):

# cfgmtd -w -p /etc

Quelle: Unifi AP: Maintaining SSH access whilst disabling password logins (authorized_keys only) sowie Hacking the KanKun Smartplug – HowTo: Login to SSH on BusyBox (DropBear) Without a Password

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 17. April 2016

Photos in einem iPhoto Smart Album löschen

So simpel, wenn man den Trick kennt:

If I then click on the Photos menu and hold down the Option key I can choose to move any selected images to the trash.

Quelle: Tips for locating (and deleting) iPhoto images

Auf Deutsch: Ich wähle alle Photos eines Smart Albums aus, welche ich gelöscht haben möchte (sie sind dann gelb umrandet). Anschliessend drücke ich die Option-Tast (⌘) und klicke — während ich die Taste gedrückt halte — auf den Menupunkt „Photos“. Das vorher ausgegraute „Move to Trash“ ist nun wählbar. Je nach Zahl der ausgewählten Photos dauert der Löschprozess eine Weile.

Ich habe diese Funktionalität genutzt, um alle Screenshots von iOS-Geräten in meiner iPhoto Library zu löschen (nachdem ich diese in einen Ordner im Dateisystem kopiert habe — dort machen die Screenshots mehr Sinn).

Hierzu habe ich ein Smart Album erstellt, welches Photos findet, die die Dateiendung PNG tragen:

iPhoto Smart Album PNG iOS Screenshots

Tags: , ,
Labels: Apple

Keine Kommentare | neuen Kommentar verfassen

Samstag, 2. April 2016

Lackschäden am Auto beheben

Vor einigen Tagen kam es in einer Tiefgarage zu einer ungewollten Streifung zwischen unserem Yaris und einer Betonsäule. Das Auto zeigte hinten links über dem Radkasten und an der Stossstange entsprechende Schrammen und fremde Farbablagerungen.

Von meinen Automechaniker-Kollegen liess ich mir erklären, wie man solche Lackschäden an einem bald 13-jährigen Auto behebt:

Nagellack-Entferner

Zuerst dachte ich, dass mich die Kollegen verarschen — aber es funktioniert tatsächlich: Um die Farbablagerungen wegzukriegen, benötigt man als Lösungsmittel einen Nagellack-Entferner. Ich habe einen solchen für genau solche Einsätze im heimischen Werkzeugschrank abgelegt (meine Frau weiss nichts davon).

Ich habe dafür den MIGROS M-Classic Nagellack-Entferner ohne Aceton verwendet (100ml, 1.50 CHF).

Putzfäden

Um die Farbe vom Lack abzureiben, bedient man sich sogenannter Putzfäden. Diese Fäden habe ich im MIGROS Do it + Garden Bern–Marktgasse gekauft:

Putzfäden (1kg, 4.50 CHF)

Lackstift

Nachdem die Farbe und sonstige Ablagerungen vom Lack entfernt sind, verbleiben wohl in den meisten Fällen Stellen, bei denen der Lack vollständig abgetragen wurde und das Metall oder Plastic durchschimmert (bei unserem Auto: in schwarzer Farbe).

Diese Stellen kann man mit einem Lackstift in der Autofarbe abdecken. Es handelt sich um einen kleinen Pinsel in einem Gefäss — das Vorgehen ist identisch mit Tipp-Ex und Schreibfehlern.

Lackfarbe

Dabei ist es aber äusserst wichtig, dass man diejenige Lackstiftfarbe erwischt, die der Karrosseriefarbe des Autos entspricht. Diese Farbe habe ich herausgefunden, indem ich das Typenschild im Motorraum näher inspiziert habe (die Motorhaube muss geöffnet werden).

Bei unserem Toyota Yaris mit Jahrgang 2003 schlüsselten die ersten drei Ziffern in der untersten Zeile des Typenschildes die verwendete Lackfarbe auf: 1E7.

Umschlüsselung auf Lackstift

Im MIGROS Do it + Garden Bern–Marktgasse gibt es ein Regal, in welchem hunderte Lackstifte der Marke Motip (Firma MOTIP DUPLI GmbH aus Hassmersheim) gelagert werden. Damit man nun die richtige Farbe für das eigene Auto schnappen kann, sucht man den daneben angebrachten Prospekt, blättert auf die mit „Toyota“ bezeichnete Seite und sucht in der ersten Spalte den Farbcode. Hat man diesen gefunden, findet man in der Spalte ganz rechts den Motip Farbcode.

Für mich war dies der Stift mit Nummer 955300. Gekostet hat dieser 10.90 CHF.

Tags: , , , , , , , , , , , , , ,
Labels: Leben

Keine Kommentare | neuen Kommentar verfassen

Samstag, 2. April 2016

monit mit MacPorts unter OS X El Capitan installieren (mit angeblich fehlenden OpenSSL-Headern)

Vor einigen Tagen habe ich mich entschieden, mein MacBook Air (Late 2010) komplett platt zu machen und OS X El Capitan darauf zu installieren.

Nach der Neuinstallation musste ich auch alle meine MacPorts-Packages neu installieren. Leider gab es Probleme bei der Installation des Pakets monit:

$ sudo port install monit
Password:
---> Computing dependencies for monit
---> Configuring monit
Error: Failed to configure monit, consult /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_sysutils_monit/monit/work/monit-5.12.1/config.log
Error: org.macports.configure for port monit returned: configure failure: command execution failed
Please see the log file for port monit for details:
   /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_sysutils_monit/monit/main.log
To report a bug, follow the instructions in the guide:
   http://guide.macports.org/#project.tickets
Error: Processing of port monit failed

Ein Blick in /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_sysutils_monit/monit/main.log zeigte folgende detailliertere Fehlermeldung:

...
:info:configure checking for static SSL support... disabled
:info:configure checking for SSL support... enabled
:info:configure checking for SSL include directory... Not found
:info:configure 
:info:configure Couldn't find your SSL header files.
:info:configure Use --with-ssl-incl-dir option to fix this problem or disable
:info:configure the SSL support with --without-ssl
:info:configure 
:info:configure Command failed: cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_sysutils_monit/monit/work/monit-5.12.1" && ./configure --prefix=/opt/local 
:info:configure Exit code: 1
:error:configure Failed to configure monit, consult /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_sysutils_monit/monit/work/monit-5.12.1/config.log
:error:configure org.macports.configure for port monit returned: configure failure: command execution failed
:debug:configure Error code: NONE
:debug:configure Backtrace: configure failure: command execution failed
   while executing
"portconfigure::configure_main org.macports.configure"
   ("eval" body line 1)
   invoked from within
"eval $procedure $targetname"
:info:configure Warning: targets not executed for monit: org.macports.activate org.macports.configure org.macports.build org.macports.destroot org.macports.install
:notice:configure Please see the log file for port monit for details:
   /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_sysutils_monit/monit/main.log

Der relevante Teil des Logs:

...
:info:configure Couldn't find your SSL header files.
:info:configure Use --with-ssl-incl-dir option to fix this problem or disable
:info:configure the SSL support with --without-ssl
...

MacPorts openssl war aber installiert und die Header-Files fanden sich im Pfad /opt/local/include/openssl. Den Pfad hatte ich mit einer Suche nach ssl.h ausgemacht.

Nach mehr als einer Stunde Google-Suche war ich immer noch nicht weiter. Da kam mir der Geistesblitz: Das configure-Script von monit wird die SSL-Headers wohl im Standardverzeichnis suchen. Offenbar gibt es dieses Verzeichnis nicht, weshalb die Installation scheitert … wenn ich aber herausfinde, wie das Standardverzeichnis lautet, kann ich dieses mit einem Symlink auf das MacPorts-Verzeichnis umbiegen und die Installation sollte durchlaufen.

Gesagt, getan. Als erstes startete ich in einem Terminal-Fenster die Installation von monit:

$ sudo port install monit

In einem zweiten Tab führte ich dann folgenden Befehl aus, um alle Zugriffe auf das Dateisystem zu loggen:

$ sudo fs_usage

Nachdem das Tab mit dem MacPorts-Befehl wieder „bash“ als Titel anzeigte, stoppte ich fs_usage mit Ctrl-C. Anschliessend kopierte ich den ganzen Text in eine Textdatei, speicherte diese auf dem Desktop ab und begann, den Text zu greppen.

Ganz am Schluss der Aktivitäten kam heraus:

...
18:17:53  stat64            /usr/include/sys/_pthread/_pthread_key_t.h                                 0.000008   clang       
18:17:53  stat64            /usr/include/sys/_types/_fsblkcnt_t.h                                      0.000008   clang       
18:17:53  stat64            /usr/include/sys/_types/_fsfilcnt_t.h                                      0.000008   clang       
18:17:53  stat64            /opt/local/include                                                         0.000013   clang       
18:17:53  stat64            /usr/local/include                                                         0.000005   clang       
18:17:53  stat64            /usr/local/include                                                         0.000004   clang       
18:17:53  stat64            /Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.3.0/include    0.000013   clang       
18:17:53  stat64            .app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include    0.000007   clang       
18:17:53  stat64            /usr/include                                                               0.000005   clang

/usr/local/include tönte vielversprechend nach einem Standardpfad … und Bingo:

$ cd /usr/local/include
-bash: /usr/local/include: No such file or directory

Tönt wie ein Volltreffer. Dann versuchen wir es doch einmal damit:

$ sudo mkdir /usr/local/include
$ cd /usr/local/include
$ sudo ln -s /opt/local/include/openssl .

Alles bereit für den Versuch? Dann los — et voilà:

$ sudo port install monit
--->  Computing dependencies for monit
--->  Configuring monit
--->  Building monit
--->  Staging monit into destroot
--->  Creating launchd control script
###########################################################
# A startup item has been generated that will aid in
# starting monit with launchd. It is disabled
# by default. Execute the following command to start it,
# and to cause it to launch at startup:
#
# sudo port load monit
###########################################################
--->  Installing monit @5.12.1_1
--->  Activating monit @5.12.1_1
--->  Cleaning monit
--->  Updating database of binaries
--->  Scanning binaries for linking errors
--->  No broken files found.

Die Jungs von homebrew haben die Problematik übrigens direkt im config-File gefixt, und zwar mit dem Parameter --with-ssl-dir, welches auf den openssl-Pfad zeigt:

...
def install
    system "./configure", "--prefix=#{prefix}",
                          "--localstatedir=#{var}/monit",
                          "--sysconfdir=#{etc}/monit",
                          "--with-ssl-dir=#{Formula["openssl"].opt_prefix}"
    system "make", "install"
    (share/"monit").install "monitrc"
...

Quelle: homebrew/monit.rb at master

Tags: , , , , , , , ,
Labels: Apple, IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 27. März 2016

Sismics Docs installieren

Als Projekt für das Oster-Wochenende habe ich mir die Installation eines Dokumentenmanagementsystems (DMS) vorgenommen. Ziel ist es, die von mir seit Jahren gescannten Einkaufsbelege sauber in einem Archiv abzulegen und die Belege anschliessend mit meiner selbstprogrammierten Buchhaltungs-Applikation (PHP/MySQL) zu verknüpfen.

Nach einem wenig erfolgsversprechenden Umweg über Alfresco (zu gross, zu komplex, beansprucht zu viele Ressourcen) landete ich schlussendlich bei Sismics Docs, auch wenn dieses in einer Übersicht quelloffener DMS aus dem Jahr 2010 nicht erwähnt wird. Die Screenshots haben mich überzeugt, die Software zu installieren und herunterzuladen.

Da ich mich nicht mit Java-Applikationen auskenne, liefere ich hier eine Installationsanleitung. Sie richtet sich an Personen, welche ausreichend Linux-Erfahrung haben, anstelle aus der Java- aber aus der PHP/MySQL-Ecke kommen.

Repository auschecken

Als erstes legen wir uns eine lokale Kopie des Git-Repositories an:

# mkdir /usr/local/bin/sismics
cd /usr/local/bin/sismics
git clone https://github.com/sismics/docs.git .

To Dock or not to Dock

Unter den Dateien des Repositories finden sich Hinweise darauf, dass der Entwickler Docker zu verwenden scheint; u.a. existieren im Wurzelverzeichnis des Repositories die Dateien Dockerfile, build.sh und run-service.sh.

Ich konnte das Teil mit Docker aber nicht zum Laufen bringen. Dies aus mehreren Gründen:

i686

Der kräftigere meiner beiden Linux-Server, welcher im Elternhaus läuft, hat Debian i686 installiert, ein 32-bit Linux. Docker erfordert x86_64 (64-bit). Ein forciertes Upgrade tönt nach digitalem Selbstmord.

Die Bit-Architektur überprüfen kann man dies mit folgendem Befehl:

$ uname -m
x86_64

Docker installieren

Der Intel NUC, welcher in unserer Mietwohnung im Netzwerk hängt, hat ein x86_64 Linux am Laufen. Deshalb führte ich dort die Installation gemäss der offiziellen Anleitung aus.

Vorgängig musste ich noch herausfinden, welche Debian-Version ich installiert hatte:

# lsb_release -da
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 8.3 (jessie)
Release:	8.3
Codename:	jessie

Quelle: Check what Debian version you are running on your Linux system

Jessie! Anschliessend folgte ich der offiziellen Anleitung:

# apt-get install apt-transport-https ca-certificates
# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
# echo "deb https://apt.dockerproject.org/repo debian-jessie main" > /etc/apt/sources.list.d/docker.list
# apt-get update
# apt-get install docker-engine
# service docker start
# docker run hello-world

Bingo, Docker läuft.

Image nicht gefunden

Leider funktioniert die Generierung des Images für das Sismics Docs nicht:

# cd /usr/local/bin/sismics
# docker build -t sismics:0.1 .
Sending build context to Docker daemon 14.35 MB
Step 1 : FROM sismics/debian-java7-jetty9
Pulling repository docker.io/sismics/debian-java7-jetty9
Error: image sismics/debian-java7-jetty9 not found

Mit dem Switch -t definiert man das Paket und den Tag (vgl. Docker — build.

*seufz* Okey, dann halt kein Docker.

Manuelle Installation

Nun gut, da wir den Docker-Weg nicht beschreiten können, verlassen wir den Intel NUC und wenden uns wieder dem kräftigeren Server zu.

Pakete

Damit man schon nur die Testumgebung des DMS hockriegt, benötigt man folgende Pakete:

# apt-get install maven tesseract-ocr openjdk-7-jdk

Testinstallation bauen

Sobald die Pakete auf dem Rechner liegen, bauen wir uns die Testinstallation:

# cd /usr/local/bin/sismics/docs-parent
# mvn clean -DskipTests install
...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Docs Parent ........................................ SUCCESS [  7.114 s]
[INFO] Docs Core .......................................... SUCCESS [01:37 min]
[INFO] Docs Web Commons ................................... SUCCESS [ 47.086 s]
[INFO] Docs Web ........................................... SUCCESS [ 30.833 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:02 min
[INFO] Finished at: 2016-03-27T09:52:29+00:00
[INFO] Final Memory: 34M/94M
[INFO] ------------------------------------------------------------------------

Testinstallation starten

Nun starten wir die Testinstallation, um zu sehen, ob alles wie gewünscht funktioniert:

# cd /usr/local/bin/sismics/docs-web
mvn jetty:run
...
[INFO] Started ServerConnector@b40c2f{HTTP/1.1}{0.0.0.0:8080}
[INFO] Started @23372ms
[INFO] Started Jetty Server

Sobald diese Anzeige erscheint, können wir mit einem Web-Browser auf den Applikationsserver zugreifen:

10.1.2.3:8080/docs-web/src/

Das Standardpasswort des Administrator-Kontos lautet admin, wie eine Suche durch den Quellcode offenbart:

$ ack passw
...
docs-core/src/main/java/com/sismics/docs/core/constant/Constants.java
19:     * Administrator's default password ("admin").
...

Java Advanced Imaging

Die Web-Oberfläche funktioniert, man kann Dateien hochladen — doch ausgerechnet das erste PDF produzierte folgende Fehlermeldung im Log der Applikation:

Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed

Diese Tools installiert man sich folgendermassen:

$ cd /tmp
$ wget "https://install-java-jai-imageio.googlecode.com/files/install-java-jai-imageio"
# bash /tmp/install-java-jai-imageio

Quelle: Install Java Advanced Imaging ImageIO Tools on a Linux Machine

ACHTUNG: Bitte den Inhalt aller aus dem Netz heruntergeladenen Bash-Scripts gründlich prüfen, bevor man sie unter dem root-Account ausführt.

Weitere Pakete installieren

Rückblickendes Ziel meines Sonntagsprojekts war es, die Applikation unter dem Java-Applikationsserver Jetty persistent zum Laufen zu bringen. Hierzu bauen wir uns ein sog. war-File. Damit das auch sauber funktioniert, benötigen wir folgende Pakete:

# apt-get install nodejs npm
# ln -s /usr/bin/nodejs /usr/bin/node
# npm install -g grunt-cli

Wir sehen, ob alle nötigen Komponenten da sind, wenn folgende Befehle einen Wert zurückgeben:

$ which node
/usr/bin/node
$ which grunt
/usr/local/bin/grunt

Insbesondere das node-Binary ist zwingend nötig — bei den ersten Kompilationsversuchen erschien folgende Fehlermeldung …

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Docs Web 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ docs-web ---
[INFO] Deleting /usr/local/bin/sismics/docs-web/target
[INFO] 
[INFO] --- maven-antrun-plugin:1.8:run (default) @ docs-web ---
[INFO] Executing tasks

building:
     [exec] /usr/bin/env: ‘node’: No such file or directory
     [exec] Result: 127
[INFO] Executed tasks
[INFO] 
[INFO] --- maven-resources-plugin:2.7:resources (default-resources) @ docs-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 1 resource
[INFO] Copying 1 resource
...

… und ich endete mit einem nur halbwegs funktionsfähigen .war, weil bestimmte nodejs-Komponenten fehlten:

building:
     [exec] /usr/bin/env: ‘node’: No such file or directory
     [exec] Result: 127

Der oben angelegte Symlink löst dieses Problem:

...
building:
     [exec] Running "clean:dist" (clean) task
     [exec] 
     [exec] Running "ngmin:dist" (ngmin) task
     [exec] ngminifying src/app/docs/app.js, src/app/docs/controller/Login.js, src/app/docs/controller/Main.js, src/app/docs/controller/Navigation.js, src/app/docs/controller/document/Document.js, src/app/docs/controller/document/DocumentDefault.js, src/app/docs/controller/document/DocumentEdit.js, src/app/docs/controller/document/DocumentModalPdf.js, src/app/docs/controller/document/DocumentModalShare.js, src/app/docs/controller/document/DocumentView.js, src/app/docs/controller/document/DocumentViewActivity.js, src/app/docs/controller/document/DocumentViewContent.js, src/app/docs/controller/document/DocumentViewPermissions.js, src/app/docs/controller/document/FileModalView.js, src/app/docs/controller/document/FileView.js, src/app/docs/controller/settings/Settings.js, src/app/docs/controller/settings/SettingsAccount.js, src/app/docs/controller/settings/SettingsDefault.js, src/app/docs/controller/settings/SettingsGroup.js, src/app/docs/controller/settings/SettingsGroupEdit.js, src/app/docs/controller/settings/SettingsLog.js, src/app/docs/controller/settings/SettingsSecurity.js, src/app/docs/controller/settings/SettingsSecurityModalDisableTotp.js, src/app/docs/controller/settings/SettingsSession.js, src/app/docs/controller/settings/SettingsUser.js, src/app/docs/controller/settings/SettingsUserEdit.js, src/app/docs/controller/settings/SettingsVocabulary.js, src/app/docs/controller/tag/Tag.js, src/app/docs/controller/usergroup/GroupProfile.js, src/app/docs/controller/usergroup/UserGroup.js, src/app/docs/controller/usergroup/UserProfile.js, src/app/docs/directive/Acl.js, src/app/docs/directive/AuditLog.js, src/app/docs/directive/File.js, src/app/docs/directive/ImgError.js, src/app/docs/directive/InlineEdit.js, src/app/docs/directive/SelectRelation.js, src/app/docs/directive/SelectTag.js, src/app/docs/filter/Filesize.js, src/app/docs/filter/Newline.js, src/app/docs/filter/Shorten.js, src/app/docs/service/Tag.js, src/app/docs/service/User.js, src/app/share/app.js, src/app/share/controller/FileModalView.js, src/app/share/controller/FileView.js, src/app/share/controller/Main.js, src/app/share/controller/Share.js, src/app/share/controller/ShareModalPdf.js, src/app/share/filter/Filesize.js, src/app/share/filter/Newline.js
     [exec] 
     [exec] Running "concat:docs" (concat) task
     [exec] File "dist/docs.js" created.
     [exec] 
     [exec] Running "concat:share" (concat) task
     [exec] File "dist/share.js" created.
     [exec] 
     [exec] Running "less:dist" (less) task
     [exec] File dist/less.css created.
     [exec] 
     [exec] Running "concat:css" (concat) task
     [exec] File "dist/style.css" created.
     [exec] 
     [exec] Running "cssmin:dist" (cssmin) task
     [exec] File 'dist/style/style.min.css' written.
     [exec] Uncompressed size: 165398 bytes.
     [exec] Compressed size: 31032 bytes gzipped (139383 bytes minified).
     [exec] 
     [exec] Running "uglify:docs" (uglify) task
     [exec] File dist/docs.min.js created.
     [exec] 
     [exec] Running "uglify:share" (uglify) task
     [exec] File dist/share.min.js created.
     [exec] 
     [exec] Running "copy:dist" (copy) task
     [exec] Created 23 directories, copied 53 files
     [exec] 
     [exec] Running "remove:dist" (remove) task
     [exec] 
     [exec] Running "cleanempty:src" (cleanempty) task
     [exec] Cleaning dist/locale...OK
     [exec] Cleaning dist/lib...OK
     [exec] 
     [exec] Running "htmlrefs:index" (htmlrefs) task
     [exec] 
     [exec] Running "htmlrefs:share" (htmlrefs) task
     [exec] 
     [exec] Running "replace:dist" (replace) task
     [exec] 
     [exec] Done, without errors.
...

Quelle: run npm command gives error „/usr/bin/env: node: No such file or directory“

.war kompilieren

Nun ist alles da, um das .war zu kompilieren:

# cd /usr/local/bin/sismics/docs-web
# mvn -Pprod -DskipTests clean install
...
[INFO] Installing /usr/local/bin/sismics/docs-web/target/docs-web-1.0-SNAPSHOT.war to /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.war
[INFO] Installing /usr/local/bin/sismics/docs-web/pom.xml to /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.935 s
[INFO] Finished at: 2016-03-27T10:37:55+00:00
[INFO] Final Memory: 28M/68M
[INFO] ------------------------------------------------------------------------

Jetty installieren und das .war bekanntmachen

Als nächstes installiert man Jetty:

# apt-get install jetty9

Sobald Jetty existiert, kopiert man das vorhin kompilierte .war in folgendes Verzeichnis:

# cp /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.war /usr/share/jetty9/webapps/dms.war

ACHTUNG: Es gibt auch ein Verzeichnis /usr/share/jetty/webapps/; Jetty ignoriert dieses aber (meiner Meinung nach). Das .war gehört nicht hierhin.

Datenverzeichnis anlegen

# mkdir /var/docs
# chmod 777 /var/docs

Jetty neu starten

# service jetty9 start

Sismics Docs aufrufen

Sobald Jetty läuft, öffnet man den Browser wieder:

10.1.2.3:8080/dms/

Man loggt sich ein, ändert das Admin-Passwort, erstellt weitere User, lädt ein Testdokument hoch, loggt sich wieder aus — und dann stoppt man Jetty testhalber wieder um sicherzugehen, dass die Daten und Konfiguration auch einen Stop des Applikationsservers überlegen:

# service jetty9 stop
# service jetty9 start

Nun sollte man sich mit dem soeben gesetzten Admin-Passwort einloggen können und das vorher hochgeladene Dokument sehen.

Fertig! Nun kann der Spass beginnen.

Die API-Dokumentation habe ich leider noch nicht gefunden …

Tags: , , , , , , , , ,
Labels: Uncategorized

1 Kommentar | neuen Kommentar verfassen

Sonntag, 20. März 2016

Ookla Speedtest für Fiber7 respektive Init7 konfigurieren

Damit der Ookla Speedtest bei mir sauber funktioniert, habe ich mir ein Benutzerkonto angelegt und folgende Einstellungen gemacht:

Ookla Speedtest Fiber7 Settings

Von grösster Wichtigkeit ist es, folgenden Server als Standardserver auszuwählen:

Winterthur [CH] - Init 7

(Gemäss dem HTML-Quellcode handelt es sich um den Server mit der Ookla-ID 3026)

Nur so testet man die theoretisch verfügbare Geschwindigkeit zwischen dem eigenen Router, der Telefonzentrale, in welche das Fiber- respektive das Kupferkabel führt, und dem ISP-internen Netzwerk.

Auf der Test-Oberfläche ist dann der Button „BEGIN TEST. YOUR PREFERRED SERVER“ zu wählen:

Ookla Speedtest Begin Test Preferred Server

Nachtrag

Noch einfacher geht es für uns Linux-Geeks von der Kommandozeile. Ein findiger Zeitgenosse scheint das Ookla Speedtest-Protokoll reverse engineered und seine Erkenntnisse in einem Python-Script zusammengefasst zu haben.

Nachdem man das Script heruntergeladen und ausführbar gemacht hat, misst man die Geschwindigkeit zum Init7/Fiber7-Speedtest-Server folgendermassen:

$ ./speedtest-cli --server 3026
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Init7 (Switzerland) Ltd. (85.195.234.162)...
Hosted by Init 7 (Winterthur) [117.24 km]: 3.615 ms
Testing download speed........................................
Download: 584.35 Mbit/s
Testing upload speed..................................................
Upload: 498.04 Mbit/s

Tags: , , , , , , , , , , , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 20. März 2016

Gigabit FTTH mit Asus RT-AC66U? Hände weg von DD-WRT!

Ende Januar 2016 wurde unsere Wohnung mit Fiber to the Home (FTTH) von Fiber7 (einer Tochter von Init7) erschlossen. Das konkurrenzlos günstige Angebot umfasst eine symmetrische 1 Gbit/s-Anbindung für weniger als 65 CHF pro Monat.

Die Verbindung zum Internet stelle ich mit einem Asus RT-AC66U und dem optischen Wandler TP-Link MC220L her. Auf dem Asus RT-AC66U lief bis letzte Woche DD-WRT mit dem Release r26332 vom 22. Februar 2015.

Von Powerline zu Ethernet-Kabel

Da ich mich beim Besuch der Elektriker von BKW ISP AG dazu entschied, den OTO im Wohnzimmer installieren zu lassen (die Alternative wäre das Büro gewesen), stellte sich mir das Problem, dass ich bis vor kurzem die maximale ISP-Geschwindigkeit nicht testen konnte: In der Stube betreibe ich einige Multimedia-Geräte wie den TV, den Apple TV sowie einen UniFi AP-PRO. Nur der UniFi WLAN-Access Point verfügt über einen Gigabit-Ethernet-Port — doch mit dem Access Point lässt sich die maximale Performance des Internetanschlusses nur schlecht testen.

Ein Geschwindigkeitstest mit der von Fiber7 empfohlenen Apple TV-App Ookla Speedtest zeigte Durchsätze von annähernd 100 MBit/s — sowohl für den Up- wie auch Downstream. Durchaus realistisch, wenn man bedenkt, dass der Apple TV nur mit einer Fast Ethernet-Schnittstelle ausgestattet ist.

Erst als ich von Digitec das lange vergriffene Wirewin Netzwerkkabel (25m, Weiss, STP, Kat. 6, Flachband) Kabel geliefert bekam, konnte ich das Büro direkt mit einem Cat 6-Netzwerkkabel erschliessen. Ich schaffte es, das Kabel der Fussleiste entlang und unter zwei Türleisten hindurch zu verlegen und so die zwei Gigabit-Switches TP-LINK SG1016D (Büro) und ZyXEL GS1100-8HP (Stube, mit PoE) miteinander zu verbinden.

In der Zwischenzeit verwendete ich ein Powerline-Produkt namens Devolo dLAN 500 duo+, um Stube und Büro über die Stromverkabelung zu verbinden. Der Frevel an der Sache: Ganze 50 MBit/s brachte ich so über die Leitung.

Erster Speedtest

Nun also waren der Mac mini und der iMac mit Gigabit-Ethernet an den Internet-Router angebunden. Voller Spannung startete ich den ersten von Init7 gehosteten Ookla Speedtest vom Mac mini aus — und erhielt mehrmals in der Folge folgende Messwerte zu Gesicht:

Ookla Speedtest Fiber7 DD-WRT

Was zum Teufel? Verkauft mir Fiber7 vielleicht nur ein Zehntel des angepriesenen Durchsatzes?

Netzwerkkabel testen

Um das Problem einzugrenzen, teste ich als erstes das soeben verlegte Netzwerkkabel: Auf dem Mac mini startete ich iperf im Server-Modus:

$ iperf -s

Dann ging ich ins Wohnzimmer und verband einen Toshiba-Laptop mit integriertem Gigabit-Port an den Switch im TV-Schrank und lud mir iperf in der Version 2.0.5-3 auf den Rechner. Ich öffnete eine Kommandozeile und führte folgenden Befehl aus:

$ iperf -c 10.1.2.3

Der Mac mini zeigte darauf folgende Durchsätze an:

------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 128 KByte (default)
------------------------------------------------------------
[ 4] local 10.1.2.3 port 5001 connected with 10.1.2.4 port 56432
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 721 MBytes 604 Mbits/sec
...

Am Ethernet-Kabel von der Stube ins Büro konnte es also definitiv nicht liegen.

Direkt am Router

Ich schloss den Laptop per Kabel direkt an den Router an und führte den Oookla-Geschwindigkeitstest erneut durch: Auch hier wieder der „mickrige“ Durchsatz in der Grössenordnung von Fast Ethernet (100 Mbit/s). Lag das Problem allenfalls am Geschwindigkeitstest, bspw. am Server von Fiber7?

Ookla Geschwindigkeitstest testen

Ich machte mich auf die Suche nach einem im Internet verfügbaren iperf-Server und wurde auf der iperf-Web-Site fündig: Public iPerf3 servers. Ich wählte debit.k-net.fr, installierte auch noch iperf 3 und führte dann den Test aus:

$ iperf -c debit.k-net.fr

Auch bei dieser Aktion kam ich nicht nur annähernd in die Nähe der erwarteten 1 Gbit/s. Somit war für mich bewiesen, dass das Problem zwischen Router und dem ISP liegen musste. Doch wo genau?

DD-WRT

Langsam aber sicher wuchs in mir das Misstrauen gegenüber der Frickelware DD-WRT. Was, wenn die Open Source-Firmware die Performance des Routers einbrechen liess?

Ich informierte mich im Netz über die offizielle Firmware des Routers und durfte erfreut feststellen, dass das letzte Update kürzlich, am 28. Januar 2016, veröffentlicht worden war. Nach einer kurzen Recherche stiess ich auch auf die vom User „Merlin“ modifizierte Version der Firmware. Ich entschied mich, den Firmware-Wechsel zu wagen und zog Asuswrt-Merlin in der Version RT-AC66U_380.57_0 dem offiziellen Firmware von Asus vor.

Frühlingsputz: DHCP und VPN

Bevor ich aber das Vorhaben startete, entschied ich mich angesichts eines im April bevorstehenden Routerwechsels zwei Funktionalitäten vom Router weg auf einen Linux-Server zu verlagern: Den DHCP-Server sowie ein OpenVPN Site-to-Site-VPN zu meinem Elternhaus. Wie ich erst zu dem Zeitpunkt realisierte, gehört solche Funktionalität nicht auf einen Consumer-Router, sondern auf einen schicken, kleinen Linux-Server (Intel NUC), welcher ein „anständiges“ Linux, ausreichend Speicherplatz und Subversion-Anbindung möglich macht.

Asuswrt-Merlin

Wie in einem Artikel auf DD-WRT beschrieben, setzte ich den Router über das DD-WRT auf die Werkseinstellungen zurück. Anschliessend lud ich über das Web-Interface die Firmware (.trx) auf den Router und wartete den Transfer sowie die Installation ab. Der Router kam problemlos hoch und erschien nun mit der neuen, standardmässigen Oberfläche.

Nach einem erneuten NVRAM-Reset funktionierte auch die Konfiguration: Das NVRAM voller DD-WRT-Variablen wurde beim Rücksetzen nämlich irgendwie nicht gelöscht und überschritt plötzlich das maximal mögliche Volumen von 65 KB, weshalb die Routeroberfläche subtile Fehlfunktionen und Fehlermeldungen aufwies.

1 GBit/s!

Nachdem ich die Konfiguration des Routers abgeschlossen hatte, führte ich voller Spannung den nächsten Speedtest durch. Hatte sich der Aufwand, der mich fast das gesamte Wochenende gekostet hatte, gelohnt?

Ookla Speedtest Fiber7 Asuswrt-Merlin

Beruhigt lehnte ich mich in den Bürosessel zurück und feierte innerlich der Beginn des nächsten Breitbandzeitalters.

Tags: , , , , , , , ,
Labels: IT

4 Kommentare | neuen Kommentar verfassen

Freitag, 11. März 2016

Ist Dune der Vater von Alien, Star Wars und Terminator?

It’s like a Hollywood failed movie project. In the end, they decide not to move forward with the project, shutting it down. The employees then go off to different companies, taking those ideas with them, using them in unrelated movie projects. That’s the story told in the award-winning documentary Jodorowsky’s Dune, which ties that production to other unrelated movies, like Alien, Star Wars, and Terminator.

Quelle: Can the Apple code be misused?

Tags: , , , ,
Labels: Unterhaltung

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 2. März 2016

Apple meldet „Die Transaktion kann für den ausgewählten Standort nicht ausgeführt werden“

Vor einigen Wochen habe ich mir mit Seriennummern von allen je von mir gekauften Apple-Geräten dutzende Netzteilstecker bestellt. Apple hat diesen Rückruf lanciert, weil das Unternehmen realisiert hat, dass ältere Stecker den Qualitätskriterien nicht genügen und die Besitzer im schlimmsten Fall durch einen Stromschlag töten können.

Die für die Abwicklung des Rückrufs von Apple programmierte Web-Seite lässt aber zu wünschen übrig: Nachdem man den ersten Netzteilstecker bestellt hat, muss man den Browser komplett schliessen. Ansonsten sieht man sich folgender Fehlermeldung gegenüber, wenn man die zweite Seriennummer absenden will:

Apple Transaktion Standort

PS: Die Pakete sind übrigens immer noch nicht bei meinem Arbeitgeber eingetroffen. Auf der Status-Seite von Apple steckt der Prozess bei Schritt 2 von 3 fest: „Ersatzversand wird bearbeitet“. Bestellt habe ich die Netzteilstecker am 9. Februar …

Tags: , , ,
Labels: Apple

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 2. März 2016

Der Tagi-Webmaster sollte seinen produktiven Server besser konfigurieren

display_errors = On gehört nun einfach wirklich nicht auf den Produktionsserver. Anfänger.

Tagesanzeiger Exception

Tags: , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen