Skip to content

LTE with Asus WL-330N3G, ZTE MF831 and OpenWrt

For some time now I used the mobile router Asus WL-330N3G with a 3G USB modem. As LTE is now readily available I needed to upgrade my gear. Hofer, one of our local disconters, offers a LTE modem – a ZTE MF831 (). With it comes a HoT sim card (carrier t-mobile AT), which I’ve found not work in more rural areas so one should better choose a A1 based provider (A1, bob, Yessss!) or Drei Hutchinson. I’ve opted for a Yesss! prepaid LTE plan.

Asus WL-330N3G

The original Asus firmware wasn’t fullfilling my needs. It was a pain to configure and there are little possibilities to perform debugging tasks so I’ve ditched the it for OpenWrt which works really well on this small device.


The Modem itself is sold unlocked by Hofer for about 45EUR (as of March 2016). It works on the LTE frequencies B20, B9, B3, B7 (more information on frequencies) and offers a virtual network interface via RNDIS and a web interface for configuration. The stick listens on and provides DHCP over the virtual network interface.

Although it is possible to bring the stick into a dummy modem mode (aka factory mode) using the RNDIS interface works well.


I’m using Arch Linux on my workstation but to some extend you’ll need to check how to do it on your distribution.

Flash openwrt image onto the device

I’ve installed an older version of OpenWrt already on the router but there was no support for RNDIS so I needed to update the firmware. I’ve used the following flashing procdure for the first OpenWrt install too so go ahead and use it – more information to the flashing possibilities can be found in the OpenWrt Wiki.

First download the OpenWrt image:

md5sum -c openwrt-15.05.1-ramips-rt305x-wl-330n3g-squashfs-sysupgrade.bin
  1. Connect the router to your computer via ethernet
  2. Configure your Ethernet IPv4 address as static: netmask Note the IP of .20 is critical – the bootloader accepts tftp only from this IP.
    sudo ip a add dev enp0s25
  3. Press and hold the Reset button on the bottom of the router and power on device
  4. Hold the Reset until the power led flashes slowly. If you are running tcpdump on the Ethernet interface you should see ARP requests from for
  5. Use tftp to upload a firmware file in binary mode to the device:
    # tftp
    tftp> binary
    tftp> trace
    Packet tracing on.
    tftp> rexmt 1
    tftp> put openwrt-15.05.1-ramips-rt305x-wl-330n3g-squashfs-sysupgrade.bin
    sent WRQ <file=openwrt-15.05.1-ramips-rt305x-wl-330n3g-squashfs-sysupgrade.bin, mode=octet>
    received ACK <block=0>
    sent DATA <block=1, 512 bytes>
    sent DATA <block=5377, 4 bytes>
    received ACK <block=5377>

    The received ACK line is important, the block number varies from version to version.

  6. Wait, flashing may take a couple of minutes. Do not power off!
  7. The device will reboot when flashing is done. If you flashed OpenWRT, telnet into and set root password:
  8. Logout – you can only login via SSH from now on.

Mirror repository for local use

I’m aware that this is not needed, as you could easily resolve all dependencies by hand, but I like to have the system itself doing this for me. As I didn’t have internet connection at this point via the router I mirrored the whole repository to my local machine (it’s about 320MB).

mkdir /mnt/owrt
mount /dev/rootvg/owrt_lv /mnt/owrt
cd /mnt/owrt
wget --no-parent -r -l 2 -p -k

To serve the repository I’ve used nginx:

sudo pacman -S nginx
vim /etc/nginx/nginx.conf
  location /packages {
    root /mnt/owrt/;
    index index.html index.htm;

Configure OpenWrts package manager opkg to use my local mirror:

cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.20160327
vim /etc/opkg/distfeeds.conf
  src/gz chaos_calmer_base
  src/gz chaos_calmer_luci
  src/gz chaos_calmer_packages
  src/gz chaos_calmer_routing
  src/gz chaos_calmer_telephony
  src/gz chaos_calmer_management

Install RNDIS drivers

For more detailed procedure have a look at the OpenWrt Wiki.

opkg update
opkg install kmod-usb-net-rndis usb-modeswitch

Configure the network interfaces

cp /etc/config/network /etc/config/network.20160327
vim /etc/config/network
  config interface 'wan'
    option ifname 'usb0'
    option proto 'dhcp'
/etc/init.d/network restart

Configure wireless access point

I’ve used the webinterface on to configure my wireless access point. The config file looks as follows:

config wifi-device 'radio0'
  option type 'mac80211'
  option channel '11'
  option hwmode '11g'
  option path '10180000.wmac'
  option htmode 'HT20'
  option txpower '20'
  option country '00'

config wifi-iface
  option device 'radio0'
  option network 'lan'
  option mode 'ap'
  option ssid 'wre'
  option encryption 'psk2'
  option key '12345678'

Perform a test reboot and cut-the-power-reboot to test the setup.

Posted in Linux.

Extract multiple partial directories from a Subversion repository

Subversion almost got me today.


Multiple parts or subdirectories of an existing Subversion repository should be synced to an exposed Subversion server to give someone access to the code in this directories – only those directories and only readonly. So bear in mind that this solution is only working one way (and downhill with tailwind).

First attempt:

Since Subversion 1.5 partial sync of a repository is possible. This sounds promising but after some searching in the documentations I throw away this plan because only one subdirectory can be synced to a mirror repository at a time. As I had multiple to sync, this solution would never gonna work. More information this can be found here (“Q: Can I mirror a subdirectory of a master repository?”). I spare you the details on creating a synced repository here because there is plenty of guides and documentations out there.

Second attempt:

My second attempt was just dumping the source repository and use svndumpfilter to only include the directories which should be exposed later on. The size and number of commits aren’t the issue here but in repositories files and directories tend to get moved, renamed, deleted and so on. For the dump, you have to include all those special sources which changed over time to the include list of svndumpfilter and this gets really frustrating after you started the 10th time. Also the standard svndumpfilter doesn’t work very well in some cases. Therefor some people implemented svndumpfilter in Python which should help solving those problems. You can find it here. But still after trying out various options of svndumpfilter3 I wasn’t able to cleanly export the parts I needed. So I started scripting and came up with clearly not the best solution, but a solution.

As every missing directory or file needed a new command line option it is fairly boring to run the script, open it, add the option, save and rerun it.

Here comes my first script ( into work. It runs the svnadmin dump and the svndumpfilter3 combination, reads the output and automatically adds the missing parts to itself.


newline=`(svnadmin dump /srv/subversion/repos/source | /usr/bin/svndumpfilter3 \
include trunk/modules/subpath2 | gzip > testdump.svndump.gz) 2>&1 >/dev/null | grep "svndumpfilter3: Invalid" | awk -F\' '{print $2;}'`

if [ ! -z "$newline" ];
echo "modifying export script to add line: "
echo $newline

sed -i -r "s#(\s{4}include.*?gzip.*)#    include $newline \\\\\n\1#" $0

echo "### RUN $0 again!"

The second script ( is in fact only a while loop which calls the first script, which changes in every run, until the svnadmin dump command exits without any missing parts.


while true
echo "still running"

./ | grep "RUN"
if [ $? -eq 1 ];

sleep 1

At the import I hit the next bump by getting errors like this:

<<< Started new transaction, based on original revision 646
 svnadmin: File not found: transaction ’0-1′, path ‘some/path/’
 * adding path : some/path …<em>

The explanation of this can be found here. As stated in the linked blogpost you have to create the missing subdirectories. This is done like this (I’ve added a svn mkdir line for every missing path):


svnadmin create /srv/subversion/repos/testrepo
svn mkdir --parents file:///srv/subversion/repos/testrepo/some/path -m "empty dir"

svnadmin load -q /srv/subversion/repos/testrepo < testdump.svndump

Now you should hopefully have a new shiny repository with only the needed parts.

Posted in Code & Snippets, Linux.

Tagged with .

How to find the standard path of the CAs trusted by OpenSSL

Today I was searching on a Linux box for the standard path of the CAs the OpenSSL installation trusts. It’s fairly easy to find out, but searching for it can take some time so here as a quick note – to find the standard path of the CAs trusted by OpenSSL this command can be used:

# openssl version -a
OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
built on: Wed Feb 22 17:34:31 EST 2012
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(ptr,int) des(idx,cisc,16,int) blowfish(ptr2)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -I/usr/kerberos/include -DL_ENDIAN -DTERMIO -Wall -DMD32_REG_T=int -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack -DOPENSSL_USE_NEW_FUNCTIONS -fno-strict-aliasing -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  dynamic

The interesting line is the one starting with OPENSSLDIR.

Posted in Allgemeines.

Erdnussbutter Tage 2014

Es ist schon eigenartig. Erdnussbutter. Das sind eigentlich nur sehr stark zerhackte Erdnüsse (es gibt selbstverständlich auch Anleitungen auf youtube). Natürlich ist mir das Zeug wiederholt in amerikanischen Filmen und Serien untergekommen. Entweder auf dem Erdnussbutter und Marmelade Sandwich oder die Szenen aus Meet Joe Black, in der Brad Pitt zum ersten Mal voll Verzückung Erdnussbutter von einem Löffel probiert. Und natürlich, so anfällig wie ich auf solche Dinge bin, musste ich es auch probieren.

Seit Jahren kaufe ich jedes Jahr ein Glas Erdnussbutter, einfach nur um zu sehen, ob es mir mittlerweile schmeckt. Und bisher jedes Jahr habe ich das Glas nach den ersten paar mal probieren entsorgt, mit Inhalt (Verschwendung, ich weiß) oder versucht, es an Familie und Freunde zu verschenken.

Auch heuer ist es wieder soweit. Die ersten Februartage sind die Erdnussubttertage 2014. Schmecken tut es mir immer noch nicht richtig, aber langsam gewöhne ich mich daran. Aber vor allem die Konsistenz war und ist für mich nach wie vor schrecklich. Schmierig und sich selbst unauflösend stellt sich immer das Gefühl ein, dass das Zeug den Magen komplett zukleistern wird.

Fazit: Am Anfang ging es noch, bis ich mich dazu entschlossen habe, Erdnussbutter beim Kochen zu verwenden. Frei nach dem Motto probieren geht über studieren habe ich Geld in Hühnerbrust investiert, brav an das amerikanische Rezept gehalten und mir was vermeintlich Leckeres gezaubert. Das Gezauberte habe ich nach ein paar Bissen entsorgt. Komplett. Und jetzt kann ich mal wieder für einige Zeit keine Erdnussbutter mehr in den Mund nehmen. Warten wir aufs nächste Jahr ..

Posted in Allgemeines.

Howto create a pull request on

I created my first Debian package (automx) in the last few weeks. It is already in SID and I’m happy to report that I’ve already got my first bug report (#731233). automx is available via Github. So it was easy to file a pull request to fix the problem in upstream too. But how can such a pull request be created? Fear not, it’s very easy.

I assume you already have a Github Account. Navigate to the repository you want to create a pull request for and press the Fork-Button. A new forked repository will be created for your user.

Now clone the repository to your local machine to make the changes.

git clone<your-user>/<repository-name>

Create a new bugfix branch. Name it for example fix_automx-test_install. This is very important. Do not create the fix in the master branch.

git checkout -b fix_automx-test_install

Let’s imagine the changes you need to make are in the file Make your changes, add the changed file and commit it to the bugfixing branch.

git add
git commit -v

After the changes are commited it is time to push the local changes to your Github repository. We need to push the bugfix branch so we include the name of it in the push command.

git push origin fix_automx-test_install

On the Github page of your repository you should by now see the new branch. Press the green Check and Create pull request button next to the branch.
That’s it.

My pull request was merged already, yeah!
And I haven’t tested it yet, but to update your Github fork with the original repository follow the steps here.

Posted in Linux.

EMail Tagging with Postfix and Dovecot

I’m using Postfix and Dovecot for the EMail service on and all hosted domains.

Often you need an EMail address on websites to get their services but sometimes you are not sure what happens to this EMail address, will it get sold, or sometimes you want to just add a filter which moves the invoices of your hosting provider automatically into a specific folder. Certainly you don’t want to create aliases for everything, so the good people defining the EMail standards thought of that as well – EMail Tagging.

“How can I use this incredible feature?” you may ask. It’s fairly easy, just add your tag lead by “-” to your EMail address which is hosted on – for example the EMail address you’ll use would look like:

How to use it on your own mailsystem setup will be shown now.

First of, let’s be clear, “-” is only one possible tagging delimiter. Some sites use “+” and it’s some kind of religious dispute. Nevertheless, Postfix needs to be aware of it.

In the file add the following line:

# address tagging
recipient_delimiter = -

To forward it to Dovecots LDA add or change the line which does this in your

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop} -a ${recipient}

Reload Postfix and test it – for example with swaks.

Posted in Code & Snippets, Linux.

Tagged with , , .

Find out if a Subversion Repository is using fsfs or bdb

As our Subversion server could maybe use some tweaks I was wondering how I can find out if my repositories are using fsfs or bdb as the backend for storing the versioning information. It’s fairly easy to determine, simply check the content of the file fs-type within the repository.

for i in `find /srv/subversion/repos -name fs-type`; do echo -n "$i: "; cat $i; done

Posted in Code & Snippets, Linux.

Tagged with , .

Detect UEFI capability under Linux

Oh dear, the search is over. I’m using FAI ( for automatic installation of Linux Mint on the companys Developer Notebooks. The setup is working fine for older Notebooks, which do not have UEFI, the new ones starting to roll in are all equipped with it, so I was searching for a way to detect this in my scripts to perform the specific tasks needed for those devices.

Long story short, after some time googling around and endless threads with “boot into your BIOS” or “read your manual” I’ve found holy grail – dmidecode.

From the man page we know “dmidecode  is a tool for dumping a computer’s DMI (some say SMBIOS) table contents in a human-readable format. This table contains a description of the system’s hardware components, as well as other useful pieces of information such as serial numbers and BIOS revision“.

And now, here it is:

# dmidecode | grep UEFI
UEFI is supported

dmidecode does not only give us information about the BIOS, it also includes information about the Type of the Vendor, Product Number, serial number etc. of the notebook.

Posted in Code & Snippets, Linux.

Eine Woche Wohnungssuche – ein Rant

Schon ein interessantes Volk, die Maklerinnen und Makler. Ich suche gerade eine Wohnung in Graz. Mindestens 55m², mindestens 2 Zimmer und ruhig gelegen. Kein Dachgeschoss und wenn geht Balkon. Das Ganze um rund 600 EUR warm. Nichts aufregendes sollte man meinen. Deswegen habe ich ein bisschen mit ihnen zu tun.

Als erstes fällt auf, dass es in Graz offenbar keine MaklerInnen gibt, denen man seine Wünsche mitteilt und die dann mit Angeboten aufwarten, jedenfalls ist mir und allen in meiner Filterbubble, soetwas noch nicht untergekommen. Die Maklerinnen und Makler in Graz beschränken sich vielmehr darauf, Immobilienanzeigen durchzuforsten und alle Wohnungen die ohne Makler angeboten werden, mal für sich zu lukrieren. Ich habe auf den EMail Service in Anspruch genommen, der mir passende Angebote zukommen lässt. Das haben offenbar auch die Makler. Es kommt eine Anzeige für eine Wohnung, privatvermietet. Ein paar Tage später kommt die gleiche Anzeige von einem Maklerbüro, mit sogar den selben Bildern usw., daraus folgere ich, dass die Maklerinnen und Makler wohl nicht mal eigene Fotos machen.

Wo wir gleich beim nächsten Thema wären, Fotos. Eine Katastrophe. Fotos von privatvermieteten Wohnungen sind ja noch recht annehmbar, weil die Damen und Herren Vermieter wohl darauf wert legen, ihre Immobilie möglichst gut darzustellen. Die Fotos der Maklerinnen und Maklern hingegen, strotzen nur so von Nichtsaussage.

Hier ein Beispiel – Titel “Single-/ Studentenhit Nächst FH in Eggenberg!”, hat 64m² (Quelle: entsprechende Anzeige auf


Das war’s. Wir haben vielleicht, wenn man großzügig ist, 10m² abgebildet. Ok, fairerweise, ein ebenso nichtssagendes Bild vom Balkon war auch dabei, trotzdem haben die Bilder keinen (Mehr-)Wert. Oder die Anzeige des Hauses von außen, mit einem leeren Regal und einem Vorraum als Bildausschnitt (die Anzeige gibt es leider nicht mehr). So, also alles klar wie es in der Wohnung aussieht, richtig?

Abgesehen von Bildern fehlt bei gefühlten 90% ein Grundriss. Niemand verlangt (zenti-)metergenaue Grundrisse, aber eine größenverhältnisdarstellende Grundrissskizze, von mir aus auf einem Blatt Papier mit Filzstift gemalt, würde einen immensen Mehrwert bieten. Aber, wie Fladi trefflich anmerkt, würde die Konvertierungskette der selbst, mit Blut und Schweiß erstellten Skizzierung, wohl so aussehen:

papier -> scanner -> tiff -> pdf -> jpeg ->gif -> drucker -> papier -> scanner -> jpeg

evtl. wir der zweite druckerschritt durch an blinden einäugigen chinesischen maler ersetzt, der sich des gif vorlesen losst und doun ah abstrakte repräsentation davon erstellt

Jetzt hat man aus den detailreichen Belichtungen und den, vom verstorbenen aber exhummierten Architekten, persönlich und per Hand gezeichneten Grundrissen eine interessante Wohnung gesehen, aber wo ist diese denn nun genau? “Moooooooment”, denkt sich der Makler, “da könnte ja Jede/-r kommen!”. Anstatt eine Adresse anzugeben, hat man Glück, wenn man zumindest die Strasse erfährt. Üblich ist aber sehr oft auch nur den Bezirk anzugeben. “8020 Graz, Eggenberg” liest man dann zum Beispiel als InteressentIn, wenn man nach der Lage der Immobilie sucht. Eggenberg also. Soso. Der Bezirk Eggenberg in Graz hat 7,78km² Fläche (Quelle: Wikipedia). Es gibt ruhige Flecken, grüne Flecken, es gibt Strassenbahnlinien, Buslinien, stark befahrene Strassen, wenig befahrene Strassen, Industrie, Zuggeleise, einen Bahnhof, also alles was man sich denken kann. Aber mit “8020 Graz, Eggenberg” ist anscheinend alles gesagt.

Hat man sich nun doch durchgerungen anzurufen, und hat das Glück die genaue Adresse zu erfahren dann wird man eingeladen, zu einem Besichtigungstermin. Aber schlau ist er/sie ja, der Makler/die Maklerin. Wegen einer Person lässt er oder sie sich nicht so einfach hinter dem Ofen hervorlocken. Man könne ja an der “gemeinschaftlichen” Besichtigung teilnehmen. Gemeinschaftlich heißt, zusammen mit 15 anderen durch die Wohnung gehen und am Ende der feierlichen Eröffnungsansprache wird verlautbart “wer sich zuerst meldet, bekommt die Wohnung. Sie können sich jetzt in Ruhe umsehen”. Natürlich in Ruhe. Ruhe definiert der/die MaklerIn also mit x anderen Personen gemeinsam in einer Wohnung (ob ich mir da Sorgen machen muss, wenn ich eine ruhige Lage bevorzuge?).

Für all diese ansprechenden Dienstleistungen kassiert der/die überragende DienstleisterIn dann die maxiaml ausschöpfbaren zwei Bruttomonatsmieten, plus Steuer. Bis September 2010 waren es sogar noch drei. Bei der Herabsetzung hat der Branchenverband noch um die Existenz gefürchtet, heute merkt man davon gefühlt als Wohnungssuchende/r nichts.


Was ich mir wünschen würde, wäre ein Maklerbüro dem ich meine Wünsche mitteile, das danach ALLE Anzeigen für mich durchschaut, und mir passende Angebote unterbreitet. Vorab per Mail, mit brauchbaren Fotos, einem Grundriss, mit Informationen zur genauen Lage und zur Heizung. Bonuspunkte gäbe es bei weiterführenden Informationen z.B. betreffend den Nachbarn, der Öffi-Anbindungen, Verkehrslage usw. Das alles kann man heutzutage in Datenbanken pflegen. Ist gar nicht soo schwer, wirklich.

Posted in Allgemeines, Kommentar.

Dovecot maildir subscriptions file erstellen

Ich bin auf Dovecot umgezogen und alle meine Subscriptions in IMAP waren weg. Das lässt sich leicht beheben, indem man im Maildir-Verzeichnis folgendes Kommando ausführt:

find . -maxdepth 1 -type d | grep --color=NEVER "\./\." | sed -e 's|\./\.||g' > subscriptions

Posted in Linux.

Tagged with , .