čtvrtek 29. května 2014

Webserver pro Turris

Jako mnoho dalších nadšených uživatelů jsem se nedávno stal šťastným majitelem routeru Turris. Starý router jsem používal jako NAS i jako WEB server, obdobně jsem to udělal i s Turrisem. Výhodou Turrisu je ohromný výpočetní výkon i  velká paměť, není tedy nutné se příliš omezovat a je možné instalovat i aplikace používané na serverech, jako třeba Apache.
Takže k návodu:


stačí nainstalovat tyto balíčky:
opkg install apache php5 php5-cgi php-cli php5-mod-gd php5-mod-mysql zoneinfo-europe

a pro správnou podporu časových zón je ještě nutné nainstalovat zoneinfo-core zoneinfo-europe.

v /etc/apache/httpd.conf si zkontrolovat číslo portu (a jednoduše máme i IPv6 web server)
Listen 80

Umístění html a php souboru jsem nechal výchozí aby se při každém načtení stránky nemusel startovat HDD.
DocumentRoot "/usr/share/htdocs"

Jen složku media mám pomocí symlinku umístěnou na HDD, sem se ukládají nahrané pořady. Vytvoření symlinku jsem provedl takto:
ln -s /mnt/hdd/movie/data data

v sekci nastavení parametrů výchozího umístění, je nutné povolit symbolické odkazy:
<Directory />
    Options FollowSymLinks

a dále dodat pravidla pro složku s nahrávkami (tedy /usr/share/htdocs/movie/data), čímž zamezíme přístupu odjinud než z definovaných adres. V našem případě se jedná o vnitřní rozsah IP adres.:
<Directory />
    Options FollowSymLinks
<Directory "/usr/share/htdocs/movie/data">
Order deny,allow
Deny from all
Allow from 192.168.1.0/255.255.0.0
Allow from XXXX:::29b::/64
Allow from XXXX:::829b::/64
</Directory>

No a potom už se jedná o obvyklé nastavení apache pro podporu PHP (přidání souboru index.php):
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

Do sekce alias_module je nutné přidat toto:
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/usr/share/cgi-bin/"
    ScriptAlias /php/ "/usr/bin/"
</IfModule>

a do mime_module
<IfModule mime_module>
    AddType application/x-httpd-php .php
</IfModule>

a na konec souboru toto:
Action application/x-httpd-php "/php/php-cgi"

No a nyní ke zdrojovým kódům, na úvodní stránce mám zatím jen zobrazení venkovní teploty a automatické obnovování pomocí javascriptu. V podstatě se periodicky načítá soubor teplota.txt, ve kterém je umístěn řetězec s teplotou. Aby se neošoupala paměť routeru tak je soubor opět symlinkován do /tmp.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Teploměr</title>
        <style type="text/css">BODY{background:#87ceeb}</style>
        <script type="text/JavaScript">
            function LoadTeplota()
            {
            var xmlhttp;
            if (window.XMLHttpRequest)
              {// code for IE7+, Firefox, Chrome, Opera, Safari
              xmlhttp=new XMLHttpRequest();
              }
            else
              {// code for IE6, IE5
              xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
              }
            xmlhttp.onreadystatechange=function()
              {
              if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                var Teplota=xmlhttp.responseText;
                //document.getElementById("Teplota").innerHTML = Teplota + "<br>\n";
                document.getElementById("Teplota").innerHTML = Teplota.replace(".",",") + " °C";
                }
              }
            xmlhttp.open("GET","teplota.txt",true);
            xmlhttp.send();
            }
            // tato funkce nastaví periodické spouštění funkce LoadTeplota každých 20 vteřin
            setInterval(function(){LoadTeplota()},20000);
        </script>
    </head>
<body onload="LoadTeplota()"> <!-- toto způsobí okamžité první načtení teploty -->
    <span Id="Teplota"></span>
</body>
</html>


 Soubor pro vkládání teploty se jmenuje ZapisTeplotu.php, kterým jiný router pomocí wgetu či curl vkládá teplotu, ta se jednoduše zapíše dou souboru teplota.txt. 
<?php
if (isset($_REQUEST["Venku"]) && $_SERVER["REMOTE_ADDR"] == "192.168.1.2")
{
    $soubor = fopen("/tmp/teplota.txt", "w");
    fwrite($soubor,htmlspecialchars($_REQUEST["Venku"]));
    fclose($soubor);
    echo htmlspecialchars($_REQUEST["Venku"]);
}
?>

A nyní to multimediálně zajímavější, ve /usr/share/movie se nachází toto:
Ikonky CSFD.png, Download.ico a Stream.ico. A dále php soubory a symlinkované umístění video souborů nahrávaných v TS(MPEG transport stream):
Soubor GetStream.php v podstatě podstrčí vygenerovaný playlist pro VLC, viz následující kód. Vím, že takto není URL příliš bezpečné předávat ale domácí uživatelé si jistě stream server ničit nebudou:
<?php
if (isset($_GET["URL"]))
{
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='."PlayList.m3u");//basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    //header('Content-Length: ' . filesize($file));
   
    echo "#EXTM3U\n#EXTVLCOPT--http-reconnect=true\n#EXTVLCOPT:\n";
    echo "http://$_SERVER[HTTP_HOST]/movie/data/".rawurlencode(htmlspecialchars($_GET["URL"]));
}
?>

Poslední je soubor, který generuje tabulku se seznamem nahrávek. Každá nahrávka má odkaz na hledání v CSFD, možnost stažení a streamování. Celé to ještě není dokonalé ale třeba to někomu pomůže k dalším úpravám a modifikacím. Do budoucna by bylo vhodné předělat na ajax a rozhraní rozšířit o čtení a zobrazování EPG, který přijímač na HDD také ukládá.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>TS přehrávač</title>
        <style type="text/css">BODY{background:#87ceeb}</style>
    </head>
    <body>
        <table border="1">
<?php

function nahradiZnaky( $string )
{
    $string = htmlspecialchars($string);
    $string = str_replace (  'á','%E1', $string );
    $string = str_replace('é', '%E9', $string );
    $string = str_replace('í', '%ED', $string );
    $string = str_replace('ó', '%F3', $string );
    $string = str_replace('ú', '%FA', $string );
    $string = str_replace('ý', '%FD', $string );
    $string = str_replace('Š', '%8A', $string );
    $string = str_replace('Ž', '%8E', $string );
    $string = str_replace('š', '%9A', $string );
    $string = str_replace('ž', '%9E', $string );
    $string = str_replace('Á', '%C1', $string );
    $string = str_replace('É', '%C9', $string );
    $string = str_replace('Í', '%CD', $string );
    $string = str_replace('Ó', '%D3', $string );
    $string = str_replace('Ú', '%DA', $string );
    $string = str_replace('Ý', '%CD', $string );
    $string = str_replace('ě', '%E9', $string );
    $string = str_replace('É', '%C9', $string );
    $string = str_replace('É', '%C9', $string );
    $string = str_replace('É', '%C9', $string );

   
    return $string;
}

define('CHARSET', 'cp1252');
define('REPLACE_FLAGS', ENT_COMPAT | ENT_XHTML);

$dir = "data";
if (is_dir($dir))
{
    if ($dh = opendir($dir))
    {
        $poradi = 0;
        while (($file = readdir($dh)) !== false)
        {
            if (($file != ".") && ($file != "..") && (substr($file, strlen($file) - 3) == '.ts'))
            {
             //20140223 1956 - CT 1 - Piknik.ts
                $datum=substr($file, 0, 13);
                $url=htmlspecialchars($file);
                $file=substr($file, 15);
                $rok = substr($datum, 0, 4);
                $mesic = substr($datum, 4, 2);
                $den = substr($datum, 6, 2);
                $hodina = substr($datum, 9, 2);
                $minuta = substr($datum, 11, 2);
                //echo $file."\n";
                $zacatek = strpos($file, "-") + 2;
                $kanal = substr($file, 0, $zacatek - 3);
                $CSFDurl = substr($file, $zacatek, strrpos($file, ".ts") - $zacatek);
                $nazevFilmu = substr($file, $zacatek, (strrpos($file, ".ts") - $zacatek));
                echo "<TR><TD> ".$den.".".$mesic.".".$rok." ".$hodina.":".$minuta." </TD><TD> ".$kanal.
                    " </TD><TD> <a href=\"http://www.csfd.cz/hledat/?q=$CSFDurl\" target=\"_blank\"> $nazevFilmu </a>
                    <!--</TD><TD><img src=\"nahledy\\$url.jpg\">--!>
                    </TD><TD><a href=\"data\\".
                    $url."\"><img src=\"Download.ico\"></a></TD><TD>
                    <a href=\""."GetStream.php?URL=".$url."\"><img src=\"Stream.ico\"></a></p>
                    </TD><TD><a href=\"http://www.csfd.cz/hledat/?q=$CSFDurl\" target=\"_blank\"><img src=\"CSFD.png\"></a></TD></TR>\n";
            }
        }
        closedir($dh);
    }
}
?>
        </table>
    </body>
</html>



1 komentář:

  1. Díky za tipy.
    Vytvořil jsem návod jak si zprovoznit apache a přistupovat skrz něj k souborům na NASu připojenému k Turrisu.
    https://www.turris.cz/forum/topic_show.pl?tid=454

    OdpovědětSmazat