volted.net

A blog about being free, as in free speech

Divinity Original Sin sous openSUSE GNU/Linux

28 décembre, 2018 — sogal

Parmi les jeux de rôles que j'aime bien, il y a Divinity Original Sin. La suite du jeu, le 2, est sorti il y a quelques temps et je me le suis offert en cette fin d'année sur console. Du coup ça m'a fait pensé que le premier opus, qui a quelques années maintenant, tournerait peut-être correctement sur mon portable (openSUSE Leap). J'ai donc regardé sur GOG et, cool, il était à 9,99€, c'est parti pour le téléchargement.

Une fois récupéré, l'installeur se présente sous la forme d'un script qui va installer les composants du jeu.

Une fois installé, j'essaye de le lancer et pas de bol, ça plante ! Je me retrouve avec des erreurs du type :

(0) /usr/lib/libpthread.so.0 : +0x10d60 [0x7f360f099d60]
(1) ./libOGLBinding.so : api::OpenGLRenderer::ApplyConstants()+0x65 [0x7f360ffd57d5]
(2) ./libRenderFramework.so : rf::Renderer::Apply(bool)+0x57 [0x7f360fc74207]
(3) ./EoCApp : ig::IggyBinding::Swap(rf::Renderer*)+0xfc [0xebf16c]
(4) ./libGameEngine.so : BaseApp::EndDrawGUI(rf::Renderer*)+0x9b [0x7f360fdd288b]
(5) ./libGameEngine.so : BaseApp::MakeFrame()+0x3a4 [0x7f360fdd2db4]
(6) ./libGameEngine.so : BaseApp::OnIdle()+0xe0 [0x7f360fdd1590]
(7) ./EoCApp : main+0x170 [0x6d4430]
(8) /usr/lib/libc.so.6 : __libc_start_main+0xf0 [0x7f360ed01610]
(9) ./EoCApp : _start+0x29 [0x6d41a9]

En farfouillant un peu sur le Web, je trouve un rapport de bug sur Freedesktop.org.

Par chance, ce dernier contient une solution : il faut récupérer un pre-loader qui va pallier le soucis:

curl https://bugs.freedesktop.org/attachment.cgi\?id\=125302 > divos-hack.c

Puis le compiler :

gcc -s -O2 -shared -fPIC -o divos-hack.{so,c} -ldl

Et le copier dans le répertoire contenant les données du jeu :

cp divos-hack.so $HOME/Jeux/Divinity_Original_Sin_Enhanced_Edition/game/

Enfin, il convient d'adapter le lanceur du jeu. J'ai créé un petit wrapper qui lance le jeu avec les options correctes :

#!/bin/bash

allow_glsl_extension_directive_midshader=true LD_PRELOAD='$HOME/Jeux/Divinity_Original_Sin_Enhanced_Edition/game/divos-hack.so' $HOME/Jeux/Divinity_Original_Sin_Enhanced_Edition/start.sh

Puis j'ai adapté le lanceur présent dans $HOME/.local/share/applications/gog_com-Divinity_Original_Sin_Enhanced_Edition_1.desktop :

[Desktop Entry]
Encoding=UTF-8
Value=1.0
Type=Application
Name=Divinity: Original Sin - Enhanced Edition
GenericName=Divinity: Original Sin - Enhanced Edition
Comment=Divinity: Original Sin - Enhanced Edition
Icon=/home/user/Jeux/Divinity_Original_Sin_Enhanced_Edition/support/icon.png
Exec="/home/user/Jeux/Divinity_Original_Sin_Enhanced_Edition/DivinityLauncher.sh"
Categories=Game;
Path=/home/user/Jeux/Divinity_Original_Sin_Enhanced_Edition

Attention : dans ce fichier il faut bien passer les chemins complets.

Ceci fait, le jeu se lance sans problème et je peux en profiter durant mes trajets quotidiens en train, le tout sur un simple Thinkpad T450 avec une puce graphique Intel et sous openSUSE of course !

Divinity sous Linux

Tags: tips

Astuce : connexion VNC over SSH

14 décembre, 2018 — sogal

Aujourd'hui juste une petite astuce, ou un rappel pour certains, sur la façon de sécuriser une connexion VNC grâce à l'usage d'un tunnel SSH.

Dans ce post, je suppose que vous avez déjà une connexion SSH fonctionnelle entre votre poste et la machine cible (celle qui exécute le serveur VNC). Cela peut être réalisé très simplement via la commande suivante :

ssh -f -L 5901:localhost:5901 machine.domain.tld sleep 10 ; vncviewer-tigervnc 127.0.0.1:5901

Si on décompose la commande, cela donne :

  • -f : on demande à SSH d'exécuter la commande qu'on va lui passer en arrière-plan, ce qui évite une coupure du flux et nous permet d'exécuter le client VNC par la suite ;
  • -L 5901:localhost:5901 : on va rediriger les connexions s'effectuant sur la machin client et sur le port 5901 vers le port 5901 de la machine distante ;
  • machine.domain.tld : la machine distante, qui exécute le serveur VNC ;
  • sleep 10 : la commande à faire exécuter sur la machine distante, cela nous permet de conserver la connexion ouverte car l'option -f requiert forcément une commande à passer en arrière-plan. Et comme on va lancer notre client VNC dans la foulée, il y aura toujours un flux de données et la connexion sera maintenue. En revanche, si le client VNC est fermée, la connexion se fermera au bout de 10 secondes ;
  • vncviewer-tigervnc 127.0.0.1:5901 : on connecte le client VNC sur le port local 5901, connexion que SSH va rediriger vers le port 5901 distant, comme indiqué ci-dessus.

Si l'on ne veut pas que le serveur VNC tourne en permanence sur la machine distante, on pourrait même imaginer ajouter une pré-commande du type :

ssh machine.domain.tld vncserver :1

Puis une post-commande pour terminer le serveur VNC une fois qu'on a fini :

ssh machine.domain.tld vncserver -kill :1

Tags: tips

Afficher le virtualenv Python dans son prompt ZSH

08 décembre, 2018 — sogal

Voici une petite astuce bien pratique lorsqu'on utilise des virtualenv Python. C'est quand même assez pratique, quand on a plusieurs terminaux ouverts, de savoir si oui ou non on se trouve dans un virtualenv et si oui, lequel. Ça peut éviter des bêtises aussi.

Pour ce faire, j'ai ajouter les éléments suivants à mon $HOME/.zshrc:

function virtualenv_info () {
    [ $VIRTUAL_ENV ] && echo "($(basename $VIRTUAL_ENV)) "
}

export VIRTUAL_ENV_DISABLE_PROMPT=0

Puis dans mon prompt, j'ai ajouté $(virtualenv_info) comme suit:

LPROMPT='$(virtualenv_info)$(pwd_icon) %F{yellow}%2c%f %F{magenta}❱%f '

Ce qui donne, dans mon prompt complet:

ZSH virtualenv

Tags: terminal, tips

Tester Gimp 2.9.5 avec Flatpak

02 décembre, 2018 — sogal

Flatpak (anciennement xdg-app), tout comme AppImage, est une solution visant à simplifier et uniformiser l'installation d'applications sur différentes distributions GNU/Linux. Le but est de fournir un espace cloisonné (sandbox) dans lequel s'exécute l'application, c'est une forme de virtualisation mais d'application uniquement et non d'un système complet. Cela permet donc aux utilisateurs curieux de tester les dernières versions de leurs logiciels favoris sans avoir à les compiler, ni à se soucier des dépendances.

Installation de Flatpak :

Voyons comment installer ça :

zypper install flatpak

Configuration :

Nous ajoutons ensuite les dépôts depuis lesquels nous allons par la suite installer le runtime (un environnement d'exécution virtualisé) :

wget https://sdk.gnome.org/keys/gnome-sdk.gpg
flatpak remote-add --gpg-import=gnome-sdk.gpg gnome https://sdk.gnome.org/repo/
flatpak remote-add --gpg-import=gnome-sdk.gpg gnome-apps https://sdk.gnome.org/repo-apps/

Puis installation de la plateforme, ici celle de Gnome 3.20 puisque c'est une application GTK que je souhaite installer. J'en profite pour traduire (et résumer) 2 passages de la F.A.Q. qui rassureront ceux qui n'utilisent ni Gnome comme environnement de travail, ni Fedora comme OS :

Flatpak est-il lié à Gnome ?

Non. Bien que Flatpak ait été développé par des gens impliqués depuis longtemps dans la communauté Gnome, il n'est lié à aucun environnement de bureau. En réalité, il a été conçu avec pour objectif clair de permettre la construction d'applications utilisant n'importe quel base de bibliothèques ou langage de programmation souhaités par l'auteur.

Flatpak est-il lié à Fedora ?

Non. Les développeurs ont une expérience de Fedora [...] mais Flatpak a été développé de manière à faire abstraction de la distribution et à se déployer sur n'importe quel système GNU/Linux disponible. Nous avons pris contact et discuté avec des représentants d'autres distributions très tôt dans le projet.

Installer une application :

Assez de blabla, on installe Gimp !

flatpak install gnome org.gnome.Platform 3.20

Passons maintenant à ce qui nous intéresse vraiment : l'installation des applications ! Dans cet exemple, nous allons installer Gimp dans sa version de développement " Nightly" et donc ajouter le dépôt "Nightly graphics" et sa clé :

wget http://209.132.179.2/keys/nightly.gpg
flatpak remote-add --gpg-import=nightly.gpg nightly-graphics http://209.132.179.2/repo/

Pour voir ce que contient ce dépôt :

flatpak remote-ls nightly-graphics --app

net.scribus.ScribusDevel
org.darktable.DarktableDevel
org.gimp.GimpDevel
org.gimp.GimpDevelGtk3
org.inkscape.InkscapeDevel
org.mypaint.MypaintDevel
org.telegram.TelegramDesktopDevel

Il contient quelques applications qui intéresseront les graphistes !

Installons donc Gimp :

flatpak install nightly-graphics org.gimp.GimpDevel master

Et enfin, nous pouvons en profiter :

flatpak run org.gimp.GimpDevel

gimp-night

Pour les utilisateurs de Gnome (et possiblement d'autres DE mais je n'ai pas testé), l'application est même ajoutée au menu des applis. Je peux donc avoir simultanément ma version stable de Gimp et celle de développement sans avoir recours à une VM ni un chroot "classique" !

Tags: gnome, tips

Un .vimrc remis au propre

02 décembre, 2018 — sogal

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

Tags: terminal, tips

Réduire la taille d'un volume système en RAID1

02 décembre, 2018 — sogal

Lors de l'installation de ma station de travail en openSUSE Leap 42.3, je n'avais pas créé de partition /home dédiée, n'en ayant alors pas l'utilité. Mes besoins ayant changé, me voici avec une partition racine sur un RAID1 qu'il va me falloir réduire sans perte de données, car je n'ai pas l'intention de réinstaller. Je partage ici la procédure que j'ai suivie dans l'espoir qu'elle puisse vous être utile.

Le contexte :

  • Un RAID1 nommé /dev/md127 composé de /dev/sda3 et /dev/sdb3
  • ... d'une taille de de 216 Go
  • ... contenant un système de fichiers au format btrfs
  • ... que je veux réduire à 51 Go (soit 10 Go de plus que la taille actuellement consommée)
  • ... dont les partitions débutent, sur leur disque respectif, à 8.5 Go.

Préparation :

Bien entendu, afin de pallier tout problème éventuel, j'ai fait une sauvegarde complète de mon /home :

rsync -arv --progress /home/ /run/media/sogal/MyDisk/homebak/

Et j'ai testé ma procédure par deux fois dans une machine virtuelle reproduisant le contexte énoncé précédemment.

Puis j'ai lancé l'utilitaire btrfs de défragmentation sur / au cas où :

btrfs filesystem defragment -r -v /

Ceci étant fait, je peux passer à la phase du redimensionnement proprement dit. Pour cela, il me faut un système live, j'ai pris la dernière Linux Mint, seule ISO Live récente que j'avais sous la main, avec laquelle j'ai créé une clé USB bootable.

La procédure :

  1. Démarrer sur la clé USB ;

  2. Installer les utilitaires de gestion RAID nécessaires :

    apt-get install mdadm
    
  3. Charger les modules nécessaires :

    modprobe mdio
    modprobe linear
    modprobe multipath
    modprobe raid0
    modprobe raid1
    modprobe raid5
    modprobe raid6
    modprobe raid10
    
  4. Chercher les volumes RAID présents :

    mdadm --examine --scan
    
  5. Activer les volumes RAID trouvés :

    mdadm -A --scan
    
  6. Monter le volume RAID1 à réduire :

    mount /dev/md127 /mnt
    
  7. Redimensionner le système de fichiers :

    btrfs filesystem resize -165G /mnt
    

    Cette opération a pris un bon moment, laisser le travail se faire !

  8. Une fois le système de fichiers btrfs réduit, démonter le volume RAID1 :

    umount /mnt
    
  9. Mettre une des partitions en échec :

    mdadm /dev/md127 --fail /dev/sda3
    
  10. Puis la retirer du RAID :

    mdadm /dev/md127 --remove /dev/sda3
    
  11. Redimensionner la partition un poil plus grand que le système de fichiers :

    parted /dev/sda → resizepart 3 → end 60GB→ Yes → quit
    
  12. Vérifier le système de fichiers :

    btrfs check /dev/sda3
    

    Il va renvoyer une série de messages qui ne veulent pas dire que le système de fichiers est corrompu, pour s'assurer de la réussite du test, vérifier son code de retour :

    echo $?
    

    si c'est 0, c'est tout bon.

  13. Réduire le volume RAID1 à une taille légèrement inférieure à celle des partitions qui le composent (j'ai mis 500 Mo de moins) :

    mdadm --grow /dev/md127 --size=xxxx
    

    où xxxx = taille souhaitée en GB * 1024 * 1024

  14. Rajouter le disque au RAID :

    mdadm /dev/md127 --add /dev/sda3
    
  15. Attendre la reconstruction du volume RAID1, visible en lançant :

    cat /proc/mdstat
    
  16. Faire pareil avec l'autre partition (/dev/sdb3 dans mon cas) (étapes 8 à 14 mais pas la 13 !)

  17. Agrandir le volume RAID1 au maximum de la nouvelle taille des partitions qui le composent :

    mdadm --grow /dev/md127 --size max
    
  18. Redémarrer sur votre système habituel :

    reboot
    

Le résultat :

Au redémarrage sur ma Leap, rien à signaler, mes disques /dev/sda et /dev/sdb disposent maintenant d'un espace libre de 165 Go dans lequel j'ai pu créer, respectivement les partitions /dev/sda4 et /dev/sdb4 que j'ai ajouté à un nouveau volume RAID1 (chiffré pour le coup) dans lequel j'ai transféré mon /home.

Enjoy !

Tags: tips, opensuse

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

02 décembre, 2018 — sogal

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 :

zypper 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.

Tags: tips

Découvrir Powerline et l'installer sous openSUSE

30 novembre, 2018 — sogal

Powerline est un plugin de ligne de statut et de prompt pour diverses applications telles que Bash, Zsh, Vim, tmux ou encore des gestionnaires de fenêtres comme Awesome.

Dans cet article, nous vous proposons de découvrir comment l'installer et s'amuser un peu avec.

Installation dans openSUSE :

Powerline est constitué d'un programme principal, le powerline-daemon, et de plusieurs plugins pour les applications dans lesquelles il s'intègre :

zypper in powerline powerline-fonts

Nous avons ici l'essentiel pour configurer le prompt de notre shell grâce à Powerline.

Configuration

Bash

C'est très simple, il suffit d'ajouter les lignes suivantes dans notre $HOME/.bashrc :

if [ -f `which powerline-daemon` ]; then
  powerline-daemon -q
  POWERLINE_BASH_CONTINUATION=1
  POWERLINE_BASH_SELECT=1
  . /usr/share/powerline/bash/powerline.sh
fi

On enregistre et on recharge le fichier de configuration de Bash :

source .bashrc

Zsh

Ajoutez la ligne suivante à votre $HOME/.zshrc :

source /usr/share/powerline/zsh/powerline.zsh

Pour configurer Powerline, il faut éditer le fichier $HOME/.config/powerline/themes/shell/default.json (créer les dossiers et le fichier s'ils n'existent pas).

Je vous propose une configuration qui fonctionne à la fois sous Bash et Zsh (pour ce dernier, il y a un prompt supplémentaire à droite) :

{
    "segments": {
        "left": [
            {
                "name": "user",
                "function": "powerline.segments.common.env.user",
                "priority": 30
            },
            {
                "name": "cwd",
                "function": "powerline.segments.common.env.cwd",
                "args": {
                    "dir_limit_depth": 1
                }
            }
        ],
        "right": [
            {
                "function": "powerline.segments.common.sys.system_load"
            },
            {
                "function": "powerline.segments.common.time.date",
                "args": {
                    "istime": "True",
                    "format": "%T"
                }
            },
            {
                "function": "powerline.segments.common.vcs.branch"
            },
            {
                "function": "powerline.segments.shell.last_status"
            },
            {
                "function": "powerline.segments.common.players.mpd"
            }
        ]
    }
}

Ceux qui ont des portables voudrons sûrement ajouter l'instruction suivante qui permet d'avoir le niveau de charge de la batterie façon Super Mario, avec des cœurs :

{
      "function": "powerline.segments.common.bat.battery",
      "args": {
        "gamify": 1
      }
    },

Installation pour Vim :

zypper install vim-plugin-powerline

Et là, rien à faire, Powerline s'active tout seul dans Vim.

Installation pour tmux :

zypper install tmux-powerline

Et ajoutez ceci à votre fichier $HOME/.tmux.conf :

source "/usr/share/tmux/powerline.conf"

Redémarrer le daemon Powerline :

Si quelque chose ne va pas ou bien pour forcer le chargement de la configuration après modification de celle-ci, il peut être nécessaire de relancer Powerline en place. Pour ce faire, il suffit de lancer la commande suivante :

powerline-daemon --replace

Aller plus loin :

Cet article quelques unes des possibilités, très nombreuses, offertes par Powerline, en espérant que cela vous donner envie de l'essayer pour égayer un peu vos terminaux. Vous retrouverez tout les détails de configuration dans la documentation en ligne ou, pour l'avoir toujours sur soi :

zypper install powerline-docs

Have fun !

Tags: tips

Bien configurer son client SSH pour gérer de multiples connexions à l'aide de divers moyens d'authentification

30 novembre, 2018 — sogal

L'usage de SSH permet de sécuriser les connexions distantes, que ce soit avec les postes client ou les serveurs et matériels d'infrastructure. Une très bon niveau de sécurité peut être atteint grâce à l'usage de clés SSH, particulièrement si elles sont chiffrées à l'aide d'une phrase de passe.

Toutefois cela peut devenir une contrainte surtout si des moyens d'authentification différents sont utilisés en fonction des machines à connecter.

Pour cela, il est impératif de bien configurer son client SSH et d'utiliser un agent SSH.

Introduction

Configurer SSH n'est pas très compliqué à condition de garder en tête quelques règles simples de syntaxe et de comprendre la façon dont SSH interprète votre fichier de configuration. Cela peut prendre un peu de temps en fonction du nombre de connexions que vous devez gérer mais vous facilitera grandement la vie par la suite.

Structure et interprétation du fichier de configuration

Le fichier de configuration du client SSH est lu, si présent, dès lors qu'une connexion SSH est initiée, que ce soit directement en ligne de commande, par l'intermédiaire d'un agent ou encore lors d'opération sur un dépôt Git distant.

Le fichier de configuration du système, pour tous les utilisateurs donc, est :

/etc/ssh/ssh_config

Il permet de configurer les options par défaut mais doit être édité en tant que root. Le fichier lu est situé dans :

$HOME/.ssh/config

Ce fichier contient les options à appliquer lors de la connexion, il est organisé par hôte. Nous appellerons section un bloc d'instruction commençant par le nom de l'hôte à connecter suivi des options à appliquer à cette connexion.

Seules les options qui diffèrent de la configuration par défaut (généralement / etc/ssh/ssh_config) doivent être précisées. Une section commence par l'en-tête Host suivi des options indentées :

Host nom_hote_1
    Option1 valeur
    Option2 valeur

Il est possible d'utiliser le joker * pour appliquer des options génériquement :

Host *
    OptionGlobale1 valeur

Il n'est pas nécessaire que la valeur de Host corresponde au nom de la machine, elle peut être une sorte d'alias :

Host git
    HostName depot.exemple.fr
    User git

Ainsi nous pouvons nous connecter à en tapant simplement :

ssh git

Lors d'une connexion, la configuration est lue de haut en bas et les options correspondant à l'hôte sont appliquées. L'ordre des blocs est donc important. Mais l'interprétation ne s'arrête pas au premier bloc rencontré, SSH va continuer de lire le fichier à la recherche d'autres blocs Hosts pouvant correspondre. S'il en trouve, il appliquera alors les options présentes dans le bloc et qui n'auraient pas déjà été définies et appliquées précédemment. Ce point est particulièrement important car il signifie que SSH utilise toujours, pour une option donnée, la première valeur définie. Il n'est donc pas possible de surpasser une option déjà définie dans une section précédente. En conséquence, le fichier config doit être écrit du particulier au général, de telle manière que les options les plus spécifiques se trouvent au début du fichier et les options générales à la fin.

Prenons l'exemple suivant :

Host num1
    Option1 valeur
    Option2 valeur
    Option3 valeur

Host num2
    Option4 valeur

Host *
    Option2 valeur

Si nous nous connectons à l'hôte num1, les trois options correspondantes seront appliquées, le fichier continuera d'être lu jusqu'à la section Host *, celle-ci correspond à toutes les connexions et sera donc appliquée mais comme l'option Option2 a déjà été définie, elle sera abandonnée. En revanche, si nous nous connectons à l'hôte num2, l'option Option4 sera logiquement appliquée puis, à la lecture de la section Host * l'option Option2 sera appliquée également. L'usage de l'option -v en ligne de commande permet de voir les options appliquées :

ssh -v root@192.168.1.100
    OpenSSH_7.2p2, OpenSSL 1.0.2j-fips  26 Sep 2016
    debug1: Reading configuration data /home/user/.ssh/config
    debug1: /home/user/.ssh/config line 39: Applying options for 192.168.1.*
    debug1: /home/userl/.ssh/config line 50: Applying options for *
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: /etc/ssh/ssh_config line 25: Applying options for *
    debug1: Connecting to 192.168.1.100 [192.168.11.174] port 22.
    debug1: Connection established.

Options de connexions

Les options à appliquer à une connexion peuvent l'être de différentes façons :

  • directement en ligne de commande :

    ssh -p 8822 user@hote.exemple.fr

  • en ligne de commande mais en utilisant l'option -o :

    ssh -o User=user -o Port=8822 -o HostName=hote.exemple.fr hote

  • en configurant les options dans le fichier config :

    Host hote HostName hote.exemple.fr User user Port 8822

Quelques options utiles :

  • User : l'utilisateur utilisé pour la connexion ;
  • PasswordAuthentication : l'authentification doit être faite par mot de passe (yes | no) ;
  • RSAAuthentication : l'authentification doit être faite par clé SSH (yes | no) ;
  • IdentityFile : le chemin vers la clé utilisée pour la connexion ;
  • IdentitiesOnly : utile si un agent SSH est utilisé pour préciser que seul l'identité spécifiée dans le fichier de configuration doit être utilisée (si l'agent peut en offrir plusieurs) (yes | no) ;
  • StrictHostKeyChecking : ajouter la clé de l'hôte au fichier $HOME/.ssh/known_hosts et vérifier cette entrée avant chaque connexion (yes | no) ;
  • Compression : compresser les données avant transmission, utilise avec un client lent (yes | no) ;
  • ServerAliveInterval : intervalle de temps (en secondes) après lequel, en l'absence de transmission de données depuis le serveur, SSH va envoyer un message à ce dernier pour vérifier qu'il répond ;
  • ServerAliveCountMax : nombre de messages envoyés pour lequel aucune réponse n'est obtenue. Au delà de ce seuil, le client SSH met fin à la connexion.

Sources

  • https://www.digitalocean.com/communi...our-ssh-client
  • https://www.cyberciti.biz/faq/create...on-linux-unix/
  • https://docstore.mik.ua/orelly/netwo...sh/ch07_04.htm
  • https://linux.die.net/man/5/ssh_config

Note : si le dossier $HOME/.ssh n'existe pas, il faut le créer. Le client SSH vérifie les droits sur le dossier et son contenu et refusera une connexion si les droits sont trop ouvert. Idéalement, ils doivent être les suivants :

  • dossier $HOME/.ssh : 700 ou drwx------ ;
  • fichier $HOME/.ssh/config : 600 ou -rw------- ;
  • vos clés SSH : 400 ou -r--------

Tags: linux, tips

2 petites astuces pour Gnome

29 novembre, 2018 — sogal

Je ne pensais vraiment pas dire ça il y a quelques temps en arrière, mais j'aime bien Gnome ! C'est devenu mon bureau par défaut au boulot pour des raisons professionnelles puis à la maison. Ça a mis un peu de temps mais son mode de fonctionnement et les raccourcis sont rentrés et j'aurais du mal (tout est relatif hein) à utiliser autre chose.

Bref, je vais pas raconter ma vie avec le Gnome, juste vous faire partager deux minis scripts dont j'ai eu le besoin dans le cadre de son utilisation :

Activer/désactiver à la volée les espaces de travail sur tous les écrans ou seulement l'écran principal :

Je travaille souvent avec un écran secondaire et, parfois, j'aime naviguer entre mes espaces de travail sur l'écran principal (celui du portable) tout en conservant l'affichage du moniteur auxiliaire fixe, parfois c'est le contraire et je veux que les deux affichages se « déplacent » quand je passe d'un espace à l'autre. Pour cela, ce petit script :

#!/bin/bash
# |-------------------------------------------------------------
# | Nom         : wops (Workspace on Primary Switcher
# | Description : Activer/désactiver à la volée les espaces
# |             : de travail sur tous les écrans ou seulement
# |             : l'écran principal
# | Auteur      : Sébastien Poher <sebastien.poher@eveha.fr>
# | Mise à jour : 16/06/2016
# | Licence     : GNU GLPv2 ou ultérieure
# |-------------------------------------------------------------

# |-----------------------------------------------------------
# | Définition des variables :

_SETTINGS="org.gnome.shell.overrides workspaces-only-on-primary"

# |-----------------------------------------------------------
# | Fonctions :
# |-----------------------------------------------------------

CheckState () {
    _STATE=$(gsettings get org.gnome.shell.overrides workspaces-only-on-primary)
}

# |------------------------------------------------------------
# | Exécution du script :
# |------------------------------------------------------------

CheckState
echo "$_STATE"
case "$_STATE" in
    "false" ) gsettings set $_SETTINGS true
              _NEWSTATE="fixe" ;;
    "true" ) gsettings set $_SETTINGS false
              _NEWSTATE="mobile" ;;
esac

if [ $? -eq 0 ]
then
    notify-send --hint=int:transient:1 -t 2 "WOPS" "Espace secondaire $_NEWSTATE"
fi

exit 0

Activer/désactiver à la volée le touchpad :

Dans la même veine, selon comment je travaille, je veux que le touchpad soit actif ou non. Dans les deux cas, je souhaite conserver le trackpad (de mon Thinkpad) actif. Je n'ai pas de touche dédiée à une désactivation matérielle, d'où ce petit script :

#!/bin/bash
# |-------------------------------------------------------------
# | Nom         : touchpad
# | Description : Activer/désactiver à la volée le touchpad
# | Auteur      : Sébastien Poher <sebastien.poher@eveha.fr>
# | Mise à jour : 07/04/2017
# | Licence     : GNU GLPv2 ou ultérieure
# |-------------------------------------------------------------

# |-----------------------------------------------------------
# | Définition des variables :

_KEY="org.gnome.desktop.peripherals.touchpad send-events"

# |-----------------------------------------------------------
# | Fonctions :
# |-----------------------------------------------------------

CheckState () {
    _STATE=$(gsettings get $_KEY)
}

# |------------------------------------------------------------
# | Exécution du script :
# |------------------------------------------------------------

CheckState
case "$_STATE" in
    "'enabled'" ) gsettings set $_KEY 'disabled'
                  _NEWSTATE="désactivé"  ;;
    "'disabled'" ) gsettings set $_KEY 'enabled'
                  _NEWSTATE="activé"  ;;
esac

if [ $? -eq 0 ]
then
    notify-send --hint=int:transient:1 -t 2 "Touchpad" "Touchpad $_NEWSTATE"
fi

exit 0

Association avec un raccourci clavier :

Pour les avoir toujours sous la main, je les place dans mon $HOME/bin et les associe avec un raccourci clavier :

  • Maj + Super + W pour wops ;
  • Super + T ou une touche du Thinkpad inactive pour touchpad.

EDIT 14 avril : utilisation de notify-send pour avoir une notification du changement effectif d'état

En espérant que cela puisse être utile à certains.

Tags: gnome, tips