constant stream of curated content
by seb - 2012-07-19 10:37
L'Apple TV 2 est sans doute le produit de chez Apple qui a le plus de potentiel, en matière de customization.

Un produit fonctionnant avec de la mémoire flash, toujours branché, et donc toujours allumé et connecté, tournant sous une base unix, il était tentant d'en faire un serveur web, et les résultats sont assez impressionnants.

Tout d'abord, il faut bien sûr jailbreaker son Apple TV, à l'aide de Seas0npass (evasi0n peut également le faire). Notez que si vous avez une Apple TV 3, il n'est pas possible de la jailbreaker, vous pouvez donc arrêter ici la lecture de ce billet.

Ensuite (et c'est un peu en dehors du sujet), je vous conseille d'installer ATV Flash Black, qui est normalement payant (à moins de passer par une baie bien connue située en Suède). Ce merveilleux package vous installera sur l'écran d’accueil l'application Medias, qui vous permet de mater tous les formats de films via des partages smb et afp.

C'est évidemment beaucoup plus clean qu'installer cette immonde daube qu'est XBMC. Après tout, on n'achète pas une Apple TV pour avoir une interface pourrie sur un logiciel buggué jusqu'à la moelle et d'une lenteur affligeante, n'est ce pas ?

Bon, la parenthèse est fermée, nous sommes prêt, votre Apple TV 2 est jailbreaké, l'accès ssh est donc opérationnel, et vous connaissez son adresse ip (sinon elle est dans le menu réglages > réseau).

Ne vous laissez pas impressionner par la longueur de ce tutoriel, ça ne vous prendra que 20 minutes.

1 - Sécuriser SSH un minimum

Comme tous les iBidules, les mots de passe des deux utilisateurs root et mobile son fixés sur "alpine". On ne va évidemment pas laisser ça comme ça.

Donc sur votre ordi, dans votre console ssh préférée, tapez:
ssh root@(adresse ip)
donc là vous tapez alpine pour vous connecter, puis
passwd
Là vous tapez deux fois un bon mot de passe bien sécurisé, et ensuite on va aussi changer celui de mobile, donc
su mobile
retapez alpine, puis
passwd
on va vous redemander alpine, puis deux fois le même nouveau mot de passe, choisissez-en un différent, si possible.

2 - Installer tout le nécessaire pour un bon vieux serveur web

Comme nous ne voulons pas saturer la mémoire ram de notre Apple TV, nous n'installerons pas MySQL. De toutes façon c'est très compliqué à utiliser dans cet environnement, puisque notre version de php ne le supporte pas, nous utiliserons donc SQLite.

donc, ssh en root sur l'Apple TV, puis
apt-get update
pour avoir les bonnes versions qui vont bien.
Ensuite
apt-get install lighttpd php sqlite3 nano

Les packages nécessaires vont s'installer, il nous reste plus qu'à configurer tout ça.

3 - Vérifier que tout soit bien prêt à se lancer au démarrage

Je ne m’étalerai pas sur LaunchD dans ce billet, ça ferra l'objet d'un tutoriel à part.

Donc, toujours dans ssh:
cd /Library/LaunchDaemons
ls
Si, comme c'est probable, vous n'avez aucun fichier contenant de prés ou de loin "lighttpd" dans son titre, rien n'est configuré.

Dans ce cas
nano net.lighttpd.plist
et copiez le contenu du fichier suivant:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>net.lighttpd</string>
<key>OnDemand</key>
<false/>
<key>Program</key>
<string>/usr/sbin/lighttpd</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/lighttpd</string>
<string>-f /etc/www/lighttpd.conf</string>
<string>-D</string>
</array>
</dict>
</plist>

faites ctrl+x pour quitter, et y pour enregistrer.

4 - Configurer lighttpd

Vérifiez ensuite que le fichier lighttpd.conf soit bien dans /etc/www/. Si tel n'est pas le cas, faites un
find / -name lighttpd.conf
créez le dossier www dans etc en faisant
mkdir /etc/www
puis déplacez le fichier avec
mv (ancien emplacement)/lighttpd.conf /etc/www/

Nous allons créer un dossier qui contiendra le répertoire http, dans l'arborescence de l'utilisateur mobile:
mkdir /private/var/mobile/Media/Sites

Vous pouvez maintenant vérifier votre config en faisant
nano /etc/www/lighttpd.conf

vérifiez les lignes suivantes:

server.document-root = /private/var/mobile/Media/Sites/
index-file.names = ( "index.php","index.html")

vérifiez également que #dir-listing.activate = "enable"
soit bien commenté par un # pour éviter d'afficher le contenu des répertoires.

Configurez ensuite le fastCGI pour PHP:

fastcgi.server = ( ".php" =>
( "localhost" =>
( "socket" => "/tmp/php-fcgi.sock",
"bin-path" => "/private/var/stash/bin/php-cgi",
"max-procs" => 1,
"bin-environment" =>
( "PHP_FCGI_CHILDREN" => "2",
"PHP_FCGI_MAX_REQUESTS" => "1000" ))))

puis ctrl+x pour fermer et y pour enregistrer.

5 - Configurer php

Là c'est beaucoup plus simple, nous nous contenterons du minimum syndical.

nano /usr/lib/php.ini

et faites en sorte que votre fichier ressemble à peu près à ça:

upload_max_filesize = 14M
post_max_size = 14M
max_execution_time = 240
session.auto_start = 1
expose_php=off

6 - On prépare un petit test (en option)

Bien entendu il n'y a pas encore de fichier html ou php dans notre répertoire "Sites", vous pourrez les ajouter en installant netatalk ou pure-ftpd, pas besoin d'un tutoriel pour ça.

Si vous n'avez vraiment rien dans votre répertoire Sites, vous pouvez faire un petit test pour vérifier que tout fonctionne bien:
nano /private/var/mobile/Media/Sites/index.php

Et copiez la ligne suivante:
<? echo "php fonctionne"; ?>

ctrl+x et y

7 - On peut démarrer

Tout est près, nous allons donc demander à LaunchD de bien vouloir nous lancer lighttpd.
launchctl load /Library/LaunchDaemons/net.lighttpd.plist
launchctl start net.lighttpd


Histoire de vérifier que tout soit bien lancé, faites un "ps aux" et vérifiez qu'il y ai bien un process lighttpd qui soit lancé.

Vous pouvez maintenant taper dans votre navigateur http://(adresse ip de l'apple tv)

7 - En cas d'erreur

Si ça ne fonctionne pas (et que donc le process lighttpd n'est pas lancé lorsque vous vérifiez via "ps aux"), votre config est peut-être moisie, ou alors php plante lamentablement.

Essayez tout d'abord de lancer manuellement lighttpd:
/usr/sbin/lighttpd -f /etc/www/lighttpd.conf -D
Vous aurez le message d'erreur et vous pourrez ainsi rectifier ce qui ne va pas.

Si le problème vient de php, le debug se ferra en faisant un
cat /var/log/syslog
pour vérifier les messages d'erreur sur la console.


Voilà voilà, si vous êtes motivés, vous pouvez aussi configurer un serveur de mail.