sMobile ? "width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0" : "width=1100"' name='viewport'/> android xda

Thursday, 28 August 2008

smysluplně strávený večer

Neinstaluj Windows na stroj s Linuxovými oddíly.
Když už instaluješ a instalace Windows se kvůli přítomnosti Linuxových oddílů zasekne, nemaž MBR a radši se na to vykašli.
Když už mažeš MBR, tak si ho předtím zazálohuj.
Když už sis ho nezazálohoval, použij na obnovení testdisk, parted je k ničemu.

Friday, 15 August 2008

man2po2tmx2po2man \n bug


Tento zápisek slouží pouze jako podklad pro bugreport. Navíc je anglicky.

This entry is just an attachment to a bugreport. Nothing interesting here.




My goal is to move the current Linux manual pages translation framework (translating to czech) to OmegaT. As OmegaT handles .properties and .po files only, I'm using po4a to transform the man pages to po files and back. To ease the transition I'm creating translation memories from existing translations using po2tmx.



The original en/intro.1 looks like this:

...
.BI "knuth login: " aeb
.BI "Password: " ********
.BI "% " date
Tue Aug 6 23:50:44 CEST 2002
.BI "% " cal
August 2002
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
.BI "% " ls
...

Its czech translation cs/intro.1 looks like this:
...
.BI "knuth login: " aeb
.BI "Password: " ********
.BI "% " date
Út Srp 6 23:50:44 CEST 2002
.BI "% " cal
Srpen 2002
Ne Po Út St Čt Pá So
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
.BI "% " ls
...


This is how it looks when viewed using man en/intro.1 or man cs/intro.1:





To create a po file from the man pages I use the following command:

$ po4a-gettextize -f man -m en/intro.1 -l cs/intro.1 -L utf8 -p intro.1.po

The relevant part of the created intro.1.po file looks like this:
...
# type: Plain text
#: en/intro.1:106
#, fuzzy, no-wrap
msgid ""
"B<knuth login: >I<aeb>\n"
"B<Password: >I<********>\n"
"B<% >I<date>\n"
"Tue Aug 6 23:50:44 CEST 2002\n"
"B<% >I<cal>\n"
" August 2002\n"
"Su Mo Tu We Th Fr Sa\n"
" 1 2 3\n"
" 4 5 6 7 8 9 10\n"
"11 12 13 14 15 16 17\n"
"18 19 20 21 22 23 24\n"
"25 26 27 28 29 30 31\n"
msgstr ""
"B<knuth login: >I<aeb>\n"
"B<Password: >I<********>\n"
"B<% >I<date>\n"
"Út Srp 6 23:50:44 CEST 2002\n"
"B<% >I<cal>\n"
" Srpen 2002\n"
"Ne Po Út St Čt Pá So\n"
" 1 2 3\n"
" 4 5 6 7 8 9 10\n"
"11 12 13 14 15 16 17\n"
"18 19 20 21 22 23 24\n"
"25 26 27 28 29 30 31\n"
...

I have to remove the ', fuzzy' indications that were automatically inserted by po4a, otherwise po2tmx would ignore all the messages:
$ sed -i 's/, fuzzy//' intro.1.po

Because of bug 2021007 in OmegaT, I also have to remove the strings ', no-wrap' from the po file:
$ sed -i 's/, no-wrap//' intro.1.po

Then I create a tmx file from the po file:
$ po2tmx -l cs -i intro.1.po -o intro.1.tmx

The relevant part of the intro.1.tmx file looks like this:
...
<tu>
<tuv xml:lang="en">
<seg>B&lt;knuth login: &gt;I&lt;aeb&gt;
B&lt;Password: &gt;I&lt;********&gt;
B&lt;% &gt;I&lt;date&gt;
Tue Aug 6 23:50:44 CEST 2002
B&lt;% &gt;I&lt;cal&gt;
August 2002
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
</seg>
</tuv>
<tuv xml:lang="cs">
<seg>B&lt;knuth login: &gt;I&lt;aeb&gt;
B&lt;Password: &gt;I&lt;********&gt;
B&lt;% &gt;I&lt;date&gt;
Út Srp 6 23:50:44 CEST 2002
B&lt;% &gt;I&lt;cal&gt;
Srpen 2002
Ne Po Út St Čt Pá So
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
</seg>
</tuv>
</tu>
...

Then I launch OmegaT, select 'Project'->'New' and give 'manpagestest' as the new project's name. The Source files language is en-us, target language is cs. Sentence-level segmenting is disabled. I quit the project.

Then I copy the tmx to the project:
$ cp intro.1.tmx manpagestest/tm/

Then I create an english po file from the original man page and place it to the source directory of the project:
$ po4a-gettextize -f man -m en/intro.1 -p manpagestest/source/intro.1.po


Then I launch OmegaT, open the manpagestest project and click on the intro.1.po file to edit it. When I change to the message containing the calendar, I can see that the suggested translation (based on the tmx) is not 100% as with other strings, it's only 67 % :



Still hoping it will turn out ok I put the fuzzy match as new translation:



save the project and click 'Project'->'Create translated documents'. I close OmegaT now.


The relevant part of the translated manpagestest/target/intro.1.po file now looks like this:

...
# type: Plain text
#: en/intro.1:106
#, no-wrap
msgid ""
"B<knuth login: >I<aeb>\n"
"B<Password: >I<********>\n"
"B<% >I<date>\n"
"Tue Aug 6 23:50:44 CEST 2002\n"
"B<% >I<cal>\n"
" August 2002\n"
"Su Mo Tu We Th Fr Sa\n"
" 1 2 3\n"
" 4 5 6 7 8 9 10\n"
"11 12 13 14 15 16 17\n"
"18 19 20 21 22 23 24\n"
"25 26 27 28 29 30 31\n"
msgstr B<knuth login: >I<aeb>
B<Password: >I<********>
B<% >I<date>
Út Srp 6 23:50:44 CEST 2002
B<% >I<cal>
Srpen 2002
Ne Po Út St Čt Pá So
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
...

Obviously this is already wrong but for the sake of the experiment, I'm going on:
$ po4a-translate -f man -m en/intro.1 -p manpagestest/target/intro.1.po -l intro.cs.1
...
manpagestest/target/intro.1.po:134: (po4a::po)
Strange line: --><--
manpagestest/target/intro.1.po:165: (po4a::po)
Strange line: -->msgstr B<knuth login: >I<aeb><--
manpagestest/target/intro.1.po:166: (po4a::po)
Strange line: -->B<Password: >I<********><--
manpagestest/target/intro.1.po:167: (po4a::po)
Strange line: -->B<% >I<date><--
manpagestest/target/intro.1.po:168: (po4a::po)
Strange line: -->Út Srp 6 23:50:44 CEST 2002<--
manpagestest/target/intro.1.po:169: (po4a::po)
Strange line: -->B<% >I<cal><--
manpagestest/target/intro.1.po:170: (po4a::po)
Strange line: --> Srpen 2002<--
manpagestest/target/intro.1.po:171: (po4a::po)
Strange line: -->Ne Po Út St Čt Pá So<--
manpagestest/target/intro.1.po:172: (po4a::po)
Strange line: --> 1 2 3<--
manpagestest/target/intro.1.po:173: (po4a::po)
Strange line: --> 4 5 6 7 8 9 10<--
manpagestest/target/intro.1.po:174: (po4a::po)
Strange line: -->11 12 13 14 15 16 17<--
manpagestest/target/intro.1.po:175: (po4a::po)
Strange line: -->18 19 20 21 22 23 24<--
manpagestest/target/intro.1.po:176: (po4a::po)
Strange line: -->25 26 27 28 29 30 31<--
manpagestest/target/intro.1.po:236: (po4a::po)
Strange line: --><--
manpagestest/target/intro.1.po:309: (po4a::po)
Strange line: --><--
...

as you can see, po4a complains about some extra blank lines in the file and also does not like at all the translated part. This is because po4a expects the message to have opening and closing doublequotes, and to have them on each line (a bug in OmegaT?). I fix that manually:
$ cp manpagestest/target/intro.1.po manpagestest/target/intro.1.fixed.po
$ vi manpagestest/target/intro.1.fixed.po
$ cat manpagestest/target/intro.1.fixed.po
...
# type: Plain text
#: en/intro.1:106
#, no-wrap
msgid ""
"B<knuth login: >I<aeb>\n"
"B<Password: >I<********>\n"
"B<% >I<date>\n"
"Tue Aug 6 23:50:44 CEST 2002\n"
"B<% >I<cal>\n"
" August 2002\n"
"Su Mo Tu We Th Fr Sa\n"
" 1 2 3\n"
" 4 5 6 7 8 9 10\n"
"11 12 13 14 15 16 17\n"
"18 19 20 21 22 23 24\n"
"25 26 27 28 29 30 31\n"
msgstr "B<knuth login: >I<aeb>"
"B<Password: >I<********>"
"B<% >I<date>"
"Út Srp 6 23:50:44 CEST 2002"
"B<% >I<cal>"
" Srpen 2002"
"Ne Po Út St Čt Pá So"
" 1 2 3"
" 4 5 6 7 8 9 10"
"11 12 13 14 15 16 17"
"18 19 20 21 22 23 24"
"25 26 27 28 29 30 31"
...

and retry:
$ po4a-translate -f man -m en/intro.1 -p manpagestest/target/intro.1.fixed.po -l intro.cs.1

The important part of the created intro.cs.1 looks like this:
...
\fBknuth login: \fP\fIaeb\fP\fBPassword: \fP\fI********\fP\fB% \fP\fIdate\fPÚt Srp 6 23:50:44 CEST 2002\fB% \fP\fIcal\fP Srpen 2002Ne Po Út St Čt Pá So 1 2 3 4 5 6 7 8 9 1011 12 13 14 15 16 1718 19 20 21 22 23 2425 26 27 28 29 30 31
...


and this is how it looks when viewed with man ./intro.cs.1, i.e. badly:




All the mentioned files are attached.


Monday, 4 August 2008

iDuino


Na svém oblíbeném hackaday.com jsem po vlně různých hacků s platformou Arduino (Vývojová sada s procesorem ATmega168, opensource je hardware i software, soft je multiplatformní) narazil na zprávičku o stickDuino, forku Arduina, který lze zasunout přímo do USB portu. To mě, spolu s informací, že to prodávají za 20 USD, navnadilo. Dolar je dneska za ~15 Kč a to už vychází o něco líp než 770 Kč za echt Arduino Diecimila v českém shopu. Nakonec jsem se ale rozhodl pro iDuino.





iDuino se k PC připojuje pomocí USB s Mini-B konektorem (to je ten malej k digitálním foťákům apod.). Jeho velkou výhodou je maximální kombinovatelnost s nepájivými kontaktními poli.



V procesoru, který je na desce, zabírá 2kB z 16kB bootloader, díky kterému je nahrávání programů jednoduché. Ale pomocí jednoduchých triků se dá deska použít i k programování čistých procesorů, a to i Mega8, Tiny2313 a Tiny13.



Minimální objednávka už hotové desky byla 5ks. 2-3 kusy určitě využiju, ale zbylé dva klidně prodám za náklady (cca 390 Kč, ale asi k tomu přijde i DPH a clo, nechám se překvapit). Takže pokud máte někdo zájem, tak se ozvěte.



Jo a taky díky tomu jsem si dneska konečně aktivoval účet na PayPalu.
Nejdřív jsem musel zavolat na linku Servis24 spořky a nastavit "limity pro transakce bez fyzické přítomnosti karty" (přes web to nejde a hodinu na pobočce se mi trávit nechtělo). Nejdřív mi slečna řekla, že to bude aktivovaný až ve středu, že jim to tak prostě v systému chodí, ale když jsem vyjádřil rozčarování, tak z ní vylezlo, že za 50 Kč to můžu mít expres za 30 minut. No tak jo. Asi za hodinu jsem to zkusil, v internetbankingu sice ještě změna nebyla, ale PayPal už mi kartu ověřil.





Sunday, 27 July 2008

Acceleration of Suguri

Když jsem zažil nečekaní úspěch s Neverhood, podíval jsem se po AppDB wine po dalších hrách s hodnocením Platinum a Gold. Hned u A mě zaujala svým názvem hra Acceleration of Suguri. Stáhnul jsem a ono to zase bez problémů fungovalo... Takhle budu muset za chvíli přejít na další OS, jinak nic užitečnýho neudělám ;-)



Je to jednoduchá arkáda, ale s krásnými postavičkami a veselou hudbou. Hrát se dá proti kamarádovi u počítače, přes síť anebo proti počítači. Trial má oproti plné verzi jen 3 holky - Suguri se světelným mečem, Saki s výbušnými kužely a Iru s plazmovou pistolí. Dále jsou k dispozici jen dvě scény - Forest a Lake. Myslím ale, že to vůbec nevadí, ono se to docela rychle omrzí.


Acceleration of Suguri
Acceleration of Suguri
A tady video na youtube, omluvte zhoršenou kvalitu, točil jsem to foťákem, aby tam byl i zvuk.

Systémové požadavky: CPU 1.2 GHz, RAM 256 MB, Video RAM 32MB, DirectX 8.1a


Příjemně mě překvapilo, že je to naprosto v pohodě hratelné i na notesu s přesně 32 MB VRAM.

Jak na to:
$ wget http://www.shindenken.org/daidai/AoSuguriTrial.zip
$ unzip AoSuguriTrial.zip
$ cd AoSuguriTrial
$ pasuspender wine AoSuguriTrial.exe


Sice je to podrobně japonsky popsáno na stránkách hry :-), ale neškodí si připomenout ovládání:




Menu:



Šipky

Z potvrzuje výběr



Hra:


Z normální útok

ZZ zesílený útok

X útok

XX zesílený útok

C speciální útok, je dostupný až poté, co několikrát zasáhnete protivníka. Velká číslice v půlkolečku nahoře ukazuje, kolik je jich k dispozici.

V rychlý pohyb

Z+X

A+Z útok ruční zbraní

A+X útok ruční zbraní na větší vzdálenost

A+C

S štít (je dostupný až poté, co několikrát zasáhnete protivníka - viz nápis SHIELD)

T menu

Esc odchod do OS




K nastavení síťové hry slouží config.exe, na třetí záložce je třeba nastavit IP adresu protivníka, ten musí udělat to samé. OK je to tlačítko vpravo.

Acceleration of Suguri

Bohužel síťová hra je trochu rozbitá, postavy na lokálním a vzdáleném stroji se liší a nesedí ani jejich poloha, takže u sebe souseda trefím, ale na jeho obrazovce minu.


Saturday, 26 July 2008

zabitej den


Včerejšek nebyl zrovna nejproduktivnější. Nejdřív jsem se konečně podíval na (1. díl) IT Crowd. Není to špatný, ale ty vtipy jsou většinou strašně předvídatelný.
No a pak jsem si pod vlivem zprávičky o další verzi Wine nainstaloval starou pecku Neverhood. Wine v MDV 2008.1 je sice jen ve verzi 0.9.58 (v Backports je 1.1.2, ale nemám je zapnuté, momentálně upřednostňuju stabilitu před bleeding edge), ale i tak to proběhlo naprosto bez potíží. Wine se musí nastavit jako Windows 95. Aby fungoval zvuk, je kvůli PulseAudio potřeba změnit ovladač zvuku ve winecfg na OSS (s esd to dost blblo, často byl místo zvuku jen šum) a taky spouštět wine s pasuspender (viz tady). Dohrál jsem to ve 4 ráno ...





Wednesday, 2 July 2008

Customizing Asus AM200g - V. firmware modification

I would not dare to upload a firmware built from scratch, but what about only slightly modified one?

For me, it would suffice to just add a call to some script on the flash drive that would be launched at boot. From there I'd be able to do all I need (ATM).

The WL-600g GPL Makefile contains the following default sequence of commands in its buildimage section:

./buildFS
$(HOSTTOOLS_DIR)/mksquashfs $(TARGET_FS) $(PROFILE_DIR)/rootfs.img -noappend -be -lzma -no-fragments -noI
$(OBJCOPY) -O binary vmlinux vmlinux.bin
$(HOSTTOOLS_DIR)/cmplzma -k -2 vmlinux vmlinux.bin vmlinux.lz;\
$(HOSTTOOLS_DIR)/bcmImageBuilder --output $(CFE_FS_KERNEL_IMAGE_NAME) --chip $(BRCM_CHIP) --board $(BRCM_BOARD_ID) \
--productname $(CUSTOMER_PRODUCT_NAME) --blocksize $(BRCM_FLASHBLK_SIZE) --cfefile $(CFE_FILE) --rootfsfile rootfs.img --kernelfile vmlinux.lz --include-cfe;

Let's keep hoping that WL-600g is the same as AM-200g, try to reverse the process, do the modifications and put together again.
bcmImageBuilder should just put together the filesystem file, kernel, cfe file (st like bios - see OpenWRT - Everything you need to know about broadcom hardware (Part 1)) and some checksums. There is a utility done by OpenWRT people that should be a replacement of bcmImageBuilder. Here. From there I learned the structure of the header, let's repeat it here for the sake of completeness:
The header takes the first 256 bytes

/* Image component */
struct imagecomp {
uint8_t address[12]; /* Address of this component as ASCII */
uint8_t len[10]; /* Length of this component as ASCII */
};
/* Image tag */
struct imagetag {
uint8_t tagver[4]; /* 0 - 3: Version of the tag as ASCII (2) */
uint8_t sig1[20]; /* 4 - 23: BCM_MAGIC_1 */
uint8_t sig2[14]; /* 24 - 37: BCM_MAGIC_2 */
uint8_t chipid[6]; /* 38 - 43: Chip id as ASCII (6345) */
uint8_t boardid[16]; /* 44 - 59: Board id as ASCII (96345GW2, etc...) */
uint8_t bigendian[2]; /* 60 - 61: "1" for big endian, "0" for little endian */
uint8_t imagelen[10]; /* 62 - 71: The length of all data that follows */
struct imagecomp cfe; /* 72 - 93: The offset and length of CFE */
struct imagecomp rootfs; /* 94 - 115: The offset and length of the root file system */
struct imagecomp kernel; /* 116 - 137: The offset and length of the kernel */
uint8_t dualimage[2]; /* 138 - 139: use "0" here */
uint8_t inactive[2]; /* 140 - 141: use "0" here */
uint8_t reserved1[74]; /* 142 - 215: reserved */
uint32_t imagecrc; /* 216 - 219: crc of the images (net byte order) */
uint8_t reserved2[16]; /* 220 - 235: reserved */
uint32_t headercrc; /* 236 - 239: crc starting from sig1 until headercrc (net byte order) */
uint8_t reserved3[16]; /* 240 - 255: reserved */
};

Let's decompose it for the firmware from Joyce:
tagver="36 00 00 00" = "6..."
sig1="42 72 6f 61 64 63 6f 6d 20 43 6f 72 70 6f 72 61 74 69 6f 00" = "Broadcom Corporatio."
sig2="76 65 72 2e 20 32 2e 30 00 00 00 00 00 00" = "ver. 2.0......"
chipid="36 33 34 38 00 00" = "6348.."
boardid="39 36 33 34 38 47 57 2d 31 31 00 00 00 00 00 00" = "96348GW-11......"
bigendian="31 00" = "1"
imagelen="33 38 32 32 33 35 36 00 00 00" = "3822356..." #indeed 3822356 + 256 = 3822612 (the size of the firmware file)
cfe="33 32 31 37 30 33 31 31 36 38 00 00 36 32 31 37 32 00 00 00 00 00" = "32170311..62172....." # this starts to be tricky ...
## 62172 is clearly the cfe size, but the cfe itself is slightly different from the files provided in the WL-600g GPL package.
rootfs="33 32 68 31 37 30 39 36 39 36 30 00 00 33 31 33 37 35 33 36 00 00 00" = "3217096960..3137536..." #fs size = 3137536
kernel="33 32 32 30 32 33 34 34 39 36 00 00 36 32 32 36 34 38 00 00 00 00" = "3220234496..622648...." # kernel size = 622648
## 3137536+622648+62172+256=3822612 - all fits so far!
dualimage="00 00"
inactive="00 00"
reserved="00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00"
imagecrc="c9 ea a8 50"
reserved2=""

The reserved2 part is different from WL-600g - after some experimentation, I found out that the first four bytes are CRC of the fs image and the second four bytes are CRC of the kernel, but was not able to figure out the CRC algorithm.
to extract cfe:
dd bs=1 if=JOYCE_IAD_U2_B_306063520_cfe_fs_kernel of=cfe skip=256 count=62172
to extract fs:
dd bs=1 if=JOYCE_IAD_U2_B_306063520_cfe_fs_kernel of=fs skip=62428 count=3137536
to extract kernel:
dd bs=1 if=JOYCE_IAD_U2_B_306063520_cfe_fs_kernel of=kernel skip=3199964 count=622648

By calling the Asus' bcmImageBuilder command on the extracted files, I got a firmware identical (verified with md5sum) to the original:
../../Dokumenty/GPL_AM604G_ForRussia/GENERIC_6348_WLAN_A34_3-06-02-01/hostTools/bcmImageBuilder --output bcmimage --chip 6348 --board 96348GW-11 --blocksize 64 --cfefile cfe --rootfsfile fs --kernelfile kernel --include-cfe

So, let's proceed further...
$ file fs
fs: Squashfs filesystem, big endian, version 2.0, 3136535 bytes, 423 inodes, blocksize: 65536 bytes, created: Mon May 28 08:35:59 2007

the file command confirms the fs file is indeed a squashfs image. Let's extract it:
$ unsquashfs -s fs
Reading a different endian SQUASHFS filesystem on fs
Can't find a SQUASHFS superblock on fs

This is already reported in Ubuntu, I reported it to the Mandriva guys as well.
The hand-compiled squashfs 3.3 seemed to work just fine, but it was not able to deal with the Broadcom specific lzma compression. I tried to mount the fs file on the router, but unfortunately mount was not compiled with support for mounting loop devices
# mount -o ro -o loop /var/usb/usb_2/fs /var/usb/a
mount: Mounting /var/usb/usb_2/fs on /var/usb/a failed: Block device required

After some retries I found out about the excellent OpenBox4 people hacking another Broadcom based ADSL router. They developed nb4-unsquash - a tool to extract the content of Broadcom-lzma-compressed squashfs.


But I still did not trust it entirely. I found out I can mount the internal flash and that's enough for me.
First I made a backup of the original fs:
# mkdir /var/usb/a
# mount -o ro /dev/mtdblock0 /var/usb/a
# /var/usb/usb_1/bin/tar cvf /var/usb/usb_2/firmwarefs.tar /var/usb/a/

Copied the filesystem to my PC:
on-my-PC $ mkdir /tmp/fs
on-my-PC $ netcat -l -p 9000 | dd of=/tmp/fs/fs.tar
on-router# /var/usb/usb_1/bin/dd if=/var/usb/usb_2/firmwarefs.tar |/var/usb/usb_1/bin/mipsel-linux-netcat 192.168.1.64 9000

Unpacked (as root because the contents are special files):
$ su
# cd /tmp/fs
# tar xvf fs.tar

Before doing any modifications I tried recreating the squashfs image:
# /home/hajma/Dokumenty/GPL_AM604G_ForRussia/GENERIC_6348_WLAN_A34_3-06-02-01/hostTools/mksquashfs /tmp/fs/var/usb/a rootfs.img -noappend -be -lzma -no-fragments -noI

and verified with the nb4-unsquash that it looks similar to the original one:
# nb4-unsquash -d new rootfs.img
# nb4-unsquash -d old /tmp/joycefs
# ls -laR old/ > /tmp/oldfslist
# ls -laR new/ > /tmp/newfslist
# kdiff3 /tmp/oldfslist /tmp/newfslist

I saw that all except some modification times was identical, so I put the recreated fs together with the old kernel and cfe:
# /home/hajma/Dokumenty/GPL_AM604G_ForRussia/GENERIC_6348_WLAN_A34_3-06-02-01/hostTools/bcmImageBuilder --output bcmimage --chip 6348 --board 96348GW-11 --blocksize 64 --cfefile cfe --rootfsfile rootfs.img --kernelfile kernel --include-cfe

Then I took a deep breath and flashed the router with the recreated firmware ... ... ... ... ... ...
And it worked!

Unfortunately it was not possible to simply find a place in the boot sequence where everything is already done and flash is mounted. The /etc/profile, launched by the line ::respawn:-/bin/sh of /etc/inittab, calls /bin/cfm, which takes care of all the ADSL settings and mounting the flash - but it stays loaded and the script does not go on. So after several retries I found a solution - added another line to the /etc/inittab:

$ diff -u inittab.old inittab
--- inittab.old 2008-07-03 00:31:44.000000000 +0200
+++ inittab 2008-07-03 00:31:52.000000000 +0200
@@ -1,5 +1,6 @@
+::respawn:-/bin/myscript.sh
tty2::askfirst:-/bin/sh

that will launch a script that waits until the flash drive is mounted and then passes the command to script residing on the flash:
$ cat bin/myscript.sh
#!/bin/sh
while [ "`echo /var/usb/usb_*`" = "/var/usb/usb_*" ]; do
ping 127.0.0.1 # the shell does not have the sleep builtin, hence using ping as a substitute
done
ping -c 20 127.0.0.1 # wait 20 seconds after the usb is mounted just to be sure load is not too high
/bin/sh /var/usb/usb_2/myscript.sh > /var/usb/usb_2/myscript.log 2>&1

Then I created the new image:
# /home/hajma/Dokumenty/GPL_AM604G_ForRussia/GENERIC_6348_WLAN_A34_3-06-02-01/hostTools/mksquashfs /tmp/fs/var/usb/a rootfs.img -noappend -be -lzma -no-fragments -noI

Combined with the rest of the lot:
# /home/hajma/Dokumenty/GPL_AM604G_ForRussia/GENERIC_6348_WLAN_A34_3-06-02-01/hostTools/bcmImageBuilder --output bcmimage --chip 6348 --board 96348GW-11 --blocksize 64 --cfefile cfe --rootfsfile rootfs.img --kernelfile kernel --include-cfe


and flashed. Works like a charm. I put the firmware to the OpenWRT page on AM-200g. direct link



In the next part I'll try to fix the dhcp.



FYI, this is the content of the /var/usb/usb_2/myscript.sh file, launching the jabber daemon:

#!/bin/sh
/bin/iptables -I INPUT -p tcp -i ppp_8_48_1 --dport 5222 -m state --state NEW -j ACCEPT
/bin/iptables -I INPUT -p tcp -i ppp_8_48_1 --dport 5223 -m state --state NEW -j ACCEPT
/bin/iptables -I INPUT -p tcp -i ppp_8_48_1 --dport 5269 -m state --state NEW -j ACCEPT
/var/usb/usb_1/bin/jabberd -c /var/usb/usb_2/jabberd/jabber.xml

FYI, the steps to cross-compile netcat and coreutils (for the tar and dd commands):
$ wget ftp://heanet.dl.sourceforge.net/n/ne/netcat/netcat-0.7.1.tar.bz2
$ tar xvf netcat-0.7.1.tar.bz2
$ cd netcat-0.7.1
$ ./configure --build=i686-pc-linux-gnu --host=mipsel-linux --target=mipsel-linux --prefix=/var/usb/usb_1
$ make
$ make install
$ cd ..
$ wget http://ftp.gnu.org/gnu/coreutils/coreutils-6.9.tar.bz2
$ tar xvf coreutils-6.9.tar.bz2
$ cd coreutils-6.9
$ ./configure --build=i686-pc-linux-gnu --host=mipsel-linux --target=mipsel-linux --prefix=/var/usb/usb_1
$ make
$ make install

Customizing Asus AM200g - IV. jabberd configuration

Customizing Asus AM200g - III. jabberd and vim

Customizing Asus AM200g - II. Preparing the environment

Customizing Asus AM200g - I. PREPARATION

Friday, 27 June 2008

Customizing Asus AM200g - IV. jabberd configuration

The following is a sequence of trial and errors, one by one, covering the path from the default config file to a working one. It is intended to be a search engine trap for people trying to resolve configuration problems.




$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to r (192.168.1.1).
Escape character is '^]'.
BCM96348 ADSL Router
Login: admin
Password:
> sh
BusyBox v1.00 (2005.04.12-18:11+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.
# /var/usb/usb_1/bin/jabberd
Not writing pidfile /var/usb/usb_1/var/run/jabberd/jabber.pid: Read-only file system

In my setup, the jabberd ecosystem resides on a readonly filesystem, so the very first thing to do is to copy the etc/jabber.xml file to the vfat partition and make sure the files that need to be dynamically created/modified are there as well.

# mkdir /var/usb/usb_2/jabberd
# cp /var/usb/usb_1/etc/jabber.xml /var/usb/usb_2/jabberd
# /var/usb/usb_1/bin/vim /var/usb/usb_2/jabberd/jabber.xml


If you're not familiar with vi, here's quick help:

To quit without saving type ':q' (colon q Enter)

To save changes and quit type ':wq' (colon w q Enter)

To move around use the arrow keys

To start writing at cursor press 'i'

To get out of the writing mode (so that you can move somewhere else) press 'Esc'

To delete character at cursor press 'x'




The changes I did at first were:


1.

To prevent the message


Not writing pidfile /var/usb/usb_1/var/run/jabberd/jabber.pid: Read-only file system

I changed /var/usb/usb_1/var/run/jabberd/jabber.pid to /var/usb/usb_2/jabberd/jabber.pid.

2.


Next I launched jabberd in debug mode (-D) and pointed it to the alternate config file (-c path/to/file):


# /var/usb/usb_1/bin/jabberd -D -c /var/usb/usb_2/jabberd/jabber.xml
Mon Jan 3 20:31:13 2000 mio_tls.cc:921 MIO TLS init (GNU TLS)
Mon Jan 3 20:31:14 2000 log.cc:221 <log xmlns='jabber:server' type='warn' from='-internal'>
Cannot open /var/usb/usb_1/etc/dhparams.pem for reading dhparams: No such file or directory</log>
...

The comments in the file say:
<!-- With the <dhparams/> element right inside the <tls/> element,  -->
<!-- you can configure a file containing parameters for Diffie -->
<!-- Hellmann key exchanges. If this configuration setting is not -->
<!-- present, jabberd14 will generated these parameters -->
<!-- automatically on each startup. This takes some time, therefore -->
<!-- you get a faster startup, if this setting is present. -->

So I commented out <dhparams type='pem'>/var/usb/usb_1/etc/dhparams.pem</dhparams> as I don't know how to make it properly and don't mind waiting a few seconds more at startup. To start a comment, you write "<!--", you close it with "-->".

3.

# /var/usb/usb_1/bin/jabberd -D -c /var/usb/usb_2/jabberd/jabber.xml
...
Mon Jan 3 20:47:02 2000 xdb_sql.cc:911 using the following query on SQL connection establishment: SET NAMES utf8
Mon Jan 3 20:47:02 2000 log.cc:221 <log xmlns='jabber:server' type='alert' from='xdbsql.localhost'>Your xdb_sql is compiled without support
for the selected database driver 'mysql'.</log>
Mon Jan 3 20:47:02 2000 xdb_sql.cc:813 processing handler definition: <handler xmlns='jabber:config:xdb_sql' ns='jabber:iq:last'>
...
Mon Jan 3 20:47:03 2000 deliver.cc:837 delivering to instance 'elogger.localhost'
Mon Jan 3 20:47:03 2000 deliver.cc:614 DELIVER 3:xdbsql.localhost <log xmlns='jabber:server' type='alert' from='xdbsql.localhost'>Your
xdb_sql is compiled without support for the selected database driver 'mysql'.</log>


Yes, this is true, the daemon was compiled without any sql support. I've followed the steps in README.filespool to setup jabber to store data in files - I definitely don't want to run sql server on the machine. Of course I replaced the <xdb_file>$PREFIX/lib/libjabberdxdbfile.so</xdb_file> with <xdb_file>/var/usb/usb_1/lib/libjabberdxdbfile.so</xdb_file>, and <spool><jabberd:cmdline flag='s'>$PREFIX/var/spool/jabberd</jabberd:cmdline></spool> with <spool><jabberd:cmdline flag='s'>/var/usb/usb_2/jabberd/jabberdspool</jabberd:cmdline></spool> - then made sure the directory exists:
# mkdir /var/usb/usb_2/jabberd/jabberdspool



4.


# /var/usb/usb_1/bin/jabberd -D -c /var/usb/usb_2/jabberd/jabber.xml
...
Mon Jan 3 21:17:58 2000 log.cc:221 <log xmlns='jabber:server' type='alert' from='inject.localhost'>
could not open directory /var/usb/usb_1/var/spool/jabberd/inject.localhost for reading</log>
...

inject.localhost is a directory, where some other process can put messages. jabberd then automatically sends them. To make it working I changed
<in>/var/usb/usb_1/var/spool/jabberd/inject.localhost</in> to <in>/var/usb/usb_2/jabberd/inject.localhost</in> and created the directory with
# mkdir /var/usb/usb_2/jabberd/inject

5.
# /var/usb/usb_1/bin/jabberd -D -c /var/usb/usb_2/jabberd/jabber.xml
...
Mon Jan 3 21:33:15 2000 jabberd.cc:336 main load check of 1.00 with 4 total threads
Mon Jan 3 21:33:16 2000 users.cc:209 0 total users
Mon Jan 3 21:33:17 2000 dialback.cc:1207 dialback idle check

hmm, seems to be working ..., time to launch kopete and try registering a user hajma@192.168.1.1. It failed, of course. The message I got from Kopete was definitely not helpful: "There was an error in the protocol stream: There was a conflict in the information received." and "Unable to create account on the server. The Jabber ID is probably already in use.". What a nonsense ... a brief look into the konsole shows the infamous "bouncing a routed packet" message:
Mon Jan  3 21:35:40 2000  deliver.cc:614 DELIVER 4:192.168.1.1 <route xmlns='jabber:server' type='auth'
to='hajma@192.168.1.1' from='14@c2s/100E0278'><iq type='set' to='192.168.1.1' id='aab0a'>
<query xmlns='jabber:iq:register'>
<username>hajma</username>
<password>qwertyuiop</password>
</query>
</iq></route>
Mon Jan 3 21:35:40 2000 deliver.cc:837 delivering to instance 'dnsrv.localhost'
Mon Jan 3 21:35:40 2000 deliver.cc:766 delivery failed (Internal Delivery Error)
Mon Jan 3 21:35:40 2000 log.cc:221 <log xmlns='jabber:server' type='notice' from='192.168.1.1'>bouncing a routed
packet to hajma@192.168.1.1 from 14@c2s/100E0278: Internal Delivery Error</log>

In short, to make jabberd working correctly, you have to replace all occurences of 'localhost' by the domain or IP jabberd is listening at. Now I replaced localhost with 192.168.1.1.

6.

# /var/usb/usb_1/bin/jabberd -D -c /var/usb/usb_2/jabberd/jabber.xml
...

Registering with Kopete again ... This time I only got one error: "Unable to create account on the server. The Jabber ID is probably already in use.". And again it was completely unrelated - in the konsole I found this:
Mon Jan  3 21:50:02 2000  mod_register.cc:278 we got a reply for: username
Mon Jan 3 21:50:02 2000 mod_register.cc:278 we got a reply for: password
Mon Jan 3 21:50:03 2000 mod_register.cc:298 returned err msg: Missing data field: name
...
<error code='400' type='modify'><bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
<text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Missing data field: name</text></error></iq></route>

The stupid thing Kopete completely ignores XEP-0077, does not ask the server what is needed for registration and just sends username and password. To support Kopete, I had to delete
<name/> and <email/> from the <register xmlns="jabber:iq:register" notify="yes"> section.


After this change I am able to register a new user and send messages.
Just to be perfect I also changed /var/usb/usb_1/var/log/jabberd/error.log to /var/usb/usb_2/jabberd/error.log.
Off to the next level!

7.


To have it available from outside world, I replaced 192.168.1.1 with my_domain.cz.
To open a port in the AM-200g router, issue the following command:

iptables -I INPUT -p tcp -i ppp_8_48_1 --dport 5222 -m state --state NEW -j ACCEPT



8.

The main reason for running own jabber server is more privacy and that is impossible without encryption - let's do it.
To be able to use TLS I had to generate a self-signed certificate. I've used the procedure described at http://www.vanemery.com/Linux/Jabber/jabberd.html:

$ openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out key.pem

Generating a 1024 bit RSA private key

...........++++++

.........++++++

writing new private key to 'privkey.pem'

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase: