banneer2

Rechercher sur le blog du grouik:

#Main:

L’installation de Dreamfactory par une image Bitnami est très bien pour tester, mais elle me fait craindre quelques problèmes de stabilité. C’est un peu caca, bitnami en met partout, dur de s’y retrouver lorsque des optimisations sont à faire coté apache php ou mysql etc... et les scripts Bitnami de redémarrages de services oublient de faire des logrotates et font d’autres erreurs.

Bref avant de passer Dreamfactory en production, installons le proprement à la main. voici le mémo.

Le wiki de Dreamfactory explique bien comment faire. http://wiki.dreamfactory.com/DreamFactory/Installation je m’attacherai ici à détailler un eu plus, dont le paramétrage serveur.

Prérequis

Débian 8 Fraichement installée.

Je choisis un trio PHP7 + Apache + mysql

Apache, php et ses modules, et autres prérequis

ajouter le dépôt dotdeb

PHP 7 n’est pas dans les dépôts de la version stable de debian. C’est la logique de leur cycle de développement, ils ne sortent pas de version majeures d un logiciel. On va donc utiliser le dépôt dotdeb.

echo "deb http://packages.dotdeb.org jessie all" > /etc/apt/sources.list.d/dotdeb.list
wget -O- https://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt-get update

’’Source’

Installer tous paquets nécessaires directement et indirectement à dreamfactory.

apt-get install git curl apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert php7.0 php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-memcached php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip php7.0 libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-memcached php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip php7.0-dev php-pear mysql-server mysql-client libcurl4-openssl-dev pkg-config
pecl channel-update pecl.php.net
#la lib mongodb est un peu chiante à installer 
#(Plusieurs paquets ci dessus en sont des prérequis, et il faut enregistrer le module)
pecl install mongodb-alpha
echo "extension=mongodb.so">/etc/php/7.0/cli/conf.d/20-mongo.ini
echo "extension=mongodb.so">/etc/php/7.0/mods-available/mongo.ini

Mettez un mot de passe root à mysql quand il le demande.

php.ini

vi /etc/php/7.0/apache2/php.ini Si votre API dreamfactory aura aussi pour vocation du transfert de fichiers, relevez les valeurs par défaut en fonction de vos besoins.

post_max_size = 40M
upload_max_filesize = 40M
max_file_uploads = 20

Composer

curl -s https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Créer une base mysql

mysql -u root -p
CREATE DATABASE dreamfactory;
GRANT ALL ON dreamfactory.* TO 'dreamfactory'@'localhost' IDENTIFIED BY '*hjiQM,NER!';
quit

Installer dreamfactory

cd /var/www
git clone https://github.com/dreamfactorysoftware/dreamfactory.git
cd dreamfactory/
composer install --no-dev
php artisan dreamfactory:setup

Voici mon retour écran pour la dernière commande:

root@dreamfactory:/var/www/dreamfactory# php artisan dreamfactory:setup
**********************************************************************************************************************
* Configuring DreamFactory... 
**********************************************************************************************************************
Created .env file with default configuration.
Application key [base64:9AZJkz07XobEu5IQ72kRCVjIiJKUg0HrhY/WD1McPUw=] set successfully.
Created phpunit.xml with default configuration.

 Which database would you like to use for system tables? [sqlite]:
  [0] sqlite
  [1] mysql
  [2] pgsql
  [3] sqlsrv
 > 1

 Enter your mysql Host:
 > localhost

 Enter your database name:
 > dreamfactory

 Enter your database username:
 > dreamfactory

 Enter your database password:
 > 

 Re-enter your database password:
 > 

 Enter your Database Port [3306]:
 > 

CACHE DRIVER  is not supported. Using default driver file.
Configuration complete!
*************************************************** WARNING! *********************************************************
*
* Please take a moment to review the .env file. You can make any changes as necessary there. 
*
* Please run "php artisan dreamfactory:setup" again to complete the setup process.
*
**********************************************************************************************************************

Un petit tour dans le fichier .env nous indique entre autre qu’il veut bien de redis comme systeme de cache. Let’s do it:

apt-get install redis-server

Maintenant on édite le fichier .env, et on gère le cache comme ça:

##------------------------------------------------------------------------------
## Cache and Session Settings
##------------------------------------------------------------------------------

CACHE_DRIVER=redis
SESSION_DRIVER=array
MAIL_DRIVER=mail

##------------------------------------------------------------------------------
## Redis cache settings.  Uncomment if the CACHE_DRIVER is changed to redis and
## the default values are not appropriate
##------------------------------------------------------------------------------

REDIS_HOST=127.0.0.1
REDIS_PORT=6379
#REDIS_DATABASE=
#REDIS_PASSWORD=

On relance la commande:

php artisan dreamfactory:setup

Voici mon retour écran

root@dreamfactory:/var/www/dreamfactory# php artisan dreamfactory:setup
**********************************************************************************************************************
* Welcome to DreamFactory setup wizard.
**********************************************************************************************************************
Running Migrations...
Migration table created successfully.
Migration driver used: mysql
Migrated: 2015_01_27_190908_create_system_tables
Migrated: 2015_02_03_161456_create_sqldb_tables
Migrated: 2015_02_03_161457_create_couchdb_tables
Migrated: 2015_02_03_161457_create_mongodb_tables
Migrated: 2015_03_10_135522_create_aws_tables
Migrated: 2015_03_10_200756_create_azure_tables
Migrated: 2015_03_11_143913_create_rackspace_tables
Migrated: 2015_03_20_205504_create_remote_web_service_tables
Migrated: 2015_05_02_134911_update_user_table_for_oauth_support
Migrated: 2015_05_21_190727_create_user_config_table
Migrated: 2015_07_10_161839_create_user_custom_table
Migrated: 2015_08_25_202632_db_alias
Migrated: 2015_11_06_155036_db_function
Migrated: 2015_11_10_225902_db_foreign_key
Migrated: 2016_01_21_213101_add_curl_options
Migrated: 2016_03_15_235903_add_username_field_to_user_table
Migrated: 2016_05_11_134231_remove_service_and_script_type
Migrated: 2016_05_17_020359_db_config_add
Migrated: 2016_06_20_195319_event_affects_content
Migrated: 2016_07_11_155716_create_cassandra_config_table
Migrated: 2016_07_25_214132_adding_a_custom_field_for_oauth_config
Migrated: 2016_08_02_153513_create_redis_config_table
Migrated: 2016_08_02_193216_create_local_cache_config
Migrated: 2016_08_04_140705_create_memcached_config_table
Migrated: 2016_08_09_202900_create_jobs_table
Migrated: 2016_08_10_145124_create_failed_jobs_table
Migrated: 2016_08_10_191349_queueable_scripts
Migration completed successfully.
**********************************************************************************************************************
**********************************************************************************************************************
Running Seeder...
Service resources created: system, api_docs, files, db
Seeded: DreamFactory\Core\Models\Seeds\ServiceSeeder
App resources created: admin, api_docs, file_manager
Seeded: DreamFactory\Core\Models\Seeds\AppSeeder
Email Template resources created: User Invite Default, User Registration Default, Password Reset Default
Seeded: DreamFactory\Core\User\Models\Seeds\EmailTemplateSeeder
Service resources created: email
Seeded: DreamFactory\Core\User\Models\Seeds\EmailServiceSeeder
Service resources created: user
Seeded: DreamFactory\Core\User\Models\Seeds\UserServiceSeeder
Seeded: DreamFactory\Core\User\Models\Seeds\DatabaseSeeder
All tables were seeded successfully.
**********************************************************************************************************************
**********************************************************************************************************************
Creating the first admin user...

 Enter your first name:
 > Gnieark

 Enter your last name:
 > Grouik

 Enter display name:
 > Gnieark Grouik

 Enter your email address?:
 > gnieark@domaoine.com

 Choose a password:
 > 

 Re-enter password:
 > 

Successfully created first admin user.
**********************************************************************************************************************
*************************************************** WARNING! *********************************************************
* Please make sure following directories and all directories under them are readable and writable by your web server 
*   -> storage/
*   -> bootstrap/cache/
* Example:
*      > sudo chown -R {www user}:{your user group} storage/ bootstrap/cache/ 
*      > sudo chmod -R 2775 storage/ bootstrap/cache/ 
**********************************************************************************************************************
*********************************************** Setup Successful! ****************************************************
* Setup is complete! Your instance is ready. Please launch your instance using a browser.
* You can run "php artisan serve" to try out your instance without setting up a web server.
**********************************************************************************************************************

On applique les droits:

chown -R www-data:www-data storage/ bootstrap/cache/ 
chmod -R 2775 storage/ bootstrap/cache/

Configuration d’apache

a2enmod rewrite

Editer le fichier /etc/apache2/sites-available/000-default.conf Pour y mettre:

<VirtualHost *:80>
    DocumentRoot /var/www/dreamfactory/public

    <Directory /var/www/dreamfactory/public>
        AddOutputFilterByType DEFLATE text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript
        Options -Indexes +FollowSymLinks -MultiViews
        AllowOverride All
        AllowOverride None
        Require all granted
        RewriteEngine on
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^.*$ /index.php [L]

        <LimitExcept GET HEAD PUT DELETE PATCH POST>
            Allow from all
        </LimitExcept>
    </Directory>
</VirtualHost>
service apache2 restart

Se rendre sur le serveur via un navigateur: Capture_du_2016-09-18_23-50-53.png

Voila, Il ne reste plus qu’à configurer apache pour le https, mais ça, je vous laisse faire.


Nouveau rythme de vie, nouveaux usages de mon PC portable.

  • Dans le train, j’"accroche" mon PC portable en USB [1] à mon téléphone Android afin de partager la connexion. La carte réseau est alors usb0
  • Au travail, je le relie en RJ45 au lan la carte réseau utilisée est alors eth0
  • Chez moi, c’est généralement en wifi que mon PC est connecté. Wlan0

Sauf que ça marche mal. Voici le test à l’instant.

  • Je me mets en partage de connexion USB.
  • Je vérifie le résultat de la commande ifconfig. OK
  • Je pingue 8.8.8.8 OK

Voici les détails

  • Je débranche mon tel,
  • Je me mets sur le wifi
  • Je checke l’ifconfig, c’est cohérent
  • Je pingue 8.8.8.8, ça ne marche pas.

Voici les détails

J’envoie la commande:

dhcclient wlan0

Et ça marche

Et ce problème se produit dans d’autres sens (passage de la connexion wifi vers usb ou filaire vers wifi etc....

La solution temporaire:

Lorsque je suis en wifi, je saisis la commande:

dhcclient wlan0

Lorsque je suis connecté en USB:

dhcclient usb0

Et le rootage se fait comme il faut. Mais je préfererais faire du plug and play et ne pas avoir à ouvrir un terminal en root à chaque changement de connexion.

Cherchons la solution automatique

Bah, j’ai la flegme de réfléchir. Je fais le bourrin, je dégage Network-manager et configure tout dans le fichier /etc/network/interfaces

Capture_d_ecran_de_2016-08-07_15_13_16.png Devinette, Quel est le prénom de mon voisin? Quel est son FAI? Est-ce que ces infos suffiraient à tenter un bon pishing bien personnalisé pour récupérer des codes de carte bleue?

apt-get remove network-manager
vi /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
    wpa-ssid proutcacaboudin2 
    wpa-psk azerty

auto usb0
allow-hotplug usb0
iface usb0 inet dhcp

Voilà, ça marche mieux... Bon Ok, c’est la méthode "à la truelle dans les fichiers de paramétrage" ... Pour gérer plusieurs réseaux wifi, jetez un coup d’oeil à wpa_supplicant

Note

[1] Je suppose que ça consomme moins la batterie que de faire un pont wifi, mais ça reste à vérifier


bots-arena-connectFour.png

Depuis quelques mois, j’utilise une partie de mon temps libre au développement de Bots Aréna. Je n’avais même pas pris le temps de venir présenter ce site sur ce blog. C’est chose faite.

Quelques jeux sont disponibles.

  • Le morpion
  • Le puissance 4
  • La bataille navale (en maintenance, on a redéfini les specifications, je n’ai pas encore adapté ce jeu là)

Et d’autres viendront, je pense à un Tron pour le prochain.

Le principe, c’est que vous ne devez pas y jouer, mais développer une intelligence artificielle qui jouera pour vous.

Vous hébergez cette dernière sur un site web[1]. Bots arena fera les requêtes pour interroger les adversaires.

principe.gif

les spécifications qui expliquent comment votre bot et l’arène communiquent sont détaillées sur le site pour chaque jeu. Une page web (à télécharger éventuellement) vous permettant de tester votre bot avant de l’envoyer combattre a été créée.

J’attends vos bots avec impatience. Concernant mes bots "gnieark" dans botsarena, ils ne sont pas au point, ce sera facile de me gagner ;)

PS, Mon projet BotsArena est public et opensource.

Note

[1] Il y aurait plein de contraintes, de sécurité pour mon serveur, de limitations de langage de développement, si je devais créer une plateforme qui héberge tous les bots.


postfix-mail-server.png

Oui, les certificats pour les serveurs web sont les mêmes que pour les serveurs de messagerie.

Dans les fichiers de configuration de Dovecot et de postfix, Quels fichiers générés par Lets Encrypt faut-il renseigner?

Créer la clé et le certificat avec lets encrypt.

ce n’est pas vraiment l’objet de ce billet, si vous avez déjà créé vos certificats, passez au paragraphe suivant.

cd ~
#dl lets encript
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
#Stopper l'éventuel service qui utilise le port 80 (dans mon cas c'est apache)
#car letsencrypt en auraz besoin quelques secondes.
service apache2 stop
#générer le certificat
#Je ne mets pas le mode auto car ma configuration d'apache est un peu fouillie
# et lets encrypt n'arrivera pas à générer la configuration
# du coup je lui demande juste les certificats et le clefs:
# Adaptez en fonction de vos besoins
./letsencrypt-auto certonly --standalone --email email@domaine.fr -d domaine1.fr -d machine.domaine1.fr -d machine.domaine2.fr 
#restart apache
service apache2 start

Postfix

Ma partie certificats tls dans le /etc/postfix/main.cf est la suivante:

#tls
smtpd_tls_key_file = /etc/letsencrypt/live/tinad.fr/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/tinad.fr/cert.pem
smtpd_tls_CAfile = /etc/letsencrypt/live/tinad.fr/chain.pem

Évidemment vous remplacez tinad.fr par le nom du répertoire que vous trouvez dans /etc/letsencrypt/live

Dovecot

Pour dovecot (serveur IMAP)

ssl_protocols = !SSLv2 !SSLv3
ssl_ca = </etc/letsencrypt/live/tinad.fr/chain.pem
ssl_cert = </etc/letsencrypt/live/tinad.fr/cert.pem
ssl_key = </etc/letsencrypt/live/tinad.fr/privkey.pem
ssl_verify_client_cert = yes
ssl = required

j’adapte ce billet en vidéo, mais je prends le temps d’aller plus loin dans l’explication théorique.

je ne suis pas super satisfait du résultat (qualité de la vidéo, rythme etc...), mais j’expérimente.

Enjoy.


Hello, un essai de tutoriel vidéo.

La marge de progression est immense. Je sais à présent qu’on ne fait pas une vidéo de la même manière qu’on rédige un billet de blog.


ta daaaaa! Voici mon "arduino’s analog joystick":

IMG_20160302_232752.jpg

Electronique:

schema.png

(je déteste les logiciels de création de PCB) Pour faire simple [1], la loi d’ohm fait qu’en mettant une résistance différente au cul de chaque bouton poussoir, la valeur lue dans A0 sera unique en fonction du bouton activé.

IMG_20160302_230758.jpg

IMG_20160302_230803.jpg

Code

Il donne quelque chose comme ça:

int joystickPin = A0; 
int getPushedButton(int joystickPin){
  int val=analogRead(joystickPin);
  if(val > 1000){
   return 0; 
  }else if (val > 650){
    return 4;
  }else if(val > 450){
   return 6; 
  }else if(val > 120){
    return 5;
  }else if(val > 45){
    return 3;
  }else if(val > 15){
   return 1; 
  }else{
   return 2; 
  }
}

Adaptez les valeurs en fonction des résistances que vous mettez. On peut aussi gérer les combinaisons de boutons.

Box

Le dessin 3D du carter de la manette peut être téléchargé sur ce dépot github.

Cette manette s’intègre dans mon projet de cube led. Cet article est assez léger techniquement. Mais s’il peut donner des idées à des bidouilleurs arduino, c’est cool.

Note

[1] Comme il est minuit passé au moment où je rédige ces lignes... Je n’ai pas envie de poser des équations


CauS4TNW0AEblN4.jpg_large.jpeg

Mon cube led est assemblé, la carte électronique finie (et déboguée) Let’s code!

Plusieurs composants ne sont pas simples à faire fonctionner avec l’arduino et à force de chercher des exemples de programmation du cube led (avec le même type de démultiplexage), j’en suis arrivé à la conclusion suivante:

Les auteurs des blogs et tutoriels ont tous utilisé le même code de bas niveau[1]. Que l’auteur du code d’origine lève la main!.

J’ai aussi remarqué que ce code est "imbuvable" et peu malléable[2],

La manipulation des ports arduino et les opérations sur les bits, sont des mondes qui me sont étrangers et pénibles à appréhender.

Par exemple, cette ligne dans le code source:

PORTB = (PORTB & 0xF8) | (0x07 & (i+1));

Heu là,... i est compris entre [0 et 7] vu les lignes précédentes. Il modifie l’état (HIGH / LOW) de certaines pins entre D8 et D13 puisqu’on parle de "PORTB". Mais lesquelles précisément et avec quels états? Je n’en sais rien. L’explication est donnée en commentaire par Khajidu

Je ne veux pas faire un bête copier collé de code que je ne comprends pas.

Dans cet article on va expliquer le fonctionnement de certains composants électroniques (car j’ai eu du mal à trouver des explications simples), puis on va recoder plus simplement[3] les fonctions de base du cube led.

Résumé du fonctionnement du cube led

Il s’agit du cube led décrit par Dylan Collaud sur son blog. En suivant les liens dans son article, vous trouverez les plans pour le circuit etc... Il s’est basé sur celui proposé par le site instructables , mais avec un arduino.

8x8x8 leds. Les cathodes (+) des leds sont reliées entre elles par colonnes. Il faut gérer 64 colonnes. Les anodes (-) sont mises en commun par étage de led[4]. Il faut gérer 8 étages.

Ce qui fait un total de 72 sorties à gérer. Il va falloir démultiplexer.

Le circuit de démultiplexage comprend:

  • 8 flip flop octal 74hc574 (non ce ne sont pas des registres à décalages [5]),
  • un IC SN74HC138N qui sert à contrôler la pin clock de chaque flip flop,
  • 8 transistors.

L’impossibilité de faire certaines combinaisons de leds

On peut allumer chaque led individuellement sans problème.

Prenons mon cube 4x4x4[6], ce sera plus simple pour les gribouillages sur les photos.

IMG_20160218_180312.jpg

Pour allumer la 3ème led vers la droite, 2ème rangée en allant vers l’arrière, 2ème étage:

  • Faire passer le courant dans la 7ème colonne
  • activer l’interrupteur le transistor qui permet de mettre à la masse le 2ème étage de leds

cub1.png

Pour allumer aussi la 1ère led e, 1ère rangée en allant vers l’arrière, 3ème étage:

  • Faire passer le courant dans la 1ère colonne
  • activer l’interrupteur le transistor qui permet de mettre à la masse le 3ème étage de leds.

Résultat:

cub2.png

Zut, deux leds supplémentaires se sont allumées.

La solution pour pallier ce problème est de jouer sur la persistance rétinienne. On affiche le premier étage de led, on l’éteint, on allume le deuxième etc.... Si c’est fait assez rapidement l’œil n’y verra que du feu.

Je vous ai expliqué la contrainte de démultiplexage, de la nécessité de compliquer le code en gérant étage par étage, et de devoir aller très vite pour l’effet de persistance rétinienne.

Entrons donc dans le vif du sujet, le fonctionnement du bouzin, avec ces contraintes que j’ai eu du mal à maîtriser.



Composants

Bascule octale flip flop 8 bits 74hc574

74hc574.jpg

Ce composant va mémoriser l’état des signaux en entrée (D0 à D7) et va les reproduire sur ses sorties (Q0 à Q7), jusqu’ ce qu’on lui demande d’enregistrer à nouveau les signaux en entrée.

La doc est par là http://www.nxp.com/documents/data_sheet/74HC_HCT574.pdf

Branchements

74HC574E-pinning.png

74HC574E-pin-description.png

  • OE (output enable)-> vers une sortie digitale de l’arduino. dans mon cas D11. (Toutes les pins OE des 8 flip flop sont reliées à D11)
  • D0 ~ D7 -> Ce sont les entrées, Reliées aux sorties de l’arduino A0,A1,A2,A3,A4,A5,D12,D13, toutes en mode "output"
  • CP (clock pin) -> Reliées aux sorties de l’IC. Évidemment Vous reliez dans l’ordre: la sortie 0 de l’IC sur la clock pin du 74HC574 qui gère la première ligne de led; la sortie 1 sur le 74HC574 qui gère la deuxième ligne de leds etc...
  • Q0 ~ Q7 -> ce sont les sorties, vers une résistance puis la colonne de leds.
  • Vcc vers le 5v de l’arduino et GND vers le GND. Ça parait tellement évident que sur certains schémas électroniques, ils omettent de le préciser. Mais, si si, il faut.

Utilisation

74HC574E-table.png

Pour "enregistrer" un nouvel état des sorties:

  • Mettre les entrées D0 à D7 dans le mode qu’on souhaite, celui que le flip flop doit mémoriser.
  • Mettre la pin OE à disable, c’est à dire: HIGH (logique inversée)
  • Faire passer la clock pin de LOW vers HIGH (c’est à ce moment là, lors de la transition de l’état LOW vers HIGH que le flip flop enregistre)
  • Quand on aura fini d’enregistrer le(s) flip flop Remettre OE à enable (LOW) pour qu’il(s) génèrent les signaux demandés.

En code arduino, ça donne:

digitalWrite(pinOE, HIGH);//Output Enabled off
//lines
PORTB=ICtable[0];//l'IC va mettre la clock pin du premier FlipFlop à LOW

//ecrire le bus,(là on va allumer une led sur 2)
digitalWrite(A0,LOW);
digitalWrite(A1,HIGH);
digitalWrite(A2,LOW);
digitalWrite(A3,HIGH);
digitalWrite(A4,LOW);
digitalWrite(A5,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);

PORTB=ICtable[1];//On passe au flip flop suivant, et cette manip va faire passer la clock pin
		  //  du flip flop 0 de l'état LOW à HIGH. C'est à ce moment qu'il va enregistrer.

//OE ON
digitalWrite(pinOE, LOW);

IC d’adressage 74HCT138N

SN74HC13N.jpg

Il sert à définir lequel des 8 flip flop est en cours d’écriture dans le cas du cube led.

Voici un premier extrait de sa documentation qui explique comment le raccorder.

Branchement

SN74HC13N-fiche.jpg

  • A0 A1 et A2 c’est la data, -> vers des pins digitales de l’arduino D8, D9 et D10, c’est une bonne idée.
  • E1, E2 (actifs si LOW) et GND vers la masse
  • E3 et VCC vers le 5V de l’arduino
  • Y0 à Y7 vers les PINS Clock des 74hc574

Utilisation

En fonction des états (HIGH / LOW) que vous enverrez dans les entrées A0~A2, une (et une seule) des sorties Y0~Y7 sera à l’état "LOW". Voici le tableau, fait à partir de la doc :

InputOutputput
A0 A1 A2 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
LOW LOW LOW LOW HIGH HIGH HIGH HIGH HIGH HIGH HIGH
HIGH LOW LOW HIGH LOW HIGH HIGH HIGH HIGH HIGH HIGH
LOW HIGH LOW HIGH HIGH LOW HIGH HIGH HIGH HIGH HIGH
HIGH HIGH LOW HIGH HIGH HIGH LOW HIGH HIGH HIGH HIGH
LOW LOW HIGH HIGH HIGH HIGH HIGH LOW HIGH HIGH HIGH
HIGH LOW HIGH HIGH HIGH HIGH HIGH HIGH LOW HIGH HIGH
LOW HIGH HIGH HIGH HIGH HIGH HIGH HIGH HIGH LOW HIGH
HIGH HIGH HIGH HIGH HIGH HIGH HIGH HIGH HIGH HIGH LOW

En une function arduino ça donne:

const int ICPins[]={8,9,10}; 

const boolean ICtable[8][3]=
{
  {false,   false,	false},
  {true,    false,	false},
  {false,   true, 	false},
  {true,    true,       false},
  {false,   false,	true},
  {true,    false,	true},
  {false,   true,	true},
  {true,    true,  	true}
}

void selectIC(int ICPinLow){
    for (int i=0; i<3; i++){
        digitalWrite(ICPins[i], ICtable[ICPinLow][i]); // Arduino shows  true as HIGH and false as LOW 
    }
}

Sauf que dans le cas du cube led[7], le délai minime de traitement des digitalWrite par l’arduino va poser problème. J’ai mis plusieurs d’heures avant de comprendre ce problème.

Je vous explique: Si l’IC a la valeur 1. D8 true D9 false d10 false Pour passer 2. {false, true, false}, les commandes sont les suivantes

digitalWrite(D8, LOW); // -> LOW, LOW, LOW l'IC prend la valeur 0
digitalWrite(D9, HIGH); // -> LOW, HIGH, LOW l'IC prend la valeur 2
digitalWrite(D10, LOW); //-> D10 était déja LOW l'IC reste à la valeur 2

Pour passer de la valeur 1 à 2 sur l’IC, il va y avoir une valeur intermédiaire de 0. Et lorsque la pin clock de la bascule flip flop n°0 va enregistrer un passage de LOW vers HIGH, elle va enregistrer la configuration qui était destiné à la bascule 2. Il faut donc trouver un moyen de changer l’état de plusieurs pins simultanément.

La seule technique est la manipulation de ports. Le code précédent est remplacé par:

const byte ICtable[9]={
 B00000000,
 B00000001,
 B00000010,
 B00000011,
 B00000100,
 B00000101,
 B00000110,
 B00000111,
 B00000000 //une façon de boucler sur 0
};

//Pour choisir la sortie du 74HC13N faire:
PORTB=ICtable[ligne];
//avec "ligne" étant le numéro de la pin de l'IC qui doit être LOW

Voila, pas le choix de faire un peu d’écriture dans les registres de l’ATMEGA, ça m’embête car ça rend le code moins facile à appréhender, et un peu plus rigide. Ah j’oubliais, l’explication:

PORTB=B00000110;
       ||||||||
       |||||||+-> D8 LOW
       ||||||+->D9 HIGH
       |||||+->D10 HIGH
       ||||+->D11 LOW mais on s'en fout, c'est la pin output enable, 
       ||||                   elle doit etre low au moment où enregistre une valeur
       ||||                   sur le flipflop
       ||||
       |||+-> D12 LOW (idem, OSEF, c'est un étage de led, doit etre off à ce moment)
       ||+-> D13 LOW idem
       ++->bits inutiles

Transistors

NPN222.jpg

Non, je plaisantais avec ce titre, je ne vais pas vous expliquer le fonctionnement des transistors quand même... Si?

Transistor_NPN_symbol.png

Je m’en sers comme d’un télerupteur. Envoyez du courant dans la base, le circuit est fermé, sinon il est ouvert.

Le code

Comme je l’écrivais en introduction, l’objectif était de simplifier le code qu’on peut trouver partout sur le net. J’ai donc utilisé au minimum le "port manipulation". Et j’ai supprimé l’interruption arduino pour afficher le cube.

Vu que le code du cube c’est dans le style en pseudo code:

Led[1] -> allume;
Led[2] -> éteind;
delay(200);
Led[2] -> allume;
delay(87);
etc...

on change l’état des leds, on applique un délai et ainsi de suite,

Autant remplacer l’instruction delay par une instruction qui affiche le cube pendant une durée donnée. De cette manière, l’arduino n’a plus à compter son nombre de cycles pour gérer l’interruption (optimisation)

/*
* Low level code for cube led 8x8x8
* By Gnieark https://blog-du-grouik.tinad.fr February 2016
* GNU GPL V2
*/

#define pinOE 11
boolean cube[8][8][8];

const int layersPins[]={A0,A1,A2,A3,A4,A5,12,13};
const int busPins[]={0,1,2,3,4,5,6,7};

// IC Pins are "hard coded". here just for info,
const int ICPins[]={8,9,10}; 
//  If you change IC pin configuration, 
//  You'll have to modify const ICtable[9]

//see SN74HC138 specs 
//http://www.ti.com/lit/ds/symlink/sn54hc138.pdf page 2
const byte ICtable[9]={
 B00000000,
 B00000001,
 B00000010,
 B00000011,
 B00000100,
 B00000101,
 B00000110,
 B00000111,
 B00000000 //une façon de boucler sur 0
};

void writeCube(int tdelay){
    static int currentLayer=0;
    unsigned long startedAt = millis();
    while(millis() - startedAt < tdelay){ 

        delay(1);// wait a bit on previous layer
        digitalWrite(layersPins[currentLayer],LOW);//turn off current Layer

        //change currentLayer
        if(currentLayer == 8)
            currentLayer=0;
        else
            currentLayer++;  

        digitalWrite(pinOE, HIGH);//Output Enabled off
        //lines
        PORTB=ICtable[0];//set IC
        for(int ligne=0;ligne < 8; ligne++){
            //write BUS for this leds'line
            for (int led=0;led <8;led++){
                digitalWrite(busPins[led], cube[currentLayer][ligne][led]); 
            }
            PORTB=ICtable[ligne +1]; //74HC574 is writen when clock pin goes LOW to HIGH. SO go to the next value for IC.
        }
        //OE ON
        digitalWrite(pinOE, LOW);
        //layer on
        digitalWrite(layersPins[currentLayer],HIGH);
    }
}
void fillCube(){
 for (int i=0;i<8;i++){
  for(int j=0;j<8;j++){
   for(int k=0;k<8;k++){
       cube[i][j][k]=true;
   }
  }
 }
}
void lowCube(){
 for (int i=0;i<8;i++){
  for(int j=0;j<8;j++){
   for(int k=0;k<8;k++){
       cube[i][j][k]=false;
   }
  }
 }
}

void setup(){
    for(int pin=0; pin<8; pin++){
        pinMode(layersPins[pin], OUTPUT);
        pinMode(busPins[pin], OUTPUT);
    }
    for(int pin=0;pin<3;pin++){
     pinMode(ICPins[pin],OUTPUT);   
    }
    pinMode(pinOE, OUTPUT);
    digitalWrite(pinOE, LOW);
    lowCube();  
}

void loop(){    
 for (int i=0;i<8;i++){
  for(int j=0;j<8;j++){
   for(int k=0;k<8;k++){
       cube[i][j][k]=HIGH;
       writeCube(100);
       cube[i][j][k]=LOW;
   }
  }
 }
}

Je mettrai les évolutions de mon code sur ce dépot github. https://github.com/gnieark/8x8x8

Améliorations prévues du cube led.

J’ai deux pistes incompatibles.

J’utilise un arduino nano, et au final il me reste les pins A6 et A7 libres (spécifiques au nano).

  • Je peux les utiliser pour ajouter deux manettes et développer une sorte de snake avec le cube led.
  • Je peux aussi les utiliser pour récupérer les pins D0 et D1 qui actuellement utilisées bloquent l’utilisation du Serial et empêchent donc de piloter le cube depuis le PC.

Notes

[1] Par "bas niveau" il faut comprendre les fonctions du programme qui servent à définir quelles leds sont allumées. Ce sont les fonctions qui sont entre l’arduino et le programme qui génère les animations avec les leds quoi.

[2] Si vous vous êtes planté sur un mappage de pins et que vous souhaitez corriger ça dans le code et pas à coup de pompe à dessouder; bon courage!

[3] C’est prétentieux... disons de façon plus accessible pour un développeur amateur.

[4] J’ai une chance sur deux d’avoir inversé "cathode" et "anode"

[5] La temps d’écriture sur les registres à décalages pose peut être problème sur un cube led.

[6] Il m’avait servi pour tester la méthode avant d’attaquer les 512 leds. PS, en 4x4x4, un arduino mega a assez de sorties pour tout gérer sans avoir à démultiplexer.

[7] Dans un autre programme, cette function peut fonctionner sans poser de soucis


Ok, le ftp en 2015, c’est à éviter. Je suppose que vous ferez ça en local sur une DMZ uniquement. On va voir ici comment installer proftp, avec une gestion des comptes sur une base mysql.

Roadmap du document:

  • 06/10/2010: création
  • 23/11/2015: Correction erreur mysql, fichier de conf de proftp, ajout d’un exemple de création d’un utilisateur.

Bases de données:

La database se nome ftp, l’user ’proftpd’@’localhost’ y a accès. Dans le prompt mysql pour créer la base et l’user:

CREATE database ftp;
GRANT ALL ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'mot-de-passe';
QUIT

Puis pour créer les tables, télécharger le script sur ce blog.

cd ~
wget https://blog-du-grouik.tinad.fr/public/createtablesftp.sql
mysql -u root -p ftp < createtablesftp.sql

Installation

apt-get install proftpd proftpd-mod-mysql

proftpd-inetd-ou-Indep.jpg je choisis indépendant, (proftp tournera en permanence et pompera un peu plus de ressources. c’est pas bien vu mon utilisation, mais c’est plus stable et plus simple à configurer.)

addgroup proftpd

Activer le module mysql:

Dans le fichier /etc/proftpd/modules.conf dé-commenter les lignes suivantes:

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c

Paramétrage proftpd:

Remplacez le fichier /etc/proftpd/proftpd.conf par celui ci dessous proposé ici:

cd /etc/proftpd
mv proftpd.conf proftpd.conf.old
wget https://blog-du-grouik.tinad.fr/public/proftpd.conf
vi proftpd.conf

Remplacez ************** par le mot de passe mysql de proftpd dans la ligne SQLConnectInfo ftp@localhost proftpd **********

Mais c’est pas bien, je le conçois, idéalement l’user ftp devrait être le propriétaire des dossiers publics (faisant partie du site) avec des droits en écriture et lecture. tandis que www-data devrait faire partie du groupe de l’user, ce dernier ayant accès en lecture uniquement (sauf dans les répertoires où le site internet a besoin d’écrire).

Une telle organisation pourrait limiter les conséquences de l’exploitation d’une faille dans un script php. mais à gérer site par site, c’est super lourd.

Redémarrer proftpd:

service proftpd restart

Créer des utilisateurs

#Créer le repertoire
mkdir -p /home/ftp/user1
chown -R ftp:ftp /home/ftp/user1

Créer l’user en dans la base de donnée. "120" correspond à l’uid unix du compte ftp.

USE ftp;
INSERT INTO ftpuser(userid,passwd,uid,gid,homedir,modified) VALUES 
('user1',ENCRYPT('mot-de-passe'),'120','120','/home/ftp/user1',NOW());

Vous pouvez ajouter des utilisateurs dans la base de données en utilisant phpmyadmin par exemple.


computerengineerbarbie-laptop.jpg

Barbie code directement en binaire. Pour les autres, voici une petite sélection de sites proposant des challenges ludiques de programmation.

Les challenges du hackerspace de Rouen Jeanne d’hack (dont je suis membre)

Les sujets et les réponses des challengers sont sur ce dépôt github. Comme tout le monde démarre au même moment le lundi soir (à une bière sans alcool près), la rapidité est un critère. Si vous n’êtes pas à proximité de Rouen [1] vous pouvez quand même participer en répondant par une pull request.

Un des sujets (le morpion) consistait à développer un bot. Les bots peuvent s’affronter dans une arène . Vous pouvez toujours créer votre propre bot de morpion, et je pense qu’on reproposera ce genre de sujet (avec affrontement des bots pour définir le gagnant du challenge)

D’ailleurs il y a un site dédié à ce genre de défis:

Tournoyons

Tournois de logiciels Le site parait être à l’abandon (charset mal réglé sur certaines pages) et pas d’activité depuis quelques années. Mais rien ne m’indique qu’il ne fonctionne plus. Si quelqu’un a la patience de s’y inscrire pour faire un retour ;)

Il propose das tournois de bots pour plusieurs jeux ludiques (échecs, bataille navalle, shifumi ...)

Code golf

Par là: Code golf le principe est généralement de réussir à faire le code le plus court possible pour répondre à un sujet. Cependant, personnellement, je trouve que la plupart des sujets sont fastidieux et peu ludiques. Mais il y a quelques exceptions.

Project Euler

Par là: Project Euler. L’avantage de ce site est qu’il propose des problèmes dans un ordre de difficulté légèrement croissante. Les premiers problèmes m’ont pris maxi 15 minutes chacun. Et là, je sens que la difficulté augmente. Mais au passage, j’ai révisé les factorielles et les combinaisons en maths ;) Pour le moment aucun des problèmes justifie de dépasser une centaine de lignes de codes.

Les sujets sont orientés mathématiques. Développeurs amateurs fans de Micmaths, Go!!!!

Conclusion

Il doit en exister d’autres. faites un tour surtout sur les défis de Jeanned’hack. l’avantage d’utiliser github est qu’on peut commenter, discuter (troller) etc...

Allez, Tchouss! je retourne écrire ma fonction pour faire des permutations dans l’ordre lexicographique (probleme euler 24)

Note

[1] Il existe un monde en dehors de la Normandie?


IMG_20151005_003242.jpg

Comme je l’expliquais dans la dernière brève, J’ai mis une cam sur le raspberry qui controle mon imprimante... Fail, quand il fait noir, je n’ai plus d’image.

On va voir comment piloter une ampoule 12V depuis le Raspberry PI, puis comment intégrer ça à Octoprint. Certes dixit @trankilloman, avec une caméra infrarouge ce serait plus simple. Oui, mais je vais faire avec les moyens du bord, qui sont dans mon cas:

  • Une ampoule 12V (Philips)
  • Mon dernier transistor NPN TIP122
  • des résistances

Circuit électronique

Capture_d_ecran_de_2015-10-07_15_40_59.png

  • L’alimentation 12V est l’alimentation fournie par l’alim ATX. Il me restait un cable jaune non utilisé.
  • La pin GND du raspberry est mise en commun avec le GND de l’alim (Perso, c’était déjà le cas vu que j’allimente le pi via les pins GPI0 cf : ce billet sur le branchement )
  • La valeur de la résistance entre la Pin GpiO et le transistor.... idéalement 220 ohms mais entre 100 et 300 ça marchera.
  • Le transistor, TIP 120, 121 ou 122. même combat ;)

Attention quand j’évoque la pin gpio1, il s’agit de la pin qui aura le numéro 1 dans les commandes bash. et pas de la pin à l’emplacement physique 1

Donc la pin droite de la 6ème rangée en partant du haut:

p1header.png Image provenant de Google images lediouris.net

Tests sur la plaque d’essais:

IMG_20151003_222917.jpg

Après quelques soudures, puis des déssoudures sans pompe à dessouder car je m’étais trompé dans le sens du transistor:

IMG_20151004_235729.png

Le verso (j’ai un peu honte de mes soudures crados là, mais je n’avais pas de pompe à dessouder suite à mon erreur)

IMG_20151004_235749_1_.jpg

Le trou de 3mm de diamètre sert à la fixation du circuit sur une entretoise, elle même fixée au raspberry PI.

Une fois mon circuit fixé et branché au PI:

IMG_20151005_003213.jpg

Commander la lampe depuis le raspberry Pi

Installer WiringPi

Pour plus d’infos, n’hésitez pas à consulter la page du développeur http://wiringpi.com/

#git
sudo apt-get install git-core
sudo apt-get update
sudo apt-get upgrade
#To obtain WiringPi using GIT:
git clone git://git.drogon.net/wiringPi
#Sscript qui compile et installe:
cd wiringPi
./build

Tester

#Mettre la gpio 1 en mode écriture
gpio mode 1 out
#allumer la lampe
gpio write 1 1
#éteindre la lampe
gpio write 1 0

Ajout les fonctions éclairage dans Octopi

Pour qu’Octopi mette la pin en écriture à son démarrage, ajoutez:

gpio mode 1 out

dans le script /etc/init.d/octoprint juste après RETVAL="$?"

comme ceci: Capture_d_ecran_de_2015-10-07_17_11_54.png

Pour ajouter les commandes sur l’interface d’Octopi, éditez le fichier /home/pi/.octoprint/config.yaml et ajoutez

  - action: light ON
    command: gpio write 1 1
    name: light ON
  - action: light OFF
    command: gpio write 1 0
    name: light OFF

dans le bloc system.

Redémarrez le Raspberry Pi Les commandes devraient apparaître: octoplight.png

To do

Il me reste à dessiner et imprimer un support pour la cam et l’ampoule afin que je puisse récupérer ma troisième main de soudeur.


Dans ce billet, on va détailler comment utiliser au mieux la fonctionnalité STAND BY d’une alimentation ATX servant à alimenter une reprap (électronique RAMPS + arduino), contrôlée par un Raspberry pi contenant Octoprint. Et donc pouvoir mettre off l’imprimante depuis n’importe quel endroit connecté au net.

Vous retrouverez la plupart des infos que j’explique ici sur le github d’Octopi, sauf que je le fais en français, à la sauce Gnieark, et que j’ajoute la configuration du trancheur[1].

On va faire en sorte:

  • Que l’alimentation alimente la reprap et le raspberri pi (économie d’une prise secteur)
  • qu’Octoprint soit capable d’allumer et de "STAND BY" l’alimentation (tout en restant lui même alimenté).

Branchement de base, alimenter l’imprimante.

Après avoir coupé les connecteurs ATX, molex, alim SATA..., on prend 6 câbles jaunes (12 V) et 6 noirs.

  • On les dénude,
  • on les regroupe par 3 afin d’être sur que la section de câble supportera l’intensité demandée par l’imprimante.
  • On étame un peu,
  • On les habille avec un petit bout de gaine thermorétractable.
  • On les visse au bornier
  • On chauffe la gaine avec un briquet pour venir isoler au plus près du bornier

IMG_20150926_120038.jpg

Voila l’imprimante est alimentée., ça c’est l’étape que tout le monde qui possède une reprap a fait.

Alimenter le Raspberry pi

On va alimenter le Raspberry pi avec la sortie +5VSB (le câble violet).

CN2Wy7-U8AEKRiF.jpg

Il y a deux possibilités pour alimenter un raspberry pi: Le câble micro USB, et utiliser les pins sur la carte.

/!\ L’alimentation USB du Pi est protégée contre des fluctuations légères du voltage. Ce n’est pas le cas lorsqu’on alimente le PI via les pins GPIO. Je considère (peut être à tort) que le 5V généré par une alim ATX est fiable [2].

IMG_20150924_122738.jpg

j’ai utilisé un câble avec connecteurs Dupont déja fait.

  • Le câble noir est relié à un câble noir du boitier ATX (GND)
  • Le câble jaune est relié à rien du tout (j’avais pas envie de l’enlever même s’il ne sert à rien)
  • le câble rouge est relié avec le câble violet de l’alim ATX (+5V)

N’hésitez pas à vérifier avant de brancher avec un voltmètre. Normalement votre Pi devrait s’allumer lorsque vous mettez sous tension votre alimentation.

Contrôler le On/off via le raspberry.

Pour allumer (hors fil violet toujours alimenté) à la main votre alim, il faut court-circuiter le fil vert et une masse. Un arduino ou un Raspberry est capable de gérer ça. voici d’ailleurs la méthode

FVRK2BSI6NIDBRE.MEDIUM.jpg

Sauf que la carte ramps 1.4 contient déja ce circuit, là:

RAMPS1.4-fuse_layout.png

Voila mon branchement IMG_20150924_122848.jpg

  • le câble vert correspond au cable vert de l’alim
  • le rouge correspond au rouge

-_- [3]

Précision: ce circuit sur la carte RAMPS fait partie des secteurs alimentés via la prise USB, il fonctionnera même quand l’imprimante sera en stand by.

Si vous avez tout suivi, votre installation est de manière ultra simplifiée la suivante:

IMG_20150926_163731.jpg

Tests

Dans octoprint, onglet "Terminal", Saisissez M80 pour allumer l’alimentation et M81 pour l’éteindre. (Tout de suite, je ne le fais pas car une impression est en cours) Capture_du_2015-09-26_16_04_05.png

Intégrer les instructions ON OFF dans le trancheur

ON

On va configurer le trancheur pour qu’avant de commencer quoi que ce soit, il envoie le code M80 (ON) à l’imprimante, puis une fois l’impression terminée et la température assez descendue, qu’il envoie M81(Stand By)

Bon j’avoue, j’utilise Repetier-Host avec Curaengine pour trancher mes STL.

Dans la configuration de Curaengine, j’ajoute la commande M80 au tout début du "Start G-Code" Capture_du_2015-09-26_17_09_44.png

OFF

J’utilise un extrudeur E3D métallique qui est ventilé. Si j’arrête de le ventiler dès la fin de l’impression, il va monter suffisamment en température pour que le PLA fonde dans la partie froide et bouche ma tête. On va attendre que la température de la tête d’impression ait baissé avent d’envoyer le M81 (qui coupe aussi le ventilateur)

J’ai remplacé tout le "end-gcode" par celui ci

;END GCODE
M107 ; Turn off fan
G91 ; Relative positioning
G1 Z10.0000 F200 ; move the head up
G1 E-1 ; Reduce filament pressure
M140 S0 ; Disable heated bed
M109 T0 S50 ; temp target have to down before next STEP
M104 T0 S0; turn off extrudeur
M84 ; Turn steppers off
M81; Turn off printer

Note: Les essais avec la commande M109 Bxxxx et M109 Rxxx n’ont pas fonctionné avec mon Marlin

En attendant que mon imprimante redescende en dessous de 50° et s’arrête. (ce qui signifiera que je peux publier ce billet), voici quelques indications pour configurer Octoprint

Configurer des boutons on off dans Octoprint

Il est possible de configurer des boutons ON OFF dans Octoprint, La méthode est expliquée là, mais j’ai perdu la clef ssh du raspberry pi pour pouvoir faire la manip [4]. Et comme M80 et M81, ce n’est pas trop dur à taper, je n’ai pas jugé ça super utile.

Notes

[1] J’ai bouché la tête de mon imprimante en testant le GCODE pour rédiger ce billet. Correction OK.

[2] Je ne prétends pas avoir la science infuse, vous êtes avertis qu’il y aurait un petit risque d’endommager votre carte raspberry. Vous êtes libre de couper un câble USB et de faire avec si vous préférez.

[3] Le code couleur tu respecteras. Le code couleur tu respecteras. Le code couleur tu respecteras

[4] la flegme de le brancher sur une télé, et clavier pour récupérer les accès


gnutlslogo.png Lors d’un passage de Debian 7 Wheezy à Debian 8 Jessie, libapache2-mod-gnutls (qui est une alternative à mod-ssl pour gérer les certificats https) se fait désinstaller et Apache ne marchera donc pas après l’upgrade du serveur. Ce paquet n’est pas porté dans débian 8

Deux solutions:

  • utiliser mod-ssl (et réadapter les fichiers de conf des vhosts, remettre les fichiers contenant les clefs et les certificats au propre etc...)
  • A l’ancienne, compiler le mod_gntls

Au travail, j’ai choisi la première solution et sur mon serveur perso, je prends la deuxième. Lors du ./configure, il ne prévient pas de toutes les dépendances manquantes, il faut deviner en fonction de la sortie en erreur lors du "make".

Je suppose qu’apache2 est déjà installé et mod-ssl désactivé et mod_gnutls activé mais ne voulant pas fonctionner parceque :

/usr/lib/apache2/modules/mod_gnutls.so est manquant.

Voici le petit mémo:

#installer les prérequis
apt-get install apache2-dev gnutls-dev libapr-memcache0 libapr-memcached-dev
cd ~
#dl la source
git clone https://mod.gnutls.org/git/mod_gnutls
cd mod_gnutls
#compile puis make
./configure --with-apxs=/usr/bin/apxs2
make
#On ne fait pas l'install, on va juste pousser le module
cp src/.libs/libmod_gnutls.so /usr/lib/apache2/modules/mod_gnutls.so

Voila, plus qu’à faire un reload d’apache


rsaPlp.png

Pourquoi faire ça?

A moins de s’appeler le trésor public[1], cette sécurité peut paraître exagérée.

Ça va me servir dans quelques semaines à sécuriser une appli web du travail pour laquelle seuls une dizaine d’utilisateurs auront accès depuis l’extérieur (via un reverse proxy apache) .

Présentation des techniques employées:

La configuration se fait au niveau d’apache et du module SSL. Ce n’est pas compliqué, Mais c’est chiant à expliquer de façon claire. J’en suis à la troisième re-rédaction de ce billet pour tenter d’éclaircir les explications.

Ce billet contient tout un mémo de création d’une chaine de certification avec openSSL et un peu de config Apache.

Sur le serveur (mon Raspberry pi), je vais créer trois sites virtuels (VHOST) dans la configuration d’apache:

  • home.tinad.fr (en http)
  • home.tinad.fr (en https)
  • prive.tinad.fr (en https, avec obligation pour l’utilisateur de posséder un certificat personnel signé par l’autorité de certification qu’on va créer):

Créer son autorité de certification et des certificats pour les deux sites en https

l’autorité de certification

Malheureusement, il n’est pas possible d’obtenir un certificat ayant le rôle "autorité de certification" reconnu par tous les navigateurs. On devra faire en sorte que les utilisateurs ajoutent notre certificat dans leur navigateur. Je ne détaillerai pas ici comment faire, mais il voici trois pistes:

  • Créer une page web intermédiaire fournissant le certificat, et expliquant comment et pourquoi l’installer
  • Si les utilisateurs sont dans un réseau sur lequel on est l’administrateur réseau : Via une GPO.
  • Offrir une boite de kinder chocolat à l’administrateur réseau pour qu’il fasse une GPO.
  • L’installer manuellement sur tous les postes.

Configuration

#On créé l'architecture de dossiers et fichiers nécessaires à une gestion des
#clés et certificats dans le repertoire /srv/ssl
mkdir /srv/ssl
cd /srv/ssl
mkdir certs crl newcerts private
echo 01 > serial
touch index.txt
echo 01 > crlnumber
cp /usr/lib/ssl/openssl.cnf .

Editer le fichier /srv/ssl/openssl.conf et modifiez les parametres suivants:

  • dir=/srv/ssl
  • Dans le bloc [req_distinguished_name]  :

.

countryName_default             = FR
stateOrProvinceName_default     = France

Clé privée certificat et signature

#Créer une clé privée
openssl genrsa -des3 -out private/cakey.pem 4096
#certif signé
openssl req -config openssl.cnf -new -x509 -nodes -sha1 -days 1825 -key private/cakey.pem -out cacert.pem

Adaptez les réponses en fonction,s de votre site, mais ne mettez pas le FDQN dans le common name. Il s’agit du certificat autorité, pas celui de votre site web. Voici mon retour écran:

root@raspberrypi:/srv/ssl# openssl req -config openssl.cnf -new -x509 -nodes -sha1 -days 1825 -key private/cakey.pem -out cacert.pem
Enter pass phrase for private/cakey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [France]:
Locality Name (eg, city) []:Rouen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tinad
Organizational Unit Name (eg, section) []:Gnieark   
Common Name (e.g. server FQDN or YOUR name) []:tinad.fr
Email Address []:gnieark@free.fr

Publier le certificat de l’autorité de certification

cp /srv/ssl/cacert.pem /var/www/cacert.crt

(Lors de la copie, on change l’extension .pem en .crt, car .crt est un type mime connu dans la configuration standard d’apache)

Enregistrez le certificat dans le magasin de confiance de votre ordinateur local

Ouvrez tout simplement votre navigateur à l’URL http://VotreServeur/cacert.crt et cochez toutes les cases:

firefoxCacertTinad.png

Créer un certificat pour le serveur Web home.tinad.fr

changez "home.tinad.fr" par le FDQN de votre serveur pour la suite des tests.

cd /srv/ssl
#Création de la clé privée pour home.tinad.fr
openssl genrsa -des3 -out home.tinad.fr.key.pem 4096
#demande de certificat:
openssl req -config openssl.cnf -new -key home.tinad.fr.key.pem -out home.tinad.fr.csr.pem

Voici mon retour écran:

root@raspberrypi:/srv/ssl# openssl req -config openssl.cnf -new -key home.tinad.fr.key.pem -out home.tinad.fr.csr.pem
Enter pass phrase for home.tinad.fr.key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [France]:
Locality Name (eg, city) []:Rouen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tinad
Organizational Unit Name (eg, section) []:home
Common Name (e.g. server FQDN or YOUR name) []:home.tinad.fr
Email Address []:gnieark@free.fr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Signature de la demande:

openssl ca -config openssl.cnf -policy policy_anything -out home.tinad.fr.cert.pem -infiles home.tinad.fr.csr.pem

La valeur la plus importante est le common name. Elle corrspond au FDQN pour les autres champs, essayez simplement d’etre logique avec l’autorité de certification Voici mon retour écran:

root@raspberrypi:/srv/ssl# openssl ca -config openssl.cnf -policy policy_anything -out home.tinad.fr.cert.pem -infiles home.tinad.fr.csr.pem 
Using configuration from openssl.cnf
Enter pass phrase for /srv/ssl/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: May  3 19:25:04 2013 GMT
            Not After : May  3 19:25:04 2014 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = France
            localityName              = Rouen
            organizationName          = tinad
            organizationalUnitName    = home
            commonName                = home.tinad.fr
            emailAddress              = gnieark@free.fr
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                81:4B:C7:3E:9B:C6:EA:60:78:26:B3:8F:77:B4:43:07:07:DE:A8:02
            X509v3 Authority Key Identifier: 
                keyid:BE:1D:5D:B9:F1:53:D6:BD:11:90:8E:5C:0F:D2:BC:99:22:BE:F1:48

Certificate is to be certified until May  3 19:25:04 2014 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Voila, on a notre certificat signé: /srv/ssl/home.tinad.fr.cert.pem et sa clé privée: /srv/ssl/home.tinad.fr.key.pem (chiffrée par un mot de passe là)

On remarque au passage openssl a incrémenté la valeur dans le fichier /srv/ssl/serial .

Créer une clé non protégée par un mot de passe (ça servira à Apache)

cd /srv/ssl
openssl rsa -in home.tinad.fr.key.pem -out home.tinad.fr-EnClair.key.pem

Créer un certificat pour le serveur Web prive.tinad.fr

Idem qu’au châpitre précedent, du coup je ne détaille pas:

cd /srv/ssl
#Création de la clé privée pour prive.tinad.fr
openssl genrsa -des3 -out prive.tinad.fr.key.pem 4096
#demande de certificat:
openssl req -config openssl.cnf -new -key prive.tinad.fr.key.pem -out prive.tinad.fr.csr.pem
#signature de la demande:
openssl ca -config openssl.cnf -policy policy_anything -out prive.tinad.fr.cert.pem -infiles prive.tinad.fr.csr.pem
#créer une clé non protégée:
openssl rsa -in prive.tinad.fr.key.pem -out prive.tinad.fr-EnClair.key.pem

Configuration du serveur web

cd /var/www
#on va créer 5 dossier pour des vhosts:
mkdir home.tinad.fr
mkdir home.tinad.fr-https
mkdir prive.tinad.fr-https
#Il me semble que le VHOST par défault d'apache est le premier par ordre alphabétique;
#d'où le "0" au début du nom
mkdir 0-default
mkdir 0-default-https
#Supprimer les fichiers de vhosts créés à l’installation d'apache
cd /etc/apache2/sites-enabled
rm *

configuration des vhost

Comme vous le verrez, je reste sur une configuration méga basique des VHOST, préférant les valeurs par défaut d’apache aux paramètres non ou mal compris. De plus je n’utilise pas de script CGI, donc autant ne pas les activer.

vi /etc/apache2/sites-available/home.tinad.fr

<VirtualHost *:80>                                                                                                                                                               
ServerName home.tinad.fr                                                                                                                                               
DocumentRoot /var/www/home.tinad.fr                                                                                                                                    
</VirtualHost>

vi /etc/apache2/sites-available/home.tinad.fr-https

Ce VHOST est chiffré en HTTPS, cependant, aucune restriction d’accès n’est effectuée. Pour le test, j’ai mis le certificat de notre propre autorité de certification. Mais en production, autant mettre un vrai certificat (comptez maxi 30€/an). Pour cette maquette, j’y publie le certificat de l’autorité de certification, j’explique comment l’insérer, et je mets un formulaire qui permettra aux utilisateurs de demander leurs propres certificats. (dans le projet final ce sera l’administrateur qui aura accès au formulaire pour générer les certificats)

<VirtualHost *:443>
        ServerName home.tinad.fr
        DocumentRoot /var/www/home.tinad.fr-https
        SSLEngine On                                                                                                                                                                                           
        SSLCertificateFile /srv/ssl/home.tinad.fr.cert.pem                                                                                                                                                     
        SSLCertificateKeyFile /srv/ssl/home.tinad.fr-EnClair.key.pem                                                                                                                                           
        SSLProtocol all -SSLv2                                                                                                                                                                                                                                                                                                                                                              
</Virtualhost>

vi /etc/apache2/sites-available/prive.tinad.fr-https

<VirtualHost *:443>
	ServerName prive.tinad.fr
	DocumentRoot /var/www/prive.tinad.fr-https
	SSLEngine On
	SSLCertificateFile /srv/ssl/prive.tinad.fr.cert.pem 
	SSLCertificateKeyFile /srv/ssl/prive.tinad.fr-EnClair.key.pem
	SSLProtocol all -SSLv2
	SSLCACertificateFile /srv/ssl/cacert.pem
        SSLCARevocationFile  /srv/ssl/crl.pem
	SSLVerifyClient require
	SSLVerifyDepth 1
	SSLOptions +StdEnvVars
</Virtualhost>

Ce VHOST étant le plus intéressant, expliquons les directives

  • SSLEngine On : active le SSL
  • SSLCertificateFile le fichier contenant le certificat TLS pour prive.tinad.fr
  • SSLCertificateKeyFile le fichier contenant la clé qui servira à chiffrer les connexions (à garder bien cachée ;) )
  • SSLProtocol all -SSLv2 On accepte tous les protocoles ssl supportés sauf le SSLV2 qui présente une faiblesse)
  • SSLCACertificateFile Le fichier certificat de l’autorité qui signe les certificats clients (apache vérifie les signatures)
  • SSLCARevocationFile Le fichier qui contient la liste des certificats révoqués (nécessaire si on veut gérer les utilisateurs)
  • SSLVerifyClient require Seuls les clients ayant un certificat valide sont admis
  • SSLVerifyDepth 1 On limite à une autorité de certification intermédiaire
  • SSLOptions +StdEnvVars Cette directive permet d’ajouter les informations concernant le certificat client aux variables d’environnement. On pourra ainsi adapter le code PHP en fonction du certificat de l’utilisateur.

Activation des vhost:

a2ensite home.tinad.fr
a2ensite home.tinad.fr-https
a2ensite prive.tinad.fr-https
/etc/init.d/apache2 reload

Créer un couple certificat-clé client (fichier PKCS#12):

cd /srv/ssl
mkdir home.tinad.fr-Clefs-clients
cd home.tinad.fr-Clefs-clients

creer clé

openssl genrsa -des3 -out gnieark.home.tinad.fr.key.pem

Créer le certificat:

openssl req -config ../openssl.cnf -new -key gnieark.home.tinad.fr.key.pem -out gnieark.home.tinad.fr.csr.pem

Retour écran de la dernière commande:

Enter pass phrase for gnieark.home.tinad.fr.key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [France]:
Locality Name (eg, city) []:Rouen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tinad
Organizational Unit Name (eg, section) []:home
Common Name (e.g. server FQDN or YOUR name) []:gnieark
Email Address []:gnieark@free.fr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Signer le certificat:

openssl ca -config ../openssl.cnf -policy policy_anything -out gnieark.home.tinad.fr.cert.pem -infiles gnieark.home.tinad.fr.csr.pem

Retour écran de la commande:

root@raspberrypi:/srv/ssl/home.tinad.fr-Clefs-clients# openssl ca -config ../openssl.cnf -policy policy_anything -out gnieark.home.tinad.fr.cert.pem -infiles gnieark.home.tinad.fr.csr.pem 
Using configuration from ../openssl.cnf
Enter pass phrase for /srv/ssl/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: May 12 17:18:18 2013 GMT
            Not After : May 12 17:18:18 2014 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = France
            localityName              = Rouen
            organizationName          = tinad
            organizationalUnitName    = home
            commonName                = gnieark
            emailAddress              = gnieark@free.fr
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                47:E4:92:85:3A:43:6A:BC:43:C7:5B:41:F4:67:66:E2:36:CA:D7:69
            X509v3 Authority Key Identifier: 
                keyid:BE:1D:5D:B9:F1:53:D6:BD:11:90:8E:5C:0F:D2:BC:99:22:BE:F1:48

Certificate is to be certified until May 12 17:18:18 2014 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Concatener et convertir au forlat PKCS#12 (.p12)

openssl pkcs12 -export -inkey gnieark.home.tinad.fr.key.pem -in gnieark.home.tinad.fr.cert.pem -out gnieark.home.tinad.fr.cert.p12 -name "Gnieark"

Ça y est, j’ai une clé à) fournir à l’utilisateur Gnieark, il pourra l’intégrer à Firefox ou Internet Explorer (lol) et ainsi accéder au site que j’ai protégé précédent.

Révoquer un certificat:

En imaginant que je révoque un Zigazou

cd /srv/ssl
openssl ca -config openssl.cnf -revoke prive.tinad.fr/zigazou.prive.tinad.fr.cert.pem
#générer la liste de révocation:
openssl ca -config openssl.cnf -gencrl -out crl.pem
#la visualiser:
openssl crl -in crl.pem -text

Note

[1] Pour déclarer nos impôts il n’y a plus besoin de certificat personnel, mais les interlocuteurs (fonctionnaires de collectivités) ont leurs propres clés PKCS pour communiquer avec cette administration


16692670676_ee280997b3_o.jpg Mon imprimante photographiée par Frédéric BISSON licence CC certains droits réservés

Ça n’engage que moi, mais voici après quelques mois d’impression, dépannages, dessins... Voici mes conseils sur les choix d’une imprimante 3D:

Imprimante 3D plug and play, kit à monter, ou importer toutes les pièces de Chine et se dépatouiller

L’imprimante 3D toute faite est plus chère et aura les mêmes soucis qu’une imprimante open-source (Reprap):

  • Extrudeur qui peut se boucher
  • Courroies qui s’usent ou se détendent
  • Fins de course qui se décalent
  • Plateau pas tout à fait horizontal
  • Extrudeur qui a un peu de jeu
  • etc...

Monter soi même un kit permet, avant la première impression, d’avoir une bonne compréhension de l’imprimante et ses mécanismes. La maintenance et les dépannages seront facilités.

Du coup, je suppose que vous suivez ce conseil et dans le reste de ce billet de blog, j’écarte les imprimantes 3D de grande surface.

Cartésienne ou delta?

Kézako?

Mon imprimante cartésienne, une Prusa i3[1], que voici en photo:

16717523982_a1a5dc6511_o.jpg Mon imprimante photographiée par Frédéric BISSON licence CC certains droits réservés

... a des moteurs qui font déplacer relativement[2]mais directement la tête sur les trois axes XYZ.

Cependant pour une imprimante Delta:

mini-rostock.gif Le gif a été honteusement piqué par l’auteur du blog du grouik au site hkforemost.com

il y a des cosinus et des sinus à utiliser dans la relation entre le moteur qui déplace la courroie de X millimètres et le déplacement de la tête d’impression dans un repère cartésien XYZ, .

Comparatif

Avantages de la Delta

  • Le bruit: les moteurs pas à pas chantent un peu, et c’est tout, Pas de plateau bruyant qui fait de grands mouvements.
  • L’esthétique
  • la vitesse de déplacement. On ne peut pas configurer une imprimante classique de manière à ce que l’accélération soit au max de ce que peuvent fournir les moteurs NEMA 17. Lors d’une accélération (ou d’une décélération) trop grande sur l’axe Y. Le poids du plateau (qui bouge) fait que la courroie sautera malgré une bonne tension. Sur la delta, le poids entrainé par les courroies est moins important.
  • En général, 4 moteurs seulement contre 5 sur la plupart des imprimantes cartésiennes.

Avantages d’une imprimante cartésienne

  • Plus simple à étalonner[3] et configuration du Firmware plus aisée
  • Plus simple à améliorer: Elle tolère une masse plus importante sur la tête, donc si vous voulez ajouter des ventilateurs, des capteurs, des lumières, un double extrudeur.... sans soucis.
  • Pas besoin de Bowden (je reviens sur ce point quelques paragraphes plus loin.)

Extrudeur plastique ou métallique?

Type j-Head: 525px-Jhn_mk5.jpg

Type hexagon:

190px-Hexagon-hotend.jpg Les deux photographies proviennent du site reprap.org licence GNU GPL

J’ai testé les deux types. Retour à la J-Head depuis deux jours.

Une tête métallique a l’avantage de supporter des températures élevées tandis qu’une tête en polyétheréthercétone commence à perdre ses capacités vers 247 degrés Celsius (Ça empêche d’extruder certains ABS).

Il est cependant super rare de bloquer son filament dans une J-HEAD, tandis que c’est assez fréquent avec une hexagon. L’extrudeur métallique, dès que sa zone froide chauffe un peu.... paf bouchée.

Ma manipulation pour déboucher la J-HEAD est:

  • Démonter la tête de l’imprimante,
  • La mettre au four à 220 degrés si c’est du PLA qui bloque,
  • La sortir du four avec une pince (c’est chaud),
  • Déboucher avec une tige de 3mm de diamètre.
  • Tout remonter

Autant dire que c’est un peu pénible. Avant de réinstaller un extrudeur entièrement métallique, je m’imprimerai un super système de refroidissement.

A moins de vouloir expérimenter l’impression de plastiques bizarres, la J-HEAD c’est mieux, il faut juste veiller à ce que son bec soit bien serré.

Plateau chauffant ou non?

L’impression sur du verre avec plateau chauffant permet de maintenir la première couche à... disons 50° pour du PLA, afin qu’il adhère le temps de l’impression.

Indispensable sur une imprimante qui fait bouger le plateau sur un des axes X ou Y. Sur les autres imprimantes (plateau qui ne bouge que sur l’axe vertical Z, ou qui ne bouge pas du tout) ce n’est pas indispensable mais c’est très pratique. Le fait de ne pas chauffer le plateau nécessite plus de préparation de ce dernier (nettoyage etc...) et augmente le risque de la pièce qui se rétracte pendant l’impression et se soulève un peu.

Bowden or not?

le tube Bowden qui sera utilisé par la reprapJeanne

C’est un risque supplémentaire que le filament soit bloqué quelque part. Sauf sur une DELTA, je pense qu’il faut éviter.

RAMPS / autre carte?

Je n’ai testé que la RAMPS, je ne peux pas comparer. Cette dernière ne protège pas assez l’arduino, j’en ai abîmé deux en réglant l’intensité des pololus.

Alimentation ATX?

Oui, une avec un interrupteur ! C’est costaud, plus sécurisant que certains convertisseurs 12V importés de chine. Et vous avez la possibilité de chercher comment allumer l’alimentation via le RPY/octoplus qui gère vos impressions, ou via l’arduino ;)

Conclusion

J’ai pesé à chaque fois le pour et le contre, je n’ai pas d’opinion tranchée.

Enfin si... En appartement sans pièce réservée à vos bidouillages: une Delta (peu de bruit) et n’imprimez que du PLA (peu d’odeur).

Envie de pouvoir faire évoluer / customiser à mort votre imprimante: Cartésienne

Notes

[1] Et vous comprendrez en lisant ce billet que je ne vous conseille pas particulièrement ce modèle

[2] Pour l’axe Y, c’est le plateau qui bouge

[3] Dans le cas d’un kit fourni par emotion-tech, ils fournissent un tool de configuration automatique


top-axe.png Au hackerspace, avec @TranKILLoman, nous nous sommes lancés dans la construction d’une Reprap grande taille: Type Rostock 2 m de hauteur pour 1m40 utiles.

On en est à l’étape "mécanique", C’est à dire les dessins des pièces plastiques pour s’adapter aux barres en profil "T carré 20X20" qu’on a choisi comme structure et comme guides pour les axes.

Il y a encore beaucoup d’étapes.

Le git du projet: https://github.com/gnieark/reprapJeanne

Son wiki: https://mail.jeannedhack.org/wicked/display.php?page=reprap_geante

Allez, je retourne m’ammuser avec OpenSCAD.

Capture_du_2015-01-31_14_57_53.png


IMG_20141025_160135.jpg

L’IDE arduino est juste médiocre, et Eclipse sur un laptop me gonfle passablement. Je veux juste coder (avec le langage arduino) dans mon editeur de code préféré (KATE).

Je vous explique dans ce billet comment vous passer simplement d’eclipse ou de l’IDE arduino pour compiler et charger votre programme arduino.

Je suis sous debian (mais ça s’adapte à toutes les distros linux)

Cependant comme sous debian, dans le gestionnaire de paquet, ils ont généralement un retard sur les dernières versions (ce qui peut etre génant pour avoir la prise en charge des cartes arduino récentes) on va préférer télécharger que la méthode "apt-get"

Télécharger l’IDE arduino

Je sais, le but est de ne pas l’utiliser, Il contient des ressources nécessaires: la liste des cartes, les outils de compilations etc...

Téléchargez la par là: Arduino Downloads. Ne prenez pas la béta (le Makefile ne fonctionne pas avec et ne prenez pas les sources, mais la version qui correspond à votre distribution) Au moment où j’écris ce billet, c’est la 1.0.6

Sur mon PC, je décompresse tout dans /home/gnieark/arduino-1.0.6

Se faire un dossier de projets

C’est éventuellement le moment de faire du propre dans vos morceaux de code.

Je me fais un dossier qui contiendra tous les dossier projets (et le fichier arduino.mk, j’y viendrai plus loin)

  1. cd ~
  2. mkdir sketchbooks
  3. cd sketchbooks
  4. mkdir projetTest

Mon nouveau projet s’appelle projetTest vous l’avez compris. Dans son dossier je place mon code (projetTest.ino)[1] qui contient:

  1. void setup() {
  2. Serial.begin(19200);
  3. }
  4. void loop() {
  5. Serial.println("It works");
  6. delay(2000);
  7. }

Installer et paramétrer le Makefile magique

histoire d’avoir les dépendances sous debian vous pouvez installer le paquet arduino-mk

On télécharge le Makefile qu’a créé Tim Marson:

  1. cd /home/gnieark/sketchbooks
  2. wget http://ed.am/dev/make/arduino-mk/arduino.mk

N’hésitez pas à jeter un coup d’oeil dans ce fichier

Allons dans le dossier projetTest pour créer le Makefile

  1. cd projetTest
  2. vi Makefile

Le mien contient:

BOARD = uno
ARDUINODIR = /home/gnieark/arduino-1.0.6
SERIALDEV = /dev/ttyACM0
include ../arduino.mk

La commande "make boards" vous donnera la liste des cartes. les autres parametres je vous laisse deviner à quoi ils servent et comment les renseigner.

Utilisation

  1. #compiler (tous les fichiers .c, .cc et .cpp du repertoire et des sous repertoires seront pris en compte)
  2. make
  3. #envoyer sur la carte
  4. make upload

Un petit piège:

Si vous utilisez un serial dans votre code, et qu’il n’est pas à 19200 baups vous aurrez l’erreur suivante lors du chargement du code:

$ make upload

Uploading to board...
stty -F /dev/ttyACM0 hupcl
/usr/bin/avrdude  -DV -p atmega168 -P /dev/ttyACM0 -c arduino -b 19200 -U flash:w:projetTest.hex:i
avrdude: stk500_getsync(): not in sync: resp=0x1e

avrdude done.  Thank you.

Si vous avez absolument besoin de mettre le serial à une autre frequence que 19200 baups, vous devrez trouver comment corriger ce problème dans le fichier arduino.mk

L’interface serie

Pour ouvrir le serial sans passer par l’IDE arduino, installez screen puis:

  1. screen /dev/ttyACM0 19200

Conclusion

Ça c’est fait, l’IDE arduino et Eclipse (sur laptop) me rebutaient tellement qu’ils allaient me dégoûter de l’arduino.

Note

[1] Le fait de nommer le fichier principal du projet de la même manière que son parent permet de garder la compatibilité avec l’IDE arduino (qu’on ne veutr plus utiliser, j’en conviens)


switch.jpg

Descriptif de la passerelle

Un serveur sous debian 7 qui sert de passerelle avec trois cartes réseaux.

  • eth0 vers le LAN
  • eth1 vers un modem Orange Buisness
  • eth2 vers une Box Bouygues Telecom

Les cartes sont configurées comme ceci dans le fichier /etc/network/interfaces

#s file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo eth0 eth1 eth2
iface lo inet loopback

# The primary network interface Carte vers le LAN
allow-hotplug eth0
iface eth0 inet static
        address 192.168.15.253
        netmask 255.255.255.0
        network 192.168.15.0
        broadcast 192.168.15.255
        dns-nameservers 127.0.0.1 192.168.15.254
        dns-search lan


#carte reseau vers le modem Orange
iface eth1 inet static
        address 192.168.10.252
        netmask 255.255.255.0
        broadcast 192.168.10.255
        network 192.168.10.0
        gateway 192.168.10.1

#carte reseau vers le modem Bouygues (IP bytel box 192.168.1.254)
iface eth2 inet static
        address 192.168.1.10
        netmask 255.255.255.0
        broadcast 192.168.1.255
        network 192.168.1.0
             

A ce niveau là, toutes les connexions vers l’extérieur passent par le lien Orange, mais on peut pinguer la box Bouygues.

La commande route -n retourne:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.1    0.0.0.0         UG    0      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.15.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

Dans ce tuto je suppose que vous avez su configurer vos trois cartes réseau à peu près de cette manière.

Objectif

Dans ce billet, je ne vais pas décrire comment faire un vrai load balancing à base d’IPtable. Tout simplement parce que les deux points d’accès internet n’ont pas les même particularités. Le lien Orange Buisness a une IP fixe et un reverse DNS paramétré. Le smtp par exemple, doit absolument sortir par ce lien. Tandis que la box Bouygues est techniquement la même chose que ce qu’ils offrent aux particuliers (TV en moins).

On va router de cette manière:

  • Par défaut: ça passe par le lien Orange
  • Le HTTPS et le HTTP (le surf du personnel et des quelques patients à qui je fournis un point internet) passent par le lien Bouygues.

Ça me permet d’alléger le lien Orange, et aussi d’anonymiser un peu le surf des utilisateurs de l’Hôpital qui m’emploie. Jusqu’à avant hier, lorsqu’un patient allait sur internet, le webmaster du site pouvait voir avec le Reverse DNS et le WHOIS que la connexion provenait d’un centre Hospitalier (à vocation gériatrique vu l’intitulé qu’a mis Orange dans le Whois).

C’est parti pour le paramétrage

Créer une deuxième table de routage

Vu que dans le fichier /etc/network/interfaces la gateway est renseignée pour le lien Orange, la table de routage par défaut est automatiquement créée. On ne va donc pas se occuper d’Orange, mais seulement du lien bouygues dans la suite.

On ajoute "2 bouygues" à la fin du fichier /etc/iproute2/rt_tables comme ceci:

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
2       bouygues

IPTABLES: Quand et comment le serveur doit appliquer cette table de routage.

Toute la suite, je la fais dans mon script qui me sert de pare feu, et qui est lancé au démarrage du serveur. Seule la fin du script sert au forwarding. L’idée est que vous puissiez adapter votre propre script de parefeu de votre passerelle.



Les explications sont en commentaire.

  1. #! /bin/sh
  2. ### BEGIN INIT INFO
  3. # Provides: firewall
  4. # Required-Start:
  5. # Required-Stop:
  6. # Default-Start: 2 3 4 5
  7. # Default-Stop: 0 1 6
  8. # Short-Description: firewall
  9. # Description:
  10. ### END INIT INFO
  11.  
  12. # Interface qui est sur Internet (WAN) Lien Orange IP fixe
  13. WAN_IFACE="eth1"
  14. #Inerface Bouygues (IP publique non fixe)
  15. WAN_IFACE_BYTEL="eth2"
  16. # Interface qui est dans votre réseau local (LAN)
  17. LAN_IFACE="eth0"
  18.  
  19. ###### Debut Initialisation ######
  20.  
  21. # Réinitialisation
  22.  
  23. iptables -P INPUT ACCEPT
  24. iptables -P FORWARD ACCEPT
  25. iptables -P OUTPUT ACCEPT
  26. iptables -t nat -P PREROUTING ACCEPT
  27. iptables -t nat -P POSTROUTING ACCEPT
  28. iptables -t nat -P OUTPUT ACCEPT
  29. iptables -t mangle -P PREROUTING ACCEPT
  30. iptables -t mangle -P OUTPUT ACCEPT
  31.  
  32. # Les tables sont effacées.
  33. iptables -F
  34. iptables -t nat -F
  35. iptables -t mangle -F
  36. iptables -X
  37. iptables -t nat -X
  38. iptables -t mangle -X
  39.  
  40. # bloquer le trafic (comportement par défaut).
  41. iptables -P INPUT DROP
  42. iptables -P OUTPUT DROP
  43. iptables -P FORWARD ACCEPT
  44.  
  45. ########### Regles pour que le serveur fonctionne (SSH, HTTP, HTTPS) ##########
  46. #Cette partie est mise à titre d'exemple mais ce n'est pas l'objet de ce billet,
  47. #Pour les règles concernant le FORWARDING et la répartition entre les deux tables
  48. #de routage, allez directement à la fin du script
  49.  
  50. # Autoriser loopback
  51. iptables -t filter -A INPUT -i lo -j ACCEPT
  52. iptables -t filter -A OUTPUT -o lo -j ACCEPT
  53.  
  54. #on accepte le ping
  55. iptables -A INPUT -p icmp -j ACCEPT
  56. iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
  57.  
  58. #NTP (synchronisation de l'heure du serveur)
  59. iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
  60. iptables -A INPUT -p udp --sport 123 -j ACCEPT
  61.  
  62. #DNS (le serveur DNS est configuré pour ne pas répondre à une requete
  63. # Ne provenant pas du LAN)
  64. iptables -t filter -A INPUT -p tcp --destination-port 53 -j ACCEPT
  65. iptables -t filter -A INPUT -p udp --destination-port 53 -j ACCEPT
  66. iptables -t filter -A OUTPUT -p tcp --destination-port 53 -j ACCEPT
  67. iptables -t filter -A OUTPUT -p udp --destination-port 53 -j ACCEPT
  68.  
  69. #SSH (accessible depuis l'extérieur avec une clé uniquement)
  70. iptables -t filter -A INPUT -p tcp --destination-port 22 -j ACCEPT
  71.  
  72.  
  73.  
  74. # HTTP HTTPS
  75. #Commentez ces lignes si votre serveur ne sert pas de serveur WEB
  76. iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT
  77. iptables -A INPUT -p tcp --destination-port 443 -j ACCEPT
  78.  
  79. #Pour que le serveur puisse faire des requetes http et https
  80. iptables -A OUTPUT -p tcp --destination-port 80 -j ACCEPT
  81. iptables -A OUTPUT -p tcp --destination-port 443 -j ACCEPT
  82.  
  83. # Dans mon cas, c'est un serveur de Mail
  84. iptables -t filter -A INPUT -p tcp --destination-port 25 -j ACCEPT
  85. iptables -t filter -A INPUT -p tcp --destination-port 110 -j ACCEPT
  86. iptables -t filter -A INPUT -p tcp --destination-port 143 -j ACCEPT
  87. iptables -t filter -A INPUT -p tcp --destination-port 993 -j ACCEPT
  88. iptables -t filter -A INPUT -p tcp --destination-port 587 -j ACCEPT
  89. iptables -t filter -A OUTPUT -p tcp --destination-port 993 -j ACCEPT
  90. iptables -t filter -A OUTPUT -p tcp --destination-port 25 -j ACCEPT
  91. iptables -t filter -A OUTPUT -p tcp --destination-port 110 -j ACCEPT
  92. iptables -t filter -A OUTPUT -p tcp --destination-port 143 -j ACCEPT
  93. iptables -t filter -A OUTPUT -p tcp --destination-port 587 -j ACCEPT
  94.  
  95. ##Depuis Le LAN uniquement:
  96. #c'est un serveur DHCP. Supprimez les lignes si non
  97. iptables -t filter -A INPUT -i $LAN_IFACE -p tcp --destination-port 67:68 -j ACCEPT
  98. iptables -t filter -A INPUT -i $LAN_IFACE -p udp --destination-port 67:68 -j ACCEPT
  99. iptables -t filter -A OUTPUT -o $LAN_IFACE -p tcp --destination-port 67:68 -j ACCEPT
  100. iptables -t filter -A OUTPUT -o $LAN_IFACE -p udp --destination-port 67:68 -j ACCEPT
  101.  
  102. #Proxy Squid
  103. iptables -t filter -A INPUT -i $LAN_IFACE -p tcp --destination-port 3128 -j ACCEPT
  104.  
  105. #Puppet
  106. iptables -t filter -A INPUT -i $LAN_IFACE -p tcp --destination-port 8140 -j ACCEPT
  107. iptables -t filter -A OUTPUT -i $LAN_IFACE -p tcp --destination-port 8140 -j ACCEPT
  108.  
  109. # FTP
  110. #Le FTP est autorisé depuis le lan untiqument
  111. modprobe ip_conntrack_ftp
  112. iptables -A INPUT -p tcp --dport ftp -j ACCEPT
  113. iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT
  114. iptables -A INPUT -p ALL -i $LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
  115. iptables -A OUTPUT -o $LAN_IFACE -p tcp --sport ftp -j ACCEPT
  116. iptables -A OUTPUT -o $LAN_IFACE -p tcp --sport ftp-data -j ACCEPT
  117. iptables -A INPUT -i $LAN_IFACE -m state --state NEW -p tcp --dport 49152:65534 -j ACCEPT
  118.  
  119. #serveur de cache de mise à jour pour les postes linux
  120. iptables -A INPUT -i $LAN_IFACE -p tcp --dport 3142 -j ACCEPT
  121. iptables -A OUTPUT -i $LAN_IFACE -p tcp --dport 3142 -j ACCEPT
  122.  
  123.  
  124. ################## FORWARDING ET ROUTAGE ######################################
  125. #C'est là que commence l'objet du billet sur le blog du Grouik
  126. #Pour débian
  127. echo 0 > /proc/sys/net/ipv4/tcp_ecn
  128. #activer le forwarding
  129. echo 1 > /proc/sys/net/ipv4/ip_forward
  130.  
  131. #Forcer le passage dans le proxy: (à supprimer si vous nb'utilisez pas squid)
  132. iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
  133. #iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3128
  134.  
  135. #Empécher le transit de paquets SMTP.
  136. #Je les envoie au serveur de mail (qui les rejettera mais loguera)
  137. #supprimez si votre passerelle ne fait pas de mail
  138. iptables -t nat -A PREROUTING -i $LAN_IFACE -p tcp --dport 25 -j REDIRECT --to-port 25
  139.  
  140. #!!!!!!!!!!!!!!!!!!!!!!!!!!!
  141. #Marquer les paquets http et https qu'on fera passer par la connexion bouygues
  142. #Le reste passe par la connexion par défaut (orange IP fixe)
  143.  
  144. #Marquage des paquets en Forward
  145. iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 2
  146. iptables -A PREROUTING -t mangle -p tcp --dport 443 -j MARK --set-mark 2
  147.  
  148. #Optionnel, mais utile si vous utilisez squid; Marquer les paquets HTTP
  149. #et HTTPS générés par le serveur lui même
  150. iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2
  151. iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 2
  152.  
  153. ######### TABLE DE ROUTAGE ##########
  154. #delete, puis place la table de routage boutygues
  155. ip rule delete table bouygues
  156. #Lui indiquer la passerelle (l'IP de la box)
  157. ip route add default via 192.168.1.254 dev $WAN_IFACE_BYTEL table bouygues
  158. #Les paquets marqués 2 doivent passer par la table bouygues:
  159. ip rule add fwmark 2 table bouygues
  160.  
  161. #Autoriser le forwading dans les deux sens
  162. #Bouygues
  163. iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
  164. #Orange
  165. iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
  166.  
  167. iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
  168.  
  169. iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
  170. iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
  171.  
  172. exit 0

Envoyer


J’ai mis en ligne il y a une dizaine de jours le changement du design (plus correction de quelques bugs en arrière plan) de mon site de QCM. Il est maintenant "full responsive HTML5".

tinadQCMsmall.jpeg

Contrairement à la version précédente, je n’ai pas adapté le site au bandeau de pub, j’ai adapté après coup la pub au site (enfin du moins c’est ce que j’ai tenté de faire).Et c’est cool car adsense a sorti il y a quelques temps les blocs de pubs responsives. C’est en béta.

Comment ça se passe pour les pubs responsive:

Avec le code du bloc de pub responsive par défaut, le script va calculer la largeur de son conteneur, et installer une pub parmis les formats classiques: voir la liste par là. Ce n’est pas une publicité élastique.

Si comme moi, pour faire du responsive, vous choisissez d’exprimer vos largeurs en pourcentage, il y a peu de chance que le conteneur tombe pile poil sur la largeur de la pub.

Y’aura toujours des espaces sur les cotés et l’allignement est aléatoire...

...centré:

tinadQCMpub.jpeg

quelques F5 plus tard, alligné à gauche: tinadQCMpub2.jpeg

Dans l’interface google adsense, lorsque vous avez créé un bloc responsive, au moment de charger le code, vous avez deux possibilités:

  • Dimmensionnement intelligent(recommandé)

Le code à insérer est celui-ci

  1. <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
  2. <!-- responsive -->
  3. <ins class="adsbygoogle"
  4. style="display:block"
  5. data-ad-client="ca-pub-XXXXXXXXXX"
  6. data-ad-slot="XXXXXXX"
  7. data-ad-format="auto"></ins>
  8. <script>
  9. (adsbygoogle = window.adsbygoogle || []).push({});
  10. </script>
  • Avancé (modification de code requise)

Le code à adapter et insérer ainsi:

  1. <style>
  2. .responsive { width: 320px; height: 50px; }
  3. @media(min-width: 500px) { .responsive { width: 468px; height: 60px; } }
  4. @media(min-width: 800px) { .responsive { width: 728px; height: 90px; } }
  5. </style>
  6. <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
  7. <!-- responsive -->
  8. <ins class="adsbygoogle responsive"
  9. style="display:inline-block"
  10. data-ad-client="ca-pub-XXXXXXXXXXXXXXXXXX"
  11. data-ad-slot="XXXXXXXXXXXX"></ins>
  12. <script>
  13. (adsbygoogle = window.adsbygoogle || []).push({});
  14. </script>

Le style dans le code précédent peut être placé dans votre CSS (testé ça marche)

En bidouillant à mort, je n’ai pas réussi à forcer l’alignement de la pub à gauche (devinez pourquoi je voulais faire ça #sifflotte).

Voila mon retour sur l’intégration responsive des pubs adsense, c’est super, mais quelques petits défauts qu’il peut être bien de connaître avant de se lancer dans la création des PSD etc... pour le design d’un site.


url-esc.jpgSur un mutu OVH [1]avec ça dans le .htaccess:

SetEnv PHP_VER 5_TEST
SetEnv REGISTER_GLOBALS 0

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301]

l’adresse:

http://www.unSite.fr/index.php?post/Plan-d-accès

devient:

https://www.unSite.fr/index.php?post/Plan-d-acc%C3%A8s

Et paf, page 404

La solution est simple, il suffit d’ajouter le flag NE (no escape) dans la rewriteRule. comme ceci:

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301]

Voila, les caractères accentués ne sont plus "percent-encoded" suite à leur passage dans la regex.

L’illustration a été empruntée sur le site de Joe Dog Software

Note

[1] Je viens de découvrir qu’OVH propose la mise en place d’un certificat SSL sur ses mutualisés (cher quand même: 59,99 € TTC pour un certificat basique). J’ai donc passé un dotclear en https (pas ce blog, lui est sur un dédié chez online).


- page 1 de 24

#enBref:

Xml rpc test

Hello petit blog,

Depuis le mois de juillet, je passe plus de trois heures par jour dans les transports en commun. J’ai adapté mon PC portable pour avoir tous ce qui me permet de développer mes petits projets (BotsArena principalement actuellement) en local uniquement. Car maintenir une connexion 3G correcte entre Saint Lazare et ma Normandie est actuellement impossible.

Maintenant, c est ton tour petit blog, je réactive la fonctionnalité xml /rpc pour publier des brèves via un client hors ligne et teste les clients Android.

Ce test est effectué avec l’application "blog editor" car AndroDot 2 plantait lamentablement.

Edit: test de modification d un article, avec envoie d’une image.


  ... C est un fail, il ne met pas le /public/ dans l’URL. Et je ne trouve pas où configurer ça. C est peut être du côté Dotcleår. Ça peut se corriger manuellement dans l’appli en modifiant le texte en mode HTML.


Pokémon: Ton anus est petit pour son type tu ne trouves pas?

Pokemon Go a fait deux modifications récentes, il est possible :

  • de personnaliser le nom d’un pokémon,
  • d’obtenir une évaluation d’un Pokémon.

Mélangeons les deux possibilités, ça donne:

Screenshot_2016-09-03-23-19-50.jpg

Screenshot_2016-09-03-23-22-59.jpg

Screenshot_2016-09-03-23-23-19.jpg

Screenshot_2016-09-03-23-32-43.jpg

On peut même s’amuser avec des noms d’hommes politiques:

Et bien! c’est le plus petit des ex présidents que j’ai jamais vu!

Mais, je ne m’amuserai pas à ça sur ce blog.


Let's Encrypt

letsencrypt-logo-horizontal.svg

Juste un petit mot pour dire que comme beaucoup, j’ai testé Lets’Encrypt. Je ne ferai probablement pas de tutoriel là dessus car la documentation se trouve partout, et que la flegme.

Plusieurs VHOSTS sur ce serveur ont des certificats lets’Encrypt. Je compte tester quelques renouvellements de certificats (La validité d’un certificat Let’s Encrypt est de 90 jours), avant de généraliser l’utilisation de ce service à tous mes VHOSTS.

Parce que:

C’est gratuit (le prix de départ d’un certificat c’est 15€) et faut compter 200 euros pour une wildcard.

La wildcard n’est pas possible, mais il est possible de renseigner plusieurs noms DNS. Du coup j’image bien renseigner sur un certificat tous les vhosts de ma dédibox, et éventuellement trouver comment retirer la gestion du SNI [1] sur le serveur Web. Ça devrait faire gagner au moins 4 instructions processeur par chargement de page web ;) .

Ne plus me faire ch... avec des certificats qui expirent à des dates différentes. Trois commandes unix suffisent à renouveler tous les certificats d’un coup:

#Il faut stopper l'éventuel service qui écoute sur le port 80:
service apache stop
./letsencrypt
service apache start

Note

[1] J’adore sourcer vers un article Wikipedia dont je suis l’auteur.


Timelapse fail.... coucher de soleil

IMG_20151001_222114.jpg

Suite à mes bidouillages pour pouvoir superviser la reprap à distance, J’ai jeté la webcam qui datait du début de l’époque MSN, pour une cam spéciale Raspberry pi.

On a franchi cette étape: mon imprimante est assez mature pour que je la laisse plusieurs heures sans surveillance directe. Snif, quelle émotion. Aujourd’hui, j’ai lancé une impression (de 7 heures) et suis parti. Je regardais quand même sur mon smartphone, toutes les 1 heures ou deux les images de la cam. Ce qui m’aurait permis de stopper la machine en cas de bouillie de plastique (ou d’incendie -_-).

Le fail, c’est qu’à partir de 20 heures, n’ayant pas laissé de lumière allumée, la cam ne me montrait que du noir. (l’impression est réussie quand même)

Le timelapse est par là (la flegme d’intégrer la vidéo dans ce billet)

Bref, objectif: ajouter une lumière (12 ou 5 V à la reprap) et pouvoir l’allumer et l’éteindre depuis octoprint. Quelques pistes:

Si je prends le temps de le faire dans les semaines qui viennent, je publierai évidemment ma solution sur ce blog.


MAJ

Je viens de faire une petite mise à jour du tuto sur horde 5. Une histoire de ’realm’ qui a été modifiée sur la configuration d’IMP


Passage en debian 8 Jessie

Debian_8_.pngC’est fait, direct sur la prod #evilmode.

Les quelques points sur lesquels j’ai lutté après la mise à jour:

GNUTLS

qui a déconné, du coup j’ai reconfiguré mes quelques vhosts en https avec modSSL

Apache

J’ai remis les apache.conf et php.ini recommandés. du coup, j’ai du modifier plus de 10 000 de code PHP à grand coups de sed. genre:

find /var/www/vhost -exec sed -i "s/mysql_set_charset(/mysqli_set_charset(\$GLOBALS["linkMysql"],/g" {} \;

afin de ne plus me prendre les WARN "deprecated"

su

La commande "su user" ne fonctionne plus pour les users qui n’ont pas de shell du coup il faut le préciser le paramètre:

su -s /bin/bash www-data

(je m’en sers pour gérerer des crontab avec les droits de www-data ou un autre compte)

rsyncd

Mon serveur est boudé par le serveur de sauvegarde. je suis encore en train de regarder pourquoi.

systemctl

Pas de problème, juste qu’il prend une place plus importante sous debian 8. Il faut s’habituer à l’utiliser.


Oups

f9b26427bda2d1e6a8c82ebf25bbb1d0.jpg

Je viens de m’apercevoir que j’avais oublié de retirer le mappage des ports 80 et 22 vers mon raspberry Pi. Sauf que dernièrement (depuis 2 semaines quand même), j’avais remis le pi au cul de ma freebox pour octopi:

  • En lui laissant le mot de passe par défaut pi/raspberry
  • En branchant la webcam (consultable en http sans s’authentifier dans octopi). Sauf que le câble de la cam étant trop court, elle ne filme pas la reprap, mais mon salon.

Je pense m’en être aperçu avant d’avoir mérité le "Numéric Darwin Awards"

PS: Octoprint a ce robots.txt de base:

User-agent: *
Disallow: /

Pas de possibilité d’utiliser un Google dork pour faire joujou avec plein de reprap dans le monde :p

Photo by mofetos/Flickr (CC BY 2.0)


Propulsé par Dotclear