From 01cdaebdb460a808bed157be3a86db460ba28e7c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Wxcaf=C3=A9=20=28Cl=C3=A9ment=20Hertling=29?=
 <wxcafe@wxcafe.net>
Date: Mon, 14 Dec 2015 20:20:16 +0100
Subject: [PATCH] long time no see

---
 content/let's_encrypt.md                 | 165 +++++++++++++++++++++++
 content/openwrt-usbnet.md                | 132 ++++++++++++++++++
 themes/bootstrap2/templates/base.html    |  16 +--
 themes/bootstrap2/templates/sidebar.html |  11 --
 4 files changed, 298 insertions(+), 26 deletions(-)
 create mode 100644 content/let's_encrypt.md
 create mode 100644 content/openwrt-usbnet.md

diff --git a/content/let's_encrypt.md b/content/let's_encrypt.md
new file mode 100644
index 0000000..7c67ee1
--- /dev/null
+++ b/content/let's_encrypt.md
@@ -0,0 +1,165 @@
+Title: Let's Encrypt, enfin
+Date: 2015-12-13T18:48+0100
+Author: Wxcafé
+Category: Tutoriel
+Slug: lets-encrypt-enfin
+
+Vous avez peut être vu que ce blog, entre autres sites que j'administre, n'est
+disponible depuis quelques jours qu'en HTTPS, et avec un certificat valide. Bon,
+si vous êtes là, vous avez déjà entendu parler de Let's Encrypt, mais pour les
+deux trois du fond on va résumer:
+
+LE est une nouvelle autorité de certification (ceux qui valident les certificats
+SSL), basée sur une organisation, et dont le but est de fournir des certificats
+valides, automatiquement et gratuitement. Leur certificat racine est signé par
+IdenTrust, et est donc considéré valide par tous les navigateurs modernes.
+
+Bon, maintenant qu'on est tous au même point, voyons comment ça marche. Depuis
+dix jours LE est ouvert en bêta publique, donc il n'est plus nécessaire de
+préciser les domaines pour lesquels on veut un certificat sur un formulaire,
+comme c'était le cas pendant la période de bêta fermée. Le système qui est
+utilisé repose sur le protocole ACME (Automatic Certificate Management
+Environment), qui automatise complètement la signature des certificats. Du coup,
+les certificats que délivre LE ne sont valides que 90 jours, ce qui serait super
+chiant avec une autorité de certification classique, mais qui la veut simplement
+dire qu'il faut mettre un cron en place.
+
+Bref, comment mettre en place vos certificats? On va faire ça sans trop modifier
+vos sites, et en automatisant au maximum. LE utilise, dans son système par
+défaut, un fichier sur le site web, dont le serveur de certification vérifie
+l'existence lors de la requête (si le fichier est présent avec le bon contenu,
+c'est que le client tourne bien sur ce domaine, et donc que la personne qui
+a demandé le certificat contrôle bien le domaine). Ce fichier est situé dans un
+dossier dans la racine, `.well-known`. Plutôt que de se faire chier a gérer ce
+dossier pour tous nos vhosts nginx, on va simplement créer un alias vers un
+dossier commun sur le système de fichier, que tous les vhosts partagerons, et
+qui permettra aussi de valider tous les domaines pour lesquels on veut un
+certificat à la fois (avec un AltName) (sur un seul serveur, par contre. Enfin
+si vous voulez vraiment vous pouvez faire des mounts cross-serveurs (avec du
+sshfs ou des trucs du genre), mais c'est un peu sale quand même. Et faudra quand
+même distribuer le certificat après, donc bon...).
+
+Donc, on va rajouter ça dans nos blocs `server` :
+
+```shell
+location /.well-known {
+	alias /srv/letsencrypt/.well-known;
+}
+```
+
+(bien sûr il faut créer le dossier, hein.)  
+Après, on `git clone https://github.com/letsencrypt/letsencrypt`, dans `/opt/` ou
+dans `/usr/local/`, peu importe, on le clone quelque part, et on cd dans le
+dossier en question. Une fois là, on demande un certificat :
+
+```shell
+sudo ./letsencrypt-auto certonly \
+	-a webroot \
+	--webroot-path /srv/letsencrypt/ \
+	-d <domaine> \
+	-d <altName1> \
+	-d <altName2> \
+	--server https://acme-v01.api.letsencrypt.org/directory
+```
+
+Normalement, maintenant, on a un certificat valide dans
+`/etc/letsencrypt/live/<domaine>/`. Reste à configurer nginx pour qu'il serve
+nos sites en https en utilisant notre nouveau certificat. Perso, j'utilise une
+template qui ressemble à ça :
+
+```shell
+server {
+	listen 80;
+	listen [::]:80;
+	server_name SERVERNAME;
+	return 302 https://$server_name$request_uri;
+}
+
+server {
+	listen 443 ssl;
+	listen [::]:443 ssl;
+	ssl_certificate /etc/letsencrypt/live/DOMAIN/fullchain.pem;
+	ssl_certificate_key /etc/letsencrypt/live/DOMAIN/privkey.pem;
+	ssl_dhparam /etc/nginx/dhparams.4096;
+	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+	ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
+	ssl_prefer_server_ciphers on;
+	add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload";
+
+	root SERVERROOT;
+
+	index index.html index.htm;
+
+	server_name SERVERNAME;
+
+	server_tokens off;
+	client_max_body_size 5m;
+
+	access_log /var/log/nginx/access.log;
+	error_log /var/log/nginx/error.log;
+
+	location /.well-known {
+		alias /srv/letsencrypt/.well-known;
+	}
+
+	location / {
+		try_files $uri $uri/ =404;
+	}
+}
+```
+
+Alors c'est pas /tout à fait ça/ d'un point de vue parano du TLS (genre je
+devrais désactiver TLS 1.0 et EECDH+aRSA+RC4, notamment) mais ça marche pas trop
+mal et c'est plus compatible comme ça (mon telephone est sous Android 4.4, donc
+je suis content d'avoir encore TLS 1.0 par exemple).
+
+Vous pouvez ajouter votre domaine à la liste préloadée dans Chrome/ium, Firefox,
+IE, Edge, Safari, le Tor Browser Bundle, etc...
+[ici](https://hstspreload.appspot.com/) (oui ça fait clairement site de
+phishing, mais apparemment c'est serieux...)
+
+Enfin, il nous faut un renouvellement automatique, puisque notre certificat ne
+sera valide que 90 jours. On va utiliser un cron tout con, avec un script :
+
+```shell
+00 01 */14 * * /usr/local/bin/cert-renew 2>&1 | mail -s "certificates renewal report" <votre email>
+```
+
+(oubliez pas que ça doit aller dans le crontab du root)
+Et le script qui va bien :
+
+```shell
+#!/bin/bash
+
+if [[ $UID != 0 ]]; then
+	echo "please run as root"
+	exit 1
+fi
+
+cd /opt/letsencrypt/
+
+git pull 2>&1 >> /dev/null
+
+
+# Renewing the cert
+./letsencrypt-auto certonly \
+	-a webroot --webroot-path /srv/letsencrypt \
+	-d <domaine> \
+	-d <altName1> \
+	-d <altName2> \
+	--server https://acme-v01.api.letsencrypt.org/directory \
+	--renew \
+	2>&1
+
+systemctl restart nginx
+exit 0
+```
+
+Notez bien le `--renew` qui spécifie qu'on renouvelle le certificat, le `git pull`
+qui met à jour le client, et le `systemctl restart nginx` qui prend en compte le
+nouveau certificat automatiquement
+
+Et puis voilà, normalement avec ça vous devriez pouvoir chopper des certificats
+valides. C'est plutôt cool, en pratique.
+
+Merci Let's Encrypt
diff --git a/content/openwrt-usbnet.md b/content/openwrt-usbnet.md
new file mode 100644
index 0000000..34d1518
--- /dev/null
+++ b/content/openwrt-usbnet.md
@@ -0,0 +1,132 @@
+Title: OpenWRT, l'USBNet, et l'histoire des 4Mo
+Date: 2015-10-16 10:27
+Author: Wxcafe
+Category: Hacking
+Slug: openwrt-usbnet
+
+Donc, j'ai récemment obtenu un [TP-Link
+TL-MR12U](http://www.dx.com/p/tp-link-tl-mr12u-portable-5200mah-mobile-battery-3g-router-white-231188),
+qui est vendu comme "routeur 3G portable", mais qui est en réalité une grosse
+batterie avec une antenne wifi, un port USB, et un port Ethernet. Perso, ça me
+va, vu que je comptais de toute façon pas prendre un deuxième abonnement 3G
+juste pour ce truc là (surtout vu la couverture 3G qu'on se tape en France...)
+
+Bref, tout ça pour dire : quand j'ai reçu ce truc, j'ai tout de suite commencé
+par y installer OpenWRT (parce que de 1, je parle pas chinois, et de 2, j'aime
+bien avoir des firmwares corrects sur mes routeurs). Bon, c'est super simple, il
+suffit de chopper ce fichier
+\[binaire\] [la](http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/openwrt-15.05-ar71xx-generic-tl-mr12u-v1-squashfs-factory.bin),
+et de trouver la page d'update (pas forcément super simple en chinois, mais avec
+un peu de temps, ça se fait. C'est celle avec un bouton upload). Ensuite on
+upload l'image sur le bouzin, et c'est parti. Pas de signatures, pas de
+vérifications, osef total, mais bon pour le coup ça m'arrange.
+
+Une fois ceci fait, je me trouva bien démuni de ne pas pouvoir utiliser le
+partage de connexion USB de mon intelliphone android, car l'image OpenWRT par
+defaut ne comprend pas USBNet, et ne peut donc pas créer de réseau sur de l'USB.
+Qu'à cela ne tienne, me dis-je! Je vais l'installer!
+Je courra donc installer le package grâce à `opkg`. Las! Le système n'avait plus
+de place.
+
+... Atta. Le système avait plus de place? J'ai encore rien mis dessus!
+
+Eh bah ouais. Il se trouve que TP-Link, en 2015, trouve que 4Mo de flash sur un
+routeur, c'est largement suffisant, et que de toute façon personne aura jamais
+besoin de plus.
+
+Serieux, mettre 8Mo c'était tellement plus cher? u_u
+
+Bon, bref, je vais pas m'étendre la dessus. J'ai décidé de saisir mes petits
+bras, et de tenter de pousser bien fort pour convaincre OpenWRT qu'il était tout
+a fait possible de faire rentrer à la fois le système de base avec LuCi, uhttpd,
+un serveur DHCP, etc; et USBNet, dans 4Mo. Ça à pas été vraiment facile, et j'ai
+du virer pas mal de trucs, mais... ça fonctionne!
+
+Bon, alors, comme je suis quelqu'un de sympa, je vais vous filer à la fois le
+fichier de config et l'image finale. Si vous voulez pas utiliser une image qui
+vient d'un mec que vous connaissez pas, vous pouvez toujours la rebuilder vous
+même. Mais avant ça, je vais vite fait expliquer ce qui est dans l'image et ce
+qui n'y est pas
+
+Alors, pour faire rentrer tout ça, vous vous doutez que j'ai du faire quelques
+concessions. J'ai donc viré tout ce qui a trait à *PPP*, *PPPoE*, le client
+*DHCPv6*, tous les *outils de debug*, quelques *fonctionnalités de busybox*, et
+bien sûr *opkg*. Dans ce qui à été ajouté, simplement ce qui est nécessaire au
+fonctionnement de *l'USBNet*.
+
+Une petite modification doit être effectuée pour que le tout fonctionne : le
+fichier `package/feeds/luci/luci/Makefile` doit être modifié pour que la
+dépendance sur `luci-proto-ppp` ne soit plus présente. Ainsi, on passe de
+
+```makefile
+LUCI_DEPENDS:= \
+	+uhttpd +uhttpd-mod-ubus +luci-mod-admin-full +luci-theme-bootstrap \
+	+luci-app-firewall +luci-proto-ppp +libiwinfo-lua +IPV6:luci-proto-ipv6
+```
+
+à
+
+```makefile
+LUCI_DEPENDS:= \
+	+uhttpd +uhttpd-mod-ubus +luci-mod-admin-full +luci-theme-bootstrap \
+	+luci-app-firewall +libiwinfo-lua +IPV6:luci-proto-ipv6
+```
+
+Une fois que c'est fait, ça devrait mieux marcher (et ça sauve un peu
+d'espace...)
+
+Bon. Le fichier de config est
+[là](http://pub.wxcafe.net/static/openwrt/tl-mr12u/config), l'image finale est 
+[là](http://pub.wxcafe.net/static/openwrt/tl-mr12u/openwrt-15.05-wx-ar71xx-generic-tl-mr12u-v1-squashfs-factory.bin),
+et j'ai une petite surprise.
+
+Bien sûr, le switch situé sur le côté du TL-MR12U ne fonctionne pas sous
+OpenWRT de base, parce que c'est un truc lié au hardware et que du coup c'est
+assez compliqué à gérer sur une base de matos aussi grande que celle d'OpenWRT.
+Bah j'ai à peu près trouvé comment le faire fonctionner. 
+Voilà le code :
+
+```shell
+#!/bin/sh
+if [ $ACTION == "released" ]; then
+	if [ $BUTTON == "BTN_0" ]; then
+		# Position is 3G
+		logger "slider 3G"
+	elif [ $BUTTON == "BTN_1" ]; then
+		# Position is Router
+		logger "slider Router"
+	fi
+elif [ $BUTTON == "BTN_1" ] || [ $BUTTON == "BTN_0" ]; then
+	if grep -qe "sw1.*in  hi" /sys/kernel/debug/gpio\
+	&& grep -qe "sw2.*in  hi" /sys/kernel/debug/gpio; then
+		# Position is AP
+		logger "slider AP"
+	fi
+fi
+```
+
+Et ça va dans `/etc/hotplug.d/button/00-buttons` (créez le chemin, il existera
+pas à la base). Du coup là comme ça ça fait rien, ça loggue juste les events.
+Mais comme vous êtes pas cons vous avez peut être deviné qu'on pouvait très bien
+activer l'USBNet que quand l'interrupteur est en position 3G, le wifi et
+l'ethernet quand il est en position AP, et juste la batterie quand il est en
+position Router. Par exemple.
+
+Tiens, d'ailleurs. Pour activer le partage de connexion, suffit pas d'ajouter le
+support USBNet. Il faut aussi configurer le système pour qu'il demande un lease
+DHCP, toussa. Du coup vous pouvez (peut être, j'ai pas testé) le faire par LuCi,
+mais sinon vous pouvez le faire en CLI :
+
+```shell
+uci del network.wan
+uci set network.wan=interface
+uci set network.wan.ifname=usb0
+uci set network.wan.proto=dhcp
+uci commit network
+ifup wan
+```
+
+Et pouf, ça marche.
+
+Voilà. Amusez vous bien avec votre grosse batterie portable, qui fait maintenant
+point d'accès wifi/partage de connexion 3G/whatever.
diff --git a/themes/bootstrap2/templates/base.html b/themes/bootstrap2/templates/base.html
index 270f76d..6a3cb2d 100644
--- a/themes/bootstrap2/templates/base.html
+++ b/themes/bootstrap2/templates/base.html
@@ -9,21 +9,7 @@
     <!-- Le styles -->
 			<link rel="stylesheet" href="{{ SITEURL }}/theme/css/extra.css" type="text/css" />
 			<link rel="stylesheet" href="{{ SITEURL }}/theme/css/bootstrap.css" type="text/css" />
-			<link href='http://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
-			<script type="text/javascript">
-				/* <![CDATA[ */
-				(function() {
-					var s = document.createElement('script');
-					var t = document.getElementsByTagName('script')[0];
-
-					s.type = 'text/javascript';
-					s.async = true;
-					s.src = '//api.flattr.com/js/0.6/load.js?'+
-							'mode=auto&uid=wxcafe&button=compact&popout=0';
-					t.parentNode.insertBefore(s, t);
- 				})();
-				/* ]]> */
-			</script>  <!-- flattr button loader -->
+			<link href='//fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
 			<style type="text/css">
 				body {
 					padding-top: 60px;
diff --git a/themes/bootstrap2/templates/sidebar.html b/themes/bootstrap2/templates/sidebar.html
index 6b0ffb3..3fe592d 100644
--- a/themes/bootstrap2/templates/sidebar.html
+++ b/themes/bootstrap2/templates/sidebar.html
@@ -17,17 +17,6 @@
 	<!-- Social links -->
 	{% if SOCIAL %}
 		<li class="nav-header"><h4><i class="icon-exchange"></i> social</h4></li>
-		<a class="FlattrButton" style="display:none;"
-			title="{{ SITEURL }}"
-			style="padding-top: 10px;"
-			rel="flattr;
-				url:{{ SITEURL }};
-				title:{{ SITEURL }};
-				button:compact;
-				popout:0;
-				uid:wxcafe;
-				category:blog;"
-			href="{{ SITEURL }}">flattr</a>
 		{% for name, link, icon in SOCIAL %}
 			<li><a href="{{ link }}"><i class="icon-{{ icon }} icon-large"></i> {{ name }}</a></li>
 		{% endfor %}