2 votes

Comment attribuer un numéro de priorité à "update-alternatives --config gdm3.css" dans une seule ligne de commande?

Je suis capable d'exécuter ces commandes dans le terminal :

$ sudo update-alternatives --install /usr/share/gnome-shell/theme/gdm3.css gdm3.css /usr/share/gnome-shell/theme/mytheme/mytheme.css 10
$ sudo update-alternatives --config gdm3.css
Il y a 2 choix pour l'alternative gdm3.css (fournissant /usr/share/gnome-shell/theme/gdm3.css).

  Sélection    Chemin                                                Priorité   État
------------------------------------------------------------
* 0            /usr/share/gnome-shell/theme/ubuntu.css                  10        mode automatique
  1            /usr/share/gnome-shell/theme/mytheme/mytheme.css         10        mode manuel
  2            /usr/share/gnome-shell/theme/ubuntu.css                  10        mode manuel

Appuyez sur  pour conserver le choix actuel[*], ou tapez le numéro de la sélection: 1
update-alternatives: utilisation de /usr/share/gnome-shell/theme/mytheme/mytheme.css pour fournir /usr/share/gnome-shell/theme/gdm3.css (gdm3.css) en mode manuel

Je mettrai ces deux commandes dans subprocess.run() en python3.6.

Le problème que j'ai concerne la deuxième commande. Comment puis-je assigner /usr/share/gnome-shell/theme/mytheme/mytheme.css comme alternative de gdm3.css dans la même commande que sudo update-alternatives --config gdm3.css ?

Aussi, cette commande nécessite une entrée numérique pour sélectionner mytheme.css. Le numéro assigné dépend de la priorité assignée, ce qui signifie que le numéro attribué peut être assez arbitraire. Comment puis-je surmonter la nature arbitraire du numéro attribué ?

1voto

Gerald Points 21

Basé sur le commentaire de @PRATAP, j'ai développé cette solution python3.6 à ma question. Cela a fonctionné sur mon système Ubuntu 18.04. J'espère que cela pourra bénéficier à d'autres ayant le même besoin.

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from subprocess import run, PIPE
from pathlib import Chemin
import mimetypes

class CSSFileTypeError(Exception):
    pass

class GDM3_alternatives:
    '''Classe pour interroger et configurer gdm3.css.

    Argument:
      mytheme - chemin vers mon fichier de thème gnome-shell .css.

    Attributs:
      mytheme - chemin vers mon fichier de thème gnome-shell .css.
      query   - stdout de "update-alternatives --query gdm3.css" stocké dans une liste
      link    - chemin de gdm3.css
      best    - chemin alternatif de gdm3.css sélectionné en mode automatique
      value   - chemin alternatif actuel de gdm3.css
      status  - si gdm3.css est sélectionné en mode manuel ou automatique
      max     - valeur Priorité maximale de toutes les alternatives de gdm3.css installées

    Méthodes:
      exist()     - détermine si "mytheme" est installé en tant qu'alternative de gdm3.css.
      configure() - configure le fichier "mytheme" en tant qu'alternative gdm3.css.
    '''
    def __init__( self, mytheme=None ):       
        def _get( qvalue ):
            return [ line[ line.index('/') : ] for line in self.query if qvalue in line ][0]
        self.mytheme = mytheme
        self.query = run( [ 'update-alternatives', '--query', 'gdm3.css' ],
                          stdout=PIPE, encoding="utf-8" ).stdout.splitlines()
        self.link   = _get( 'Link:' )
        self.best   = _get( 'Best:' )
        self.value  = _get( 'Value:' )
        self.status = [ line[ line.index(':')+2 : ] for line in self.query if 'Status:' in line ][0]
        self.max = max( [ int( line[ line.index(':')+1 : ] ) for line in self.query if 'Priority:' in line ] )

    def exist( self ):
        '''Méthode qui détermine si "mytheme.css" est installé en tant qu'alternative de gdm3.css. '''
        if self.mytheme == None:
            raise TypeError( 'Le fichier .css n'a pas été défini.' ) 
        if not Chemin( self.mytheme ).exists():
            raise FileNotFoundError( f'{self.mytheme} n'existe pas.' )
        if 'css' not in mimetypes.guess_type( self.mytheme )[0] :
            raise CSSFileTypeError( f'{self.mytheme} n'est pas un fichier css.' )
        return True in [ True for line in self.query if self.mytheme in line ]

    def configure( self ):
        '''Méthode pour configurer le fichier de mon thème ".css" en tant qu'alternative gdm3.css.'''
        def _config():
            if 'auto' not in self.status:
                run( [ 'update-alternatives', '--auto', 'gdm3.css' ] ) #Assurer que le mode automatique est utilisé
            run( [ 'update-alternatives', '--install', self.link, 'gdm3.css', self.mytheme, str(self.max + 1) ] )
            print( f'Configuré {self.mytheme} en tant qu'alternative gdm3.css.' )

        if not self.exist():
            _config()
        elif self.value in self.mytheme:
            print( f'{self.mytheme} est déjà une alternative gdm3.css.' )
        else:
            run( [ 'update-alternatives', '--remove', 'gdm3.css', self.mytheme ] )
            self.__init__( self.mytheme )
            _config()

if __name__ == '__main__':
    #mytheme = '/usr/share/gnome-shell/theme/mytheme/mytheme.css' 
    mytheme = '/usr/share/gnome-shell/theme/mytheme/mytheme.css' #Changez ceci par le chemin de votre thème
    gdm3 = GDM3_alternatives( mytheme )
    gdm3.configure()

## Ce script doit être exécuté avec sudo. ## 

Comment utiliser ce script :

  1. Enregistrez-le dans un fichier avec l'extension .py, par exemple myscript.py.
  2. Changez la ligne mytheme = '/usr/share/gnome-shell/theme/mytheme/mytheme.css' pour afficher le chemin de votre thème .css.
  3. Exécutez le script dans le terminal avec la permission sudo, c'est-à-dire tapez sudo python3.6 myscript.py. Ou ouvrez votre IDLE python en utilisant la permission sudo et exécutez ce script python.

La version du update-alternatives sur mon système Ubuntu 18.04 est :

$ update-alternatives --version
Version Debian d'update-alternatives 1.19.0.5.

Il s'agit d'un logiciel libre ; voir la licence publique générale GNU version 2 ou
ultérieure pour les conditions de copie. Il n'y a PAS de garantie.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X