Archiv ‘IT’

Dienstag, 13. Dezember 2016

~/Library/Caches/com.apple.bird gigantisch

Wie bereits an folgenden Orten dokumentiert ist auch mein com.apple.bird auf 48.9 GB angewachsen:

Ein auf Github gefundenes Script namens blame-bird.py habe ich ausgeführt; das Resultat:

$ python blame-bird.py 
com.apple.Numbers                                   0.00MB      1
F6266T9T75.com.apple.iMovie                         0.00MB      1
LWL9XTYF8Q.com.syniumsoftware.macfamilytree7        0.00MB      1
com.apple.Pages                                     0.00MB      2
com.apple.Keynote                                   0.00MB      2
8YE23NZS57.com.kayak.travel                         0.00MB      3
iCloud.com.bodunov.galileo                          0.00MB      7
com.apple.mail                                      0.00MB     16
com.apple.TextInput                                 0.00MB     37
com.apple.TextEdit                                  0.00MB      3
4R6749AYRE.com.pixelmatorteam.pixelmator            0.00MB     53
com.apple.shoebox                                   0.00MB     38
iCloud.com.apple.iBooks                             0.02MB    310
57T9237FN3.net.whatsapp.WhatsApp                35564.12MB    717

Accounted for: 35564MB.  Still unaccounted: 16968MB

Also auch bei mir WhatsApp, welche das mit dem iCloud-Backup einfach nicht gebacken kriegen (im Sommer plagte mich folgendes, verwandtes Problem: WhatsApp kann nicht auf iCloud backupen).

Ich habe den Ordner nun gelöscht und hoffe, dass er nicht bald wieder fettleibig wird …

Labels: IT

1 Kommentar | neuen Kommentar verfassen

Montag, 5. Dezember 2016

Geschwindigkeiten von SD-Karten

Die Industrie unterscheidet zwei SD-Kartenarten: Standard sowie UHS.

Die (neueren) Standard-Karten kodieren ihre Geschwindigkeiten als Zahl in einem Kreis, aufgedruckt auf das Etikett:

Zahl im Kreis Geschwindigkeit
10 10 MBit/s
6 6 MBit/s
4 4 MBit/s
2 2 MBit/s

Die UHS-Karten haben die Geschwindigkeit als Zahl in einem u-ähnlichen Symbol aufgeführt:

Zahl im U Geschwindigkeit
3 30 MBit/s
1 10 MBit/s

Quelle: Speed Class

Tags: , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 27. November 2016

Die REST-API von SeedDMS ansprechen

Vor einiger Zeit habe ich mir auf meinem Linux-Server hier zu Hause das Dokumentenmanagement-System SeedDMS installiert. Ich habe dieses Produkt ausgewählt, weil es mit PHP programmiert ist (eine Alternative benötigt Java und scheint nach einem Testlauf nicht die erhofte Maturität aufzuweisen.)

Obwohl die Installation dieses Produkts auch nicht ganz simpel ist (dies erläutere ich dereinst in einem separaten Blog-Artikel), weist es die nötige Maturität aus und bringt eine ansehnliche Liste von Features mit. Grösstes Manko ist eine aktuelle, für Endanwender verständliche Dokumentation.

Eine der von mir gesuchten Funktionalitäten ist die REST API, welche man unter der URL /restapi/index.php ansprechen kann.

Als ich damit die ersten API-Calls machen wollte, kam leider eine leere Antwort zurück. Im php.err fand sich folgende Zeile:

...
[27-Nov-2016 11:55:44 Europe/Zurich] PHP Warning:  require(Slim/Slim.php): failed to open stream: No such file or directory in /var/www/seeddms/restapi/index.php on line 55
[27-Nov-2016 11:55:44 Europe/Zurich] PHP Fatal error:  require(): Failed opening required 'Slim/Slim.php' (include_path='/var/www/seeddms/::.:/usr/share/php/') in /var/www/seeddms/restapi/index.php on line 55
...

Hmmm! Da scheinen mit der Quickstart-Version 5.0.7 (die einzige, die ich auf meinem Server zum Laufen gebracht zu habe) nicht alle externen Dependencies mitzukommen.

Ein Issue auf Sourceforge bestätigt meine Vermutung, bringt aber keine Lösung mit (was bringt es dem Endbenutzer, wenn die Dependency im README ergänzt wird?).

Ein, zwei Google-Suchen später finde ich dann einerseits die Web-Site des Frameworks, andererseits das Github-Repository.

Doch wie und wo installiere ich das Paket nun?

Eine weitere Google-Suche leitet mich auf eine Web-Site weiter, welche die Dokumentenstruktur einer älteren SeedDMS-Installation auflistet und dabei auch einen Ordner Slim aufweist. Der Ordner enthält folgende Dateien:

Als ich diese Struktur mit dem Github-Repository verglich, konnte ich keine Ähnlichkeiten feststellen.

Dann der Geistesblitz: Vielleicht verwendet SeedDMS noch eine ältere Version des Frameworks? Richtig geraten: Aktuell trägt das Framework die Version 3.0, SeedDMS baut aber auf Version 2.0 des Frameworks auf.

Ein Blick auf die Dateistruktur des 2.x Branches bestätigt meine Vermutung. Ich lade mir von diesem Branch die ZIP-Datei herunter und kopiere anschliessend den Unterordner Slim im Ordner Slim-2.x in das Web-Root von SeedDMS (/var/www/seeddms/Slim).

Nun klappt der Aufruf der API, weil PHP die Include-Datei unter /var/www/seeddms/Slim/Slim.php findet!

Am Ende der /restapi/index.php findet sich auch eine Liste aller verfügbarer API-Calls:

$app->post('/login', 'doLogin');
$app->get('/logout', 'doLogout');
$app->get('/account', 'getAccount');
$app->get('/search', 'doSearch');
$app->get('/searchbyattr', 'doSearchByAttr');
$app->get('/folder/:id', 'getFolder');
$app->post('/folder/:id/move', 'moveFolder');
$app->delete('/folder/:id', 'deleteFolder');
$app->get('/folder/:id/children', 'getFolderChildren');
$app->get('/folder/:id/parent', 'getFolderParent');
$app->get('/folder/:id/path', 'getFolderPath');
$app->get('/folder/:id/attributes', 'getFolderAttributes');
$app->post('/folder/:id/createfolder', 'createFolder');
$app->put('/folder/:id/document', 'uploadDocument');
$app->get('/document/:id', 'getDocument');
$app->delete('/document/:id', 'deleteDocument');
$app->post('/document/:id/move', 'moveDocument');
$app->get('/document/:id/content', 'getDocumentContent');
$app->get('/document/:id/versions', 'getDocumentVersions');
$app->get('/document/:id/version/:version', 'getDocumentVersion');
$app->get('/document/:id/files', 'getDocumentFiles');
$app->get('/document/:id/file/:fileid', 'getDocumentFile');
$app->get('/document/:id/links', 'getDocumentLinks');
$app->get('/document/:id/attributes', 'getDocumentAttributes');
$app->put('/account/fullname', 'setFullName');
$app->put('/account/email', 'setEmail');
$app->get('/account/locked', 'getLockedDocuments');
$app->post('/accounts', 'createAccount');
$app->get('/accounts/:id', 'getAccountById');
$app->put('/accounts/:id/disable', 'setDisabledAccount');
$app->post('/groups', 'createGroup');
$app->get('/groups/:id', 'getGroup');
$app->put('/groups/:id/addUser', 'addUserToGroup');
$app->put('/groups/:id/removeUser', 'removeUserFromGroup');
$app->put('/folder/:id/setInherit', 'setFolderInheritsAccess');
$app->put('/folder/:id/access/group/add', 'addGroupAccessToFolder'); // 
$app->put('/folder/:id/access/user/add', 'addUserAccessToFolder'); // 
$app->put('/folder/:id/access/group/remove', 'removeGroupAccessFromFolder'); 
$app->put('/folder/:id/access/user/remove', 'removeUserAccessFromFolder'); 
$app->put('/folder/:id/access/clear', 'clearFolderAccessList');
$app->run();

Eine simple API-Abfrage schaut folgendermassen aus:

  1. /restapi/index.php/login mit den POST-Parametern user und pass
  2. Das Session-Cookie mydms_session=XXX; in eine Variable speichern. Es muss bei allen folgenden API-Calls mit übermittelt werden
  3. /restapi/index.php/searchbyattr?name=AttrName&value=AttrValue mit den GET-Parametern name und value
  4. Die Antwort wird als JSON zurückgegeben, welche mit json_decode() in ein PHP-Objekt/Array geparsed werden kann

Tags:
Labels: IT, Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 13. November 2016

Brandmelder mittels IKEA-Hack in der Wohnung platzieren

Vor einiger Zeit habe ich mir bei MIGROS für wenig Geld ein Sechserpack Brandmelder erstanden und wollte unsere Wohnung damit ausstatten. Unser Apartment ist vollgestopft mit Elektronik und es müsste nur eine Frage der Zeit sein, bis damit irgendwann einmal etwas schief geht. Im schlimmsten Fall brennt es.

Damit Brandmelder und deren Luftpartikelsensoren wie gewünscht funktionieren ist es wichtig, dass diese in einem Zimmer möglichst hoch, das heisst an der Decke, angebracht werden. Da wir in einer Mietwohnung leben, deren Decken wir nicht beschädigen wollten, und weil ich handwerklich nicht der Hirsch bin, habe ich mich nach einer anderen Lösung umgesehen.

Was, wenn man die Brandmelder kopfüber an eine Halterung anbringen könnte, und diese Halterung dann an möglichst hochgelagerten Positionen im Haus platzieren könnte?

Die Spezifikationen waren simpel: Eine Art rundes Teller (Durchmesser mindestens so gross wie derjenige der Brandmelder), an welches der Brandmelder mit seiner Deckenhalterung angebracht werden kann. Das Eingericht ist am Besten mit Füssen ausgestattet, damit man das Konstrukt aufstellen kann und der Brandmelder unter sich ausreichend Partikel sieht.

Eine Suche auf IKEA dauerte nicht lange und brachte folgendes Produkt an den Tag:

VARIERA Tellerhalter, Buche hell, Edelstahl (IKEA Artikelnummer 002.404.15; 7.95 CHF)

Genau was ich gesucht habe! Die auf einen Durchmesser von 12cm bis 19cm verschiebbaren Füsse helfen zudem, dass das Holzbrett auch grössere Objekte aufnehmen kann, die das Brett ein wenig überragen.

Mein Vater half mir dabei, Schrauben im Holz zu versenken, die Deckenhalterung daran zu montieren. Anschliessend bestückte ich die Brandmelder mit der 9V-Batterie und platzierte das Konstrukt an neuralgischen Punkten in unserer Wohnung.

Das Endresultat lässt sich sehen:

IKEA Variera Brandmelder
image-7045

Tags: , , , , ,
Labels: IT

1 Kommentar | neuen Kommentar verfassen

Dienstag, 11. Oktober 2016

SFP-Informationen unter Linux anzeigen

Weil ich meinen Fiber7 SFP-Transceiver im Turris Omnia (noch) nicht zum Laufen bringen konnte, habe ich mich schlau gemacht, wie man Informationen über diesen Hardwarebaustein mit Linux-Bordmitteln abfrägt.

Ein Knowledgebase-Artikel bei Cumulus Networks lotste mich zu ethtool.

Konkret (von der Cumulus Web-Site kopiert):

$ ethtool swp1
Settings for swp1:
        Supported ports: [ FIBRE ]
        Supported link modes:   1000baseT/Full
                                10000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: No
        Advertised link modes:  1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Speed: 10000Mb/s
        Duplex: Full
        Port: FIBRE
        PHYAD: 0
        Transceiver: external
        Auto-negotiation: off
        Current message level: 0x00000000 (0)

        Link detected: yes

sowie noch viel spannender folgende SFP-spezifischen Informationen:

# ethtool -m swp1
swp1: SFP detected
    Connector : CopperPigtail
        EncodingCodes : Unspecified
    ExtIdentOfTypeOfTransceiver : GBIC/SFP defined by twowire interface ID
        LengthCable(UnitsOfm) : 1
    NominalSignallingRate(UnitsOf100Mbd) : 103
        RateIdentifier : Unspecified
    ReceivedPowerMeasurementType : OMA
        TransceiverCodes :
                SFP+CableTechnology : Passive Cable
    TypeOfTransceiver : SFP or SFP Plus
        VendorDataCode(yymmdd) : 110830
    VendorName : Amphenol
        VendorOUI : Amp
    VendorPN : 571540001
        VendorRev : M
    VendorSN : APF11350017C4V

Leider scheint ethtool auf dem Turris Omnia nicht standardmässig installiert zu sein:

root@TURRIS-OMNIA:~# which ethtool
root@TURRIS-OMNIA:~# 

Nachinstallieren kann man dieses, indem man unter System > Software das Paket ethtool herunterladen und installieren lässt:

turris-omnia-ethtool
image-7008

Leider klappt es nicht wirklich, mittels dem Argument -m Informationen über Ethernet-Schnittstellen abzufragen:

# ethtool -m eth0
Cannot get module EEPROM information: Not supported

Links

Einige Hintergrundinformationen hier unter Phylink & SFP support

Tags: , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 11. Oktober 2016

Turris Omnia: Erste Erfahrungen

Am Freitag, 7. Oktober 2016, wurde mir mein über Indiegogo ge-crowdfundeter Turris Omnia-Router ins Büro geliefert.

Am Sonntag-Abend ging ich mit dem Gerät online. Zeit für ein erstes Fazit:

Fiber7 SFP funktioniert (noch) nicht

Der Router wird mit einem SFP-Slot ausgeliefert. Optimal, dachte ich mir, so kann ich meinen Gerätedschungel lichten und den im Januar gekauften Fiber Media Converter TP-LINK MC220L auf’s Altenteil schicken.

Zu früh gefreut! Wie von mir im offiziellen Forum beschrieben und von Michael Stapelberg bestätigt funktioniert der flexOptix BIDI LX SFP Transceiver aktuell nicht im Router.

Zuerst ging ich (fälschlicherweise) davon aus, dass das Problem bei Turris zu suchen ist, doch ein Tweet von Fiber7 von heute Dienstag, 11. Oktober 2016, legt nahe, dass auf Seite ISP resp. auf Seiten des SFP-Herstellers noch etwas geändert werden muss:

Performance

Eigentlich hätte ich erwartet, dass der neue Router näher an die Schallgrenze (d.h. 1 GBit/s Down- und Upstream) herankommt. Doch mein stündlich laufendes Script, welches die Geschwindigkeit zu Init7s Ookla Geschwindigkeitsserver (Ookla Server ID 3026) misst, sagt etwas anderes aus:

ookla-init7-asus-rt-ac66u-turris-omnia
image-6997

Links sieht man die Werte, die ich mit einem Asus RT-AC66U (Merlin-Firmware und mit deaktivierter Firewall) erzielt habe; rechts (nach dem Unterbruch) die Werte von Turris Omnia (mit aktivierter Firewall).

Beim Client handelt es sich um einen Intel NUC DC3217IYE, welcher mit einem Cat 5e-Kabel über einen 16-Port TP-LINK TL-SG1016D über ein 20m Cat 6 STP-Flachband-Kabel auf einen ZyXEL GS1100-8HP PoE Switch via ein Cat 5e-Kabel am Turris angeschlossen ist.

Ich gehe davon aus, dass die Performance höher wäre, wenn ich einen nicht so schmalbrüstigen Client verwenden würde. Und ja, die Firewall des Turris könnte ich ja eigentlich der Performance wegen auch deaktivieren. Doch mich reizt es, die Crowd-Firewall eingeschaltet zu belassen, um mich und mein Netzwerk besser vor Gefahren aus dem Internet zu schützen.

Doch das spielt hier keine Rolle, weil im Setup einzig der Router selber ausgewechselt wurde, der Rest blieb gleich.

Michael hingegen kommt der Schallmauer gefährlich nahe — 927 MBit/s:

Führe ich speedtest-cli (ein Python-Script) direkt auf dem Turris Omnia aus, erhalte ich folgende Werte:

# ./speedtest-cli --simple --server 3026
Ping: 4.704 ms
Download: 684.35 Mbit/s
Upload: 208.04 Mbit/s

CPU-Auslastung

Dank der Aufzeichnung der Vitalparameter des Routers mittels Cacti musste ich soeben feststellen, dass die beiden CPUs des Gerätes seit heute Mitternacht (sprich seit meinem zweiten, fehlgeschlagenen Test mit dem SFP-Transceiver) 100% beträgt. Auf beiden Cores:

turris-omnia-cpu-0-usage
image-6998

turris-omnia-cpu-1-usage
image-6999

Ein Login auf dem Router und htop zeigen, welche Prozesse die Last verursachen:

turris-omnia-socat-cpu-usage
image-7000

Die Prozesse habe ich direkt in htop mittels F9 und SIGKILL abgeschossen (ein Neustart von socat im LuCI-Interface unter System > Software hat nichts gebracht). Jetzt ist die CPU-Auslastung im einstelligen Prozentbereich und die Load Average bereits bei 0.40.

LEDs

Natürlich dürfen frei konfigurierbare LED-Farben nicht den Ausschlag geben, ein Produkt zu kaufen. Dennoch möchte ich dies nicht mehr missen. Nun sehe ich nämlich von der Eingangstüre unserer Wohnung aus, ob der Router läuft (grünes LED für Power) und ob er mit dem Internet verbunden ist (rotes LED für WAN). Hinzu kommen weiss blinkende LEDs, die mir zeigen, dass im LAN Pakete herumgeschickt werden.

turris-omnia-leds
image-7001

IPv6

Das Ding würde auch IPv6 unterstützen, doch mental, fähigkeitstechnisch und auf Grund meiner leicht komplexeren Netzwerk-Infrastruktur im LAN sehe ich mich derzeit nicht imstande, diesen Schritt bereits zu wagen. Gut zu wissen, dass Turris auf jeden Fall bereit wäre:

Usability

Verwirrend (und unschön) ist es, dass der Router über zwei Web-Oberflächen verfügt: Einerseits das von Turris Omnia selbst entwickelte Foris, welches einen Wizard, aber kaum Einstellungsmöglichkeiten bietet, andererseits das OpenWRT-LuCI-Interface, über welches man jedes hinterste Bit des Routers konfigurieren kann (oder so).

Das letztere Interface kannte ich so bereits von meinem TP-LINK TL-MR3020 Travel-Router, der mich auf Reisen überall hin begleitet. Ganz interessant ist hier der Paket-Manager des Turris, obwohl ich abgesehen von snmpd und ethtool noch kein Paket installiert habe. Die Bedienbarkeit dieses Interfaces ist aber nicht so simpel gehalten wie bei einem Consumer-Router und benötigt deshalb eine gewisse Einarbeitungszeit.

Nachtrag: Unboxing-Photos

Turris vom Flickr-Benutzer Doommeer

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

3 Kommentare | neuen Kommentar verfassen

Dienstag, 27. September 2016

Mit PowerShell alle Mitglieder einer Active Directory-Gruppe auflisten

$group = "MEINEGRUPPE" 
 
# https://technet.microsoft.com/en-us/library/ff730967.aspx
$strFilter = "(&(objectCategory=Group)(name=$group))"

$objDomain = New-Object System.DirectoryServices.DirectoryEntry

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "Subtree"
 
$colProplist = "name","member"
foreach($i in $colPropList) {
    $objSearcher.PropertiesToLoad.Add($i)
} 

$colResults = $objSearcher.FindAll()

foreach($objResult in $colResults) {
    $objItem = $objResult.Properties
    # PHP-Style var_dump():
    #echo $objItem | %{echo $_;}

    $members = $objItem.member
    Write-Output $members
} 

$filename = "$group.txt"

$membersReadable = $members | Out-String
"$group" | Out-File -FilePath $filename 
"$membersReadable" | Out-File -FilePath $filename -append

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

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 21. September 2016

Irrtümlich gelöschte Google Kalender-Einträge wiederherstellen

Das geht ganz einfach: Auf der Web-Oberfläche klickt man auf den Pfeil-Button, um ein Dropdown mit den Eigenschaften des Kalenders anzuzeigen:

google-kalender-eigenschaften
image-6941

Dort klickt man auf „Papierkorb ansehen“ und erhält eine Liste der in den letzten 30 Tagen gelöschten Einträge:

google-kalender-papierkorb
image-6942

Einzelne Einträge kann man mit Klick auf die Checkbox links und dem Button „Ausgewählte Termine wiederherstellen“ am Ende der Liste wiederherstellen.

Tags: , , , , , ,
Labels: IT

1 Kommentar | neuen Kommentar verfassen

Montag, 5. September 2016

SRF 3 Musiks „Best of Festivalsommer 2016“ herunterladen

SRF hat am 28. August die eineinhalbstündige Reportage „Best of Festivalsommer 2016“ ausgestrahlt. Wer von der Sendung ein Backup auf dem heimischen Computer anlegen möchte, gehe folgendermassen vor:

Mit dem Firefox mit aktivierten Network-Monitor (Tools > Web-Developer > Network) die folgende Seite ansurfen:

In der Liste vom Browser geladenenen Dateien die Datei mit master.m3u8 im Titel suchen. Hat man diese gefunden, klickt man mit der rechten Maustasten auf den Eintrag und wählt „Copy URL“.

In Terminal.app lädt man die Datei nun herunter und benennt sie um:

$ wget -O "master.m3u8" "http://srfvodhd-vh.akamaihd.net/i/vod/srf3musik/2016/08/srf3musik_20160828_200256_v_webcast_h264_,q40,q10,q20,q30,q50,q60,.mp4.csmil/master.m3u8?hdnts=exp%3D1473097915~acl%3D%2Fi%2Fvod%2F*~hmac%3D082b882b8cc09344ec0e52120adc1dd0b0d0ee0b668899c1d93cac56094f1aab"

Anschliessend startet man ffmpeg (bei mir v3.1.2):

$ ffmpeg -protocol_whitelist file,http,https,tcp,tls -i master.m3u8 -strict -2 video.mp4

Hinweis

Der Parameter -i schluckt übrigens anstandslos auch URLs:

$ ffmpeg -protocol_whitelist file,http,https,tcp,tls -i "http://cdn-vod-ios.br.de/i/b7/2016-07/24/0f8a34f451c211e68a90984be10adece_,0,A,B,E,C,X,.mp4.csmil/master.m3u8?__b__=200" -strict -2 video.mp4

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

1 Kommentar | neuen Kommentar verfassen

Dienstag, 30. August 2016

Mit cacti Synology-Partitionen aufzeichnen

Synology verfügt Out-of-the-Box über einen SNMP-Server, welchen man mittels weniger Klicks aktivieren kann. Diesen SNMP-Daemon verwende ich im Heimnetzwerk mit dem Tool cacti, um Vitaldaten meines NAS aufzuzeichnen.

Damit man auch die Informationen über die Festplattenbelegung des NAS aufzeichnen kann, muss man in cacti in der Device-Ansicht des vorgängig eingerichteten Synology-NAS im Abschnitt Associated Data Queries das Data Query mit dem Namen „SNMP – Get Mounted Partitions“ hinzufügen, welches den SNMP-Baum hrStorageTable (.1.3.6.1.2.1.25.2.3) abfrägt.

Im Gegensatz zum Data Query „ucd/net – Get Monitored Partitions“ (SNMP-Baum dskTable (.1.3.6.1.4.1.2021.9)) findet die SNMP-Version entsprechende Werte.

Dies, weil Synology die HOST-RESOURCES-MIB verwendet, um Informationen über Partitionen und Festplattenbelegung zu teilen:

cacti-associated-data-queries-snmp-get-mounted-partitions
image-6895

Via: Monitoring disk stats with Cacti

Hintergrundinfos

Tags: , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen