středa 29. srpna 2012

Přidání grafického indikátoru využití HDD pro IPBox Enigma2

Je nutné upravit celkem dva soubory:

Nejdříve javascriptový soubor: soubor /usr/local/lib/enigma2/python/Plugins/Extensions/WebInterface/web-d
ata/objects.js


            var free        = hdd.getElementsByTagName('e2free').item(0).firstChild.data;
            var IntFree = parseInt(free.replace(" GB",""));
            var IntCapacity = parseInt(capacity.replace(" GB",""));
            var pfree   = Math.floor(((100 / IntCapacity) * IntFree)*10)/10;
            var pUsed   = 100 - pfree;
   
            this.hdds[i] = {   
                    'model'     : model,
                    'capacity'  : capacity,
                    'free'      : free,
                    'pfree'     : pfree,
                    'pUsed'     : pUsed
            };

 A nyní již jen vlastní šablonu stránky v souboru: /usr/local/lib/enigma2/python/Plugins/Extensions/WebInterface/web-d
ata/tpl/default/tplDeviceInfo.htm

<tr>
    <td class="aboutElementLeft">Free:</td>
    <td class="aboutElementRight">${hdd.free}</td>
</tr>
<tr>
    <td colspan="2" style="padding-right: 3px;">
        <div style="width:100%; position:relative; border:1px solid #999999">
            <div style="background-color:#CCCCCC; width: ${hdd.pUsed}%; height:15px">
                <div style="position:absolute; left:0; top:0; text-align:center; width:100%%; color:#000000">
                    <small>Free: ${hdd.free} / ${hdd.capacity} (Free: ${hdd.pfree} %)</small>
                </div>
            </div>
        </div>
    </td>
</tr>



Pokud je HDD připojen pomocí USB rozhraní, tak se zobrazuje dvakrát. Tento problém jsem odstranil pomocí přidání podmínky do /usr/local/lib/enigma2/python/Plugins/Extensions/WebInterface/web-d
ata/objects.js, pokud je název HDD stejný jako předchozí, pak se tento nezobrazí.

var hddnodes = xml.getElementsByTagName('e2hdd');
    var PreviousHdd = "";
    for( var i = 0; i < hddnodes.length; i++){
        try{           
            var hdd = hddnodes.item(i);
   
            var model   = hdd.getElementsByTagName('e2model').item(0).firstChild.data;
            if (PreviousHdd != model)
            {
                var capacity = hdd.getElementsByTagName('e2capacity').item(0).firstChild.data;
                var free        = hdd.getElementsByTagName('e2free').item(0).firstChild.data;
                var IntFree = parseInt(free.replace(" GB",""));
                var IntCapacity = parseInt(capacity.replace(" GB",""));
                var pfree   = Math.floor(((100 / IntCapacity) * IntFree)*10)/10;
                var pUsed   = 100 - pfree;
   
                this.hdds[i] = {   
                        'model'     : model,
                        'capacity'  : capacity,
                        'free'      : free,
                        'pfree'     : pfree,
                        'pUsed'     : pUsed
                };
            }
            PreviousHdd = model;
        } catch(e){
            notify("Error parsing HDD data: " + e, false);         
        }
    }



pondělí 13. srpna 2012

Skriptování v Notepadu++


Skriptování v Notepadu++
Pomocí doplňku Notepad++ Python Script je možné spouštět Pythonovské skripty. Následuje příklad pro hromadnou modifikaci HTML, PHP a javascriptových souborů:

# -*- coding: utf-8 -*-
''' Vyhledani vsech souboru '''
import os
import sys
import string
SeznamSouboru = []
rootdir = "C:\\htdocs\\pokus" # slozka kde jsou ulozeny upravovane soubory
for root, subFolders, files in os.walk(rootdir):
    for file in files:
        SeznamSouboru.append(os.path.join(root,file))
       
# nyni jsou v poli retezce s adresami vsech souboru ve slozce rootdir
for NazevSouboru in SeznamSouboru:
    if ((string.find(NazevSouboru,".php") != -1) or
        (string.find(NazevSouboru,".js") != -1) or
        (string.find(NazevSouboru,".html") != -1) or
        (string.find(NazevSouboru,".htm") != -1)) :
        notepad.open(NazevSouboru# otevreni souboru v notepadu++
        # editujeme jen soubory pro ktere to ma smysl, ne obrazky
        ''' nahrazeni retezce (prvni parametr) retezcem v druhem parametru '''
        editor.replace('ora_getcolumn($curs,$i)', '$row[$i]')
        editor.replace('ora_getcolumn($curs,0)', '$row[0]')
        editor.replace('ora_parse($curs,', '$curs = sprintf(')
        editor.replace('ora_parse($curs2,', '$curs2 = sprintf(')
        editor.replace('ora_parse($curs3,', '$curs3 = sprintf(')
       
        # ulozeni modifikovaneho souboru
        notepad.saveAs(NazevSouboru)
        # uzavreni zalozky v notepadu
        notepad.close()
        console.write("Soubor %s byl uspesne modifikovan!\n" % NazevSouboru)
   
console.write("Hotovo!")
  
http://sourceforge.net/projects/npppythonscript/

sobota 16. června 2012

Jak bezpečně zapisovat do MySQL ze vzdáleného počítače

Na serveru běží MySQL, nechtěl jsem k ní nechat přístup z Internetu, proto jsem celý problém vyřešil pomocí předání parametrů v URL dotazu. Něco podobného je možné realizovat wgetem nebo pomocí programu curl.

<?php
$server_name = 'localhost'; // jmeno databazoveho serveru
$db_user = ''; // uzivatel
$db_pass = ''; // heslo
$db_name = 'Teploty'; // jmeno databaze

session_start();
//$_SESSION["hash"] = "17f5596768b6b33ea69dfc822d3a8bace7fe6ae5";
session_register("hash");
if ($_REQUEST['hash']==$_SESSION["hash"])
    {
    $hash = sha1(rand());
    $_SESSION["hash"]=$hash;
    echo $hash;
    mysql_connect($server_name, $db_user, $db_pass) or die('Nepodařilo se připojit k MySQL databázi'); // pripojeni k databazi
    mysql_select_db($db_name) or die('Nepodařila se otevří databáze.'); // vyber databaze

    $dotaz="INSERT INTO `Teploty`.`Teploty` (`ID`, `Datum`, `Teplota doma`, `Teplota venku`,
    `Teplota kotel`) VALUES (NULL, NOW(), '".mysql_real_escape_string($_REQUEST['doma'])."', '".mysql_real_escape_string($_REQUEST['venku'])."',
    '".mysql_real_escape_string($_REQUEST['kotel'])."');";
    $radku = mysql_num_rows($vysledek);
    }
?>

Při každém spojení je vygenerován autorizační kód pro další relaci, použitím session je pro každého uživatele generován jiný přístupový kód. Pro synchronizaci stačí odkomentovat řádek kde se do $_SESSION["hash"] přiřazuje počáteční hodnota, po úspěšném připojení všech klientů je nutné tento řádek opět zakomentovat.

Další poznatky: adresu do wgetu či curl je nutné zadávat v uvozovkách, jinak dojde k oříznutí ostatních parametrů kromě prvního.

curl "http://xxx.cz/teplota.php?doma=23.5&venku=10.81&kotel=65.58&hash=ahoj"
Při spojení s curl se session chová poněkud divně.

Jak jednoduše generovat PDF soubor?

Na mcu.cz byla docela zajímavá diskuze, jak generovat PDF soubor v omezeném mikropočítači. Někdo poslal odkaz na toto, text stačí jen zkopírovat a uložit do souboru s příponou pdf. Opravdu to funguje.

http://www.gnupdf.org/Introduction_to_PDF

středa 13. června 2012

Kolik ROM a RAM program zabere?

V RIDE stačí spustit arm-none-eabi-size.exe -t <soubor.elf>


   text    data     bss     dec     hex filename
   4620      96     392    5108    13f4 Bluetooth.elf
   4620      96     392    5108    13f4 (TOTALS)

sloupeček text ukazuje využití paměti s read-only přístupem, data ukazuje využití paměti pro zápis a čtení. Využití ROM (FLASH) bude tedy text + data (4716:1024= 4,6 kB) a paměti RAM bude data + bss (488 B).

http://support.code-red-tech.com/CodeRedWiki/FlashRamSize

pátek 8. června 2012

Ethernet, HDMI, SATA, USB co více si přát?

Na internetu jsem našel zajímavého konkurenta  Raspberry Pi, jedná se o multimediální přehrávač k TV MELE A2000. Hlavní výhodou je jeho snadná hacknutelnost a spuštění například Ubuntu. Odkazuji na fotky a stránku s popisem IO pinů:


 Cenou je cca o čtvrtinu dražší než Pi, ale je také nutné do výsledné ceny započítat napájecí adaptér, dálkový ovladač a 4 GB Flash! Na desce je také integrován WiFi  b/g/n modul. Jediným nedostatkem je asi nemožnost připojení kamery jako u PI ale nic nebrání tomu připojit libovolnou webkameru do USB portu. Také předpokládám, že u tohoto zařízení není tak kostrbaté řešení připojení Ethernetu pomocí USB sběrnice. Škoda, že jsem zatím nenašel nic o podpoře OpenWRTáku pro toto zařízení, bylo by tak možné realizovat levný a rychlý NAS, WEB server, WRT je možné nahradit například Debianem.

ARM Cortex A8 1GHz
RAM: DDR III 512MB
Storage: Built-in 4GB flash memory (firmware included)

http://rhombus-tech.net/allwinner_a10/hacking_the_mele_a1000/
dealextreme.com

úterý 24. dubna 2012

Vypínání/zapínání WiFi tlačítkem.

Ve složce /etc/hotplug.d/button, tu je nutné vytvořit pomocí příkazu mkdir -p /etc/hotplug.d/button , stačí vytvořit soubor ToggleWiFi s následujícím obsahem:

#!/bin/sh

if [ "$BUTTON" = "ses" ] ; then
 if [ "$ACTION" = "pressed" ] ; then
  #LED="$(cat /proc/diag/led/power)"
  WiFi="$(uci get wireless.@wifi-device[0].disabled)"
  if [ "$WiFi" = "0" ]; then
    #echo "0" > /proc/diag/led/power
    uci set wireless.@wifi-device[0].disabled=1
    wifi
  else
    #echo "1" > /proc/diag/led/power
    uci set wireless.@wifi-device[0].disabled=0
    wifi
  fi
 fi
fi
Potom už jen stačí mu přiřadit práva pomocí chmod. Každým zmáčknutím tlačítka Easy Setup na 500gP se buď vypne nebo zapne WiFi rozhraní.
Nakonec je nutné přidat do sekce boot startovacího souboru /etc/init.d/network


uci set wireless.@wifi-device[0].disabled=1
wifi 

Tímto se po nabootování a nakonfigurování WiFi rozhraní zase vypne a uživatel si ho potom případně zapne. 

čtvrtek 19. dubna 2012

Jak vytvářet symlinky pro zařízení

Potřeboval jsem k 500gP připojit druhou tiskárnu, bohužel tiskárny mohou uživatelé libovolně zapínat. První zapnutá tiskárna se přihlásí jako /dev/lp0, což způsobuje problémy se sdílením. Pomocí symlinku jsem tedy vytvořil pro každou tiskárnu jedinečný název.
Pomocí příkazuudevadm info -a -p $(udevadm info -q path -n /dev/lp1)jsem si nechal zobrazit všechny parametry, zvolil jsem položku ATTRS{product}=="Samsung ML-1520 Series"
do souboru /etc/udev/rules.d/10-local.rules jsem zapsal toto:ATTRS{product}=="Samsung ML-1520 Series", SYMLINK+="ML-1520"
ATTRS{product}=="CLP-320 Series", SYMLINK+="CLP-320"
Dále bylo nutné pravidla znovu načíst.udevadm control --reload-rules
Pro udev, bylo nutné ještě startovat démona, například takto (/etc/init.d/udevd):#!/bin/sh /etc/rc.common
START=03
start () {
   udevd --daemon
}
stop() {
   killall -9 udevd
}
A nakonec přiřadit práva a povolit spouštění.

Otevřené i čekající porty je možné zjistit pomocí netstat -an.


Zdroje:
http://www.root.cz/clanky/jak-umravnit-zlobivy-udev/
http://www.dl8kdl.net/articles/projects/computers/netgear-wgt634u-openwrt
a diskuze:
http://forum.root.cz/index.php?topic=4209.0

středa 15. února 2012

Regulární výraz

Pro začátek jen jeden:

 " -.*$"
Najde text začínající řetězcem " -" potom následuje libovolný text a končí koncem řádku.

pátek 6. ledna 2012

Oscam na OpenWRT

Je nutné doinstalovat balíčky pro vlákna (libpthread)
opkg install libpthread
Chyba se projevuje takto:
oscam: can't load library 'librt.so.0'

oscam je nutné spouštět s parametrem -c /etc/oscam

libusb
usbutils

// konfigurace čtečky v oscam.server
[reader]
label = Phoenix1
protocol = mouse
device = /dev/ttyUSB0 # pod windows /dev/ttyS0 (COM1)
device_out_endpoint = 0x81
detect = none
mhz = 357
cardmhz = 357
group = 1
emmcache = 1,3,2
deprecated = 1

http://www.ab-forum.info/viewtopic.php?p=299502#p299502
Pro správnou funkci Oscamu s FTDI převodníkem pro čtečku je nutné zkompilovat OpenWRT s podporou výpočtů s pohyblivou čárkou (FPU), chyba se projevuje v dmesgu hláškou:
FPU emulator disabled, make sure your toolchainwas compiled with software floating point support (soft-float)

pondělí 2. ledna 2012

Hrátky i image IPBoxu 910HD

"Rozbalení" img souboru:

./dgsimg-dump usb_update.img
reading: usb_update.img
writing: "config_welcome" [0x00000000:0x00020000]
writing: "kernel" [0x00020000:0x00220000]
writing: "root" [0x00220000:0x015c0000]
writing: "db" [0x015c0000:0x01fc0000]
Dump image DONE.

Přístup k paměti IPBoxu při nabootování z jiného média. Namountujeme část paměti /dev/mtdblock4 do složky /pokus.
mount -t jffs2 /dev/mtdblock4 /pokus

http://www.denktenk.com/forum/cube-revo-twin-tuner-software/how-to-open-an-dgs-based-img-file
http://ab-forum.info/viewtopic.php?f=85&t=9153