Tuesday, June 28, 2016

Back to TP-LINK stock firmware

If you are trying to go back to the stock firmware using the mtd command and you have the following error message:

..  [e]Failed to erase block

If you don’t upload a proper firmware, your router will get bricked next time it boots.
You need to strip the first 257 bytes from the .bin.

#dd if=Archer_c7-firm-orig.bin of=tplink.bin skip=257 bs=512

Then you're good to upload the new tplink.bin:

#mtd -r write /tmp/tplink.bin firmware

And visit the default url: 

Monday, June 06, 2016

Latching relay (Hager EPS410B) with push buttons (Legrand Niloe)

Here you go:

Basically the 2 from the push button switch goes to the 3 of the relay and the 4 goes to the light(s), the rest is pretty straight forward.

Thursday, May 19, 2016

Extract pictures from a mbs/mbox export

If you're using a mail client that can export its mails to a mbs or mbox format; like Opera or Thunderbird; and you want to parse these mails; for example to extract all pictures or any other operation, you can follow this approach using a formail and PHP.

Firstly you'll need to split the mbox archive to separate all the email as we'll use PHP to parse it and you're going to explode all the memory and timeout settings if you parse it in one go.

The command to do that is:

#cat Inbox.mbs | formail -ds sh -c 'cat > extra/msg.$FILENO'

This will generate a separate file for each email (msg.XXX) in a separate directory (extra).

Then you can use PHP and the mime_parser class (download it here mime_parser.php, rfc822_addresses.php.html ) to iterate other all these files and extract the picture (or other attachments).
 // get the mails in separated files with
//cat Inbox.mbs | formail -ds sh -c 'cat > extra/msg.$FILENO'

$mail_dirs = array("extra");

function dirToArray($dir)
   $result = array();

   $cdir = scandir($dir);
   foreach ($cdir as $key => $value)
      if (!in_array($value,array(".","..",".DS_Store")))
         if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
            $result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
            $result[] = $value;
   return $result;

$mime=new mime_parser_class;
$mime->ignore_syntax_errors = 1;

foreach($mail_dirs as $mail_dir)
    $files = dirToArray($mail_dir);
    foreach($files as $file)
        echo "doing:". $mail_dir.'/'.$file . "\n";
        $fd = fopen($mail_dir.'/'.$file, "r");
        $email = "";
        while (!feof($fd))
            $email .= fread($fd, 1024);


        $mime->Decode($parameters, $decoded);
        $file_name = "";
        foreach($decoded[0]['Parts'] as $part)
            //EVENT TIME: 2015-12-15,08:18:40
            if(preg_match('/text\/plain/', $part['Headers']['content-type:']))
                echo "TEXT\n";
                preg_match('/EVENT TIME: (.+)\n/', $part['Body'], $matches);
                //$file_name = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $matches[1]);
                $file_name = mb_ereg_replace(":", '-', $matches[1]);
                $file_name = mb_ereg_replace(",", '_', $file_name);
                echo $file_name . "\n";
            if(preg_match('/image\/jpeg/', $part['Headers']['content-type:']))
                echo "IMAGE\n";
                preg_match('/(.)\.jpg/', $part['FileName'], $matches);
                file_put_contents('extracted/'.$file_name.'_'.$matches[1].'.jpg', $part['Body']);

echo "ALL END\n";


In these case I'm using the message content to extract information about the pictures, to rename them as they all have the same name and save them in a separate folder (extracted).

Sunday, January 10, 2016

Flash a Galaxy Note 3 with CyanogenMod

  1. Root your device, first try the kingoapp app, here https://www.kingoapp.com/root-tutorials/how-to-root-galaxy-note3.htm. You'll need a Windows desktop. If this does not work go to xda-developers.com, find your device and look under rooting. Alternatively use towel root app.

  2. Find your N9005 devices codename, not the model number. You're likely to be good using Unified (htlte). It worked with a n9005ZHUENH4.
  3. Install a recovery, get the rashr app from google play, select your devices codename and choose which recovery you want, I recommend TWRP
  4. Download CM, go to https://download.cyanogenmod.org/. Select your codename, then click the build you want, for 5.0 Lollipop, its cm 12 , and for KitKat cm 11. https://download.cyanogenmod.org/?device=hlte&type=snapshot
  5. Download essential Google apps here http://forum.xda-developers.com/android/software/reborn-gapps-t3074533 and decide which package you want (full, mini, micro, nano).
  6. Store CM and gapps zips somewhere you can remember in sdcard.
  7. Reboot to recovery (hold home + volume up buttons). Backup, select backup and follow the instructions to confirm.
  8. Wipe, select wipe and follow the instructions to confirm.
  9. Flash CM, select install, select zip from sdcard, find the cm zip and follow the instructions to confirm.
  10. Flash gapps, select install, select zip from sdcard, find the gapps zip and follow the instructions to confirm.
  11. Reboot.
  12. Voila!

Thursday, December 10, 2015

GCC on Tru64

Follow the instructions from Babak Salamat, here:


Alternatively, before starting to download and install gcc, you need GMP and MPFR if you want to enable Fortran language.
If you don't need Fortran, you can skip the installation of GMP and MPFR.
To download and install GMP follow these steps:
  1. Download GMP from http://nthinking.net/vrak/gmp-4.2.1.tar.gz
  2. copy the file to /tmp and uncompress it there. Let's assume that the extracted files are in /tmp/gmp-4.2.1
  3. cd /tmp/gmp-4.2.1
  4. ./configure --prefix=$HOME/progs/gmp
  5. make
  6. make check
    Check the messages and make sure that no test failed.
  7. make install
Now you can download and install MPFR.
To do so follow these steps:
  1. Download MPFR from http://nthinking.net/vrak/mpfr-3.1.3.tar.gz
  2. copy the file to /tmp and uncompress it there. Let's assume that the extracted files are in /tmp/mpfr-3.1.3
  3. Check the website for any available patches and apply them if there is any
  4. Note: Use /usr/local/bin/patch to apply any existing patch.
  5. cd /tmp/mpfr-3-1.3
  6. LD_LIBRARY_PATH=$HOME/progs/gmp/lib:$LD_LIBRARY_PATH ./configure --prefix=$HOME/progs/mpfr --with-gmp=$HOME/progs/gmp
  7. gmake
  8. gmake check
  9. gmake install
You need libiconv in order to build gcc correctly. I tried a few different options like using --disable-nls to avoid installing libiconv, but none of them worked. Therefore, I decided to install libiconv too. To install libiconv follow these steps:
  1. Download libiconv from http://nthinking.net/vrak/libiconv-1.14.tar.gz
  2. copy the file to /tmp and uncompress it there. Let's assume that the extracted files are in /tmp/libiconv
  3. cd /tmp/libiconv
  4. ./configure --prefix=$HOME/progs/libiconv
  5. make
  6. make install
Now you are ready to build and install gcc:
  1. Download gcc from https://ftp.gnu.org/gnu/gcc/gcc-4.2.1/
  2. Uncompress the file under a directory in /tmp. Let's assume that the extracted files are in /tmp/gcc-4.2.1/
  3. Note: You should use gtar to untar the file, otherwise you will get some errors similar to this:
    tar: ././@LongLink : Unknown filetype
    You can get gtar from the Open Source Software Collection or here:

  4. Create another directory in /tmp. Let's call this directory gcc-build
  5. Note: If you are using HP TestDrive systems, it is important to use /tmp, because you don't have enough disk quota in your home directory to compile gcc.
  6. cd /tmp/gcc-build
  7. CC="gcc -Wa,-oldas" /tmp/gcc-4.2.1/configure --prefix=$HOME/gcc --enable-languages=c,c++,fortran --with-gmp=$HOME/progs/gmp --with-mpfr=$HOME/progs/mpfr --with-libiconv-prefix=$HOME/progs/libiconv
  8. If you don't need C++, omit it from --enable-languages. C++ takes a relatively large amount of disk space.
    If you don't need Fortran, use this command instead:
    CC="gcc -Wa,-oldas" /tmp/gcc-4.2.1/configure --prefix=$HOME/gcc --enable-languages=c,c++ --with-libiconv-prefix=$HOME/progs/libiconv
  9. LD_LIBRARY_PATH=$HOME/progs/gmp/lib:$LD_LIBRARY_PATH gmake bootstrap-lean
  10. Note: You should use GNU make (gmake) version 3.80 or higher to build gcc.
    You can get it from the Open Source Software Collection or here:
    This step takes a long time, usually a few hours!
    If you don't want to install Fortran simply use:
    gmake bootstrap-lean
  11. gmake install
  12. If tar complains that it failed to preserve ownership of files, you'll need to change the ownership of /tmp/gcc-build.
    Go to your home directory and run ls -l. In my case the problem was from group name. The group name of all the files in my home directory was nis while the group name of /tmp/gcc-build and all the files under the directory was system.
    So, I ran chown -hR MyUsername:nis /tmp/gcc-build then I removed $HOME/gcc and ran gmake install again.
At this point, you must have a working gcc installed in $HOME/gcc. You can set your paths to use the new version of the compiler set.

 Libraries have been installed in:

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

Now it is time to remove the folders and files that you have created in /tmp.
In our example: /tmp/gcc-4.2.1, /tmp/gcc-build, /tmp/libiconv, /tmp/mpfr-3.1.3, /tmp/gmp-4.2.1

 If you want the compiled result for Tru64 5.1a, download it here:


BTW, who is still working on Tru64?


Wednesday, November 05, 2014

CURL Reboot D-Link Router (DWR-921)

/usr/bin/curl '' -H 'Host:' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:33.0) Gecko/20100101 Firefox/33.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate' -H 'Referer:' -H 'Cookie: ID=AMIT0000' -H 'Connection: keep-alive'
/bin/sleep 1
/usr/bin/curl '' -H 'Host:' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:33.0) Gecko/20100101 Firefox/33.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate' -H 'Referer:' -H 'Cookie: ID=AMIT0000' -H 'Connection: keep-alive'

Wednesday, May 28, 2014

Controlling Mitsubishi A/C with iTach IP2IR

 - iTach IP2IR with IR blaster
 - Android 4 (rooted)

Mitsubishi Msz-fd50va & Msz-fd35va indoor units IR command codes:
 ON = sendir,1:3,1,38109,1,1,131,65,17,49,17,49,16,17,16,17,17,16,16,49,16,17,16,17,16,50,17,49,16,17,16,49,16,17,16,17,16,50,16,49,16,17,16,49,17,49,17,16,17,16,17,49,17,16,16,17,16,50,16,17,16,17,16,17,17,16,16,17,17,16,16,17,16,17,16,17,16,17,17,16,17,16,16,17,17,17,16,17,17,16,17,16,16,17,17,16,16,17,16,50,16,17,17,16,17,16,16,17,17,16,16,50,17,16,17,16,17,16,16,17,16,50,16,50,16,17,16,17,16,17,17,16,17,16,17,16,17,16,16,17,16,17,16,17,16,50,16,50,16,17,16,17,16,17,17,16,16,17,16,17,16,17,17,49,17,49,16,17,16,17,16,49,17,49,16,50,17,16,16,17,17,16,16,50,16,17,16,17,17,16,17,16,17,16,17,16,16,17,17,16,17,16,16,17,17,16,16,17,17,16,17,16,16,17,16,17,17,16,16,17,16,17,16,17,16,17,16,17,17,16,16,17,16,17,16,17,17,16,16,17,16,50,16,17,17,16,16,17,16,17,16,17,17,16,17,16,17,16,17,17,16,17,17,16,17,16,16,17,17,16,16,17,17,16,17,16,16,17,16,17,17,16,16,50,16,50,17,49,16,17,17,49,16,50,16,17,17,653,134,66,16,50,16,50,17,16,16,17,16,17,17,49,17,16,16,17,16,50,16,49,17,16,16,50,17,16,16,17,16,49,16,50,16,17,17,49,17,49,16,17,16,17,17,49,16,17,17,16,17,49,16,17,16,17,16,17,16,17,17,16,17,16,16,17,16,17,16,17,17,16,16,17,16,17,16,17,17,16,17,16,16,17,16,17,16,17,17,16,16,17,17,49,16,17,16,17,16,17,16,17,16,17,16,50,16,17,17,16,16,17,16,17,17,49,16,50,17,16,16,17,16,17,17,16,17,16,16,17,16,17,17,16,16,17,16,17,17,49,16,50,17,16,16,17,16,17,16,17,16,17,16,17,16,17,16,50,17,49,16,17,16,17,16,50,16,50,16,49,16,17,16,17,16,17,16,50,17,16,16,17,17,16,17,16,16,17,17,16,16,17,16,17,16,17,17,16,17,16,16,17,16,17,17,16,16,17
OFF = sendir,1:3,1,38109,1,1,131,65,16,50,16,50,17,16,16,17,16,17,17,49,17,16,16,17,17,49,17,49,17,16,16,50,16,17,17,16,16,50,17,49,16,17,16,50,16,50,17,16,17,16,16,50,17,16,16,17,16,50,16,17,16,17,17,16,17,16,17,16,16,17,16,17,16,17,16,17,16,17,17,16,17,16,16,17,17,16,16,17,16,17,17,16,17,16,16,17,17,16,17,16,17,16,17,16,16,17,16,17,16,17,16,50,16,17,16,17,17,16,17,16,16,50,17,49,17,16,17,16,16,17,17,16,17,16,16,17,17,16,17,16,16,17,17,16,16,50,16,50,16,17,17,16,17,16,17,16,17,16,16,17,16,17,16,50,17,49,17,16,17,16,16,50,17,49,16,50,17,16,16,17,16,17,17,49,16,17,16,17,17,16,17,16,17,16,16,17,16,17,17,16,16,17,16,17,17,16,17,16,16,17,17,16,17,16,16,17,16,17,17,16,16,17,16,17,16,17,17,16,17,16,17,16,17,16,16,17,16,17,17,16,16,50,16,17,17,16,16,17,16,17,17,16,17,16,16,17,16,17,17,16,16,17,17,16,16,17,17,16,16,17,17,16,17,16,16,17,17,16,17,16,17,16,17,49,16,50,17,49,17,16,17,16,17,49,17,16,17,649,135,65,17,49,16,50,17,16,16,17,17,16,16,50,17,16,16,17,17,49,16,50,17,16,16,50,16,17,17,16,16,50,17,49,17,16,17,49,16,50,16,17,17,16,17,49,16,17,16,17,16,50,17,16,17,16,16,17,17,16,16,17,16,17,16,17,17,16,16,17,17,16,17,16,17,16,17,16,16,17,16,17,16,17,17,16,16,17,16,17,16,17,16,17,16,17,16,17,17,16,17,16,17,16,17,49,17,16,16,17,17,16,17,16,16,50,16,50,17,16,16,17,16,17,16,17,17,16,17,16,16,17,17,16,17,16,16,17,16,50,16,50,16,17,16,17,16,17,16,17,17,16,16,17,16,17,16,50,16,50,16,17,17,16,17,49,17,49,17,49,17,16,16,17,16,17,17,49,16,17,17,16,17,16,17,16,17,16,17,16,16,17,17,16,16,17,17,16,16,17,16,17,17,16,16,17,17,16

Note: code have been retrieved using Telnet and get_IRL command not with the iLearn software, it can't record such a long code, see more details here -> https://globalcache.zendesk.com/entries/27803933-iLearn-and-Daikin-air-conditioner

Then I created a script in Perl to send my command over Telnet.


Perl is handy because it is installed in a lot of Linux distribs (readynas) by default. So you can then run some cron jobs that call this script in order to schedule the power on and off of the A/C units.

Well... Perl is not present by default on Android... but can be done using the followings.
 - SL4A with Perl for Android

You need to change he first line of the perl script to:

#!/data/data/com.googlecode.perlforandroid/files/perl/perl -w

Others handy Android software:
- SManager -> to create terminal widgets that calls the Perl script

This page is powered by Blogger. Isn't yours?