Planet Archlinux FR

ArchLinux, en Français

Installation d'une imprimante réseau Brother HL-5450DN

Au boulot j'ai hérité d'une Brother HL-5450DN, et on ne peut pas dire qu'elle marchait out of the box sur mon Archlinux. D'habitude il y a toujours un paquet AUR pour faire le job, mais dans ce cas le paquet brother-brgenml1 ne m'a pas été d'un grand secours.Il m'a donc fallu utiliser un script Brother se basant sur des .deb ou des .rpm.

préalable : installer le paquet AUR dpkg permettant d'installer un paquet deb

yaourt -S dpkg

Ensuite aller sur cette page de téléchargement de brother, accepter le CLUF et télécharger le Driver Install Tool.

Se rendre dans le dossier contenant le téléchargement, le décompacter et lancer la commande

sudo bash ./linux-brprinter-installer-2.1.1-1 
Input model name ->HL-5450DL

You are going to install following packages.
hl5450dnlpr-3.0.0-1.i386.deb
hl5450dncupswrapper-3.0.0-1.i386.deb
OK? [y/N] ->y


=========================================
Brother License Agreement

Brother retains any and all copyrights to the Software. In no case this Agreement shall be construed to assign or otherwise transfer from Brother to User any copyrights or other intellectual property rights to whole or any part of the Software.

Brother grants User a non-exclusive license: to reproduce and/or distribute (via Internet or in any other manner) the Software. Further, Brother grants User a non-exclusive license to modify, alter, translate or otherwise prepare derivative works of the Software and to reproduce and distribute (via Internet or in any other manner) such modification, alteration, translation or other derivative works for any purpose.

The license of the Software from Brother hereunder is granted "AS IS." BROTHER HEREBY DISCLAIMS ANY WARRANTIES WITH RESPECT TO THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTY FOR THE QUALITY, MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE OR NON-INFRINGEMENT.
Brother shall have no liability in contract, tort (including negligence or breach of statutory duty) or otherwise for any interruption of use, loss of data, or for any indirect, incidental, punitive or consequential loss or damage, or for any loss of profit, revenue, data, goodwill or anticipated savings that arises under, out of, or in contemplation of this Agreement or otherwise arises due to any error, inaccuracy or defect in the Software even if Brother has been advised of the possibility of such loss or damage.
Further, Brother shall have no liability to disclose and/or distribute the source cord of the Software to User under any circumstances. In no case shall the above license by Brother to modify, alter, translate or otherwise prepare derivative works of the Software be construed as Brother's implied agreement or undertakings to disclose and/or distribute the source cord of the Software.
=========================================
Do you agree? [Y/n] ->y

wget -T 10 -nd --no-cache http://www.brother.com/pub/bsc/linux/packages/hl5450dnlpr-3.0.0-1.i386.deb
--2016-12-08 14:31:11-- http://www.brother.com/pub/bsc/linux/packages/hl5450dnlpr-3.0.0-1.i386.deb
Résolution de www.brother.com (www.brother.com)… 92.123.227.219, 92.123.227.168
Connexion à www.brother.com (www.brother.com)|92.123.227.219|:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 33734 (33K) [text/plain]
Sauvegarde en : « hl5450dnlpr-3.0.0-1.i386.deb »

hl5450dnlpr-3.0.0-1 100%[===================>] 32,94K --.-KB/s in 0,03s

2016-12-08 14:31:11 (1,17 MB/s) — « hl5450dnlpr-3.0.0-1.i386.deb » sauvegardé [33734/33734]


=========================================
GPL License Agreement

This Software may be used in accordance with GNU General Public License (GPL). Please read carefully the following GPL and click on "I Accept" button. If you cannot agree with the following terms, please click "I don't Accept" button. In case of your non-acceptance, you can not use this Software.
Note:
Please click on "I Accept" while holding down "Shift" or right click on "I Accept" and select "Save Target As,,," from the menu.

GNU GENERAL PUBLIC LICENSE
Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) year name of author Gnomovision
comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.

<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
=========================================

Do you agree? [Y/n] ->y

wget -T 10 -nd --no-cache http://www.brother.com/pub/bsc/linux/packages/hl5450dncupswrapper-3.0.0-1.i386.deb
--2016-12-08 14:31:14-- http://www.brother.com/pub/bsc/linux/packages/hl5450dncupswrapper-3.0.0-1.i386.deb
Résolution de www.brother.com (www.brother.com)… 92.123.227.168, 92.123.227.219
Connexion à www.brother.com (www.brother.com)|92.123.227.168|:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 13474 (13K) [text/plain]
Sauvegarde en : « hl5450dncupswrapper-3.0.0-1.i386.deb »

hl5450dncupswrapper 100%[===================>] 13,16K --.-KB/s in 0,006s

2016-12-08 14:31:14 (2,27 MB/s) — « hl5450dncupswrapper-3.0.0-1.i386.deb » sauvegardé [13474/13474]

./linux-brprinter-installer-2.1.1-1: ligne 1800: apt-get : commande introuvable
./linux-brprinter-installer-2.1.1-1: ligne 1804: apt-get : commande introuvable
./linux-brprinter-installer-2.1.1-1: ligne 1808: apt-get : commande introuvable
ln: impossible de créer le lien symbolique '/etc/init.d/cupsys': Aucun fichier ou dossier de ce type
ln: impossible de créer le lien symbolique '/etc/init.d/cups': Aucun fichier ou dossier de ce type
ln: impossible de créer le lien symbolique '/etc/init.d/lpd': Aucun fichier ou dossier de ce type
ln: impossible de créer le lien symbolique '/etc/init.d/lprng': Aucun fichier ou dossier de ce type
dpkg -x hl5450dnlpr-3.0.0-1.i386.deb /
dpkg -x hl5450dncupswrapper-3.0.0-1.i386.deb /
dpkg-deb: building package 'hl5450dnlpr' in 'hl5450dnlpr-3.0.0-1a.i386.deb'.
dpkg -b ./brother_driver_packdir hl5450dnlpr-3.0.0-1a.i386.deb
dpkg-deb: building package 'hl5450dncupswrapper' in 'hl5450dncupswrapper-3.0.0-1a.i386.deb'.
dpkg -b ./brother_driver_packdir hl5450dncupswrapper-3.0.0-1a.i386.deb
dpkg -i --force-all hl5450dnlpr-3.0.0-1a.i386.deb
dpkg: avertissement: problème contourné par utilisation de --force :
dpkg: avertissement: l'architecture du paquet (i386) ne correspond pas à celle du système (amd64)
Sélection du paquet hl5450dnlpr:i386 précédemment désélectionné.
(Lecture de la base de données... 0 fichier et répertoire déjà installé.)
Préparation du dépaquetage de hl5450dnlpr-3.0.0-1a.i386.deb ...
Dépaquetage de hl5450dnlpr:i386 (3.0.0-1) ...
Paramétrage de hl5450dnlpr:i386 (3.0.0-1) ...
chown: utilisateur incorrect: « lp »
dpkg -i --force-all hl5450dncupswrapper-3.0.0-1a.i386.deb
dpkg: avertissement: problème contourné par utilisation de --force :
dpkg: avertissement: l'architecture du paquet (i386) ne correspond pas à celle du système (amd64)
Sélection du paquet hl5450dncupswrapper:i386 précédemment désélectionné.
(Lecture de la base de données... 29 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de hl5450dncupswrapper-3.0.0-1a.i386.deb ...
Dépaquetage de hl5450dncupswrapper:i386 (3.0.0-1) ...
Paramétrage de hl5450dncupswrapper:i386 (3.0.0-1) ...
lpadmin -p HL5450DN -E -v usb://dev/usb/lp0 -P /usr/share/ppd/brother/brother-HL-5450DN-cups-en.ppd
#
Will you specify the Device URI? [Y/n] ->


0: ipps
1: beh
2: smb
3: socket
4: http
5: lpd
6: https
7: ipp
8: dnssd://Brother%20HL-5450DN%20series._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-30055c980637
9: dnssd://MX-2310U%20(1501035Y00)._printer._tcp.local/
10: lpd://192.168.1.150/lp
11: lpd://BRN30055C980637/BINARY_P1
12 (I): Specify IP address.
13 (A): Auto. (dnssd://Brother%20HL-5450DN%20series._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-30055c980637)

select the number of destination Device URI. ->12

enter IP address ->192.168.1.249
lpadmin -p HL5450DN -v socket://192.168.1.249 -E
Test Print? [y/N] ->y

wait 5s.
lpr -P HL5450DN /usr/share/cups/data/testprint
Hit Enter/Return key.
[vincent@taf linux-brprinter-installer-2.1.1-1]$

l'option 8 dnssd://Brother%20HL-5450DN%20series._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-30055c980637 aurait étée tout aussi bien.

ACL ou la gestion fine des droits sous Linux

Sur le vieux PC Dell que j'ai évoqué lors de mon précédent billet, j'ai créé un répertoire /home/commun pour que ma chère et tendre et moi-même puissions stocker quelques ressources... communes (vidéos, musique, photos etc).

Mais en matière de gestion des droits d'accès Linux, par défaut, est clairement orienté utilisateur. Gérer les droits pour un groupe n'est pas réellement prévu et donc créer un répertoire commun à tout ou partie des utilisateurs d'un même PC ne fonctionne pas "out of the box". Même si le répertoire initial est créé avec les droits qui vont bien (rwxrwx---) toute écriture à l'intérieur héritera des droits définis (par défaut) par l'auteur. C'est modifiable avec umask, mais outre que ceci ne soit pas trivial cela ne permet pas de gérer individuellement les fichiers et répertoires. Quand à gérer au cas par cas avec chmod autant ne pas en parler.

La solution c'est ACL, pour Access Control List. Comme c'est une dépendance de sytemd c'est déjà installé automatiquement sur Archlinux, ce qui ne veut pas dire qu'il n'y a rien à faire.

Options de montage

Tout d'abord il faut que la partition sur laquelle réside le répertoire concerné soit monté avec l'option ACL. À priori c'est automatiquement le cas si elle est formate en extX ou en btrfs,. Pour vous en assurer tapez la commande
# tune2fs -l /dev/sdXY | grep "Default mount options:"
Si la réponse est
Default mount options:    user_xattr acl
C'est tout bon, sinon vous pouvez modifier les options de montage par défaut en utilisant tune2fs
# tune2fs -o acl UUID=uuid (ou /dev/sdXY ou LABEL=volume_name)
vous pouver aussi modifier la ligne correspondante dans fstab en rajoutant acl à la fin des options. Par exemple :
# /dev/sda4
UUID=cfa7cb12-e2f8-4789-9003-c19489204ed9 /home ext4 rw,relatime,data=ordered,acl 0 2
mais c'est moins souple en cas de disque externe.

Gestion des droits

la commande pour modifier les droits d'un fichier ou d'un répertoire est setfacl
# setfacl option(s) <règle> <fichier/répertoire>
Lisez la page de man qui va bien pour toutes les combinaisons possibles, nous ne nous arrêterons ici que sur les cas les plus courants.
les options qui nous intéressent ici sont -m (modifie) -R (récursif) et -d (par défaut)
les règles sont construites sous la forme qui:permissions
qui est soit un utilisateur soit un groupe : u:USERNAME ou g:GROUPNAME
permission est une combinaison des caractères r,w et x (read, write et execute).

Pour notre cas concret

# setfacl -dmR g:users:rwx /home/commun

Documentation

wiki archlinux (en anglais)
doc ubuntu-fr (en français)
redhat (en anglais)

Chiffrement de son répertoire personnel

J'ai récupéré un vieux Dell sur lequel j'ai installé ma distribution et mon environnement graphique habituels (Archlinux / Openbox). L'idée est d'en faire un PC à emmener partout. Hum... et à oublier partout ! Donc il faut pour le moins protéger ses données, pour que son éventuelle perte ne permette à quiconque d'explorer nos documents et/ou mots de passe Internet. La solution est évidement le chiffrement, et tout est expliqué sur cette page du wiki d'Archlinux. Mais comme c'est en anglais et que tout ne m'était pas aussi évident que je l'espérais voici un compte rendu de cette opération.

État des lieux :

Archlinux à jour, utilisateur(s) créé(s), mots de passes définis (et solides, il serviront au chiffrement), répertoires personnels créés (et non vides, pour pouvoir tester), suffisamment de place dans la partition dans laquelle est monté /home (environ 2,5 fois plus que la taille du plus gros répertoire à chiffrer). Une bonne sauvegarde ne peut pas nuire. Même si une copie du répertoire sera faite par l'outil de migration (sous la forme /home/USERNAME.xxxxxxx) avant chiffrement, pourquoi ne pas essayer clonezilla ?

Programmes à installer :

# pacman -S ecryptfs-utils rsync lsof pam_mount

Programmes à installer :

# pacman -S ecryptfs-utils rsync lsof pam_mount

Préalable pour pouvoir se relogger facilement :

l'idée est évidement que le répertoire personnel soit monté en clair dès le login. Pour cela nous allons utiliser pam_mount :

1) éditer le fichier /etc/security/pam_mount.conf.xml

rajouter la ligne
<volume user="USERNAME" fstype="ecryptfs" path="/dev/sdXY" mountpoint="/home" options="fsck,noatime" />
un peu avant la fin, juste avant
<mkmountpoint enable="1" remove="true" />
</pam_mount>

2) éditer le fichier etc/pam.d/system-auth

après la ligne contenant 'auth required pam_unix.so' ajouter :
auth    required    pam_ecryptfs.so unwrap

Ensuite, avant la ligne contenant 'password required pam_unix.so' insérer :
password    optional    pam_ecryptfs.so

Et finalement, après la ligne contenant 'session required pam_unix.so' ajouter :
session    optional    pam_ecryptfs.so unwrap

Chiffrement proprement dit :

Démarrer le système sans se logger en tant qu'utilisateur. Depuis le gestionnaire de connexion (lightdm chez moi) passer en console (Alt Ctrl F2) et ouvrir une session root. On peut aussi se logger sur le compte d'un autre utilisateur et passer root dans une console, ce qui permet de profiter de l'environnement graphique et du copier/coller.

Monter le module ecryptfs puis lancer la commande de chiffrement

# modprobe encryptfs
# ecryptfs-migrate-home -u username
INFO: Checking disk space, this may take a few moments. Please be patient.
INFO: Checking for open files in /home/USERNAME
Enter your login passphrase [USERNAME]:

../.. (défilé des fichiers en cours de chiffrement)
Some Important Notes! 1. The file encryption appears to have completed successfully, however, USERNAME MUST LOGIN IMMEDIATELY, _BEFORE_THE_NEXT_REBOOT_ TO COMPLETE THE MIGRATION!!!
2. If USERNAME can log in and read and write their files, then the migration is complete,
and you should remove /home/USERNAME.5ZJvW3ds.
Otherwise, restore /home/USERNAME.5ZJvW3ds back to /home/USERNAME.
3. USERNAME should also run 'ecryptfs-unwrap-passphrase' and record their randomly generated
mount passphrase as soon as possible. 4. To ensure the integrity of all encrypted data on this system, you should also encrypt swap space
with 'ecryptfs-setup-swap'.

Attention :

le  mot de passe (passphrase) à indiquer ici est bien celui utilisé par l'utilisateur pour se logger. Sinon il vous faudra monter le répertoire à la main. Ensuite, comme indiqué ci-dessus, il est essentiel de se logger et de faire des essais de lecture et d'écriture dès que la migration sera terminée, en tous cas avant de redémarrer le système. Enfin lancez la commande
$ ecryptfs-unwrap-passphrase
et notez dans en endroit secret et sûr le nombre de 32 chiffres en hexadécimal qui aura été généré de façon aléatoire et qui vous servira de mot de passe de secours en cas de problème. Le moyen le plus simple est de l'envoyer à vous-même un e-mail chiffré (voir enigmail si vous utilisez Thunderbird) ou, à défaut, de l'enregistrer dans un fichier chiffré (avec GnuPG par exemple)  avant de vous l'envoyer en pièce jointe.

Considérations sur l'ordre de la procédure

Si vous suivez le wiki d'Archlinux vous noterez que contrairement à ce tuto la partie montage automatique au login est traitée dans un second temps. Cela a un avantage didactique évident mais oblige à monter la partition chiffrée "à la main", en ligne de commande. N'essayez donc pas de vous logger en mode graphique, cela ne fonctionnera pas, faites le en console.

En cas de problème

Si rien ne se passe comme prévu, si vous ne retrouvez pas vos données, pas de panique ! Il suffit de vous logger en root sur une console, de supprimer votre répertoire /home/USERNAME ainsi que le répertoire /home/.ecryptfs et enfin de renommer le répertoire de sauvegarde
rm -rf /home/USERNAME 
rm -rf /home/.ecryptfs
mv /home/USERNAME.xxxxxxxx /home/USERNAME

Si tout va bien

au bout de quelques jours (on ne sait jamais) pensez à supprimer la copie non chiffrée de votre répertoire personnel (/home/USERNAME.xxxxxxxx)

Changement de mot de passe

Si pour une raison ou une autre vous souhaitiez changer de mot de passe il faut le faire évidement à la fois pour le login et pour le déchiffrage du dossier.
#changer le mot de passe du login
passwd
#changer le mot de passe de chiffrement
ecryptfs-rewrap-passphrase ~/.ecryptfs/wrapped-passphrase
Dans les 2 cas l'ancien mot de passe sera demandé avant le nouveau.

Autres documentations

wiki.archlinux.fr - doc-ubuntu-fr

Compte rendu du Meetup ArchLinux France du 10 Nov. 2015

Ce 10 Novembre 2015 a eu lieu le second meetup ArchLinux France, chez BlaBlaCar à Paris ! Pour rappel le premier Meetup avait eu lieu en Octobre 2014. Pour cette nouvelle édition, il y avait 5 présentations, et près de 70 personnes ! (vous pouvez retrouver le programme sur meetup).

Voici la liste des présentations et leurs slides (update: elles sont maintenant toutes disponibles !) :

J’ai pour ma part parlé de Yaourt, son histoire, son développement, ses features. Si vous souhaitez participer, n’hésitez pas à vous rendre sur le github du projet :)

Mes slides ci dessous :

Et quelques photos, tirées du ‘Live Tweet’ de @archlinuxfr :

Encore merci aux talkers, à tous ceux présents, et à BlaBlaCar (et Puckel_) pour le sponsoring de la salle et la collation !

Transférer et géolocaliser mes photos : un petit script

En matière de classement des photos, comme dans bien d'autres domaines, j'ai le sentiment de ramer à contre courant. L'heure est à l'utilisation de logiciels graphiques sophistiqués, prenant en charge depuis l'insertion de la carte SD (ou la connexion de l'APN) jusqu'au téléversement sur l'album en ligne. Digikam fait, paraît-il, cela très bien, mais je le trouve trop lourd et d'un emploi mal aisé. Je fondais quelques espoir sur oqapy, malheureusement je ne le trouve plus sur les dépôts Archlinux, même pas dans AUR... J'aime assez gthumb mais il ne sait pas faire tout ça.

Bref, je continue à travailler à la mimine selon un processus bien établi :

  • Créer un répertoire au nom significatif tant du point de vue chronologique que géographique (aaaammjj_Localisation)
  • Y copier les fichiers JPG et les renommer selon un shéma analogue (aaaammjj_hhmmss_Localisation_NomOriginel.JPG)
  • Y copier le ou les éventuel(s) fichiers gpx associés et géolocaliser les images
  • Sélectionner, recadrer et éventuellement retoucher les meilleurs clichés avant de les transférer vers notre album Piwigo

Pour renommer les photos j'utilise exiv2 de la manière suivante :

exiv2 -r %Y%m%d_%H%M%S_Localisation_:basename: mv *.JPG

Pour géolocaliser j’utilise Gpscorrelate, que j'ai présenté ici, qui est malheureusement abandonné par son créateur mais a l'avantage de disposer à la fois d'une version graphique et d'une version en ligne de commande.

gpscorrelate -g monFichierTrace.gpx -z [valeur] *.JPG

La valeur à associer à l'option -z est le décalage du fuseau horaire, par exemple +1:00 pour l’heure normale d’Europe centrale (CET : Paris, Bruxelles, Genève…) et +2:00 pour l’heure d’été d’Europe centrale (CEST). Ceci dans la mesure ou l’horodatage des photos est faite en heure locale et celle du GPS en UTC, ce qui est en principe le cas. Il y a d'autres options possible, voir la  documentation.

Bon, ce n'est pas trop compliqué, mais il faut se souvenir des options, tout ça.... Pourquoi ne pas automatiser le processus dans un petit script ?

#! /bin/bash 

#######################
##     photoman      ##
## interface à exiv2 ##
## et à gpscorrelate ##
#######################


declare -i nbRep=0
declare -i nbPhotos=0
declare -A DateTab

# chemin du répertoire photo
photoRep="/media/NAS/Public/Photos/"
# chemin du GPS
GPS="/run/media/vincent/GARMIN/Garmin/GPX"

IFS=$'\n'
shopt -s nullglob

# détection du GPS
if [ -d $GPS ]; then
    find $GPS -iname "*.gpx" > /tmp/tracesGPS
    if [ $(wc -l /tmp/tracesGPS | cut -d " " -f 1) != 0 ]; then        
        echo
        read -n 1 -s -p "un ou plusieurs fichiers gpx ont été trouvé dans le GPS. Les copier dans le(s) répertoire(s) photos [O/n] ? " copieTrace
        copieTrace="${copieTrace:=o}"
        case $copieTrace in
            o|O|y|Y ) Geolocalisation=true;;
            * ) Geolocalisation=false;;
        esac
    fi
else
    read -n 1 -s -p "Le GPS n'a pas été détecté : continuer quand même [o/N] ? " question
    question="${question:=n}"
    case $question in
            o|O|y|Y ) Geolocalisation=false ;;
            * ) exit;;
    esac
fi
echo

#traitement des photos
for fichier in *
do
    if [ ! -f $fichier ]; then continue; fi
    MimeType=$(file --mime-type $fichier)
    if [[ ${MimeType:(-10)} != "image/jpeg" ]]; then continue; fi
    datePhoto=$(exiv2 -g Exif.Photo.DateTimeOriginal $fichier | sed -r 's/^ *//;s/ {1,}/ /g'| cut -d " " -f 4 | sed 's/://g')
    repertoire=$photoRep${datePhoto:0:4}"/"
    if [ -z ${DateTab[$datePhoto]} ]; then 
        echo
        read -p "Veuillez indiquer une localisation correspondant à la journée du $datePhoto puis appuyez sur [Entrée] : " localisation
        echo
        DateTab[$datePhoto]="_"$(echo $localisation | sed 's/ /-/g')
        mkdir $repertoire$datePhoto${DateTab[$datePhoto]} 2> /dev/null
        ((nbRep++))
        # copier les fichiers gpx        
        if $Geolocalisation; then
            while read line  
                do   
                cp $line $repertoire$datePhoto${DateTab[$datePhoto]}
            done < /tmp/tracesGPS
        fi
    fi 
    fichierRenomme=$repertoire$datePhoto${DateTab[$datePhoto]}"/"$(echo $fichier | sed 's/ /-/g')
    cp $fichier $fichierRenomme
    ((nbPhotos++))
    exiv2 "-r%Y%m%d_%H%M%S"${DateTab[$datePhoto]}"_:basename:" mv $fichierRenomme
done

#Bilan
if [ $nbPhotos -eq 0 ]; then 
    echo
    echo "Il n'y a aucune photo à transférer dans ce répertoire"
    echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++"
    echo
    exit
fi
echo "$nbPhotos photos ont été transférées dans $nbRep répertoire(s)."
printf '\033[7m'
read -n 1 -s -p "===> Supprimer toutes les photos dans le répertoire d'origine [o/N] ? " question
question="${question:=n}"
printf '\033[0m'echo
case $question in
        o|O|y|Y ) rm -rf *.[jJ][pP][gG] ;;
        * ) : ;;
esac

#Géolocalisation
if ! $Geolocalisation; then exit; fi
read -n 1 -s -p "Géolocaliser les photos transférées [O/n] ? " question
question="${question:=o}"
case $question in
        o|O|y|Y ) : ;;
        * ) exit;;
esac
for i in "${!DateTab[@]}"
    do 
    cd $photoRep${i:0:4}"/"$i${DateTab[$i]}
    for f in "*.[gG][pP][xX]"
        do
        gpxFileDate=$(xml_grep 'trkpt' $f --nb_results 1 | xml_grep 'time' --text_only)
        UTCHour=$(date -d $(echo $gpxFileDate | sed "s/T/ /g" | sed "s/Z//g") +%k | sed "s/ //g")
        LocalHour=$(date -d $gpxFileDate +%k)
        TimeZone=$(( $LocalHour  - $UTCHour ))
        gpscorrelate -g $f -z $TimeZone *.[jJ][pP][gG]
    done
done

Quelques explications :

Les premières lignes servent de fichier ini : emplacement du répertoire photo et point de montage du GPS

Ensuite je détecte si le GPS est connecté et je vérifie (find -iname *.gpx) et s'il y a une (ou plusieurs) traces. On y reviendra plus tard

Puis pour chaque fichier du répertoire en cours
  • je teste s'il est de type image jpg,
  • j'extrais la date de prise de vue grace à exiv2
  • s'il n'existe pas je crée un répertoire correspondant à cette date (localisation demandée), j'y copie les éventuelles traces du GPS et j'incrémente un compteur (les noms des répertoires sont stockés dans un tableau associatif date => _localisation )
  • J'y copie le fichier photo, le renomme (aaaammjj_hhmmss_localisation_nomOririnel.JPG) et incrémenter un compteur
Une fois le transfert terminé je vide éventuellement le répertoire d'origine et je commence la géolocalisation proprement dite. Une seule difficulté, déterminer automatiquement la zone horaire qui s'applique ce jour (en supposant que l'APN est correctement réglé à l'heure locale).

Les trace gpx sont des fichiers XML. On peut évidement les exploiter à la hussarde à grand coup de sed ou de awk, mais un bon parseur vous facilitera la tache. J'utilise ici xml_grep fourni par le paquet perl-xml-twig (Archlinux) ou xml-twig-tools (Debian/Ubuntu). Il me permet ici d'extraire l'horodatage (UTC) du premier trackpoint, que j'exprime en heure locale pour calculer la différence.

J'appelle enfin gpscorrelate pour chaque fichier gpx, avec le décalage horaire calculé, et je l'applique à toutes les photos. En principe une photo n'est concernée que par une seule trace mais s'il arrivait que le fichier JPG contienne déjà des données exif gps elles ne seraient pas écrasées et un message d'erreur serait affiché.

Naturellement ce script ne répond précisément qu'à mes besoins personnels et probablement pas aux vôtres mais il démontre, je l'espère, qu'il n'est pas si difficile de réaliser soi-même l'application correspondant à ses desiderata.

Imprimer ses cartes IGN

Comme nous l'évoquons quelques fois ici, nous sommes amateurs de courses en montagnes de tout genres. Et en tous lieux, ce qui suppose un fond de cartes important. Certes il est possible d'en emprunter à la bibliothèque de notre section du CAF mais comme nous disposons d'une imprimante laser couleur nous nous contentons parfois de capturer la zone qui va bien sur Internet pour l'imprimer en A4.

Tout d'abord pour une course en montagne il est exclu d'utiliser autre chose qu'une carte IGN (pour la France) ou SwissTopo (pour la Suisse). Si vous aviez la moindre tentation d'utiliser autre chose nous vous invitons à lire l'avertissement situé sur le site (par ailleurs excellent) de FranceTopo.fr. Les sites qui reproduisent des itinéraires sur googlemap et autres simulacres de cartes topographiques devraient être mis en examen pour mise en danger de la vie d'autrui.

Mais revenons donc à nos impressions : il y a tout d'abord un site qui fait tout ça très bien, ou presque : JGN (notez le J à la plage du I). On sélectionne une échelle, un format, on centre la carte et roule ma poule. Le seul défaut est qu'il n'intègre pas le carroyage UTM et que son développeur a, selon ses propres dires, d'autres chats à fouetter. On n'en a pas forcement besoin mais c'est bien pratique si l'on dispose d'un GPS. Et comme on est là pour s'amuser  apprendre on va utiliser une autre solution.

À ma connaissance le seul site qui permette de rajouter une couche carroyage UTM est openrunner. Il faut créer un compte mais comme les adresses  type yopmail ou jetable.org sont acceptées ça ne pose pas trop de problème. Détail important : il faut l'ouvrir avec Firefox, nous verrons pourquoi plus loin.

Une fois connecté sur le site cliquez sur le bouton "Planifier un parcours". La seule chose qui nous intéresse pour le moment est la carte. Positionnez-vous où bon vous semble, choisissez "Topo IGN France" dans le menu des cartes (en haut à droite), amenez à l'échelle qui va bien (indicateur 200m en bas à droite) et activez le carroyage UTM 1km (barre d'outil de gauche.

Bon c'est pas mal mais la fenêtre est ridiculement petite. Il y a certes un bouton plein écran mais sauf avoir une résolution de malade ça restera insuffisant. Jusqu'à présent je me faisais patiemment mon petit montage de captures d'écran avec GIMP, façon puzzle, mais Antistress m'a appris ici une fonction très intéressante de Firefox : la possibilité de faire des screenshots via la barre de développement. Et des screenshots de la page entière, plus exactement de la fenêtre entière, et pas simplement de la partie visible à l'écran ce qui serait le cas avec les outils de capture ordinaires. Nous y reviendrons tout à l'heure.

Edit du 14/07 : lire les commentaires de Mathieu et de Viale ci-dessous pour une solution beaucoup plus simple et indépendante de l'OS pour la capture de la fenêtre.

Sous Linux rien ne s'oppose à ce que la fenêtre soit beaucoup plus grande que l'écran, par exemple 3000x2000 dans un écran de 1440x900 (avant cela la fenêtre ne doit pas être maximisée). Pour la manœuvrer il suffit de maintenir la touche alt de gauche enfoncée et de de déplacer la souris avec le bouton gauche. Par acquit de conscience j'ai essayé de faire la même chose sous Windows mais je n'y suis pas parvenu (il faut dire que mes connaissances de cet OS sont franchement limitées).

Bien sûr il est possible d'obtenir ce résultat à la main, en tirant sur les coins de la fenêtre, mais c'est long et fastidieux. Et comme souvent il y a un petit outils qui va bien pour automatiser tout ça, c'est wmctrl (dans community sous Archlinux, universe sous Ubuntu).

  • pour agrandir ⇒ wmctrl -r Firefox -e "0,0,0,3500,2500"
  • pour revenir à une taille"normale" ⇒ wmctrl -r Firefox -e "0,0,35,1500,800"

man wmctrl pour plus de précision. Le "35" pour revenir en taille normale c'est pour tenir compte de ma barre des tâches (tint2) qui est positionnée en haut de l'écran. À adapter en fonction de votre configuration.

Pour un confort optimal il suffit d'affecter un raccourci clavier à chacune de ces commandes (selon votre gestionnaire de bureau).

Retournons maintenant à la capture de la fenêtre : l'astuce consiste à lancer la console réservée aux développeurs, appelée « barre de développement » dans Firefox, qui est accessible soit par le menu, soit par le raccourci clavier Maj+F2. La console est positionnée au bas de la fenêtre, elle bénéficie de l'auto-complétion avec la touche tab et du rappel des dernières commandes avec la flèche du haut.

Saisissez alors la commande « screenshot votreFichier.png --fullpage » puis validez : la capture est alors sauvegardée directement dans le dossier des téléchargements.

Pour obtenir une carte au 1/25.000 il suffit maintenant de redimensionner l'image (par ex. avec gimp) et de l'imprimer en 180 DPI (points par pouce en français). La taille maximale dépendra des marges de votre imprimante. Pour ma HP CP1515 les dimensions maximales sont 2014 x 1412 pixels. Vérifiez le résultat : le carroyage UTM de 1km doit être de 4cm pour respecter l’échelle. Jouez sur la résolution d'impression si ce n'est pas le cas.

N.B. J'ai testé ceci sous Archlinux et Openbox mais je ne vois aucune raison pour que cela ne fonctionne pas dans tout autre environnement.

Vers la fin du RTFM ?

Les lecteurs de linuxfr l'auront noté au détours d'un commentaire de Xinfe : eg est, pour les cas les plus simples, une alternative séduisante à man. Si comme moi vous ne connaissez rien de plus ennuyeux que de devoir consulter des pages entières de manuel regorgeant d'options que vous n'utiliserez jamais alors qu'un simple exemple suffirait à votre bonheur alors eg est fait pour vous. 

Pour l'installer pas de souci sous Archlinux, le paquet est dans AUR, mais je n'en ai pas trouvé pour Ubuntu et dérivés

Les fichiers exemples sont stockés au format Markdown dans deux répertoires : celui par défaut, fourni par le paquet (/usr/lib/python3.4/site-packages/eg/examples/ sur mon ordi) et un éventuel répertoire personnalisé. Pour indiquer l'emplacement de ce dernier (et modifier éventuellement le chemin de celui par défaut) il faut créer un fichier ~/.egrc sous la forme suivante :

[eg-config]
examples-dir = /un_autre/répertoire/
custom-dir = ~/mon/répertoire/personnalisé

Pour créer un nouveau fichier d'exemple le plus simple est évidement de s'inspirer d'un fichier fourni avec le programme. Son nom sera composé du nom de la commande suivi de l’extension .md

On obtient la liste des fichiers exemples disponibles par l'option --list : eg --list

Ce qui donne initialement ifconfig whereis ls less cut which more ps whatis rm locate chmod find touch grep sudo xargs cat ln mv cd mkdir tr scp pwd kill od hexdump du cp chown sort curl awk su top tar wc gcc

Ironie de l'histoire il n'existe ni page man ni page eg consacrées à eg. Mais la documentation sur le site est assez claire (mais en anglais).

Pour ma part je me promets de contribuer prochainement en rédigeant une page sur la gestion des meta-données des photos avec exiv2. Y'a du boulot....

LockKeys 0.2

J'ai évoqué récemment mon besoin d'avoir une applet indicateur d'état du clavier (capslock et numlock) indépendante de l'environnement de bureau. Ne trouvant rien qui me satisfasse j'ai alors bidouillé un script en bash, mais avec dans un coin de ma tête l'idée que l'occasion était bien belle de me mettre enfin à Python. D'autant plus que j'utilise Battery Monitor (aka batterymon-clone) écrit en python2 et dont je me suis bien entendu largement inspiré.

Fonctionnement : une simple icône dans le systray avec un menu accessible par un clic droit

En option il est possible de jouer un son et/ou d'afficher une notification. Le jeux d'icônes et le fichier son doivent être installés pour l'instant dans /usr/local/share/lockkeys. Ils sont réunis dans cette archive.

Voici le code

#!/usr/bin/python2
# -*- coding: utf-8 -*-

#Todo mettre les messages sous forme de variable dans fichier à inclure <- internationalisation

import gtk
import glib
import os
import sys
import ConfigParser
import ctypes
try:
    import pynotify
    if not pynotify.init("LockKeys"):
        print("Il y a eu une erreur pendant l'initialisation du système de notification. Les notifications ne fonctionnerons pas.")
        pynotify = None
except:
    print("Il semble que python-notify ne soit pas installé. Les notifications ne fonctionnerons pas.")
    pynotify = None
NotifyAvailable = pynotify
 
class XKeyboardState(ctypes.Structure):
    _fields_ = [("key_click_percent", ctypes.c_int),
                ("bell_percent", ctypes.c_int),
                ("bell_pitch", ctypes.c_uint),
                ("bell_duration", ctypes.c_uint),
                ("led_mask", ctypes.c_ulong),
                ("global_auto_repeat", ctypes.c_int),
                ("auto_repeats", ctypes.c_char * 32)]
 
def initXGetKeyboardControl():
    global dpy, keyboardState, XGetKeyboardControl
   
    libX11 = ctypes.CDLL("libX11.so.6")
    XOpenDisplay = libX11.XOpenDisplay
    XOpenDisplay.restype = ctypes.c_void_p
    XOpenDisplay.argtypes = [ctypes.c_char_p]
    XGetKeyboardControl = libX11.XGetKeyboardControl
    XGetKeyboardControl.restype = ctypes.c_int
    XGetKeyboardControl.argtypes = [ctypes.c_void_p, ctypes.POINTER(XKeyboardState)]
   
    dpy = XOpenDisplay(None)
    keyboardState = XKeyboardState()
 
def runXGetKeyboardControl():
    global dpy, keyboardState, XGetKeyboardControl
    XGetKeyboardControl(dpy, ctypes.byref(keyboardState))
    return keyboardState.led_mask
 
#écrit dans le fichier de config    
def WriteConfig (Section, Key, Value):
    Config.set(Section,Key,Value)
    with open(ConfigFile, 'w') as myfile:
        Config.write(myfile)
 
#Notification (état du clavier) si pynotify != None
def notify(message,duration):
    if pynotify:
        n = pynotify.Notification('LockKeys', message)
        n.set_timeout(duration)
        n.set_icon_from_pixbuf(gtk.Label().render_icon(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_LARGE_TOOLBAR))
        n.show()
 
 
class Systray():
    def __init__(self):
        self.tray_object= gtk.StatusIcon()
        self.tray_object.connect("popup_menu", self.rightclick_menu)
        self.show_trayicon(1) ## fixed to one for now
        self._oldMask = -1 #int(runXGetKeyboardControl()) & 3
 
    def show_trayicon(self,value):
       self.tray_object.set_visible(True)
       return
 
    def property_modified(self):
        # utilse runXGetKeyboardControl() pour connaître l'état des touches capslock et numlock
        # 0 -> aucun, 1 -> capslock, 2-> numlock, 3 -> les 2
        mask=int(runXGetKeyboardControl()) & 3
        if mask != self._oldMask:
            if sound_status == True and self._oldMask != -1:
                os.system(Sound)
            notify(msg[mask],2000)
            self._oldMask = mask
            # Todo : essayer d'abord usr/share/lockkeys/ voire ~/.local/lockkeys
            icon_path = '/usr/local/share/lockkeys/' + str(mask) + '.png'
            self.tray_object.set_from_file(icon_path)
 
    # défini le menu clic droit sur l'icône
    def rightclick_menu(self, button, widget, event):
        menu = gtk.Menu()
        about_menu = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
        about_menu.connect('activate', self.about)
        exit_menu = gtk.ImageMenuItem(gtk.STOCK_CLOSE)
        exit_menu.connect('activate', self.close)
        menu.append(about_menu)
        menu.append(exit_menu)
        sep = gtk.SeparatorMenuItem()
        menu.append(sep)
        sound_menu = gtk.CheckMenuItem("Activer le son")
        sound_menu.set_active(sound_status)
        sound_menu.connect("activate", self.sound_toggle)
        menu.append(sound_menu)
        notify_menu = gtk.CheckMenuItem("Activer les notifications")
        notify_menu.set_active(notify_status)
        notify_menu.connect("activate", self.notify_toggle)
        menu.append(notify_menu)
        menu.show_all()
        menu.popup(None, None, None, 2, event)
       
    # activation / désactivation du son et enregistrement dans le fichier config
    def sound_toggle(self, widget):
        global sound_status
        if widget.active:
            sound_status=True
        else:
            sound_status=False
        WriteConfig ('helpers','sound',sound_status)
 
    # activation / désactivation des notifications et enregistrement dans le fichier config
    def notify_toggle(self, widget):
        global notify_status
        global pynotify
        if widget.active:
            notify_status=True
            pynotify=NotifyAvailable
        else:
            notify_status=False
            pynotify=None
        WriteConfig ('helpers','notification',notify_status)
 
    def close(self,button):
        sys.exit(0)
 
    def about(self, button):
        about_dg = gtk.AboutDialog()
        about_dg.set_name('Lockkeys')
        about_dg.set_version('0.2')
        about_dg.set_copyright('(C) 2014 Vincent Gay <vgay@vintherine.org>')
        about_dg.set_comments(("Simple icône dans la zone de notification pour indiquer l'état de CapsLock et NumLock"))
        about_dg.set_license('Ce script est distribuable sous licence gpl version 3 ou supérieure\nhttp://www.gnu.org/licenses/gpl-3.0.fr.html')
        about_dg.set_website('http://blog.vintherine.org')
        about_dg.run()
        about_dg.destroy()
 
class Manager:
    def __init__(self):
        self.listener = Systray()
       
    def __property_modified_handler(self):
        self.listener.property_modified()
 
    def update(self):
        self.__property_modified_handler()
        return True
 
def main():
    initXGetKeyboardControl()
    m = Manager()
    glib.timeout_add(200, m.update)
    gtk.main()
 
ConfigFile=os.path.expanduser('~/.config/lockkeys.cfg')
# aplay appartient au paquet alsa, est-ce la peine de vérifier ?
Sound = 'aplay /usr/local/share/lockkeys/ding.wav > /dev/null 2>1&'
sound_status=True
pynotify = None
Config = ConfigParser.ConfigParser()
msg=[]
msg.append('Capslock = off, Numlock = off')
msg.append('Capslock = on, Numlock = off')
msg.append('Capslock = off, Numlock = on')
msg.append('Capslock = on, Numlock = on')
 
#créer le fichier de config s'il n'existe pas
if os.path.isfile(ConfigFile) == False:
    ini = open(ConfigFile,'w')
    Config.add_section('helpers')
    Config.set('helpers','sound',True)
    Config.set('helpers','notification',False)
    Config.write(ini)
    ini.close()
 
# lire le fichier de configuration    
Config.read(ConfigFile)
try:
    sound_status = Config.getboolean("helpers", "sound")
except:
    WriteConfig ('helpers','sound',True)
try:
    notify_status = Config.getboolean("helpers", "notification")
except:
    WriteConfig ('helpers','notification',False)
    notify_status=False
if notify_status:
    pynotify=NotifyAvailable
   
main()

Si l'indentation n'est pas propre suite au copié collé merci de prendre le code sur pastebin

Dépendances :

  • python2
  • gtk2
  • pygtk
  • python2-notify (optionnel)
  • aplay (installé par alsa donc en principe présent)

Il me reste toutefois un point me chiffonne avec cette solution : le timeout qui gère l'appel à gtk. S'il est trop haut il y a un décalage entre l'appui sur les touches et le changement d'icône. S'il est trop bas la charge cpu, quoique supportable, excède 1%. Ce qui me paraît beaucoup pour une simple applet. Avec un compromis à 400 ms la charge ressort à 0,7% (Intel Pentium 2020M 2.4Ghz double cœur).

edit : problème résolu grâce aux conseils de Benjarobin. Le code ci-dessus a été modifié en conséquence.

Voilou, Il reste encore du boulot pour rendre l'application présentable mais c'est mon premier script python : ça s'arrose :-)

Chez moi ça fonctionne correctement mais si quelqu'un d'autre voulait bien tester ça serait sympa.

yaourt paginé et en couleur

extrait du wiki de archlinux.fr :

Yaourt est un programme en ligne de commande qui interface les fonctions de pacman et makepkg pour la gestion des paquets sous Arch Linux.

Cet outil bien connu des archers est particulièrement utile dans son mode interactif combinant recherche et installation (qui est du reste le mode par défaut). Pour les débianeux essayez d'imaginer un apt-cache search en couleur vous permettant de sélectionner dans le résultat le ou les paquet(s) à installer (peut-être cela existe-t-il).

Toutefois la recherche s'effectuant tant sur le nom du paquet que sur sa description, et intégrant d'office tous les paquets du dépôt des utilisateurs AUR, le nombre de lignes résultant peut vite devenir important. Et même gênant car le plus souvent ce qui nous intéresse est au sommet de la liste, provenant des dépôts officiels (core, extra, community, multilib) quand les dernières lignes que nous voyons, au moment de saisir le numéro des paquets à installer, ne contiennent que des paquets AUR. Dans un émulateur de terminal en mode graphique c'est le recours assuré à l'ascenseur ou à la molette !

Une solution est la pagination en utilisant une commande comme more, less ou most. Il existe pour cela l'option --pager. Extrait de la page man :

--pager
           Use $PAGER to show search results.

Il faut donc préalablement définir $PAGER :

export PAGER=less

ainsi la commande yaourt --pager monpaquet vous permettra de naviguer dans la liste avec les touches de paginations. Il suffira d'appuyer sur la touche q pour sortir de less et de se voir demander de saisir sa sélection.

Parfait.... mais il y a encore un petit quelque-chose à régler : la sortie n'est plus en couleur, l'option --pager désactivant cette caractéristique. Elle peut se rétablir avec l'option --color mais il faut alors demander à less d'autoriser les caractères spéciaux, ce qui se fait par l'option -r ⇒ export PAGER="less -r"

Et comme la commande finale (yaourt --color --pager) est un peu longue je me suis fait un alias et j'ai mis tout ça dans mon .bashrc :

export PAGER="less -r"
alias fromage="yaourt --color --pager"

Slides du Premier Meetup Archlinux France

Ce 21 Octobre a eu lieu le premier meetup Archlinux France, dans les locaux d’Arkena à Paris.

Deux sujets étaient à l’ordre du jour :

  • Présentation de la communauté Archlinux.fr ( par moi même )
  • Gestion de serveurs sous Archlinux ( par seblu )

35 personnes étaient présentes, ce qui est pas mal pour une première sans trop de communication (on commence doucement !)

Les discussions ont été très intéressantes, avec la présence de plusieurs developpeurs Archlinux, entre autres Guillaume , Remy , et bien sur Seblu (qui a organisé tout ça !)

Voici mes slides, présentant Archlinux.fr, son histoire, ses projets, ses besoins. Vous pouvez d’ailleurs aussi relire ce post d’il y a quelques mois).
Seblu devrait partager les siens prochainement :) :

Merci à tous les présents, et à bientôt pour la prochaine session !

Remplacer Dropbox par ownCloud

J'ai évoqué dans un précédent billet les raisons incitant au passage de Dropbox à ownCloud. Je n'y reviendrai pas, une simple recherche « Dropbox polémique » dans votre moteur de recherche habituel vous permettra de vous faire votre propre idée.

OwnCloud étant un produit libre vous pouvez évidement l'installer sur votre propre serveur, si possible auto-hébergé. Ceci est hautement recommandable d'un point de vue libriste mais pas toujours réalisable (qualité de la connexion, disponibilité matérielle et humaine....) et n'est pas l'objet de cet article. Pour le besoin de ce test j'ai utilisé les services d'un hébergeur spécialisé à savoir la mère Zaclys. Vous pouvez naturellement en choisir un autre, par exemple sur cette liste publiée sur le site de ownCloud.

Description de l'offre

La mère Zaclys est une association loi de 1901 proposant un certain nombre de services dont un lecteur de flux, un album photo, un envois de gros fichiers (pièces jointes d'e-mail)... et un cloud. L'offre de ce dernier est très modulaire et évolutive allant de 0€ pour 1Go au serveur dédié. J'ai choisi pour ma part d’adhérer à l'association pour une cotisation de 9,60€/an, ce qui me donne droit à 10Go de cloud. À ce prix là faut pas se gêner. En fait si, il faut se souvenir que c'est une association et pas un supermarché, et que chacun à sa manière peut tenter de se rendre utile.

Pour en savoir plus ça ce passe sur cette page. N'oubliez pas d'activer votre cloud après votre adhésion : c'est deux processus différents.

Interface web

Vous pouvez vous loguer sur le web à l'adresse https://webcloud6.zaclys.com/. Cela permet d’accéder à ses données depuis n'importe quel appareil connecté, même si ce n'est pas le vôtre (amis, cybercafé, boulot...). La page par défaut est votre espace de stockage mais un menu en haut à gauche vous permettra d'accéder aux différentes ressources disponibles.

À la racine de votre espace de stockage vous trouverez une documentation au format pdf de 80 pages, malheureusement en anglais. Pour les anglophobes il y a une documentation plus restreinte sur le site de Zaclys.

Dans la partie fichiers on notera la possibilité de récupérer des fichiers effacés ou revenir à une version antérieure. Il est également et évidemment possible de partager des fichiers, soit en envoyant un lien (avec ou sans mot de passe) soit en spécifiant les utilisateurs. J'aurai aimé trouver ces possibilités de partage directement intégrés dans les navigateurs de fichiers, à l'instar de dolphin-dropbox-plugin, mais mes recherches sont pour l'instant restées vaines. OwnCloud étant l'œuvre d'un développeur KDE on peut espérer que cela viendra vite.

À partir de la version 7 de ownCloud server produit une page web "responsive design", c'est à dire qui s'adapte à tous types d'écran. Ceci est particulièrement intéressant pour les utilisateurs de Firefox OS, système d'exploitation basé sur les technologies web et qui ne dispose pas (encore) d'un client spécifique.

Synchronisation des données (mise en place du client)

Vous trouverez certainement dans votre distribution un paquet owncloud-client qu'il suffira d'installer. Pour Archlinux il est dans AUR. Pour Windows, MacOS, Android et Ios (ainsi que Debian, CentOS, Fedora, Suze et Ubuntu) vous trouverez votre bonheur sur cette page.

Une fois l'installation terminée initialisez la connexion en lançant l'application soit en ligne de commande (owncloud) soit par l’icône dans le menu qui va bien (chez moi c'est dans accessoire et non pas dans réseau comme on aurait pu s'y attendre). Vous aurez à renseigner le serveur (ici https://webcloud6.zaclys.com), votre identifiant et votre mot de passe, ainsi que le dossier local que vous voulez synchroniser.

Serveur Identifiant Local Connexion

L'icône de owncloud apparaît alors dans la zone de notification (systray). Un clic gauche vous permettra d'afficher l'état de votre compte et de régler quelques paramètres

Compte Activité Généraux Réseau

Le premier panneau (compte) vous permettra notamment de connaître votre taux d'occupation. Dans le troisième (généraux) j'ai coché les cases "lancer au démarrage" et "afficher les notifications".

Un clic du bouton droit permet, notamment, d'ouvrir sa page owncloud dans le navigateur web et son dossier de fichier. Attention : les navigateurs utilisés sont définis par les propriétés de xdg-settings. Si vous utilisez un environnement de travail reconnu, comme Gnome, KDE, XFCE ou LXDE, pas de problème. Mais si, comme moi, vous n'utilisez qu'un simple gestionnaire fenêtre (openbox par exemple) il faudra les définir dans votre .xinitrc. Par exemple :

 

export DESKTOP_SESSION=LXDE
export BROWSER=firefox

Synchronisation avec un carnet d'adresse

Avec Thunderbird

Le carnet d'adresse de Thunderbird ne fonctionne pas nativement avec Carddav, il faut donc passer par une extension, SOGo Connector. Une fois celui-ci téléchargé et installé (et Thunderbird redémarré) il vous faut récupérer l'URL du carnet d'adresse de ownCloud sur la page web consacrée aux contacts. Tout en bas à gauche cliquez sur l'icône en forme de roue dentée puis ,sur la ligne correspondant au carnet d'adresse de votre choix, cliquez sur l'icône en forme de maillons et copiez l'adresse qui apparaît. Il ne reste plus qu'à afficher le carnet d'adresses de Thunderbird et appeler le menu Fichier → Nouveau → Carnet d'adresse distant. Choisissez un nom, collez l'adresse préalablement copiée sur la ligne URL et réglez les autres paramètres à votre convenance.

Si vous souhaitez profiter pleinement des propriétés des contacts carddav, et notamment des catégories, il vous faudra une extension supplémentaire : CategoryManager. Ce sera particulièrement utile pour vous retrouvez dans un carnet de plusieurs centaines d'adresses

Avec Evolution

Pas de souci, Evolution utilise nativement carddav, l'adresse à coller dans la zone URL est celle récupérée comme indiqué ci-dessus pour Thunderbird. Il vous faudra juste ajuster manuellement les catégories de contact que vous utilisez car si elle sont bien reconnues leur liste n'est pas importée (menu Édition → Catégories disponibles). Pensez à cocher l'option qui va bien ("copier localement le contenu du carnet...") si vous pensez avoir à consulter des adresses sans connexion internet. Par ailleurs Gnome-Keyring doit être installé pour gérer les mots de passe.

Avec Kaddressbook (KDE)

Comme Evolution kaddressbook utilise nativement carddav, par contre je n'ai vu nulle part comment gérer les catégories. Peut-être ai-je mal regardé ? D'une manière générale tout ce qui me paraît simple ailleurs me paraît long et compliqué avec la suite kmail. Voilà la suite d'écran par laquelle je suis passé.

Sur le 3ème écran il y a la possibilité de choisir owncloud mais je suis passé par une configuration manuelle. Voir ce tuto sur le web de Zaclys.

Avec un webmail (RoundCube)

J'utilise RoundCube lorsque je ne suis pas chez moi pour me connecter sur mon adresse sur le serveur de Gandi. Dans cette situation aussi une synchronisation du carnet d'adresse s'avérerait très utile. Malheureusement il s'avère qu'un plugin soit nécessaire et qu'en l’occurrence il n'est pas installé. Le sujet a été déjà évoqué sur Gandi Groupes mais est resté sans réponse.

J'ai donc été très intéressé de voir que Zaclys proposait une adresse mail (en beta test). Ici encore le plugin n'était pas installé mais il m'a été répondu ok on ajouteà la liste des plugin roundcube à activer

Affaire à suivre donc.

Synchronisation avec un calendrier

Avec Thunderbird (Lightning)

Il n'y a pas de calendrier nativement avec Thunderbird, mais ici encore une extension : lightning. Celle-ci accepte les connexions caldav et la procédure est très simple. Tout d'abord récupérer l'URL du calendrier à synchroniser sur l'interface web (même principe que pour le carnet d'adresse, voir plus haut), puis un clic droit dans la zone d'agendas de lightning → Nouvel agenda → suivre les instructions. Une page de tuto est consacrée à ce sujet sur le site de zaclys.

Avec Evolution

Même principe que pour le carnet d'adresse, caldav fonctionne nativement avec Evolution.

Avec korganizer (KDE)

Même principe que pour le carnet d'adresse, caldav fonctionne nativement avec korganizer.

Synchronisation avec les smartphones

Je n'ai pas (encore) de smartphone mais d'après ce que j'ai lu il y a des solutions webdav, carddav et caldav pour Android et pour Ios. Cela semble un poil plus complexe pour Firefox OS, notamment en ce qui concerne les contacts, mais faisons confiance à la communauté pour que ce besoin soit vite pris en compte.

TouchpadToggle : Gestion du touchpad

Le touchpad, je ne m'en sers que quand je ne peux pas faire autrement, c'est-à-dire quand je n'ai pas de souris. Par contre quand il est actif il me gène plus qu'autre chose et l'activité des mains sur le clavier provoque bien des erreurs. Il y a bien une touche de fonction prévue à cet usage sur mon ordinateur mais elle ne fonctionne pas nativement dans mon environnement de travail (Archlinux Openbox). Aussi je l'avais tout simplement (et paresseusement) désactivé en mettant dans mon autostart la première commande trouvée sur le web :
$ /usr/bin/synclient TouchpadOff=1 &

Curieusement cela n'affecte que le déplacement du pointeur, mais pas l'activité des boutons. ClickPad=0 résolvait partiellement le problème (le simple clic, mais pas le double) mais la recherche commençait à devenir pénible et je sentais bien que si je voulais une solution pérenne il me fallait reprendre le problème à la base. En l’occurrence la base c'est xorg (tant que Wayland n'aura pas définitivement remplacé xorg), et ça tombe bien, chez xorg ils ont commis un petit outil en ligne de commande pour gérer les périphériques d'entrée : xinput (que vous trouverez dans le paquet xorg-xinput de toutes les bonnes distributions).

Voici donc ma démarche et le petit script qui en résulte (voir à la fin de l'article). À adapter en fonction des besoins et du matériel.

Les objectifs :
  • fonctionner en bascule pour être intégré avec la susdite touche de fonction
  • détecter la présence ou non d'une souris au démarrage de ma session et désactiver le touchpad en fonction
  • afficher le résultat sous forme de notification
  • tout ceci indépendamment de l'environnement graphique

Vérifier les dépendances

avant toute chose vérifier que xinput est disponible, sinon ce n'est pas la peine d'aller plus loin.

if ! command -v xinput >/dev/null; then
    notify-send
--icon=dialog-error -t 7000 $Titre "Dépendance xorg-xinput non trouvée" 2>/tmp/touchpadError
     exit 1
fi

Pour bénéficier des notifications il faut que libnotify soit installé (voir ci-dessous) mais le message d'erreur éventuel sera enregistré dans /tmp

Prise en main de xinput

la commande xinput sans paramètre liste les périphériques détectés. Voici ce que cela donne chez moi :

[vincent@Astor ~]$ xinput
⎡ Virtual core pointer                            id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                       id=10    [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                       id=11    [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                    id=15    [slave  pointer  (2)]
⎣ Virtual core keyboard                           id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Video Bus                                   id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ USB2.0 HD UVC WebCam                        id=12    [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                            id=13    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=14    [slave  keyboard (3)]

Les renseignements qui nous intéressent sont le nom et l'identifiant. Ici on peut voir mon touchpad (ETPS/2 Elantech Touchpad, id=15) et ma souris (Logitech USB Receiver, id=10 et 11).

Pour aller plus loin une lecture de man s'impose. Les commande pour activer et désactiver un périphérique sont :

$ xinput enable identifiant
$ xinput disable identifiant

Arf... et évidement l'identifiant peut changer d'un boot à l'autre. Il faudra donc le lire. Quelque chose comme

DevID=$(xinput | grep "$NomTouchpad" | cut -d"=" -f2 | cut -d $'\x09' -f1)

ou $NomTouchpad contient le nom du périphérique (ici ETPS/2 Elantech Touchpad)

Évidement si l'on ne trouve pas de touchpad (désactivé dans le BIOS ?) on s’arrêtera là :

if [[ -z $DevID ]]; then
    notify-send
--icon=dialog-info -t 5000 $Titre "Touchpad non trouvé"
    exit
0
fi

Pour savoir l'état d'un périphérique (actif ou nom) la commande est

$ xinput list-props identifiant

Le résultat donne ceci (c'est la 2ème ligne qui nous intéresse) :

$ xinput list-props 15
Device 'ETPS/2 Elantech Touchpad':
    Device Enabled (135):    0
    Coordinate Transformation Matrix (137):    1.000000, 0.000000...etc.

ici la ligne "Device Enabled (135) : 0" nous indique que le touchpad n'est pas actif. Pour isoler la variable on peut faire quelque chose comme ça :

Enabled=$(xinput list-props $DevID | grep Enabled | tail -c2)

Il suffit donc de tester cette variable pour connaître la commande à lancer. Voilà pour le fonctionnement en bascule.

Automatiser la désactivation au démarrage si une souris est détectée

Autant pour la détection du touchpad on peut estimer que le matériel n'évoluera pas pendant la durée de vie de l'ordinateur, autant on peut considérer que changer de souris, ne serait-ce qu’occasionnellement, ça doit pouvoir s'envisager. Donc repérer le périphérique par son nom ne semble pas une bonne idée.

En revanche si l'on observe la liste issue de la commande xinput ci-dessus on voit que la rubrique Virtual Core Pointer ne contient d'autre matériel que le touchpad et la souris. Donc si l'on ne retient que les lignes contenant le mot "pointeur" et ne contenant pas le mot "Virtual", et qu'il y en a au moins 2, ce serait bien le diable s'il n'y avait pas une souris la dedans. Il y a d'autres solutions possibles, notamment lsusb ou lshw, mais outre que cela créerait une dépendance supplémentaire, je n'ai pas trouvé de formulation aussi simple.

Pour savoir si le script est appelé au démarrage on recherchera un paramètre d'appel que l'on aura placé sur la ligne de commande. Et si oui on ne le poursuivra que dans la mesure ou on supposera l'existence d'une souris.

if [[ $1 == "autostart" ]]; then
     if (( $(xinput | grep pointer | grep -vc Virtual) < 2 )); then exit 0; fi
fi

Si le touchpad a été désactivé par erreur un simple appel de la touche de fonction associé le rétablira.

En matière d'autostart la solution la plus standard me semble la création d'un fichier desktop dans $XDG_CONFIG_HOME/autostart/ (généralement ~/.config/autostart). Ça devrait ressembler à ça  :

[Desktop Entry]
Name=TouchpadToggle
GenericName=Touchpad Toggle
Comment=Activation désactivation du touchpad
Exec=touchpadtoggle autostart
Terminal=false
Type=Application
Categories=System;
StartupNotify=false

À noter le paramètre autostart passé sur la ligne de commande et évoqué plus haut pour distinguer l'appel initial d'un appel par la touche de fonction.

Gestion des notifications

Bon, ce n'est pas essentiel, mais tant qu'à faire... La dépendance à installer est libnotify, qui est également dans toutes les distributions. La commande est

$ notify-send [-i icon] [-t millisecondes] [titre] message

Les icônes seront nommées selon les spécification de la freedesktop organisation. Le rendu pourra être différent d'un environnement à l'autre et je ne l'ai testé que sous OpenBox et KDE, j'espère que ça marche partout.

Association à une touche de fonction

Bien sûr il est aisé d'utiliser les raccourcis clavier de l'environnement de bureau que l'on utilise, mais puisque l'on recherche une solution qui marche partout on préférera Xbindkeys. Ça marche avec toutes les touches de fonction et c'est indépendant des environnement de bureau. Après installation (paquet disponible dans toutes les distributions) pensez immédiatement à créer un fichier de configuration vide à la racine de votre répertoire personnel sans quoi vous auriez un message d'erreur à la première utilisation.

$ touch ~/.xbindkeysrc

Ensuite il faut définir la touche à utiliser. Dans mon cas fn→F9

$ xbindkeys -k

Cela provoque l'ouverture d'une petite fenêtre blanche et l'invite à choisir une clef ou une action souris. À la suite de quoi le résultat s'affichera dans le terminal sous cette forme :

You can use one of the two lines after "NoCommand"
in $HOME/.xbindkeysrc to bind a key.
"(Scheme function)"
m:0x10 + c:199
Mod2 + XF86TouchpadToggle

Plus clairement cela nous convie à éditer le fichier de config (~/.xbindkeysrc) et à saisir successivement la commande à exécuter et la clef associée, soit sous forme de couple modificateur / N° de clef (ici m:0x10 + c:199), soit sous forme de nom symbolique (Mod2 + XF86TouchpadToggle). Dans mon cas l'une des deux formules suivante :

# Activation / désactivation du touchpad
"touchpadtoggle"
m:0x10 + c:199

ou encore

# Activation / désactivation du touchpad
"touchpadtoggle"
Mod2 + XF86TouchpadToggle

enfin n'oubliez pas de rajouter xbindkeys avant la ligne qui démarre votre gestionnaire de fenêtre dans votre ~/.xinitrc

Récapitulatif

Si la solution vous intéresse :
  1. Installez si ce n'est déjà fait xorg-xinput, xbindkey et libnotyfy.
  2. Copiez le script ci-dessous dans un répertoire figurant dans votre $PATH (/usr/local/bin semble approprié), nommez le touchpadtoggle et rendez le exécutable (chmod +x /usr/local/bin/touchpadtoggle)
  3. Exécutez xinput et repérez la ligne correspondant à votre touchpad. Personnalisez le script en modifiant le contenu de la variable NomTouchpad
  4. Créez un touchpadtoggle.desktop dans votre répertoire ~/.config.autostart avec les données ci-dessus si vous souhaitez une désactivation automatique à l'ouverture de votre session.
  5. Créez un .xbindkeysrc vide dans votre Home et rajoutez xbindkeys dans votre ~/.xinitrc
  6. Lancez la commande $ xbindkeys -k et récupérer le code de la touche que vous voulez associer au script puis éditez votre .xbindkeysrc en conséquence.

Voilà, j'espère que je n'ai rien oublié, chez moi ça marche impeccablement. Dans tous les cas je serais heureux d'avoir votre retour.

Le script

#! /bin/bash 
######################################################
## TouchpadToggle                                   ##
## Gestion du touchpad avec xinput                  ##
##                                                  ##
## copyleft vgay at vintherine dot org              ##
## version 0.2 du 20140918                          ##
##                                                  ##
## dépendance obligatoire : xorg-xinput             ##
## dépendance optionelle libnotify                  ##
## et xbindkey pour associer ce script à une touche ##
######################################################

### Personnalisation -> mettez ici le nom de votre touchpad tel que trouvé avec la commande xinput.
NomTouchpad="ETPS/2 Elantech Touchpad"
### Début du script

IFS=
$'\n'
if
! command -v xinput >/dev/null; then notify-send --icon=dialog-error -t 7000 $Titre "Dépendance xorg-xinput non trouvée" 2>/tmp/touchpadError exit 1 fi
Cde[0]=
"xinput enable " Cde[1]="xinput disable " Msg[0]="Touchpad désactivé" Msg[1]="Touchpad activé" Titre="Gestion du touchpad :"
DevID=$(
xinput | grep "$NomTouchpad" | cut -d"=" -f2 | cut -d $'\x09' -f1) if [[ -z $DevID ]]; then notify-send --icon=dialog-information -t 5000 $Titre "Touchpad non trouvé" exit 0 fi
Enabled=$(
xinput list-props $DevID | grep Enabled | tail -c2)
if [[
$1 == "autostart" ]]; then if (( $(xinput | grep pointer | grep -vc Virtual) < 2 )); then exit 0; fi fi
Message=$(
eval ${Cde[$Enabled]}$DevID 2>&1) Enabled=$(xinput list-props $DevID | grep Enabled | tail -c2) if [[ -z $Message ]]; then notify-send --icon=dialog-information -t 5000 $Titre ${Msg[$Enabled]} else notify-send --icon=dialog-error -t 7000 $Titre $Message fi

Le chiffrement des données sur le cloud (pour les nuls)

Une affaire des photos de stars volées sur Icloud a fait quelques bruits récemment. Et comme toujours un déchaînement de commentaires tous plus beaufs les uns que les autres :

  • bien fait pour elles, n'avaient qu'à pas faire des photos cochonnes
  • bien fait pour elles, n'avaient qu'à pas utiliser icloud
  • bien fait pour elles, z'avaient qu'à mieux protéger leur données
  • ...

Bon, on ne va pas ici faire des commentaires sur les commentaires !

Par contre on peut sans doute faire un lien avec d'autres affaires qui ne firent pas autant de bruit, si ce n'est dans la communauté libriste :

Voila qui, dans un cas comme dans l'autre, apporte de l'eau au moulin des logiciels libres, tels EncFS pour le chiffrement ou Owncloud pour la synchronisation des données en ligne. L'utilisation de ce dernier fera l'objet d'un futur article, mais signalons dès à présent qu'il existe de nombreux hébergeurs offrant ce service. Et revenons au chiffrement.

EncFS est un système de fichiers chiffrés extrêmement simple à installer et à utiliser. Conçu initialement pour Linux, il est également porté sous Windows, sous Mac et sous Android.

Principe de fonctionnement

EncFS chiffre / déchiffre à la volée des données d'un répertoire en clair vers / depuis  un répertoire chiffré dédié à partir duquel il est monté.

Dans la pratique imaginons que vous désiriez protéger des données sensibles sur Dropbox. Avec EncFS vous créerez un (ou plusieurs) répertoire(s) chiffré(s) (par ex: ~/Dropbox/Private) auquel vous accéderez à travers un répertoire en clair monté en local dans l'espace utilisateur (par ex: ~/Secret). Quand celui-ci est démonté il apparaît vide.

Avantages et limitations

Contrairement à Truecrypt EncFS n'utilise pas de conteneur et chiffre directement les fichiers. En matière de sauvegardes incrémentielle et de synchronisation c'est clairement un avantage : il n'est pas nécessaire de transférer tout le conteneur à chaque écriture. Par contre cela a quelques inconvénients :

  • Cela ne permet pas le déni plausible (cacher un conteneur dans un autre).
  • le dossier de stockage est visible et si le nom des fichiers est caché le nombre de fichiers, leur taille et les droits d'accès ne le sont pas.
  • Selon un audit du 5 février 2014

    "EncFS est probablement sans danger tant que l'adversaire n'obtient qu'une copie du texte chiffré et rien de plus. Il est bien moins sûr si l'adversaire a la possibilité de voir deux ou plusieurs instantanés du texte chiffré à des moments différents"

Bref, si votre besoin est ne mettre les données de votre organisation syndicale ou politique à l'abri de la NSA, EncFS sera clairement un outil insuffisant. Par contre si vous souhaitez seulement protéger vos données personnelles de votre employeur, ou les photos de votre petite amie des paparazzi, cela devrait parfaitement convenir.

Installation et mise en œuvre

Les principales distributions comprennent généralement un paquet de EncFS. Les dépendances (essentiellement fuse) seront automatiquement installées si besoin.

Pour Debian et dérivées
$ sudo apt-get install encfs
Il est semble-t-il nécessaire que l'utilisateur appartienne au groupe fuse
sudo addgroup $USER fuse

Pour Archlinux il est dans le dépot community
$ yaourt -Sy encfs (ou $ sudo pacman -Sy encfs)

Il suffit ensuite d'évoquer encfs pour créer le système de fichier proprement dit ainsi que son point de montage en clair. Si les dossiers n'existent pas il vous sera proposé de les créer (ce qui est une bonne idée).
encfs ~/repertoire/chiffré ~/point/de/montage/en/clair
Dans notre exemple :
encfs ~/Dropbox/Private ~/Secret

On acceptera ensuite les valeurs proposées, par défaut, notamment l'option paranoïa (sinon man encfs pour plus d'option). Puis on prendra le plus grand soin à choisir un mot de passe unique, suffisamment long et compliqué.

Une fois les dossiers créés c'est la même commande (encfs ~/repertoire/chiffré ~/point/de/montage/en/clair) qui permettra le montage du répertoire. Pour le démonter on en utilisera une autre, bien connue des utilisateurs de fuse : fusermount -u /point/de/montage/en/clair.

Interface graphique

Une petite application bien sympathique permet de gérer ceci graphiquement, Cryptkeeper. Elle est présente dans Archlinux (AUR), dans les Debian et dérivées et se loge tout simplement dans la zone de notification (systray)

Une fenêtre des préférences (clic droit) permet de régler quelques paramètres.

(1) ex-secrétaire d'État américaine sous George Bush, impliquée dans les écoutes de la NSA et dans les actes de torture pendant la guerre en Irak.

Archlinux.fr passé, présent, futur

Archlinux.fr est le principal site francophone autour de la distribution Archlinux. Comme tout site animé par une communauté, il a subi des hauts et des bas au niveau de son activité. Je vais tenter de faire un état des lieux et des projets futurs.

D’abord, un petit “About me”, je suis dans l’aventure archlinux.fr depuis le quasi début (septembre 2006), et admin depuis cette époque. Je me suis co-occupé de la partie serveurs/miroirs toutes ces années (c’est mon métier après tout), et me retrouve à l’heure actuelle le dernier admin actif. D’ou ce blogpost :)

Archlinux.fr existe depuis aout 2006, suite à une scission d’ avec archlinuxfr.org (maintenant disparu) après plusieurs désaccords, un fork comme on les connait dans le monde du libre (je suis arrivé à ce moment là).

Archlinux.fr, c’est

  • Un portail, qui traduit généralement les news en français, et menant vers les autres ressources
  • Un forum d’entraide en français, ayant plusieurs milliers d’inscrits (pas tous actifs ;))
  • Un wiki
  • Un chan IRC #archlinux-fr sur freenode
  • Un miroir officiel
  • Un miroir fournissant des delta
  • AFUR, un “AUR” à la française, ou vous pouvez proposer vos paquets précompilés, utilisables via archlinuxfr
  • Un planète regroupant quelques blogs français
  • Et l’un des softs les plus connus d’archlinux : yaourt !

Le tout tourne sur 2 serveurs dédiés + un mutualisé, évidemment les dédiés tournent sur archlinux, avec un kernel linux-lts ;)

  • Un pour le site/wiki/forum
  • Un pour la partie miroir/afur
  • Le mutu pour les mails/dns/historiquement :)

Les projets en cours / à venir

  • Léger redesign du site/wiki (resynchronisation avec le design du .org)
  • A venir un redesign du forum ! (si Mike se motive)
  • Mise en place du support des signature de paquets sur [archlinuxfr] (disponible depuis pacman 4)
  • Trouver un vrai mainteneur pour yaourt (j’y reviens plus loin)
  • Tout passer en https par défaut (déjà disponible, mais pas forcé, merci globalsign pour le certificat !)
  • Pourquoi pas ajouter un miroir archlinuxarm

Yaourt, la bonne crème

Yaourt est une surcouche à Pacman, le gestionnaire de paquets d’archlinux. C’est l’une des plus vieilles surcouches encore en activité, et je pense la plus utilisée (enfin, moins depuis 2/3 ans). Écrit au départ par Wain (un des fondateurs de archlinux.fr), entièrement en bash, il a ensuite été réécrit et splitté en 2 parties par notre ami Tuxce.

  • package-query en C, pour toute la partie alpm / aur
  • yaourt en bash pour l’interface utilisateur

Package-query a grandement aidé à améliorer la vitesse d’exécution de yaourt.
Malheureusement depuis environ 1-2 ans, yaourt évolue très peu, par faute de mainteneur (wain et tuxce ayant d’autres priorités personnelles). Son code source est disponible sur github, il y a plusieurs bugs ouverts et des pull request en cours. Il y a donc besoin de bras pour cette partie ! Donc si vous vous sentez l’âme d’un mangeur de yaourt, la porte est ouverte :) Vous pouvez me contacter soit dans les commentaires, soit sur IRC, soit par mail, twitter etc pour en discuter.
J’ écrirai une version anglais à ce propos afin de toucher un plus large public :)

Et pour finir un merci à tous ceux qui participent/ont participés à archlinux.fr !

Ma procédure d'installation Archlinux

Contrairement à bon nombre de distributions Archlinux ne possède pas de LiveCD avec processus d'installation plus ou moins automatisé. Bien au contraire c'est le futur utilisateur qui doit, étape après étape, préparer son ordinateur, installer les paquets de base, choisir ses pilotes graphiques, paramétrer le système et le(s) compte(s) utilisateur(s), choisir les applications qu'il utilisera... Ce qui peut apparaître comme une tâche rébarbative à certains est en fait un exercice didactique plus qu'intéressant, seul à même d'aider à passer progressivement du rôle passif de consommateur à celui d'artisan de son système d'exploitation, c'est à dire de concepteur, agenceur, réalisateur puis administrateur.

Pour nous aider dans cette procédure nous disposons de l’excellent wiki du site archlinux.fr (ou de sa version anglaise, plus complète). La méthodologie d'installation est expliquée pas à pas et sauf configuration exotique ou trop nouvelle on y trouvera tout ce qui est nécessaire et suffisant à une installation propre. En cas de difficulté on peut également compter sur une communauté très réactive dans les forums.

Toutefois pour ceux qui installent souvent des PC install parties, boulot, amis...(1) il est tentant d'essayer d'automatiser un peu les choses.

La première étape est d'utiliser ssh : cela permet le copier / coller et évite les fautes de frappe.

Ensuite, et à condition de mettre à jour régulièrement ses fiches à partir du wiki, de compiler les instructions qui nous concernent habituellement, et celles-ci seulement. Ce n'est pas la peine par exemple de ce farcir la virtualisation, les pilotes graphiques propriétaires ou même le trio apache / php / mysql si l'on installe essentiellement des machines de bureau. En cas de besoin il sera toujours possible de retourner au wiki.

Enfin on établira une listes des applications que l'on installe par défaut. Rien de plus facile après une fraîche installation :
yaourt --nocolor -Qe | cut -d ' ' -f 1 | sort > liste_brute
leafpad liste_brute #retirer les paquets spécifiques, drivers, AUR...
cut -d \/ -f 2 liste_brute > liste

et mettre cette liste quelque part facilement atteignable. La mienne est ici est repose sur l'environnement de bureau KDE. Si l'on veut installer des paquets issus de AUR il vaut mieux en faire une liste à part et utiliser yaourt quand celui-ci sera installé.

booter sur l'image d'installation et installer ssh

loadkeys fr #taper loqdkeys fr puisque le clavier est pour l'heure en qwerty
nano  /etc/ssh/sshd_config
  #décommenter "PermitRootLogin yes"
  #décommenter "PermitEmptyPasswords no" et mettre la valeur à yes
systemctl start sshd
ifconfig #pour connaître l'adresse ip à laquelle se connecter avec ssh

Se connecter depuis une autre machine

ssh root@192.168.x.y #mettre ici l'adresse trouvée à l'étape précédente.

Partitionnement

Créez au minimum une partition racine et une pour /home. Avec les machines modernes disposant de plus de 2Go de mémoire il n'est plus nécessaire de prévoir de swap, sauf si vous prévoyez d'utiliser l'hibernation. Utilisez fdisk ou gdisk suivant que votre disque dur doive être partitionné en MBR ou en GPT. Si votre carte mère utilise un firmware UEFI il est en principe nécessaire d'utiliser GPT.


Montage des partitions

mount /dev/sdaX /mnt                    # remplacez sdaX par la partition qui va bien
mkdir /mnt/home
mount /dev/sdaY /mnt/home               # remplacez sdaY par la partition qui va bien
swapon /dev/sdaZ                        # si partition de swap

Installer la base

pacstrap /mnt base base-devel

Créer le fstab

genfstab -U -p /mnt >> /mnt/etc/fstab

chroot

arch-chroot /mnt

Nom machine

echo NomDeLaMachine > /etc/hostname

locale et fuseau horaire

echo "fr_FR.UTF-8 UTF-8 " >> /etc/locale.gen
locale-gen
echo 'LANG="fr_FR.UTF-8"' > /etc/locale.conf
export LANG=fr_FR.UTF-8
ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime

Installer xorg

pacman -Syu xorg-server xorg-xinit xorg-server-utils xf86-input-synaptics xterm

clavier

echo KEYMAP=fr-pc > /etc/vconsole.conf
nano /etc/X11/xorg.conf.d/10-keyboard-layout.conf
# coller les éléments ci-dessous
# (disposition oss avec æ et œ)
  Section "InputClass"
    Identifier         "Keyboard Layout"
    MatchIsKeyboard    "yes"
    MatchDevicePath    "/dev/input/event*"
    Option             "XkbLayout"  "fr"
    Option             "XkbVariant" "oss"
  EndSection


pacman

echo -e '\n[archlinuxfr]\nSigLevel = Never\nServer = http://repo.archlinux.fr/$arch' >> /etc/pacman.conf
cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
sed '/^#\S/ s|#||' -i /etc/pacman.d/mirrorlist.backup
rankmirrors -n 6 /etc/pacman.d/mirrorlist.backup > /etc/pacman.d/mirrorlist
pacman -Syy

Cloner

wget http://blog.vintherine.org/public/Linux/liste # mettre votre liste à la place, voir plus haut
# ou nano liste et copier / coller
pacman -S `cat liste`
rm liste
# si yaourt est dans la liste il est maintenant disponible pour installer des paquets AUR.

Pilotes graphiques

lspci | grep VGA
# En fonction du résultat choisi l'un des 3 pilotes ci-dessous pacman -S xf86-video-intel pacman -S xf86-video-ati pacman -S xf86-video-nouveau nouveau-dri libtxc_dxtn

Réseau

pacman -S networkmanager modemmanager net-tools openssh

ramdisk

mkinitcpio -p linux

root

passwd # saisir le mot de passe root
echo "export EDITOR=nano" >> /root/.bashrc

Installer grub (Système BIOS)

grub-mkconfig -o /boot/grub/grub.cfg
grub-install --no-floppy --recheck /dev/sda 

Installer grub (Système UEFI)

mkdir -p /boot/efi
mount -t vfat sdaX /boot/efi  # remplacez sdaX par votre partition EFI
mkdir -p /boot/efi/EFI        # Peut-être existe-t-il déjà si Windows a été pré-installé
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck
grub-mkconfig -o /boot/grub/grub.cfg
N.B. se reporter au wiki pour démarrer d'autres systèmes (Windows par ex.)
 

Démarrer les services

systemctl enable sshd
systemctl enable NetworkManager
systemctl enable ModemManager.service   #s'il faut gérer une clef 3G
systemctl enable kdm visudo #décommenter %wheel ALL=(ALL) NOPASSWD: ALL

Créer un utilisateur

useradd -g users -m -s /bin/bash -G sys,adm,lp,wheel,uucp,locate,games,network,video,audio,optical,storage,scanner,power <nom utilisateur>
passwd <nom utilisateur>

Quitter et redémarrer

exit
umount -R /mnt
reboot

En conclusion

Voilà ma procédure à ce jour, elle devra toujours évoluer avec la distribution. Peut-être inspirera-t-elle un archer qui aura la même problématique que moi pour établir la sienne, mais en aucun cas elle ne devrait être suivie aveuglément. Elle n'a pas vocation à remplacer le wiki mais seulement à rendre l'installation plus rapide quand on en maîtrise préalablement les principales étapes.


(1)  Pour répondre d'avance aux arguments (fallacieux) selon lesquels Arch n'est pas une distribution à installer pour tout le monde je dirais :
  • que d'après mon expérience une Arch, hors situation exceptionnelle (1 fois par an ?) est plus facile à mettre à jour qu'une Ubuntu
  • que comme en cas de problème c'est moi qui intervient autant que ce soit sur la distribution que je connais le mieux
  • que ssh ce n'est pas fait pour les chiens
  • qu'une rolling release évite une grosse manip tous les 6 mois (ou une très très grosse qui ne fonctionne pas toujours tous les 2 ans)
  • qu'avec Arch on n'a pas à s'emm..... avec les ppa
  • et que de toutes manières c'est comme ça et pas autrement. Na !

Installation d'Archlinux sur un Asus X75VD

Dans une grande surface près de chez moi j'ai trouvé un Asus X75VD en solde pour la modique somme de 350€. Sachant que Asus rembourse 42€ sur simple demande par mail (voir ci-dessous) une licence Windows 8 sans utilité, cela ramenait à 308€ pour un i3, 8Go de RAM et 750Go de disque. Ça tombait bien, le PC de ma fille aînée commençait à donner des signes de faiblesse.

À peine envoyé le mail qui va bien à Asus, et puisque le PC était destiné à ma fille, j'insérais sans délai la clé USB d'installation de la LinuxMint dont elle avait l'habitude et... écran noir. Ah ! Qu'est-ce à dire ? Mint buggué ?

Je télécharge Ubuntu, insère derechef la sus-dite clé... pour un résultat identique. Ah !

Pour vérification j'insère la clé d'installation Archlinux et là pas de problème. Le problème vient donc de xorg. Pourtant j'étais sûr qu'il y avait une GPU Intel. Je fais lspci | grep VGA pour vérifier et...

lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GF119M [GeForce 610M] (rev a1)

Damned, je suis refait, il y a 2 cartes graphiques, une Intel et une nVidia. Il s'agit de fameuse fumeuse technologie Optimus, qui valut entre autre un beau doigt d'honneur de Linus à l'adresse de nVidia. Et rien dans le BIOS permettant de désactiver l'une des deux cartes.

Retour sur la doc Ubuntu :

impossibilité de démarrer un média d'installation (LiveCD, LiveUSB) et de manière plus générale, l'impossibilité de démarrer un Linux quelconque. Ce problème est généralement dû à un Kernel Panic provoqué par le pilote libre pour carte graphique nVidia, nouveau, qui supporte très mal cette technologie.

Ben y'a qu'à pas l'installer le pilote nouveau, comme ça on restera bien sagement avec le pilote xf86-video-intel. Oui mais ça c'est pas dans la philosophie Ubuntu : par défaut on installe tous les pilotes et on laisse udev se démerder. Bon, il y a sûrement moyen de se faire une installation à la pogne mais j'ai trop peur qu'un apt-get dist-upgrade vienne tout casser. Je me décide donc pour installer une Arch, au moins je sais ce qu'il s'y passe.

Premièrement partitionner. Je décide de laisser le partitionnement en GPT et l'emploi de gdisk en lieu et place du fdisk habituel ne pose pas trop de problème. La question serait plus délicate s'il s'agissait de conserver partiellement Windows mais comme l'emploi d'un LiveCD n'est pas possible, je ne peux pas utiliser gparted.

À défaut d'être gravée dans le marbre ma procédure d'installation fait l'objet d'une petite fiche qui me permet des copier / coller dès lors que j'ai pu me connecter en ssh. Du reste je me demande pourquoi openssh n'est pas installé / démarré par défaut dans l'iso officielle. En attendant je tape les commandes habituelles :

loadkeys fr                 # pour avoir le clavier en français
pacman -Sy openssh # installer openssh
passwd # donner un mot de passe à root pour se loguer en ssh
nano /etc/ssh/sshd_config # et décommenter la ligne PermitRootLogin yes
ifconfig # pour connaître l'adresse ip
systemctl start sshd # et roule ma poule !

Je n'ai donc plus qu'à me connecter depuis un poste muni d'une interface graphique et  suivre mes fiches ou l’excellent wiki d'Archlinux. Pour les anglophobes il existe un wiki en français mais moins complet (comme d'hab). Je ne ferai donc pas un compte rendu détaillé mais me contenterai des résolutions des quelques petites difficultés rencontrées.

Grub et EFI

J'ai l'habitude d'utiliser grub comme chargeur d'amorçage, et avait pris soin de charger le module efivars avant le arch-chroot. Mais j'ai eu droit à un magnifique

modprobe: FATAL: Module efivars not found

Donc /sys/firmware/efi/efivars restait vide dans l'environnement d'installation et grub refusait de s'installer correctement. Le bug (incompatibilité de niveau entre le noyau et efibootmgr) et son contournement sont expliqués ici mais comme j'avais utilisé avec succès l'iso du mois de septembre j'ai tout simplement fini l'installation de grub avec celle-ci. Après boot sur la clé :

modeprobe efivars
arch-chroot

puis classiquement (grub, dosfstools et efibootmgr ayant été installés préalablement) :

mkdir /boot/efi
mount /dev/sdax /boot/efi/
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck
grub-mkconfig -o /boot/grub/grub.cfg
J'espère que le problème sera résolu sur la prochaine iso.

xorg

Après installation de xorg je me suis contenté d'installer xf86-video-intel sans installer ni nouveau ni le pilote propriétaire. Et comme je l'espérais cela a fonctionné sans problème. Comme ce PC est destiné à la bureautique et un peu de multimédia cela suffit amplement.

Par mesure de sécurité j'ai blacklisté le module nouveau et installé bbswitch pour éteindre la carte au boot :
-> options bbswitch load_state=0 dans /etc/modprobe.d/bbswitch.conf

Pour tout savoir sur optimus sous Archlinux voir la page de wiki consacrée à Bumblebee (la page en français pour les anglophobes)

Wifi

Maintenant que xorg fonctionne, que j'ai installé KDE et vérifié que le son fonctionne, il reste à m'occuper du réseau. Toute l'installation a été faite en utilisant l'interface ethernet, mais ma fifille utilise soit le wifi soit une clé 3G. Pour cette dernière partie il suffit d'installer modemmanager en complément de NetworkManager ainsi que usb_modeswitch. Voir la documentation ici.

Pour le wifi ça a été plus compliqué : impossible d'activer la carte, témoin éteint et touche de fonction prévue à cet usage sans effet. rfkill list me confirme cet état de fait :

rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
1: asus-wlan: Wireless LAN
Soft blocked: no
Hard blocked: yes

Tout d'abord je ne comprend pas pourquoi je vois 2 cartes au lieu d'une mais après des heures carrées de recherche sur le web je fini par trouver ce post ou un gus suggérait de blacklister un module hp-wmi. Chez moi c'était naturellement un asus-wmi que j'ai blaclisté et effectivement j'ai pu utiliser le wifi. Et rfkill list ne me montre plus qu'une carte, comprenne qui peut.

rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no

Le témoin reste éteint, la touche de fonction sans effet mais le wifi fonctionne. Bah....

Sortie de veille

Ultime vérification avant de livrer l'appareil à son destinataire, et notamment mise en veille. Et nouveau problème ! Plus de réseau ethernet en sortie de veille (le wifi fonctionne). dmesg me montre des tonnes d'erreur

kernel: alx 0000:04:00.0: invalid PHY speed/duplex: 0xffff

ifconfig up et systemctl restart NetworkManager sont sans effet, et le système crash à l'arrêt de la machine.

C'est de toute évidence le pilote alx de la carte qui est en cause. La solution est donc de le décharger à la mise en veille et de le recharger en sortie de veille. Un peu bricolo, pas très élégant, mais ça fonctionne.

sudo nano /etc/systemd/system/root-suspend.service
[Unit]
Description=Local system suspend actions
Before=sleep.target
[Service]
Type=simple
ExecStart=/usr/bin/rmmod alx
[Install]
WantedBy=suspend.target
sudo nano /etc/systemd/system/root-resume.service
[Unit]
Description=Local system resume actions
After=suspend.target
[Service]
Type=simple
ExecStart=/usr/bin/modprobe alx
[Install]
WantedBy=suspend.target

et rendre tout ceci actif au démarrage :

sudo systemctl enable root-suspend
sudo systemctl enable root-resume

Ici le post ou j'ai trouvé cette solution.

Conclusion

bon, c'est pas franchement du "out of the box", mais tout fonctionne. Youpi !

Annexe : Demande de remboursement de la taxe Windows

Mail adressé à acf_coa@asus.com

Bonjour,

Je viens de faire l’acquisition d’un Ultrabook Asus X75VD-TY256H Numéro de série D3N0CX286768119
Je suis très content de cet achat, cependant, je ne souhaite pas conserver le système d’exploitation Windows 8 qui ne me convient pas.

Je n’ai pas encore démarré la machine. Pourriez-vous me donner la procédure afin d’obtenir le remboursement de la licence Windows 8.

Mes coordonnées :
Vincent Gay
xxxxxxxxxxx, 74000 Annecy - France
Téléphone : +33 (0)4 50 xx xx xx

Vous trouverez en pièce jointe :
- copie de la facture d'achat
- copie de la page 1 de la « carte de garantie ASUS »
- photo de l'étiquette Windows situé sous l'appareil

Cordialement,

J'ai eu en retour deux formulaires pré-remplis que je n'ai eu qu'à signer et à renvoyer à la même adresse.