My Little Web http://mylittleweb.eu Mon petit coin dans le web Thu, 25 Jun 2015 18:27:04 +0000 fr-FR hourly 1 http://wordpress.org/?v=4.2.16 ansible-vault, clef privée ssh et déploiement http://mylittleweb.eu/2015/06/25/ansible-vault-clef-privee-ssh-deploiement/ http://mylittleweb.eu/2015/06/25/ansible-vault-clef-privee-ssh-deploiement/#comments Thu, 25 Jun 2015 18:22:33 +0000 http://mylittleweb.eu/?p=244 Je note ici ce qui vient de me coûter 2 heures, pour déployer une clef privée SSH.

L’objectif est de déployer les clefs SSH (privée et publique) par Ansible. La partie privée étant une donnée sensible, elle est stockée dans un fichier chiffré avec ansible-vault. Ce fichier contient donc dans une variable la clef privée:

user_id_rsa : |
 -----BEGIN RSA PRIVATE KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-128-CBC,C32...
 ...
 -----END RSA PRIVATE KEY-----

Première astuce: utiliser | pour avoir une variable sur plusieurs lignes et commencer les lignes par un espace pour signifier que les lignes appartiennent à la variable précédemment déclarée.

Dans le fichier de tache, il est maintenant nécessaire d’écrire le contenu de user_id_rsa dans un fichier .ssh/id_rsa. Pour cela il faut utiliser la directive copy

- name: Deploy ssh private key
  copy:
    content: "{{ user_id_rsa }}"
    dest: /home/user/.ssh/id_rsa
    mode: 0400
    owner: user
    group: user

L’option content permet d’écrire le contenu dans le fichier précisé par dest. La deuxième astuce c’est de bien utiliser le séparateur : (content: "{{ user_id_rsa }}") et non =. L’utilisation du séparateur = met des retours chariots supplémentaires en fin de ligne en plus de ceux contenus dans la variable.

]]>
http://mylittleweb.eu/2015/06/25/ansible-vault-clef-privee-ssh-deploiement/feed/ 0
Pfsense 2.2 Squid et Antivirus http://mylittleweb.eu/2015/01/30/pfsense-2-2-squid-et-antivirus/ http://mylittleweb.eu/2015/01/30/pfsense-2-2-squid-et-antivirus/#comments Fri, 30 Jan 2015 20:00:27 +0000 http://mylittleweb.eu/?p=236 Proxy server > Antivirus Advanced options > […]]]> L’installation de Squid 3 dans PfSense embarque maintenant l’antivirus ClamAV. Si vous aviez installé HAVP, supprimez le, il ne sert plus. Maintenant Squid communique avec CalmAV par l’intermédiaire de C-ICAP. L’installation du paquet Squid, installe tous ce qu’il faut.

Première étape modifier la configuration dans l’onglet:
Service > Proxy server > Antivirus
Advanced options > squidclamav.conf changer la directive redirect

Ensuite Advanced options > c-icap.conf ajouter à la fin
Service squid_clamav squidclamav.so

Et pour finir toujours dans cette configuration, supprimer la ligne
Manager:Apassword@ldap.chtsanti.net?o=chtsanti?mermberUid?(&(objectClass=posixGroup)(cn=%s))

Ensuite il faut se connecter en SSH sur la machine pour modifier la configuration dans le fichier /usr/local/pkg/squid.inc, en effet la communication se fait en IPv6 et ne fonctionne pas, il faut basculer en IPv4. Pour cela remplacer:

icap_service service_avi_req reqmod_precache icap://[:::1]:1344 /squidclamav bypass=off
adaptation_access service_avi_req allow all
icap_service service_avi_resp respmod_precache icap://[:::1]:1344/squidclamav bypass=on
adaptation_access service_avi_resp allow all

par

icap_service service_avi_req reqmod_precache icap://localhost:1344 /squidclamav bypass=off
adaptation_access service_avi_req allow all
icap_service service_avi_resp respmod_precache icap://localhost:1344/squidclamav bypass=on
adaptation_access service_avi_resp allow all

]]>
http://mylittleweb.eu/2015/01/30/pfsense-2-2-squid-et-antivirus/feed/ 1
Booter sur une clef USB avec grub http://mylittleweb.eu/2014/06/07/booter-sur-une-clef-usb-avec-grub/ http://mylittleweb.eu/2014/06/07/booter-sur-une-clef-usb-avec-grub/#comments Sat, 07 Jun 2014 08:28:43 +0000 http://mylittleweb.eu/?p=216 Il arrive que certaines cartes mères (assez vieilles) ne boot pas sur USB. Si vous avez grub d’installé sur le disque dur, voici comment faire pour booter sur de l’USB

Dans le menu de grub appuyer sur la lettre c pour avoir accès au menu. Attention pour les commandes suivantes le clavier est en qwerty. Saisissez root ( sur la ligne de commande. La parenthèse s’obtient avec [Shift] + [9]. Ensuite, appuyez sur la touche tabulation. Grub va vous afficher les disques qu’il détecte. Si vous avez un disque dur (hd0), le support USB devrait être en hd1. Il faut donc dire à grub de booter sur hd1 avec la commande suivante:

root(hd1, 0)

La virgule s’obtient sur la touche [;] d’un clavier azerty, et la parenthèse fermante sur la touche [Shift] + [0].

Ensuite saisir les commandes suivantes pour booter:

chainloader +1
boot

Et c’est parti.

]]>
http://mylittleweb.eu/2014/06/07/booter-sur-une-clef-usb-avec-grub/feed/ 0
Ssh, Authentification par clef, PAM et Yubikey sont sur une machine http://mylittleweb.eu/2014/05/09/ssh-authentification-clef-pam-yubikey-sont-sur-une-machine/ http://mylittleweb.eu/2014/05/09/ssh-authentification-clef-pam-yubikey-sont-sur-une-machine/#comments Fri, 09 May 2014 13:15:21 +0000 http://mylittleweb.eu/?p=207 C’est un peu la suite de l’article Linux et Yubikey, faire fonctionner ensemble authentification par clefs pour certains comptes, mot de passe et Yubikey pour d’autres.

Avant de faire quoi ce soit de cet article ouvrez deux terminaux sur la machine: un pour travailler et un autre au cas où vous vous enfermiez dehors. Je n’explique pas comment mettre en place l’authentification par clef, les Internets foisonnent d’articles sur le sujet.

L’idée c’est de n’autoriser que l’authentification par clef pour tous les comptes présents sur la machine sauf certains qui utilisent en plus du mot de passe une Yubikey (pour la mise en place voir Linux et Yubikey). L’aspect « compliqué » de la chose est qu’il faut jouer avec PAM.

Configuration SSH

Voici les directives qui doivent apparaître dans votre fichier /etc/ssh/sshd_config

...
PubkeyAuthentication yes
...
ChallengeResponseAuthentication yes
KbdInteractiveAuthentication no
...
PasswordAuthentication no
...
UsePAM yes

Première étape expliquer à SSH pour certains logins il faut autoriser l’utilisation de mot de passe et la saisie au clavier. A la fin de votre fichier de configuration /etc/ssh/sshd_config:

...
Match User yubikeyuser
  KbdInteractiveAuthentication yes
  PasswordAuthentication yes

Voila pour la configuration SSH

PAM

Dans le fichier /etc/pam/sshd il faut maintenant lister les utilisateurs qui peuvent s’authentifier par mot de passe. Tous les autres essuierons un refus d’authentification (par mot de passe).

Dans un premier temps il faut créer un fichier /etc/ssh.login.allowed qui contient la liste des utilisateurs qui peuvent s’authentifier par mot de passe. Il faut mettre un login par ligne.

Ensuite dans le fichier /etc/pam/sshd, au début:

auth required pam_listfile.so onerr=fail item=user sense=allow file=/etc/ssh.login.allowed
  • onerr=fail que faire en cas d’erreur: le fichier n’existe pas, …
  • item=user la vérification se fait au niveau utilisateur. Il est possible de le faire au niveau groupe.
  • sense=allow si le login est trouvé dans le fichier il est autorisé. Il est possible de mettre deny pour interdire l’accès
  • file=/etc/ssh.login.allowed fichier contenant les logins

Et voila, il faut redémarrer SSH et c’est bon (enfin normalement 😉 )

]]>
http://mylittleweb.eu/2014/05/09/ssh-authentification-clef-pam-yubikey-sont-sur-une-machine/feed/ 0
Debian Wheezy, live cd persistent avec unetbootin http://mylittleweb.eu/2014/04/06/debian-wheezy-live-cd-persistent/ http://mylittleweb.eu/2014/04/06/debian-wheezy-live-cd-persistent/#comments Sun, 06 Apr 2014 18:37:04 +0000 http://mylittleweb.eu/?p=188 Voici les étapes à suivre pour avoir une Debian persistente sur une clef usb à partir des images live cd.

Coté matériel, une simple clef usb d’au moins 8 Go devrait suffire , un PC sous linux.

En premier télécharger une image live CD de Debian

Ensuite il faut créer au moins deux partitions sur la clef la clef USB:

  1. La première va accueillir l’image du live CD Debian installée par UNetBootin – cette partition sera en vfat
  2. La deuxième pour accueillir les données mises à jour et le répertoire /home – cette partition sera en ext2

Voici les commandes en partant du principe que la clef usb est sur /dev/sdc

sudo fdisk /dev/sdc

Ensuite créer les deux partitions:

Command (m for help) : n
Select (default p): p
Partition number (1-4): 1
First cylinder (1-621, default 1): <Entrée>
Using default value 1
Last cylinder or +size or +sizeM or +sizeK or +sizeG (1-2048, default 2048): +2G

Faire la même opération pour la deuxième partition.
Ensuite fixer les bons types de systèmes de fichier (commande t de fdisk):
- vfat pour la première partition (type b)
- ext2 pour la deuxième

Ensuite il faut créer les systèmes de fichier. Attention le nom de la deuxième partition est très important:

mkfs.vfat /dev/sdc1 -n DEBIAN_LIVE
mkfs.ext2 /dev/sdc2 -L persistence

Débrancher, et rebrancher la clef usb. Monter les deux partitions si votre distribution ne le fait pas.

Ensuite sur la partition persistence créer le fichier persistence.conf à la racine et mettre dedans:

/ union,source=.

Lancer UNetBootin et installer l'image du live CD sur la partition /dev/sdc1. Une fois l'installation terminée ne pas redémarrer.

Sur la partition /dev/sdc1 (label DEBIAN_LIVE), éditer le fichier syslinux.cfg. Remplacer:

label unetbootindefault
menu label Default
kernel /ubnkern
append initrd=/ubninit boot=live config quiet splash

par

label unetbootindefault
menu label Default
kernel /live/vmlinuz
append initrd=/live/initrd.img boot=live config quiet splash persistence union=aufs

Taper:

sudo sync

Démonter la clef, booter dessus et voilà. Patientez, le premier boot est très long.

]]>
http://mylittleweb.eu/2014/04/06/debian-wheezy-live-cd-persistent/feed/ 0
screen – Cannot open your terminal ‘/dev/pts/0′ – please check. http://mylittleweb.eu/2014/01/06/screen-cannot-open-your-terminal-devpts0-please-check/ http://mylittleweb.eu/2014/01/06/screen-cannot-open-your-terminal-devpts0-please-check/#comments Mon, 06 Jan 2014 12:02:39 +0000 http://mylittleweb.eu/?p=184 Il arrive que suite à un su – user, en essayant de lancer un screen, il réponde avec l’erreur suivante:

Cannot open your terminal '/dev/pts/0' - please check.

Je vous déconseille de changer les droits sur les pseudos terminaux. Essayez plutôt la commande

script /dev/null

et ensuite la commande screen

Normalement script permet de stocker dans un fichier toutes les commandes que vous tapez, pour cela il lance un nouveau shell. Ici on ne veut rien stocker dans un fichier mais simplement lancer un screen. Une autre solution est de basculer sur tmux

]]>
http://mylittleweb.eu/2014/01/06/screen-cannot-open-your-terminal-devpts0-please-check/feed/ 0
Linux et Yubikey http://mylittleweb.eu/2013/12/07/linux-et-yubikey/ http://mylittleweb.eu/2013/12/07/linux-et-yubikey/#comments Sat, 07 Dec 2013 21:49:18 +0000 http://mylittleweb.eu/?p=161 Yubikey / Linux / SSH

La yubikey est une clef usb qui intègre une puce cryptographique. Elles est capable de:

  • stocker un mot de passe
  • générer des mots de passe à usage unique (OTP: One-time password)
  • générer des HMAC, pour s’authentifier par défi-réponse
Yubikey

Yubikey

En ce qui me concerne c’est la partie OTP avec SSH qui m’intéresse. Je veux mettre en place une authentification par mot de passe + Yubikey pour un compte, et que les autres comptes de la machine utilisent toujours mot de passe + clef ssh. Vous pouvez « personnaliser » le contenu / comportement de la yubikey avec yubikey-personalization et yubikey-personalization-gui présents dans quasiment toutes les distributions.

OTP c’est quoi?

Avec OTP  le mot de passe change à chaque génération en fonction de la clé privée présente sur le Yubikey et de la synchronisation temporelle entre client /serveur. Le mot de passe est composé d’une partie statique au début qui identifie la clef, et de la partie dynamique. Et utilisant le mode d’authentification classique (login + mot de passe) et OTP on met en place une authentification à deux facteurs (Two Factor Authentification). Le fait de saisir un login + un password + OTP rend quasiment impossible l’usurpation d’identité: il y a le savoir/secret avec le login /password et la possession d’un bien matériel pour s’authentifier.

Une authentification avec un OTP est insensible:

  • aux keyloggers ou à un œil indiscret
  • aux attaques par dictionnaire

Mise en place

La validation de l’OTP se fait à travers les serveurs de YubiCo, pensez à ouvrir votre firwall vers leurs serveurs.

Obtention d’une clef d’API

La première étape est d’obtenir une clef d’api pour votre machine. Pour cela rendez vous sur Yubico Get API Key, suivez les instructions pour obtenir une clef. Voici l’écran final:

YubiKey - Get API Key

YubiKey – Get API Key

Notez bien le « client ID » et la clef  sécrète.

Installation et configuration

Installation des logiciels

Deux paquets sont nécessaires pour pouvoir utiliser la Yubikey avec SSH (pour être exact avec PAM):

  • libpam-yubico: two-factor password and YubiKey OTP PAM module
  • libyubikey0: Yubikey OTP handling library runtime

Configuration PAM

Avant de commencer la configuration ouvrez un terminal sur la machine qui héberge le server SSH et gardez le ouvert. En effet si vous faites une erreur (ou si les infos que je vous donne sont moisies, vous les suivez à vos risques et périls), vous allez vous enfermer dehors.

Dans un autre terminal, on commence par créer un groupe d’utilisateur qui ne peut que s’authentifier qu’en utilisant login + mot de passe + Yubikey. Ensuite on ajoute à ce groupe l’utilisateur concerné.

sudo groupadd yubikey
sudo usermod -aG yubikey yubiuser

Ensuite il faut créer un fichier qui liste pour chaque compte utilisant la yubikey pour s’authentifier, l’identifiant de la clef. L’identifiant de la clef est les douze premiers caractères qui apparaissent quand vous pressez la clef pour générer un mot de passe. Pour les feignants:

  •  Yubico met à disposition cette interface Modehex Calculator (choisir OTP et pressez la Yubikey), l’identifiant apparaît dans le champ Modhex encoded
  • Cette ligne de shell vous donne l’information:
read -p "Enter a YubiKey OTP: " s && echo 'The key id is' ${s:0:12}

Donc une fois que vous avez l’identifiant on peut créer le fichier /etc/yubikeys avec le format suivant

compte_linux:identifiant_yubikey:indentifiant_yubikey
yubiuser:XXXXXXXXXXXX:123456789012

Ce fichier permet de faire le lien entre le compte Linux, et les Yubikey autorisées à s’authentifier.

PAM

Maintenant la configuration de PAM. Éditer le fichier /etc/pam/sshd, en dessous de la ligne @include common-auth ajouter:


# Yubikey
auth [success=1 default=ignore] pam_succeed_if.so quiet user notingroup yubikey
auth required pam_yubico.so authfile=/etc/yubikeys id=XXXXX key=ZZZZZZZZZZZZZZZZZZZZZZZZZZZ= debug url=http://api.yubico.com/wsapi/2.0/verify?id=%d&otp=%s
auth required pam_unix.so try_first_pass

Dans le champ id, il faut mettre votre « clientId » et dans key la clef sécrète.

Rappelez vous d’ouvrir votre firewall vers yubico.com si vous voulez que cela fonctionne. Donc là on explique à PAM que les utilisateurs appartenant au groupe yubikey doivent s’authentifier en utilisant le login + pass + Yubikey. Et uniquement ceux appartenant à ce groupe. La directive debug est optionnelle, elle permet de suivre ce qui se passe dans le fichier /var/run/pam-debug.log

J’espère que vous avez toujours votre shell d’ouvert, c’est votre bouée de secours en cas de problème !

C’est l’heure d’essayer, normalement en effectuant un ssh vers la machine cible, avec un utilisateur dans le groupe yubikey vous devriez avoir à saisir: login + mot de passe + Yubikey.

A vous les connexions SSH depuis les environnements « hostiles ».
 

]]>
http://mylittleweb.eu/2013/12/07/linux-et-yubikey/feed/ 1
Mysql et utf8 http://mylittleweb.eu/2013/11/16/mysql-et-utf8/ http://mylittleweb.eu/2013/11/16/mysql-et-utf8/#comments Sat, 16 Nov 2013 09:43:42 +0000 http://mylittleweb.eu/?p=152 Voici comment faire pour que toutes les connexions soient toujours en utf-8 sans devoir à chaque fois mettre SET NAMES 'utf8' dans le code.

Sur Debian ou Ubuntu sur le serveur qui héberge la base, rajouter un fichier utf8.cnf dans le répertoire /etc/mysql/conf.d avec le contenu suivant:


[mysqld]
init_connect='SET NAMES utf8'
character-set-server=utf8

Et voila!

]]>
http://mylittleweb.eu/2013/11/16/mysql-et-utf8/feed/ 0
Installer vyatta sur un soekris 4801 http://mylittleweb.eu/2013/10/05/installer-vyatta-sur-un-soekris-4801/ http://mylittleweb.eu/2013/10/05/installer-vyatta-sur-un-soekris-4801/#comments Sat, 05 Oct 2013 16:00:16 +0000 http://mylittleweb.eu/?p=121 Ce billet décrit comment j’ai procédé pour installer Vyatta sur un Soekris 4801 avec un carte d’extension 4 ports lan1741


[MAJ 05/10/2014] La société ayant racheté Vyatta, ne met plus à disposition le code. Je vous conseille de prendre le fork Vyos

 Matériel nécessaire

Le matériel utilisé:

 Vyatta

Pourquoi avoir choisi Vyatta? En fait c’est «la puissance» de la machine et son utilisation qui ont guidé le choix. Je souhaite mettre cette machine comme firewall entre mon réseau et ma box. Coté débit, comme c’est la misère (coucou Free) cela ne devrait pas poser de problème au Soekris.

Donc pourquoi Vyatta?

  • Voyage Linux fonctionne très bien sur ce genre de matériel, mais il faut vraiment configurer son firewall à la main
  • Je ne suis pas un fan de M0n0wall
  • Mon firewall préférait pfSense se traîne vraiment sur ce type de matériel (notamment la version 2.1). Il vaut mieux dans ce cas utiliser une Alix 2d3 ou 2d13 (plus de RAM, un CPU un peu plus gros, …)
  • Mettre un *bsd, pourquoi pas, mais à ce moment là autant mettre une Voyage Linux

Donc reste Vyatta que je n’ai jamais utilisé, et qui semble adapté pour ce que je veux faire avec des commandes dédiées à la gestion du réseau. Pas d’IHM web pour configurer ce qui fait que l’on gagne de la mémoire vive.

 

Obtenir Vyatta

Pour cela il suffit de se rendre dans la section downloads du site de Vyatta, et de prendre l’image du Live CD 32 bits.
Pour cela il suffit de se rendre sur le site de Vyos dans la section « Get Software ». Prendre l’image du Live CD 32 bits.

Installer Vyatta

Branchez votre lecture de carte compact flash, et y mettre la carte. Identifiez le device associé avec la commande dmseg qui doit avoir une ligne du style sd 7:0:0:1: [sdd] 3940272 512-byte logical blocks: (2.01 GB/1.87 GiB). Donc pour ma part la carte compact flash est associée à /dev/sdd

Si une des partitions contenues sur la carte flash est montée, il faut la démonter avec la commande umount

A partir d’ici j’ai effectué toutes les commandes en root (oui je suis une grosse feignasse, et je n’avais pas envie de me battre avec les permissions).

On va maintenant associer la carte compact flash à un fichier pour VirtualBox:


VBoxManage internalcommands createrawvmdk -filename rawdisk.vmdk -rawdisk /dev/sdd

Cette commande associe le fichier rawdisk.vmdk à la compact flash.

Ensuite sur VirtualBox, créer une nouvelle VM avec les paramètres suivants:

Paramètres Virtualbox pour l'installation de Vyatta

VirtualBox installation de Vyatta

  • Système d’exploitation: Linux 2.6
  • Mémoire vive: 128 Mo
  • Ordre d’amorçage: Disquette, Disque CD/DVD, Disque dur
  • Port SATA 0: rawdisk.vmdk – ici on utilise la carte compact flash
  • Maître secondaire IDE: [CD/DVD] vyatta_licecd – le live CD de vyatta, la machine virtuelle va booter dessus
  • Réseau: désactivé – ça simplifie la configuration ultérieure car vyatta n’aura pas mémorisé l’adresse MAC de la VM

Pour mettre cela en place, dans le menu Configuration

  • Stockage > Contrôleur IDE > Le menu en dessous (normalement vide) > Cocher « Live CD/DVD » et choisir l’image ISO de Vyatta en cliquant sur l’icône du CD
  • Stockage > Contrôleur SATA > Le menu en dessous > Cliquer sur l’icône du disque dur et choisir le fichier rawdisk.vmdk

Voila la VM est prête à être lancer.

Installer Vyatta sur la compact flash

Une fois la VM avec Vyatta lancée, il y a quelques petites modifications à effectuer. En premier lieu il faut se connecter avec l’utilisateur vyatta et le mot de passe vyatta. Ensuite il faut passer root. Au choix un sudo -i ou sudo su -.

Une fois root, il faut modifier le script d’installation pour que le filesystem utilisé sur la compact flash soit de l’ext2 et non pas de l’ext4 afin de ne pas diminuer sa durée de vie.

ATTENTION: le layout du clavier par défaut est qwerty


vi /opt/vyatta/sbin/install-system

rechercher les lignes suivantes:

if [ "$MANUF" = "Xen" ]; then
  ROOT_FSTYPE="ext3"
else
  ROOT_FSTYPE="ext4"
fi

et changer ext4 par ext2

if [ "$MANUF" = "Xen" ]; then
  ROOT_FSTYPE="ext3"
else
  ROOT_FSTYPE="ext2"
fi

Lancer l’installation sur la compact flash avec la commande: /opt/vyatta/sbin/install-system

Répondre aux questions, et une fois l’installation terminée, le prompt root s’affiche.

Mais se n’est pas fini, maintenant il faut faire les modifications pour booter sur la carte compact flash.
On va créer un répertoire pour monter la compact flash et faire les modifications:

mkdir /mnt/temp
mount /dev/sda1 /mnt/temp
cd /mnt/temp

N’oubliez pas que vue de votre VM la compact flash est sur sda.
Les éditeurs disponibles sont vi et nano

Il faut éditer le fichier fstab:
vi etc/fstab
Changer le début de la ligne UUID=… par /dev/sda1.

Ensuite il faut éditer le fichier grub.cfg:
vi boot/grub/grub.cfg
Changer toutes les occurrences de UUID=… par /dev/sda1.

Et enfin il faut éteindre la VM: halt

Et voilà, mettre la compact flash dans le soekris, branchez le câble null modem, configurer minicom ou screen en 9600 8N1, brancher le soekris. Voila plus qu’a être (très) patient pour avoir le prompt.

]]>
http://mylittleweb.eu/2013/10/05/installer-vyatta-sur-un-soekris-4801/feed/ 0
Redémarrer une machine à une heure précise http://mylittleweb.eu/2013/09/18/redemarrer-une-machine-a-une-heure-precise/ http://mylittleweb.eu/2013/09/18/redemarrer-une-machine-a-une-heure-precise/#comments Wed, 18 Sep 2013 19:05:14 +0000 http://mylittleweb.eu/?p=114 Avec l’utilisateur root, voici comment redémarrer une machine à une erreur précise:

shutdown -r 04:00 &

Cette commande permet de rebooter la machine à 04 heure du matin. Le résultat de la commande vous annonce le temps restant avant le redémarrage:

The system is going down for reboot in 549 minutes!

Le & en fin de ligne de commande permet de passer shutdown en tache de fond et de récupérer la main sur le terminal.

Alors le prochain que je vois faire cette opération avec une cron, je le mords.

]]>
http://mylittleweb.eu/2013/09/18/redemarrer-une-machine-a-une-heure-precise/feed/ 0
Antivirus gratuits à télécharger http://mylittleweb.eu/2012/08/26/antivirus/ http://mylittleweb.eu/2012/08/26/antivirus/#comments Sun, 26 Aug 2012 19:36:54 +0000 http://mylittleweb.eu/?p=92 Voici une liste d’antivirus gratuits pour Windows que vous pouvez télécharger et installer sur une clef usb (grâce à UNetbootin). Un fois téléchargés et installés, il suffit  de redémarrer et nettoyer Windows des virus. Voici la liste des anti virus à télécharger

Vous pouvez même tous les installer sur une seule clef qui a assez de place avec Multisystem. A noter que quasiment tous utilisent un système Linux pour fonctionner.

 

]]>
http://mylittleweb.eu/2012/08/26/antivirus/feed/ 0
Plusieurs Os sur une clef USB http://mylittleweb.eu/2012/08/13/plusieurs-os-sur-une-clef-usb/ http://mylittleweb.eu/2012/08/13/plusieurs-os-sur-une-clef-usb/#comments Mon, 13 Aug 2012 16:00:58 +0000 http://mylittleweb.eu/?p=87 Voici comment faire pour mettre plusieurs OS sur une clef USB.

C’est extrêmement simple grace à MultiSystem. Ce petit bout de code vous permet de créer une clef USB avec plusieurs OS. Cela permettra d’avoir System Rescue, les antivirus AVG Rescue CD et Bit Defender sur une seule clef USB pour sauver les données et le PC de tata Yvonne.

Si vous utilisez Ubuntu ce lien explique comment procéder à l’installation MultiSystem : Créez votre LiveUSB MultiBoot simplement

]]>
http://mylittleweb.eu/2012/08/13/plusieurs-os-sur-une-clef-usb/feed/ 0
Backup MySql http://mylittleweb.eu/2012/08/08/backup-mysql/ http://mylittleweb.eu/2012/08/08/backup-mysql/#comments Wed, 08 Aug 2012 18:33:23 +0000 http://mylittleweb.eu/?p=78 Voici une méthode de backup Mysql pour Debian/Ubuntu conforme iso1664 issue de La-rache.

Voici une méthode de pour transférer des bases MySql sur une autre machine quand vos backups (parce que vous avez des backups) ou votre méthode de restauration sont foirés.

Machine source

Sur cette machine il y a les bases que vous voulez transférer. Première chose, connectez vous à la base et identifiez les bases que vous souhaitez sauver avec la commande:

 SHOW DATABASES;

Une fois la liste des bases à sauvegarder connue, en root :

for DB_NAME in DB1 DB2 DB3; do 
echo "Traitement de $DB_NAME"; 
mysqldump --defaults-file=/etc/mysql/debian.cnf --quick $DB_NAME | gzip > $DB_NAME.gz;
done

Machine cible

Une fois les fichiers transférés dans un répertoire sur la machine cible

for file in *; do 
f=$(basename $file .gz); 
mysqladmin --defaults-file=/etc/mysql/debian.cnf create $f; 
gunzip <$file | mysql --defaults-file=/etc/mysql/debian.cnf $f;
done

Et voila vos bases avec les données sur la nouvelle machine. Il ne vous reste plus qu’à créer les utilisateurs qui vont bien.

 

Si votre infrastructure réseau le permet vous pouvez également transférer les données en utilisant les outils MySql avec quelque chose du genre:


mysqladmin -h 'other_hostname' create db_name
mysqldump db_name | mysql -h 'other_hostname' db_name

]]>
http://mylittleweb.eu/2012/08/08/backup-mysql/feed/ 0
MySql et AppArmor http://mylittleweb.eu/2012/07/28/mysql-et-apparmor/ http://mylittleweb.eu/2012/07/28/mysql-et-apparmor/#comments Sat, 28 Jul 2012 17:26:53 +0000 http://mylittleweb.eu/?p=71 Ou comment une « simple » mise à jour empêche MySql de redémarrer.

Lors d’une mise à jour de Ubuntu le fichier contenant la socket de connexion passe du répertoire /var/run/mysqld/ à /run/mysqld/. Et la configuration MySQL de AppArmor n’a pas été mise à jour.

Si vous êtes dans ce cas là dmesg doit baver des trucs du genre:

[5015949.897712] type=1400 audit(1343493499.381:2486195): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/mysqld" pid=30272 comm="apparmor_parser"
[5015951.955304] type=1400 audit(1343493501.437:2486196): apparmor="DENIED" operation="mknod" parent=1 profile="/usr/sbin/mysqld" name="/run/mysqld/mysqld.sock" pid=30276 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=104 ouid=104
[5015952.569459] init: mysql main process (30276) terminated with status 1
[5015952.569681] init: mysql main process ended, respawning
[5015953.370787] init: mysql post-start process (30277) terminated with status 1

La solution: éditer le fichier /etc/apparmor.d/usr.sbin.mysqld.
Remplacer les lignes

/var/run/mysqld/mysqld.pid rw,
/var/run/mysqld/mysqld.sock rw,

par

/run/mysqld/mysqld.pid rw,
/run/mysqld/mysqld.sock rw,

]]>
http://mylittleweb.eu/2012/07/28/mysql-et-apparmor/feed/ 0
Lambda en C++ http://mylittleweb.eu/2012/06/25/lambda-en-c/ http://mylittleweb.eu/2012/06/25/lambda-en-c/#comments Mon, 25 Jun 2012 13:13:56 +0000 http://mylittleweb.eu/?p=42 = 4.5 […]]]> Les fonctions Lambda sont une nouveauté de C++ 0x

Alors c’est quoi une lamba ?

Une lamba c’est une fonction dite « anonyme »: elle n’a pas de nom, mais se comporte comme une fonction (elle peut prendre des paramètres en entrée, et renvoyer un résultat).

Le code qui suit nécessite au moins g++ (gcc) >= 4.5 (Les lambda ne sont supportées qu’a partir de cette version Status of Experimental C++0x Support in GCC 4.5)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
#include <iostream>
#include <algorithm>
 
int main(void)
{
  std::vector vI = {1, 2, 3, 4, 5};
 
  for_each (vI.begin(), vI.end(), [](int i)
      {
        std::cout << "i:" << i << std::endl;
      });
  return 0;
}

La commande de compilation

g++ -std=c++0x t3.cc -o t3

Dans cet exemple ligne 9 il y a la déclaration d’une fonction lambda qui prend un paramètre par valeur de type entier. Vous pouvez utiliser ce paramètre comme vous le faites habituellement dans une fonction/méthode.

Comme une fonction standard C++ vous pouvez utiliser une référence:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
#include <algorithm>
 
int main(void)
{
 
  std::vector vI = {1, 2, 3, 4, 5};
 
  for_each (vI.begin(), vI.end(), [](int &i)
      {
        i *= i;
      });
 
  for_each (vI.begin(), vI.end(), [](int i)
      {
        std::cout << "i:" << i << std::endl;
      });
 
  return 0;
}

Le premier for_each multiple la valeur par elle même et « stocke » le résultat dans le vecteur.

On peut également affecter une lamba à une variable (les pointeurs de fonctions doivent réveiller de vieux souvenir de certains)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int main(void)
{
  auto f1 = []()
      {
        std:: cout << "f1" << std::endl;
      };
 
  auto func = [](int i)
      {
        std::cout << "i: " << i << std::endl;
      };
 
  f1();
 
  func(15);
  return 0;
}

Une fois affectée à une variable, la variable s’utilise comme une fonction.

Allons un peu plus loin:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
int main(void)
{
  int z = 4;
 
  auto f1 = []()
      {
        std:: cout << "f1" << std::endl;
      };
 
  auto f2 = [](int i)
      {
        std::cout << "f2: " << i << std::endl;       
      };   
  auto f3 = [](int i) -> int
      {
        return i * i;
      };
 
  auto f4 = [z]() -> int
      {
        return z + 1;
      };
 
  auto f5 = [&z]() -> int
      {
        z = z * z;
      };
 
  f1();
 
  f2(15);
 
  std::cout >> "f3: " >> f3(3) >> std::endl;
 
  std::cout >> "f4: " >> f4() >> std::endl;
 
  f5();
  std::cout >> "z: " >> z >> std::endl;
  return 0;
}

affiche:
f1
f2: 15
f3: 9
f4: 5
z: 16

Regardons en détail:
auto f1 = []() Lambda classique qui ne prend pas de paramètre et ne renvoie rien. C’est le genre de Lambda qui sont généralement associées à des Thread.

auto f2 = [](int i) Lambda qui prend en paramètre une variable par valeur et ne renvoie rien.

auto f3 = [](int i) -> int Lambda qui prend en paramètre une variable par valeur et qui renvoie un entier. Le type de la donnée renvoyée est précisée par la « fléche » -> int. « Normalement » il n’est pas nécessaire de préciser le type de retour, mais par sécurité et pour des raisons de lisibilité je préfére toujours le mettre.

auto f4 = [z]() -> int Alors là on bascule de la Lambda vers la Clojure: c’est une Lambda qui « capture » une variable du niveau supérieur. Ici c’est une capture par valeur, la clojure renvoie un entier.

auto f5 = [&z]() -> int Toujours une Clojure. Ici c’est une capture par référence, la clojure renvoie un entier.

Voila une présentation extremement rapide des Lambda/Clojure en C++ 0x

]]>
http://mylittleweb.eu/2012/06/25/lambda-en-c/feed/ 0
Range based for http://mylittleweb.eu/2012/06/17/range-based-for/ http://mylittleweb.eu/2012/06/17/range-based-for/#comments Sun, 17 Jun 2012 15:37:07 +0000 http://mylittleweb.eu/?p=48 Range based for ou comment j’ai pleuré du sang à cause de C++ 0x

Le code qui suit ne fonctionne pas (pour l’instant) avec gcc/g++, mais il fonctionne (il parait) en Visual C++:

1
2
3
4
5
6
7
8
#include <iostream>
 
int tab[5] = {1, 2, 3, 4, 5};
for (int &x : tab) 
{
  x *= 2;
  std::cout << "x: " << x << std::endl;
}

Je pense que ça va me prendre du temps pour m’habituer à cette écriture de boucle for.

]]>
http://mylittleweb.eu/2012/06/17/range-based-for/feed/ 0
c++ typeid http://mylittleweb.eu/2012/06/12/c-typeid/ http://mylittleweb.eu/2012/06/12/c-typeid/#comments Tue, 12 Jun 2012 11:42:13 +0000 http://mylittleweb.eu/?p=31 Si des fois vous avez un doute sur le type d’une variable vous pouvez utiliser typeid.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <typeinfo>
 
using namespace std;
 
int main(void)
{
  // built-in types:                                                            
  int i;
  int * pi;
  cout << "int is: " << typeid(int).name() << endl;
  cout << "  i is: " << typeid(i).name() << endl;
  cout << " pi is: " << typeid(pi).name() << endl;
  cout << "*pi is: " << typeid(*pi).name() << endl;
  cout << "&pi is: " << typeid(&pi).name() << endl << endl;
  return (0);
}

L’instruction typeid affiche une information cryptique du genre:

int is: i
i is: i
pi is: Pi
*pi is: i
&pi is: PPi

Il faut comprendre i Integer, Pi Pointer to Integer et PPi Pointer to Pointer to Integer.

Là où cela devient plus fun c’est avec des classes/structures

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <typeinfo>
 
using namespace std;
 
struct Base {};
struct Derived : Base {};
struct Poly_Base {virtual void Member(){}};
struct Poly_Derived: Poly_Base {};
 
int main(void)
{
  Derived derived;
  Base* pbase = &derived;
  cout << "derived is: " << typeid(derived).name() << endl;
  cout << " *pbase is: " << typeid(*pbase).name() << endl;
  cout << boolalpha << "same type? ";
  cout << ( typeid(derived)==typeid(*pbase) ) << endl << endl;
 
  Poly_Derived polyderived;
  Poly_Base* ppolybase = &polyderived;
  cout << "polyderived is: " << typeid(polyderived).name() << endl;
  cout << " *ppolybase is: " << typeid(*ppolybase).name() << endl;
  cout << boolalpha << "same type? ";
  cout << ( typeid(polyderived)==typeid(*ppolybase) ) << endl << endl;
 
  return (0);
}

Donne:

derived is: 7Derived
*pbase is: 4Base
same type? false

polyderived is: 12Poly_Derived
*ppolybase is: 12Poly_Derived
same type? true

Vous pouvez supprimer le virtual devant la méthode Member() (c’est valide en C++). L’identification n’est plus la même.

Source (surtout les exemples, j’avais pas envie de les refaire): CPlusPlus.com – typeinfo

]]>
http://mylittleweb.eu/2012/06/12/c-typeid/feed/ 0
sed s/^M/\n/g http://mylittleweb.eu/2012/06/02/sed-smng/ http://mylittleweb.eu/2012/06/02/sed-smng/#comments Sat, 02 Jun 2012 17:25:26 +0000 http://mylittleweb.eu/?p=22 Tu cherches à faire un sed pour remplacer les ^M de windows par un beau retour chariot à la Unix ? Oublie sed

Dans ce cas là il vaut mieux utiliser dos2unix ou un bon vieux tr

1
tr '\r' '\n' <file.txt >clean_file.txt
]]>
http://mylittleweb.eu/2012/06/02/sed-smng/feed/ 0
Javascript – Recupérer la valeur cochée dans un groupe de radio boutons http://mylittleweb.eu/2012/05/31/javascript-recuperer-la-valeur-cochee-dans-un-groupe-de-radio-boutons/ http://mylittleweb.eu/2012/05/31/javascript-recuperer-la-valeur-cochee-dans-un-groupe-de-radio-boutons/#comments Thu, 31 May 2012 20:06:51 +0000 http://mylittleweb.eu/?p=12 Juste pour ne pas oublier, voici comment récupérer en Javascript la valeur du radio bouton activé.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getRadioVal(radioGroupName)
{
  /* Recupere le groupe de radio bouton */
  var radiosGrp = document.getElementsByName(radioGroupName);
  /* Pacours tous les boutons du groupe pour trouver celui qui est "checked" */
  for(var radio in radiosGrp)
  {
    if(radiosGrp[radio].checked)
    {
      return radiosGrp[radio].value;
    }
  }
  return null;
}
]]>
http://mylittleweb.eu/2012/05/31/javascript-recuperer-la-valeur-cochee-dans-un-groupe-de-radio-boutons/feed/ 0
Ouverture ! http://mylittleweb.eu/2012/05/30/ouverture/ http://mylittleweb.eu/2012/05/30/ouverture/#comments Wed, 30 May 2012 19:31:34 +0000 http://mylittleweb.eu/?p=5 Allez hop ouverture de My Little Web. Je vais essayer de l’alimenter régulièrement, je vais parler Web, C++, Python, 3615MyLife, …

]]>
http://mylittleweb.eu/2012/05/30/ouverture/feed/ 0