virtuala_navigilo.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #! /usr/bin/env python
  2. # *-* encoding: utf-8
  3. # Virtuala Navigilo : redirige une requête d'ouverture de lien de manière
  4. # optimale suivant votre navigateur préféré et du/des navigateur(s) déjà
  5. # lancé(s).
  6. import sys
  7. import os
  8. # Config
  9. FICHIER_CONF = os.environ['HOME']+'/.virtuala_navigilo.rc'
  10. # Table de correspondance nom binaire <=> nom processus
  11. NomProcessus = {'firefox-esr':'firefox-esr', \
  12. 'midori':'midori', \
  13. 'chromium-browser':'chromium-browser', \
  14. 'xlinks2':'xlinks2', \
  15. '/home/docs/icecat/icecat/icecat-bin':'icecat-bin', \
  16. #'w3m':'w3m' \
  17. }
  18. class Navigateur:
  19. """ Classe regroupant les paramètres et méthodes associés à un navigateur
  20. du système. """
  21. def __init__(self, nom, executable, nom_processus, tourne):
  22. self.nom = nom
  23. self.executable = executable
  24. self.nom_processus = nom_processus
  25. self.tourne = tourne
  26. self.priorite = 0
  27. def lance(self, url=False):
  28. """ Lance le navigateur """
  29. if url:
  30. os.execl(self.executable, self.executable, url)
  31. else:
  32. os.execl(self.executable, self.executable)
  33. def DefinitPriorite(self) :
  34. """ Définit la priorité donnée au navigateur. Le choix de
  35. l'utilisateur, si existant prévaut sur le choix système. """
  36. # Obtention du choix système
  37. sppref = os.popen('update-alternatives --query x-www-browser')
  38. spref = sppref.readlines()
  39. sppref.close()
  40. for l in spref:
  41. l = l.split(': ')
  42. #TODO : lire toutes les valeurs, pas seulement la Best !
  43. if l[0] == 'Best':
  44. b = l[1].strip('\n')
  45. b = b.strip(' ')
  46. if b == self.executable:
  47. self.priorite = 100
  48. #print(" Priorité du systeme: %s = 100" % self.executable)
  49. # Si les préférences utilisateurs sont disponibles, on les utilise.
  50. # On écrase ainsi les préfs système
  51. if os.access(FICHIER_CONF, os.R_OK):
  52. uppref = open(FICHIER_CONF, 'r')
  53. upref = uppref.readlines()
  54. uppref.close()
  55. for l in upref:
  56. l = l.split(': ')
  57. #TODO : idem, gérer les autres que Best ?
  58. if l[0] == 'Best':
  59. b = l[1].strip('\n')
  60. b = b.strip(' ')
  61. if b == self.executable:
  62. self.priorite = 100
  63. #print(" Priorité utilisateur : %s = 100" % self.executable)
  64. else:
  65. print "Pas de préférences utilisateur. Pour y rémédier, créez un ~/.navigateur_virtuel."
  66. def NavigateursSysteme():
  67. """ Retourne un tableau des navigateurs installés avec leurs informations
  68. utiles. """
  69. navigateurs = []
  70. # Obtention des navigateurs présents sur le système
  71. pliste = os.popen('update-alternatives --list x-www-browser')
  72. tmp_bin = pliste.readlines()
  73. pliste.close()
  74. # Détermination de l'état des navigateurs du système pour l'utilisateur
  75. ps = os.popen('''ps -Au $USER''')
  76. tmp_etat = ps.readlines()
  77. ps.close()
  78. for i in xrange(len(tmp_bin)):
  79. # Conditionnement du chemin du binaire
  80. executable = tmp_bin[i].replace('\n', '')
  81. # Extraction du nom (nom du binaire)
  82. nom = executable.split('/')[-1]
  83. # Détermination de l'état
  84. try:
  85. np = NomProcessus[nom]
  86. etat = False
  87. for l in tmp_etat:
  88. if np in l:
  89. etat = True
  90. navigateurs.append(Navigateur(nom, executable, NomProcessus[nom], etat))
  91. except KeyError:
  92. print("Navigateur « %s » trouvé sur le système mais pas d'informations \
  93. disponibles sur ce navigateur, il sera ignoré." % nom)
  94. return navigateurs
  95. def NavigateurPreferable(navigateurs):
  96. """ A partir d'un tableau de Navigateur, retourne le plus prioritaire lancé
  97. ou à défaut le plus prioritaire spécifié par l'utilisateur ou le système. """
  98. max_nav = False
  99. max_prio = 0
  100. for nav in navigateurs:
  101. if nav.tourne:
  102. if nav.priorite > max_prio:
  103. max_nav = nav
  104. # Pas de naviguateur lancé
  105. if not max_nav:
  106. for nav in navigateurs:
  107. if nav.priorite > max_prio:
  108. max_nav = nav
  109. return max_nav
  110. def main():
  111. params = False
  112. if len(sys.argv) > 1:
  113. params = sys.argv[1]
  114. # Construction de la liste des navigateurs potentiels
  115. navigateurs = NavigateursSysteme()
  116. print("%d navigateur(s) trouvé(s) sur le système :" % len(navigateurs))
  117. for nav in navigateurs:
  118. print(" * %s [tourne=%s]" % (nav.nom, nav.tourne))
  119. # Etablissement des priorités de chaque navigateur
  120. for nav in navigateurs:
  121. nav.DefinitPriorite()
  122. # Choix du navigateur à utiliser
  123. nav = NavigateurPreferable(navigateurs)
  124. print "Navigateur retenu : %s, priorite=%d, tourne=%s" % (nav.nom, nav.priorite, nav.tourne)
  125. if nav:
  126. # Lancement du navigateur
  127. nav.lance(params)
  128. else:
  129. print "Oups ! Aucun navigateur ne sera lancé !"
  130. if __name__ == '__main__':
  131. main()