#! /usr/bin/env python # *-* encoding: utf-8 # Virtuala Navigilo : redirige une requête d'ouverture de lien de manière # optimale suivant votre navigateur préféré et du/des navigateur(s) déjà # lancé(s). import sys import os # Config FICHIER_CONF = os.environ['HOME']+'/.virtuala_navigilo.rc' # Table de correspondance nom binaire <=> nom processus NomProcessus = {'firefox-esr':'firefox-esr', \ 'midori':'midori', \ 'chromium-browser':'chromium-browser', \ 'xlinks2':'xlinks2', \ '/home/docs/icecat/icecat/icecat-bin':'icecat-bin', \ #'w3m':'w3m' \ } class Navigateur: """ Classe regroupant les paramètres et méthodes associés à un navigateur du système. """ def __init__(self, nom, executable, nom_processus, tourne): self.nom = nom self.executable = executable self.nom_processus = nom_processus self.tourne = tourne self.priorite = 0 def lance(self, url=False): """ Lance le navigateur """ if url: os.execl(self.executable, self.executable, url) else: os.execl(self.executable, self.executable) def DefinitPriorite(self) : """ Définit la priorité donnée au navigateur. Le choix de l'utilisateur, si existant prévaut sur le choix système. """ # Obtention du choix système sppref = os.popen('update-alternatives --query x-www-browser') spref = sppref.readlines() sppref.close() for l in spref: l = l.split(': ') #TODO : lire toutes les valeurs, pas seulement la Best ! if l[0] == 'Best': b = l[1].strip('\n') b = b.strip(' ') if b == self.executable: self.priorite = 100 #print(" Priorité du systeme: %s = 100" % self.executable) # Si les préférences utilisateurs sont disponibles, on les utilise. # On écrase ainsi les préfs système if os.access(FICHIER_CONF, os.R_OK): uppref = open(FICHIER_CONF, 'r') upref = uppref.readlines() uppref.close() for l in upref: l = l.split(': ') #TODO : idem, gérer les autres que Best ? if l[0] == 'Best': b = l[1].strip('\n') b = b.strip(' ') if b == self.executable: self.priorite = 100 #print(" Priorité utilisateur : %s = 100" % self.executable) else: print "Pas de préférences utilisateur. Pour y rémédier, créez un ~/.navigateur_virtuel." def NavigateursSysteme(): """ Retourne un tableau des navigateurs installés avec leurs informations utiles. """ navigateurs = [] # Obtention des navigateurs présents sur le système pliste = os.popen('update-alternatives --list x-www-browser') tmp_bin = pliste.readlines() pliste.close() # Détermination de l'état des navigateurs du système pour l'utilisateur ps = os.popen('''ps -Au $USER''') tmp_etat = ps.readlines() ps.close() for i in xrange(len(tmp_bin)): # Conditionnement du chemin du binaire executable = tmp_bin[i].replace('\n', '') # Extraction du nom (nom du binaire) nom = executable.split('/')[-1] # Détermination de l'état try: np = NomProcessus[nom] etat = False for l in tmp_etat: if np in l: etat = True navigateurs.append(Navigateur(nom, executable, NomProcessus[nom], etat)) except KeyError: print("Navigateur « %s » trouvé sur le système mais pas d'informations \ disponibles sur ce navigateur, il sera ignoré." % nom) return navigateurs def NavigateurPreferable(navigateurs): """ A partir d'un tableau de Navigateur, retourne le plus prioritaire lancé ou à défaut le plus prioritaire spécifié par l'utilisateur ou le système. """ max_nav = False max_prio = 0 for nav in navigateurs: if nav.tourne: if nav.priorite > max_prio: max_nav = nav # Pas de naviguateur lancé if not max_nav: for nav in navigateurs: if nav.priorite > max_prio: max_nav = nav return max_nav def main(): params = False if len(sys.argv) > 1: params = sys.argv[1] # Construction de la liste des navigateurs potentiels navigateurs = NavigateursSysteme() print("%d navigateur(s) trouvé(s) sur le système :" % len(navigateurs)) for nav in navigateurs: print(" * %s [tourne=%s]" % (nav.nom, nav.tourne)) # Etablissement des priorités de chaque navigateur for nav in navigateurs: nav.DefinitPriorite() # Choix du navigateur à utiliser nav = NavigateurPreferable(navigateurs) print "Navigateur retenu : %s, priorite=%d, tourne=%s" % (nav.nom, nav.priorite, nav.tourne) if nav: # Lancement du navigateur nav.lance(params) else: print "Oups ! Aucun navigateur ne sera lancé !" if __name__ == '__main__': main()