bannière du site

Vers un téléphone mobile libre ?

Rédigé par mistervolt Aucun commentaire

J'étais jusqu'à présent très critique envers les soit-disants “smartphones”, à juste titre je pense si on les considère du point de vue du logiciel libre, et réticent à en acquérir un. Mon vieux petit Wiko Lubi 2, un téléphone barre à l'ancienne, me suffisait amplement.
Mais ces derniers temps, il était clairement sur le déclin et commençait à avoir des comportements étranges (l'alarme qui se déclenche après l'avoir réglée, pas de tonalités en mode “discret” et autres bizarreries). Je me suis donc reposé à nouveau la question d'acquérir un smartphone ou pas.

Après 2 semaines d'hésitation et de recherches sur les alternatives pouvant me convenir, j'ai décidé de franchir le pas et d'upgrader mon forfait chez Free qui propose dans sa boutique le Wileyfox Spark + installé avec Cyanogen OS.
Si ce n'est pas totalement libre, c'est déjà un mieux vis-à-vis des Android “classiques” : plus de libertés et de possibilités de contrôle de ce qui se passe sur la machine, moins d'applications bidons préinstallées (facebook et autres saloperies du genre).
Mais, et c'est un gros mais ! il existe une différence majeure entre Cyanogen OS et Cyanogen Mod :
Cyanogen OS est la version vendue aux fabriquants de téléphones. Elle inclus quelques applications google (qu'il est possible de désactiver sans toutefois pouvoir les désinstaller) mais surtout, il n'est pas possible d'activer l'accès root sur la machine !

Be root or be dead ! (Iron Maiden Inside)

Je ne commenterai pas l'importance d'être root sur sa machine, c'est fondamental ! Si vous n'êtes pas root, quelqu'un ou quelque chose d'autre l'est, à vos dépends généralement.
Être root sans savoir ce qu'on fait est une faille de sécurité. Ne pas pouvoir être root du tout en est une aussi, bien pire à mon sens. Vous ne contrôlez pas ce que fait la machine.
Android avec ou sans Cyanogen (OS ou Mod) n'est ni plus ni moins qu'une distribution GNU/Linux et il est strictement hors de question que je ne sois pas root sur une de mes machines GNU/Linux.

Happy hacking ! !

J'ai donc décidé d'installer Cyanogen Mod par dessus Cyanogen OS de manière à reprendre le contrôle de la machine.
Voici sommairement les étapes que j'ai suivies :

Je précise que je n'ai que peu de connaissances en matière de téléphonie mobile, que c'est la 1ère fois que je fais ça, que cette procédure est sûrement propre à mon téléphone. Ne suivez pas ça aveuglément, renseignez vous abondamment avant de faire quoi que ce soit !


Sur mon ordinateur, j'ai installé adb et fastboot :

apt install adb fastboot

Sur le téléphone, j'ai activé le mode développeur en tapant 7 fois sur l'UUID (dans Paramètres => À propos du téléphone) puis le redémarrage avancé et le déverrouillage OEM du bootloader dans les Options développeurs (attention le déverrouillage du bootloader a eu pour effet de me réinitialiser complétement la machine).
J'ai connecté le téléphone à l'ordi en USB puis l'ai redémarré sur le bootloader.

Sur l'ordinateur, j'ai téléchargé ici la ROM recovery (colonne de droite) de la version de Cyanogen Mod correspondante (porridge). Puis j'ai flashé la partition /recovery avec :

fastboot flash recovery /home/moi/chemin/vers/porridge_recovery.img

Ça prend quelques secondes, une fois fait, j'ai rebooté :

fastboot reboot

Quand le téléphone a redémarré, j'ai activé l'Adb (Android Debug Bridge) en mode réseau dans les Options développeurs ainsi que le wifi.
J'ai connecté mon ordinateur au tél via adb :

adb connect 192.168.X.X:5555

(Mettre l'IP du téléphone évidemment).

J'ai téléchargé le build de Cyanogen Mod correspondant à mon matériel ici puis l'ai “poussé” sur le téléphone a un emplacement visible par le recovery :

adb push /home/moi/chemin/vers/cm-13.0-20161030-NIGHTLY-porridge.zip /storage/86D5-1DF3/Android/data/

(Le chemin du “storage” correspond à MON tél (ma carte mirco-SD en l'occurence), il est à adapter à votre matériel !)

Ça prend longtemps. Une fois fin (récupération du prompt dans le terminal de l'ordinateur), j'ai redémarré sur le recovery.
Dans le menu recovery, j'ai sélectionné “Apply update” puis j'ai navigué jusqu'au Zip précédemment déposé et l'ai sélectionné.

Le téléphone fait son travail et au reboot vous devriez voir la bouille bleue de la mascotte de Cyanogen Mod apparaître puis le téléphone va poursuivre son initialisation.
Si vous aviez des applications installés, il est très probable qu'elles crashent, il faudra les réinstaller.
Bonne surprise : la mise à jour vers Cyanogen Mod m'a viré toutes les applis google !

Note : vous pouvez retrouver ces étapes ici (en anglais) : https://wiki.cyanogenmod.org/w/Install_CM_for_porridge

Et pour finir, une pincée de logiciel libre !

Pour finir ma configuration, j'ai bien entendu activé l'accès root puis j'ai ajouté quelques applications nécessaires ou utiles :

  • F-droid, l'app store libre : https://f-droid.org ;
  • Firefox : mon navigateur favori malgré tout ;
  • Orbot et Orfox : l'équivalent du TorBrowser ;
  • AFwall+ : un pare-feu bien fait qui me permet de contrôler quelle appli peut accéder à quel interface réseau ;
  • Nextcloud : le client pour mon cloud auto-hébergé ;
  • Owncloud News : Un lecteur de news pour Owncloud/Nextcloud ;
  • Davdroid : pour synchroniser mes agendas et contacts depuis mon serveur Nextcloud sur mon téléphone ;
  • Termux : un émulateur de terminal bien foutu, fonctionnant en chroot et permettant d'installer des paquets (htop, vim) via un apt install ;
  • ConnectBot : un client SSH ;
  • OpenVPN : un client OpenVPN, toujours utile pour monitorer ou se connecter à distance à d'autres machines ;
  • VLC : pour les quelques vidéos que je serais amené à regarder, très anecdotique ;
  • MuPDF : le célèbre lecteur pdf très léger ;
  • Conversation : un client XMPP multi-compte ;
  • #AiCiA : un client IRC ;
  • Amaze : un gestionnaire de fichiers agréable à utiliser ;
  • EDIT (Merci à Yann) : OsmAnd : GPS et cartes avec OpenStreetMap.

Le reste de ma configuration est à l'avenant avec des règles de confidentialité assez drastiques et évidemment, la géolocalisation désactivée.

Je ne prétendrais pas qu'avec cela j'ai un téléphone portable 100% libre mais je pense en être aussi prêt que possible à l'heure actuelle.

Pense-bête : petit ajustement pour utilisation d'un casque audio Bluetooth

Rédigé par mistervolt Aucun commentaire

J'ai reçu en cadeau un casque audio sans fil (bluetooth), accessoire fort pratique pour continuer à écouter sa musique quand on s'éloigne 5 min de son bureau.
J'ai eu quelque soucis mineurs pour l'utiliser et il a fallu que je procède à quelques réglages que je remets ici pour mémoire et en me disant que ça pourrait profiter à d'autres.

Installer le support bluetooth pour pulseaudio si nécessaire :

apt install pulseaudio-module-bluetooth

Après ça mon casque était reconnu et je pouvais y envoyer le son mais j'avais des coupures de son voire des déconnexions avec des messages comme ça dans /var/log/syslog :

Oct 20 14:27:44 machine bluetoothd[1641]: No cache for 04:FE:A1:00:09:07
Oct 20 14:27:45 machine bluetoothd[1641]: Device is already marked as connected

Pour résoudre ça, éditer le fichier /etc/pulse/default.pa et commenter la ligne :

load-module module-bluetooth-discover

Puis éditer le fichier /usr/bin/start-pulseaudio-x11 et après les lignes :

   if [ x”$SESSION_MANAGER” != x ] ; then
        /usr/bin/pactl load-module module-x11-xsmp “display=$DISPLAY session_manager=$SESSION_MANAGER” > /dev/null
    fi

ajouter ceci :

    /usr/bin/pactl load-module module-bluetooth-discover

Enfin dans le fichier /etc/bluetooth/main.conf, changer:

ControllerMode = dual

en :

ControllerMode = bredr

Après redémarrage plus de soucis de déconnexion et un son nickel.
Lors des démarrages suivants le casque est automatiquement détecté et connecté (s'il est allumé bien sûr) et le son y est correctement redirigé aussi.

Configurer l'environnement GNOME à distance

Rédigé par mistervolt Aucun commentaire

Lors d'intervention sur une machine distance, il est utile de pouvoir manipuler via une simple connexion SSH les paramètres de l'environnement de bureau de l'utilisateur.
Si cela peut être fait via la commande gsettings lorsqu'on travaille sur la machine en direct, il faut faire appel à dconf dans le cas d'une intervention distante.

Voici une petite procédure et quelques exemples pour ça :

Accèder à la machine en SSH et se connecter sous le compte de l'utilisateur (si on était connecté en root) :

su - prenom.nom

Avant tout, déclarer dans quel "affichage" du serveur X on travaille en préfixant chaque commande avec :

DISPLAY=:0

La syntaxe de dconf est assez simple :

Lire la valeur d'une clé :

dconf read CLÉ

Écrire une nouvelle valeur dans une clé :

dconf write CLÉ VALEUR

Afficher l'ensemble des données de la base :

dconf dump

piper vers less ou à rediriger vers un fichier)

Mettre à jour la base avec les modifications apportées :

dconf update

Les CLÉS sont constituées par un chemin commençant par " / ". bash supporte l'auto-complétion pour les chemins dconf, pensez à l'utiliser.
Les VALEURS doivent être encadrés par des ' ' (en plus des " ") si ce sont des mots. Les listes entre crochets ne sont pas considérées comme des mots.

Exemples d'utilisation :

Réactiver les extensions par défaut :
(cette liste est un exemple hein !)

DISPLAY=:0 dconf write /org/gnome/shell/enabled-extensions "['alternate-tab@gnome-shell-extensions.gcampax.github.com', 'places-menu@gnome-shell-extensions.gcampax.github.com', 'drive-menu@gnome-shell-extensions.gcampax.github.com', 'topIcons@adel.gadllah@gmail.com', 'chatstatus@zeten30.gmail.com', 'applications-overview-tooltip@RaphaelRochet']"

Remettre le fond d'écran par défaut :

DISPLAY=:0 dconf write /org/gnome/desktop/background/picture-uri "'file:///home/prenom.nom/chemin/vers/image.jpg'"

Afficher les icônes sur le bureau :

DISPLAY=:0 dconf write /org/gnome/desktop/background/show-desktop-icons/ "'true'"

Détacher les fenêtres de dialogue de la fenêtre principale :

DISPLAY=0 dconf write /org/gnome/mutter/attach-modal-dialogs "'false'"

Afficher les boutons "Minimiser", "Maximiser", "Fermer" sur les fenêtres :

DISPLAY=:0 dconf write /org/gnome/desktop/wm/preferences/button-layout "'appmenu:minimize,maximize,close'"

Dans tous les cas, finir par un

DISPLAY=:0 dconf update

pour mettre à jour la base
Les modifications apportées seront visibles de l'utilisateur après reconnexion à sa session.

Toutes les CLÉS disponibles dans gsettings sont disponibles dans dconf. Il faut juste penser à remplacer les "." (séparateur gsettings) par des "/" (séparateur dconf).

Compiler la dernière version de GNU Emacs (25.1) sur Debian Stretch

Rédigé par mistervolt Aucun commentaire

Dans cet article, je vous présente rapidement comment compiler GNU Emacs (en dernière version) sur Debian Testing (avec interface GTK3).
Le tout ne devrait pas vous prendre plus de 10 min.

Tout d'abord on récupère l'archive :

wget http://ftp.igh.cnrs.fr/pub/gnu/emacs/emacs-25.1.tar.xz

On DL et on importe le trousseau des clés GPG GNU :

wget https://ftp.gnu.org/gnu/gnu-keyring.gpg
gpg --import gnu-keyring.gpg

Grâce à la clé, on vérifie notre archive :

gpg --verify emacs-25.1.tar.xz.sig emacs-25.1.tar.xz

Cette commande devrait vous renvoyer le résultat suivant :

gpg: Signature faite le sam. 17 sept. 2016 19:06:16 CEST
gpg:                avec la clef RSA 0x233587A47C207910
gpg: Bonne signature de « Nicolas Petton <petton.nicolas@gmail.com> » [inconnu]
gpg:                 alias « Nicolas Petton <nicolas@petton.fr> » [inconnu]
gpg: Attention : cette clef n'est pas certifiée avec une signature de confiance.
gpg:             Rien n'indique que la signature appartient à son propriétaire.
Empreinte de clef principale : 28D3 BED8 51FD F3AB 57FE  F93C 2335 87A4 7C20 7910

Notre archive étant vérifiée, on peut l'extraire :

tar xvf emacs-25.1.tar.xz

On entre dans le dossier :

cd emacs-25.1

En root on installe les dépendances de compilation (ça peut varier, chez moi il manquait les bibliothèques suivantes) :

apt-get install libgtk-3-dev libxpm-dev libjpeg-dev libgif-dev libtiff5-dev

On repasse en $USER normal puis on lance la commande de configuration pré-compilation.
Il est évidemment possible de passer des options à cette commande pour compiler Emacs sans certaines fonctionnalités (ex: --with-x=no pour ne pas activer le support graphique ou encore --prefix=/un/chemin pour que l'installation finale se fasse ailleurs que dans /usr/local/. Je vous laisser lire le fichier INSTALL pour plus d'informations) :

./configure
make

La compilation prend plusieurs minutes, une fois finie on teste notre binaire :

src/emacs -Q

Si c'est tout bon, on peut l'installer pour tout le système si on veut (commande à lancer en tant que root donc) :

make install

Et voilà, si vous avez conservé les options par défaut, GNU Emacs 25.1 devrait être installé dans /usr/local/bin et un lanceur a du apparaître dans le menu des applications de votre environnement de bureau.

Un .vimrc remis au propre

Rédigé par mistervolt Aucun commentaire

Les utilisateurs de Vim seront possiblement intéressés, les autres pourraient avoir envie de s'y mettre.
J'ai mis au propre et à jour ma configuration de Vim (~/.vimrc), après notamment des ajouts de plugins et d'une configuration en mode "IDE pour Python", langage que je me suis mis en tête d'apprendre.
Je le partage donc sur le blog en espérant que ça puisse être utile et en guise d'archive personnelle :

" | ---------------------------------------------------------------------------
" | File    : ~/.vimrc
" | By      : sogal
" | ---------------------------------------------------------------------------

" GENERAL OPTIONS :
" -----------------------------------------------------------------------------
set nocompatible     " Ne pas assurer la compatibilité avec l'ancien Vi
set encoding=utf8    " Encodage en utf-8
set mouse=a          " Sélection à la souris
set history=50       " Nombre de commandes dans l'historique

" Montrer les tabulations, espaces insécables et de fin (eol:¶)
set list listchars=nbsp:¤,tab:··,trail:¤,extends:▶,precedes:◀

set viminfo='20,\"50 " Options du fichier ~/.viminfo
set backspace=2      " Active la touche Backspace
set wrap
" Wrappe et justifie à 79 caractères avec la touche '@'
map @ {v}! par 79j
" Autorise le passage d'une ligne à l'autre avec les flèches gauche et droite
set whichwrap=<,>,[,]
" Essaye de garder le curseur dans la même colonne quand on change de ligne
set nostartofline
" Option de la complétion automatique
set wildmode=list:full
set wildchar=<Tab>
set wildmenu         " Meilleur complétion des commandes dans la ligne de status
set tabstop=4 shiftwidth=4 expandtab " Pas de vraies tabulations
set softtabstop=4    " Backspace supprime 4 espace d'un coup
set ignorecase       " Les recherches ne sont pas 'case sensitives'...
set smartcase        " ... sauf si le pattern recherché contient des majuscules
" Le pliage se base sur l'indentation du fichier
set foldmethod=indent
set foldnestmax=3    " 3 niveaux de pliage maxi
set nofoldenable     " Ne pas plier par défaut
set incsearch        " Recherches incrémentalees
set hlsearch         " Mettre en surbrillance le mot cherché
set autoread         " Auto lecture si le fichier a été modifié depuis l'extérieur

" UI :
" -----------------------------------------------------------------------------
colorscheme molokai  " Thème de couleur
syntax enable        " Active la coloration syntaxique
" Contenu de la barre de status
set statusline=%F\ Type=%y\ %=Pos=%l,%c\ (%p%%)\ SLOC=%L\ %P
set laststatus=2     " Barre de status toujours visible
set t_Co=256         " Utiliser 256 couleurs
set textwidth=78     " Largeur maxi du texte inséré
set colorcolumn=80   " Mise en couleur colonne n°80
set showcmd          " Affiche les commandes dans la barre de status
set showmatch        " Affiche la paire de parenthèses
set number           " Afficher les numéros de ligne
set splitright
" set relativenumber   " Mode numérotation des lignes relative

" INDENT :
" -----------------------------------------------------------------------------
set smartindent
" Options d'indentation pour un fichier C
set cinoptions=(0
set shiftwidth=4     " Nombre d'espace dans l'indentation

" MAPPING :
" -----------------------------------------------------------------------------
" Remapper pour conserver la sélection
vnoremap < <gv
vnoremap > >gv
" Mapper Y pour copie jusqu'à fin de ligne
map Y y$
" U n'est pas utile, en faire un redo (Ctrl - R)
map U <C-r>
" kj est plus rapide à atteindre que <Esc>
inoremap kj <Esc>
cnoremap kj <Esc>
" L sépare une ligne à la position du curseur (inverse de J)
nnoremap L i<Enter><Esc>
" Mapper pour split navigation
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>
" Mapper leader key
let mapleader = ","
" ,r passe en mode num ligne relatives
map <leader>r :set relativenumber<CR>
" Folding avec espace
nnoremap <space> za

" POWERLINE :
" -----------------------------------------------------------------------------
" set rtp+=/usr/share/vim/vimfiles/plugin/powerline.vim
" python from powerline.vim import setup as powerline_setup
" python powerline_setup()
" python del powerline_setup
" set laststatus=2
" set t_Co=256

" SCROLLING :
" -----------------------------------------------------------------------------
set scrolloff=8         " Conserver 8 lignes visibles en scrollant verticalement
set sidescrolloff=15    " Conserver 15 colonnes visibles en scrollant horizontalement
set sidescroll=1

" ASTUCES :
" -----------------------------------------------------------------------------
" Rouvrir le fichier là où on l'a quitté
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
" :set scrollbind    " Scroller syncro entre 2 fenêtres

" WRAPPING INTELLIGENT EN FONCTION DU TYPE DE FICHIERS :
" -----------------------------------------------------------------------------
" Définir wrap et textwidth en fonction du fichier ou de son emplacement
function! SetupEnvironment()
  let l:path = expand('%:p')
  if l:path =~ '/home/sogal/.*'
    setlocal textwidth=0
  elseif (&ft == 'c' || &ft == 'html' || &ft == 'sh' || &ft == 'txt2tags')
    setlocal textwidth=0
  elseif (&ft == 'mail')
  " Largeur à 72 car. pour les mails
    setlocal textwidth=72
  else
  " Le défaut est à 78 car.
    setlocal textwidth=78
  endif
endfunction
au BufReadPost,BufNewFile * call SetupEnvironment()

" txt2tags
au BufNewFile,BufRead *.t2t map 2l :w<CR>:!txt2tags -t html "%" ; unoconv -f odt "%:r.html" <CR>
au BufNewFile,BufRead *.t2t map 2h :w<CR>:!txt2tags -t html -o /tmp/txt2tags_apercu.html "%" ; firefox "file:///tmp/txt2tags_apercu.html" <CR>
au BufRead,BufNewFile *.t2t set tw=78
au BufNewFile,BufRead *.t2t set spell
au BufNewFile,BufRead *.t2t setlocal spell spelllang=fr
au BufNewFile,BufRead *.t2t set ft=txt2tags
au BufNewFile,BufRead *.t2t set noexpandtab

" PYTHON IDE :
" -----------------------------------------------------------------------------
" Exécuter le script avec '2p'
au BufNewFile,BufRead *.py map 2p :w<CR>:!python3 "%"<CR>
" Vérifier conformité du script à la PEP8 avec '2P'
au BufNewFile,BufRead *.py map 2P :w<CR>:!python3-pep8 '%'<CR>
" Paraméter le fichier pour conformité à la PEP8
au BufNewFile,BufRead *.py
    \ set tabstop=4 |
    \ set softtabstop=4 |
    \ set shiftwidth=4 |
    \ set textwidth=79 |
    \ set expandtab |
    \ set autoindent |
    \ set fileformat=unix |

let python_highlight_all=1                  " Highlight du code

" VUNDLE ET CONFIGURATION DES PLUGINS ET DE LEUR ENVIRONNEMENT :
" -----------------------------------------------------------------------------
set rtp+=~/.vim/bundle/Vundle.vim
" L'environnement Vim inclus Vundle et l'exécute au lancement
call vundle#begin()
Plugin 'gmarik/Vundle.vim'

" Ajouter les plugins ci-dessous :
" (note older versions of Vundle used Bundle instead of Plugin)
" -----------------------------------------------------------------------------
Plugin 'tmhedberg/SimpylFold'               " Meilleur folding
let g:SimpylFold_docstring_preview=1        " Voir la docstring du code foldé

" Indentation conforme PEP8
Plugin 'vim-scripts/indentpython.vim'

" Meilleur autocomplétion Python
Bundle 'Valloric/YouCompleteMe'

" Fermer la fenêtre d'autocomplétion après usage
let g:ycm_autoclose_preview_window_after_completion=1

" ,g amène vers la définition de l'élément complété
map <leader>g  :YcmCompleter GoToDefinitionElseDeclaration<CR>

" Python avec support virtualenv (pour PATH plugin YoukCompleteMe):
" -----------------------------------------------------------------------------
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
  project_base_dir = os.environ['VIRTUAL_ENV']
  activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
  execfile(activate_this, dict(__file__=activate_this))
EOF

Plugin 'scrooloose/syntastic'               " Vérif syntaxe Python
Plugin 'nvie/vim-flake8'                    " Ajout check conformité PEP8

" Navigateur de fichiers dans une side-bar
Plugin 'scrooloose/nerdtree'
map <leader>t :NERDTreeToggle<CR>           " ,t affiche l'arborescence
let NERDTreeIgnore=['\.pyc$', '\~$']        " Ignorer fichier .pyc in NERDTree

" Barre de status (+ light que powerline)
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'

" *TOUS* les plugins sont à ajouter et configurer avant cette ligne !
call vundle#end()                           " Requis
filetype plugin indent on                   " Requis

" DEMARRAGE AUTO DES PLUGINS :
" -----------------------------------------------------------------------------
autocmd VimEnter * NERDTree
Fil RSS des articles