wtorek, 30 grudnia 2014

Rootowanie Samsung Galaxy S5 z zachowaniem KNOX 0x0

Pamiętaj że podążając za tym poradnikiem, instalując własny system lub jakkolwiek ingerując w swoje urządzenie działasz na własną odpowiedzialnośc.

Co to KNOX

http://www.samsung.com/pl/business/solutions-services/mobile-solutions/security/samsung-knox

Uważam ze sam cel KNOX'a jest szczytny a sama platforma jak najbardziej pomocna dla firm i administratorów IT.

Niestety, aktualnie zastosowane rozwiązanie sprzętowa sprowadza się do flagi 0-1 która może zostać zmieniona tylko raz. W przypadku ingerencji w system zostaje on oznaczony na zawsze jako 0x1 i platforma KNOX na nim już nie zadziała, rozwiązanie wciąż trafne.

Po zakupie Samsung Galaxy S5 dowiedziałem się następującej rzeczy - zdarza się ze punkty serwisowe odmawiają uznania gwarancji jeśli KNOX posiada flagę 0x1. Czyli gdy wgramy system CyanogenMod (a dokładniej w trakcie jego wgrywania) możemy się pożegnać z gwarancją.

Przyczyna flag 0x1

Według mojej wiedzy zarządzanie flagą znajduje się w bootloaderze (odpowiednikiem świata PC byłyby LILO, GRUB, NTDLR - czyli po prostu program który odpowiada na pytanie co zrobić by uruchomić system). Download mode w tym konteksćie także jest uruchamiany przez bootloader'a.

Bootloader KNOX sprawdza czy kernel i recovery (możliwe że też sam bootloader) są poprawne. Jeśli nie - zapisuje flagę 0x1. Nie jest możliwe więc wgranie custom recovery czy kernela, nawet z download mode.

Ratunek

Bez wgrania custom recovery nie ma możliwości root'owania urządzenia, na szczęście dla posiadaczy Samsung Galaxy S5 kernel użyty w stockowych romach posiada lukę bezpieczeństwa. Dzięki towelroot i przy użyciu odpowiednio starego systemu wciąż istnieje możliwość rootowania!

Strona domowa towelroot: https://towelroot.com/

Do dzieła

Zainstaluj towelroot i spróbuj zrootować urządzenie. Następnie, jeśli posiadasz:

System bez root'a

Oryginalny tutorial (po angielsku): http://forum.xda-developers.com/galaxy-s5/development/rom-neatrom-v1-t2828562

Zaczynamy od rozdziału Installation Instructions: If you're coming from a Samsung stock NON-Rooted NG2/NG7/NG9/NH4/NH6/NJ1 ROM (KNOX 0x0). Opisuje on wgrywanie starszej wersji systemu która posiada lukę wykrzystywaną przez towelroot.

Dostępne firmware: http://samsung-updates.com/device/?id=SM-G900F

Użytą przeze mnie wersją była G900FXXU1ANCE_G900FXEO1ANC7_G900FXXU1ANCE_HOME.tar.md5, po jej wgraniu można uzyskać root'a za pomocą towelroot.

Przejdź teraz do System z root'em.

System z root'em

Rebootujemy i instalujemy SuperSu, po jego uruchomieniu zgadzamy się na wyłączenie KNOX'a.

Dokonujemy zakupu Mobile Odin Pro, pozwoli on na proste wgranie systemu w formie pliku zip bez zmiany flagi KNOX.

Wybranym przeze mnie systemem był: http://forum.xda-developers.com/galaxy-s5/development/rom-ane4-kitkat-4-4-2-multi-csc-t2813628

Wgrywanie pliku zip sprowadza się do wybrania go w Mobile Odin Pro poprzez opcję OTA/Update ZIP. Pamiętaj o przeczytaniu opisu instalacji wybranego firmware, w opisywanym tu przypadku należy też odznaczyć Everroot.

Naciśnij Flash Firmware".

Po restarcie i na końcu instalacji systemu odznacz Reboot Device. Powinieneś znaleźć się wkrótce w Download Mode.

Aktualizacja firmware

Jeśli twój bootloader lub modem wymagają aktualizacji możęsz to zrobić z Download Mode.

Zainstaluj PC Odin, podłącz telefon w trybie download. Modem dodaj jako CP, bootloader jako BL. Wgraj wybrane pliki.

W momencie pisania tego poradnika od Samsunga dostępne były:

  • BL_G900FXXU1ANK7.tar.md5

  • CP_G900FXXU1ANK1.tar.md5

Wgrywany system był bazowany na wersji ANK7 więc mogę stwierdzić że wgranie CP w lekko starszej wersji nie powoduje problemów.

Na zakończenie

Idź do Settings/Security:

  • odznacz Reactivation lock

  • odznacz Send security reports

idź do Security policy updates i odznacz Automatic updates.

Koniec, jesteś w posiadaniu zrootowanego systemu :)

Usuwanie zbędnych aplikacji

Do pozbycia się poniższych subiektywnie zbędnych programów użyłem Usuwanie Aplikacji Systemowych od Jumobile.

  • Aktualizac. oprog.

  • ANT HAL Service

  • ANT Radio Service

  • ANT+ Plugins

  • Application Kontyngent SCloud

  • Beaming Service

  • BlurbCheckout

  • Dodatek do usług drukowania Samsung

  • FWUpdate

  • HealthService

  • Konto Samsung

  • Moduł dodatkowy HP Print Service

  • Rozliczenia Samsung

  • S Szukacz

  • S Terminarz (12MB)

  • S Terminarz (908KB)

  • S Voice

  • Samsung Apps

  • Samsung Celandar SyncAdapter

  • Samsung Cloud Data Relay

  • Samsung Contact SyncAdapter

  • Samsung Galaxy

  • Samsung GALAXY Apps Widget

  • Samsung Link Platform Connectivity

  • Samsung Memo SyncAdapter

  • Samsung Push Service

  • Samsung SBrowser SyncAdapter

  • Samsung SNote3 SyncAdapter

  • Samsung Syncadapters

niedziela, 28 grudnia 2014

Bezpieczniejsze i przyjaźniejsze sterowniki drukarek Brother

Jest to czystszy sposób na instalację sterowników do drukarek firmy Brother dla systemów 32bit i 64bit (z lub bez multilib).

Poniżej przedstawiam sposób instalacji sterowników do drukarek Brother’a bez zbędnych zamknięto źródłowych programów. Ostatecznie z aplikacji w pakietach dostarczanych przez brother potrzebny jest tylko 1 plik, br<model drukarki>filter, gdzie <model drukarki> jest Twoim modelem drukarki, np. mfcj6510dw.

Przygotowanie

mfcj6510dwcupswrapper-3.0.0-1.i386.deb

Potrzebny jest nam jedynie plik opt/brother/Printers/<model drukarki>/cupswrapper/brother_<model drukarki>_printer_en.ppd (np. brother_mfcj6510dw_printer_en.ppd).

Na początku pliku znajduje sie linijka (gdzie mfcj6510dw jest modelem Twojej drukarki):

*cupsFilter: "application/vnd.cups-postscript 0 brlpdwrappermfcj6510dw"``

Zmieniamy ją na:

*cupsFilter: "application/vnd.cups-postscript 0 /opt/brother/bin/filter_mfcj6510dw"
mfcj6510dwlpr-3.0.0-1.i386.deb

Z opt/brother/Printers/<model drukarki> potrzebne są:

  • lpd/br<model drukarki>filter => przenosimy do /opt/brother/Printers/<model>/filter

  • lpd/psconvertij2 => przenosimy do /opt/nbrother/bin/

  • inf/ - cały katalog z wykluczeniem setupPrintcapij => przenosimy do /opt/brother/Printers/<model>/inf/

Struktura katalogów

/opt/brother
├── bin
│   ├── filter
│   ├── filter_mfcj6510dw -> filter
│   └── psconvertij2
├── lib
│   ├── ld-linux.so.2
│   ├── libc.so.6
│   └── libm.so.6
├── lib32 -> lib
├── opt
│   └── brother -> ..
└── Printers
    └── mfcj6510dw
        ├── filter
        └── inf
            ├── brmfcj6510dwfunc
            ├── brmfcj6510dwrc
            ├── ImagingArea
            ├── lut
            │   ├── BRPRI10IA.BCM
            │   ├── BRPRI10IB.BCM
            │   ├── BRPRI10IC.BCM
            │   ├── BRPRI10ID.BCM
            │   ├── BRPRI10IE.BCM
            │   ├── BRPRI10IF.BCM
            │   ├── BRPRI10IG.BCM
            │   ├── BRPRI10IH.BCM
            │   └── BRPRI10II.BCM
            └── paperinfij2

Instalacja

[x86] Dla systemów 64bit i 32bit [x64] Dla systemów 64bit no-multilib

  • kernel - enable ia32 [x64]

  • sudo [x64]

  • chroot [x64]

  • libs [x64]

  • script [x86] [x64]

kernel - ia32 [x64]

Sterownik od Brother’a jest 32bitowym plikiem wykonywalnym więc musimy właczyć w kernelu obsługę takich plików

Executable file formats / Emulations, IA32 Emulation
sudo [x64]

Instalacja Sudo jest wymagana do uruchamiania skryptu w chroot. Próbowałem zrobić to poprzez program z setuid lecz CUPS wymaga odpowiednich uprawnień pliku filtrów (driver)

chroot [x64]

Podane w Strukturze katalogów ścieżki lib, lib32 i opt/brother są wymagane do poprawnego działania drivera w chroocie

libs [x64]

By zobaczyć które biblioteki są potrzebne, na maszynie ze środowiskiem 32bitowym wykonaj komendę ldd <ścieżka do filtra>:

glorpen@example ../brother $ ldd brmfcj6510dwfilter
    linux-gate.so.1 (0xf779f000)
    libm.so.6 => /lib32/libm.so.6 (0xf7719000)
    libc.so.6 => /lib32/libc.so.6 (0xf756b000)
    /lib/ld-linux.so.2 (0xf77a1000)

Podane pliki kopiujemy do docelowego katalogu chroot.

script [x86] [x64]

Stwórz /opt/brother/bin/filter:

#!/bin/sh

DIR="/opt/brother"

PRINTER="$(echo $0 | sed -e 's/.*_//')"

BRCONV="${DIR}/Printers/${PRINTER}/filter"

if [[ -d /usr/lib64  && ! -d /usr/lib32 ]];
then
    BRCONV="/usr/bin/sudo /usr/bin/chroot --userspec=``id -u``:``id -g`` /opt/brother ${BRCONV}"
fi

PSCONV="${DIR}/bin/psconvertij2"

FILE_RC="${DIR}/Printers/${PRINTER}/inf/br${PRINTER}rc"
FILE_PAPERINF="${DIR}/Printers/${PRINTER}/inf/paperinfij2"
FILE_IMAGINGAREA="${DIR}/Printers/${PRINTER}/inf/ImagingArea"

cat | "${PSCONV}" "${FILE_PAPERINF}" "${FILE_RC}" "${FILE_IMAGINGAREA}" | ${BRCONV} -pi "${FILE_PAPERINF}" -rc "${FILE_RC}"

exit $?

Nadaj mu uprawnienie wykonywalne

chmod a+x /opt/brother/bin/filter

Następnie tworzymy symlink’a filter_mfcj6510dw -> filter

Przygotowany wcześniej plik PPD powinien wskazywać na stworzony przez nas filter_mfcj6510dw.

CUPS

Podczas dodawania drukarki podajemy przygotowany wcześniej plik ppd, jeśli wszystko jest ustawione poprawnie drukarka jest gotowa do użytku.

Jeśli wydrukowane strony mają zbyt mały górny margines (są obcięte) zmień linię w /opt/brother/Printers/<model>/inf/br<model>dwrc z PaperType=Letter na PaperType=A4.

Prosty i stabilny w obsłudze serwer Minecraft'a

Minecraft w sesji SCREEN’a

Istnieją działające rozwiązania wykorzystujące screen, pozwalają one na uruchomienie serwera Minecraft w tle i umożliwiają na dostęp do konsoli gry. Niestety wysyłanie poleceń ( np. /stop ) do serwera wymaga lekkiej gimnastyki i pomimo tego czasami po prostu nie działa.

Rozwiązania które znalazłem nie uznałem za wystarczająco niezawodne.

Dostęp do sesji screen’a z poziomu innego użytkownika należy odpowiednio skonfigurować, możliwe jest przypadkowe zamknięcie konsoli. Spotkałem, się też również z problemamy podwójnej daemonizacji - skrypt startowy nie może znaleźć PID serwera gdyż ten jest zakrywany przez screen który z kolei sam staje sie daemonem.

Przykład rozwiązania z użyciem komendy screen:

http://minecraft.gamepedia.com/Tutorials/Server_startup_script

Coś lepszego

Głównym problemem do rozwiązania był dostęp do konsoli oraz bezpieczne wyłączanie serwera by ten zdążył zapisać wygenerowane światy. Miłym dodatkiem jest też logowanie błędów serwera do logów systemowych.

Skrypt MiencraftD: https://github.com/glorpen/gentoo-overlay/blob/master/games-server/minecraft/files/minecraftd.py

Zalety
  • logi serwera trafiają do logów systemowych

  • akcje start/stop możliwe do uruchomienia z konsoli

  • bezpieczne zatrzymywanie - to serwer Minecraft’a decyduje o momencie swojego wyłączenia

  • możliwość uruchomienia konsoli serwera

  • wysyłanie komend z linii poleceń prosto do serwera

Wymagania skryptu
  • python 2.7 lub 3.3+

  • python-daemon

  • lockfile

Użycie
usage: minecraftd.py [-h] [--instance INSTANCE] {start,shell,stop,cmd} ...

Minecraft server daemonizer

positional arguments:
  {start,shell,stop,cmd}
    start               Starts minecraft daemon for given instance
    shell               Connects to Minecraft shell of given instance
    stop                Stops Minecraft daemon for given instance
    cmd                 Sends command to given instances shell

optional arguments:
  -h, --help            show this help message and exit
  --instance INSTANCE, -i INSTANCE
                        Instance name

Gdzie zdobyć

Skrypt ten jest częścią mojego portage overlay które można znaleźć:

Gentoo overlay: https://github.com/glorpen/gentoo-overlay

Gotowe ebuild dla serwera Minecraft znajduje się pod adresem: https://github.com/glorpen/gentoo-overlay/tree/master/games-server/minecraft

Skrypt init.d używany wraz z MinecraftD: https://github.com/glorpen/gentoo-overlay/blob/master/games-server/minecraft/files/minecraft.daemon.d

I jeszcze raz, skrypt daemonizujący aplikację: https://github.com/glorpen/gentoo-overlay/blob/master/games-server/minecraft/files/minecraftd.py

sobota, 28 czerwca 2014

Buforowanie utworów radia internetowego

Normalne odtwarzanie radia internetowego polega na bezpośrednim przesyłaniu danych z serwera źródłowego. Zależnie od sytuacji może być to sporym minusem:

  • wymaga stałego połączenia z siecią, w przypadku jego braku odtwarzanie zostanie przerwane

  • niektóre programy nie obsługują poprawnie przesyłania informacji o odsłuchanych utworach radiowych do serwisów jak Last.fm

    • mogą w ogóle nie podejmować prób wysyłania

    • lub wysyłać błędne dane zawierające tagi radia lub reklamy

  • po zatrzymaniu utworu tracimy i jego wznowieniu nie trafimy już na ten sam utwór

Dość trafnym przykładem działania z użyciem lokalnego buforowania może być słuchanie radia podczas pracy, w siedzibie firmy.

  • Po rozpoczęciu procesu, każdy pobrany utwór zostaje osobno zapisany na dysku

  • Przy okazji odfiltrowane zostają reklamy, tagi zmienione na poprawne

  • Tak przygotowany plik zostaje dodany do aktualnie odtwarzanej listy aplikacji

  • Każdy odtworzony utwór zostaje usunięty z playlisty i dysku

  • W przypadku spotkania firmowego, odtwarzanie w aplikacji można zatrzymać, pliki będą wciąz pobierane

  • Po powrocie, można kontynuuować odtwarzanie z miejsca w którym się skończyło

  • Nagle połączenie z internetem przestaje działać - w niczym nam to nie przeszkadza gdyż mamy zapas muzyki pobranej podczas wcześniejszego spotkania :)

Potrzebne aplikacje

  • Streamripper - do pobierania utworów, filtrowania i zmiany metadanych

  • Audacious - zarządzanie listą utworów, odtwarzanie

  • Python3 - do uruchomienia skryptu łączącego dwie poprzednie aplikacje, dodatkowo potrzebne są biblioteki:

Skrypt streambuffer'a jest dostępny do pobrania tutaj.

Jak to działa

Streamripper łączy się z zadanym radiem i pobiera utwory do wskazanego katalogu. Gdy dany utwór zostaje przeniesiony do katalogu gotowe, Streambuffer doda go jako nowy utwór w Audacious'ie. Gdy audacious zmieni pozycję na playliście na następną, wcześniejsze których pliki znajdują się w katalogu gotowe zostaną usunięte (z kolejki jak i z dysku).

Do nasłuchiwania zmiany plików przez streamripper'a używane jest inotify, natomiast do komunikacji z playerem d-bus.

Struktura i opis plików
- katalog główny
\- data
 \- *.* - utwory w pełni pobrane
 \- incomplete
  \- *.* - utwory niepełne
\- pattern.txt - filtry streamripper'a

Użycie

Najpierw należy samodzielnie uruchomić odtwarzacz Audacious.

Następnie,

jako skrypt python:

m = Manager("/my/music", "http://itori.animenfo.com:443/")
m.run()

lub prosto z linii poleceń:

./rip "/my/music" "http://itori.animenfo.com:443/"

wtorek, 11 lutego 2014

Pygame atakuje - "File is not a Windows BMP file"

Widziałem wielu użytkowników którzy napotkali problem przy ładowaniu obrazów png jak i jpeg.

"File is not a Windows BMP file" - nie jest to zbyt prydatna informacja w tym przypadku :)

Zgodnie z dokumentacją pygame, by sprawdzić czy wsparcie dla obrazów jest włączone należy:

>>> print(pygame.image.get_extended())
0

Zero oznacza brak wsparcia, lecz w moim przypadku wiedziałem że zostało ono dodane, a jeśli sam nie jesteś tego pewien - prawdopodobnie jest.

Droga do oświecenia

Otworzyłem katalog site-packages mojej instalacji Python3.3 (Twoja ścieżka może sie różnić): /usr/lib/python3.3/site-packages/pygame/

Znajdował się tam plik image.so który w interpreterze python'a jest modułem pygame.image, ale co z drugim podobnie nazwanym plikiem - imageext.so? Oba posiadają korzystają z libpng a image.so importuje się poprawnie.

Więc co sie stanie gdy zaimportuję imageext?

Dobre pytanie - to:

>>> import pygame.imageext
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: libpng15.so.15: cannot open shared object file: No such file or directory

To jest główna przyczyna całego problemu - zmieniła się wersja libpng a pygame chce korzystać ze starszej.

Naprawiamy

Potrafię wymyśleć 3 sposoby:

Na szybko - Możesz użyć linkowania symbolicznego do podpięcia ścieżki wymaganej przez pygame do aktualnego libpng, lecz jest to brzydkie rozwiązanie i dodatkowo może prowadzić do niepoprawnego działania ™.

Tak sobie - Możesz przywrócić w systemie starą wersję libpng by zgadzała sie z wymaganą.

Najlepiej - Napraw wszystko! Jeśli system na to pozwala - skompiluj na nowo pakiety - używam Gentoo więc wybrałem tą drogę ;)

Więc, najlepsza droga to:

By wylistować biblioteki zależne od nieistniejącego pliku, obojętnie w jakiej dystrybucji, uruchom:

grep -R libpng15.so.15 /usr/lib/*

Komenda może zwrócić coś takiego:

Plik binarny /usr/lib/libSDL_image-1.2.so.0 pasuje do wzorca
Plik binarny /usr/lib/libSDL_image-1.2.so.0.8.4 pasuje do wzorca
Plik binarny /usr/lib/libSDL_image.so pasuje do wzorca

Zepsuła się paczka sdl-image, na której z kolei polega pygame.

Teraz musimy tylko zainstalować ponownie/zaktualizować paczkę sdl-image i wszystko powinno zacząć działać. Do następnej aktualizacji libpng :)

poniedziałek, 17 czerwca 2013

Twitch.tv bez Adobe Flash

Czyli jak oglądać stream w ulubionym odtwarzaczu wideo.

Aktualne problemy z flash'em pod Linuxem:

  • nowe wersje pluginu Adobe mają wsparcie tylko dla Chrome Pepper - więc dla pozostałych przeglądarek zostają tylko starsze wersje plugina
  • zamknięte źródło ™
  • czasami nie można wyjść z trybu fullscreen
  • czasami wiesza się zajmując 100% czasu procesora
  • czasami po prostu się wywala

Istnieje jakaś alternatywa - shumway ale aktualnie nie wspiera takich rzeczy jak YouTube więc zapewne też Twitch. Dodatkowo SWFObject stwierdza że flash nie jest w ogóle obsługiwany więc zazwyczaj zobaczymy tylko "zainstaluj Adobe Flash".

Pobieranie

Listowanie plików flv dla zadanego linka z archiwum, archive.py:

#!/usr/bin/python3

from urllib.request import urlopen
import json, sys, re

decoder = json.decoder.JSONDecoder()

for arg in sys.argv[1:]:
 m = re.match(r"^.*/([^/]+)/b/([0-9]+)$", arg)
 video_id = int(m.group(2))
 with urlopen("http://api.justin.tv/api/broadcast/by_archive/%d.json" % video_id) as f:
  resp = decoder.decode(f.read().decode())
  for i in resp:
   print(i["video_file_url"])

Przykład użycia:

$ ./archive.py http://www.twitch.tv/some_channel/b/4173086
http://store30.media30.justin.tv/archives/2013-6-15/live_user_some_channel_13713088.flv
http://store38.media38.justin.tv/archives/2013-6-15/live_user_some_channel_13713106.flv
http://store6.media6.justin.tv/archives/2013-6-15/live_user_some_channel_13713124.flv

Pozostaje jeszcze tylko pobrać wypisane pliki.

Oglądanie

Potrzebne nam są livestreamer i rtmpdump. Żeby nie zaśmiecać systemu użyłem python'owego virtualenv. Poniższe kroki zakładają że rtmpdump nie jest zainstalowany w systemie.

Więc:

cd /path/to/project
git clone git://git.ffmpeg.org/rtmpdump
virtualenv env
make -C rtmpdump/
source env/bin/activate
pip install livestreamer

Następnie warto złożyć wszystko w jeden skrypt:

#!/bin/bash

d="$(dirname $0)"

source "${d}"/l/bin/activate
LD_LIBRARY_PATH="${d}"/rtmpdump/librtmp/ livestreamer -p /path/to/player -r "${d}"/rtmpdump/rtmpdump "${@}"

... i zaczynamy oglądać:

./run.sh http://www.twitch.tv/dreamhacksc2 720p

możemy także zapisywać stream do pliku:

./run.sh http://www.twitch.tv/dreamhacksc2 720p -o file.flv

czwartek, 13 czerwca 2013

Eclipse: The Dark IDE - Linux edition

Chwilę temu stumblnąłem na http://ethanschoonover.com/solarized. Jest to dość magiczny zestaw jasnych i ciemnych motywów do dużej ilości edytorów/widget'ów itp... i dodatkowo wygląda dość ładnie. Zastanawiałem się przez chwilę czy aby na pewno kolor tła i zwykłego tekstu nie będzie się zlewał ze sobą - ale przecież na stronie zostało napisane że kolory są zgodne ze specyfikacją CIELAB oraz rozwiązanie było testowane na wielu maszynach. Więc musi być prawdą! ;)

Jako że spędzam dość dużo czasu przed Eclipse'm postanowiłem skorzystać z rady wujka Google - ciemniejsze kolory mogą mniej męczyć oczy (zapewne zwłaszcza gdy programuje się w nocy). Poniżej przedstawiam kroki jak całkowicie ostylować Eclips'a ciemniejszym motywem (Linux edition).

Na zachętę - efekt końcowy

Eclipse

Na starcie dostajemy:

By załadować powyższe motywy w Eclips'ie wymagane są rozszerzenia Eclipse Color Themes oraz Chrome Theme.

Po aplikacji nowego wystroju (motyw dla Aptany oraz samego Eclipse) okazało się że motyw Aptany jest nieco ciemniejszy więc zmieniłem w kilku miejscach kolory na odpowiednie z podstawowego schematu (pobierz zmieniony motyw).
Następnym krokiem jest zmiana kolorów zakładek i innych elementów Eclipse, posłuży nam do tego Chrome Theme. Tutaj można pobrać już gotowy plik konfiguracji ui - należy go umieścić w workspace/.metadata/.plugins/org.eclipse.core.runtime/.settings. W przypadku manualnych zmian należy pamiętać o dodaniu do arkusza CSS linijki z odpowiedzi na stackoverflow.com:

#org-eclipse-e4-ui-compatibility-editor * { background-color: #002b36; }

GTK

Na szczęście motyw dla GTK+ 2 jest łatwo dostępny: https://github.com/heichblatt/gtk2-theme-solarizeddark.
Nie potrzeba włączać go dla całego systemu, w naszym wypadku wystarczy dla samego Eclipse.

GTK2_RC_FILES=~/.themes/solarized.gtkrc /mnt/sandbox/eclipse/eclipse

Desktop file

Jeśli chcesz by Eclipse włączał się już z Twoim nowym motywem poprzez wpis w menu, trzeba w odpowiednim pliku .desktop zmienić linię z Exec. Poniżej cały plik używany przeze mnie:

[Desktop Entry]
Encoding=UTF-8
Name=Eclipse IDE
Comment=Eclipse Programming IDE
Exec=env GTK2_RC_FILES=~/.themes/solarized.gtkrc /mnt/sandbox/eclipse/eclipse
Icon=/mnt/sandbox/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=Application;Development;

Niestety nawet po zaaplikowaniu motywów w tych wszystkich miejscach wciąż może się zdarzyć że jakiś edytor będzie wyświetlał niepoprawne barwy - jak np. edytor Twig'a z paczki Symfony2. (poprawiona konfiguracja)