#!/usr/bin/python # -*- coding: utf-8 -*- #djl (Dépot jeux Linux) #Copyright (C) 2008 Florian Joncour - Diablo150 . # [FR] #Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou le modifier #selon les termes de la "GNU General Public License", tels que publiés par la #"Free Software Foundation"; soit la version 2 de cette licence ou (à votre choix) #toute version ultérieure. #Ce programme est distribué dans l'espoir qu'il sera utile, #mais SANS AUCUNE GARANTIE, ni explicite ni implicite; sans même les garanties de #commercialisation ou d'adaptation dans un but spécifique. #Se référer à la "GNU General Public License" pour plus de détails. #Vous devriez avoir reçu une copie de la "GNU General Public License" #en même temps que ce programme; sinon, consulter le site . import os, sys, time, urllib, locale, socket, subprocess try: from PyQt4 import QtGui except ImportError: print "Error: You must have python-qt4 libraries installed to run djl, you have to install them with your package manager" print "Erreur lors de l\'import des librairies, vous devez installer le paquet python-qt4, merci de l'installer depuis votre gestionnaire de paquets" sys.exit() home = os.path.expanduser('~') racine = os.getcwd() socket.setdefaulttimeout(3) #Si le serveur ne répond pas après x seconde(s), on passe ##Si le fichier de configuration n'existe pas, on affichera par la suite la fenêtre de configuration au lancement #if not os.path.exists(home + '/.djl/config'): #from configuration import * #else: ##Sinon on aura besoin de l'interface principale #from djl_main import * #Serveurs pour le téléchargement des fichiers manquants. #Actuellement seul les deux premiers serveurs sont pris en compte serveur_fichiers = ["http://djl-linux.org", "http://djl.jeuxlinux.fr", "http://djl.tuxfamily.org"] try: import i18n except ImportError: try: _ except NameError: def _(s): return s #def trouve_repertoire(): #'''Trouve le répertoire courant du script (Pour que l'on puisse lancer djl n'importe comment sans problème''' #if "/" in sys.argv[0]: #liste=sys.argv[0].split("/") #script = liste[len(liste)-1] #repertoire=sys.argv[0].replace(script, "") #print repertoire + " - " + script #os.chdir(repertoire) #On se place donc dans le répertoire def verif_config(): '''Fonction pour s'assuer que le fichier de configuration est à jour''' fichier = open(home+'/.djl/config', 'r') liste_fichier = fichier.readlines() fichier.close() if len(liste_fichier) < 10: fichier = open(home+'/.djl/config', 'a+') if not '\n' in liste_fichier[8]: fichier.write('\n') fichier.write('langue = ' + locale.getdefaultlocale()[0]) #fichier.write('\n') fichier.close() if len(liste_fichier) < 11: fichier = open(home+'/.djl/config', 'a+') fichier.write('\ntype_gui = 1') #fichier.write('\n') fichier.close() if len(liste_fichier) < 12: fichier = open(home+'/.djl/config', 'a+') fichier.write('\npseudo = '+ str(os.environ["USER"]).capitalize()) fichier.close() if len(liste_fichier) < 13: fichier = open(home+'/.djl/config', 'a+') fichier.write('\nconn_irc_demarrage = 1') fichier.close() if len(liste_fichier) < 14: fichier = open(home+'/.djl/config', 'a+') fichier.write('\nfond_irc = 0') fichier.close() if len(liste_fichier) < 15: fichier = open(home+'/.djl/config', 'a+') fichier.write('\ntaille_police = 9') fichier.close() if len(liste_fichier) < 16: fichier = open(home+'/.djl/config', 'a+') fichier.write('\ncanaux_IRC = #djl') fichier.close() class avertissement(QtGui.QWidget): def __init__(self, titre, message, quitte=0): '''Affiche une boite de dialogue avec le titre et texte donné''' QtGui.QMessageBox.__init__(self) QtGui.QMessageBox.information(self, titre, message) if quitte == 1: sys.exit() class main(object): def verif_root(self): '''Vérifi que ça ne soit pas le root qui lance djl''' if home == '/root' or home == '/Root': #or home == '/home/diablo150': #<< Pour tests app = QtGui.QApplication(sys.argv) titre = _("Attention") message = _("Using djl as root user is NOT recommended.") ui = avertissement(titre, message, quitte=0) ui.show() def verif_processus(self): '''Vérifi si un processus djl n'est pas déjà lancé''' processus = os.popen('ps -ef |grep djl_main |grep python') retour = processus.readlines() retour_final = [] for i in range(len(retour)): if not 'ps -ef' in retour[i]: retour_final.append(retour[i]) if len(retour_final) >= 1: app = QtGui.QApplication(sys.argv) titre = _("Attention") #message=_("djl est deja lance") message = QtGui.QApplication.translate("MainWindow", _("djl est deja lance"), None, QtGui.QApplication.UnicodeUTF8) ui = avertissement(titre, message, quitte=1) ui.show() #except: pass def cree_repertoires(self): '''Créé les répertoires indispensables au démarrage de djl (ignore si ils existent dejà)''' if not os.path.exists(home+'/.djl'): os.mkdir(home + '/.djl') if not os.path.exists(home+'/.djl/cache'): os.mkdir(home + '/.djl/cache') def verif_demarrage(self): '''Affiche la fenêtre de configuration si c'est le premier demarrage''' print _("Ceci est le premier lancement de djl") #try: #verif_config() #Vérifi le fichier de configuration #except: pass #from configuration import * import configuration #Envoi l'affichage de la fenêtre de configuration app = QtGui.QApplication(sys.argv) window = configuration.Ui_Configuration() window.show() sys.exit(app.exec_()) def lance(self): '''Lance le "vrai" client djl''' verif_config() #Vérifi si le fichier de configuration est à jour if os.path.exists("/usr/bin/python2.6") == True: commande_python = "python2.6" elif os.path.exists("/usr/bin/python2.5") == True: commande_python = "python2.5" else: commande_python = "python" commande_python = commande_python + " -O" #Si on utilise le paramètre -dev; on réinstalle pour la version de développement argument = "" #if len(sys.argv) > 1: #if str((sys.argv[1])) == '-dev': if self.version_dev == 1: print ">djl-dev" argument = "-dev" #Active le mode "verbose" de Python #commande_python = commande_python + " -v" fichier_log = open(home + '/.djl/djl_log.txt', 'w') #fichier_log = home + '/.djl/djl_log.txt' #os.system('python2.5 djl_main.py') #Si le code source est dans le répetoire personnel, on le lance dedans: if os.path.exists(home + '/.djl/src/djl/djl/djl_main.py'): #p=subprocess.Popen('python2.5 ' + home + '/.djl/src/djl_main.py' + " " + argument, executable=None, shell=True, cwd=str(racine)) p=subprocess.Popen(commande_python +" "+ home + '/.djl/src/djl/djl/djl_main.py' + " " + argument, executable=None, shell=True, cwd=str(racine)) #Sinon on prend le répertoire d'installation de djl: else: p=subprocess.Popen(commande_python + ' djl_main.py' + " " + argument, executable=None, shell=True, cwd=str(racine)) t_ = time.localtime() secondes = t_[5] if secondes < 10: secondes = str('0') + str(t_[5]) t = str(t_[3]) + ':' + str(t_[4]) + ':' + str(secondes) + ' - ' + str(t_[2]) + '/' + str(t_[1]) + '/' + str(t_[0]) fichier_log.write('>>> ' + str(t)+'\n') fichier_log.write('>>> process id:' + str(p.pid) + '\n') fichier_log.close() def verif_liste_fichiers(self, addr, liste_fichiers): '''Parcours la liste des fichiers en ligne et vérifi si ils existent en dur''' boucle = 0 while boucle < len(liste_fichiers): liste_fichiers[boucle] = liste_fichiers[boucle].replace('\n', '') #Vérifi si les fichiers existent: if os.path.exists(racine + '/' + liste_fichiers[boucle]) == False or self.restaure == 1: print _("Le fichier:"), liste_fichiers[boucle], _("est manquant, il sera telecharge") #Sinon, on les téléchargent: #Si les fichiers sont contenus dans un dossier: if '/' in liste_fichiers[boucle]: dossier = liste_fichiers[boucle].split('/') #Vérifi si le dossier n'existe pas déjà #if os.path.exists(racine + '/' + dossier[0]) == False: boucle_ = 0 ancienne_var = '' #Créé l'arborescence de fichiers avant le téléchargements: while boucle_ < len(dossier)-1: #Sinon, on le créé: var = ancienne_var + '/' + dossier[boucle_] try: os.mkdir(racine + '/' + var) except: pass ancienne_var = var boucle_ = boucle_ + 1 #Télécharge les fichiers: urllib.urlretrieve(addr + '/' + liste_fichiers[boucle], filename=racine + '/' + liste_fichiers[boucle], reporthook=None) #else: print '>', liste_fichiers[boucle] boucle = boucle+1 def verif_fichiers(self): '''Vérifi si tous les fichiers de djl existent, sinon on les télécharges''' connection_ok = 1 adresse = serveur_fichiers[0] + '/maj_djl/djl/' if len(sys.argv) > 1: #Si l'on utilise le paramètre -dev, on utilise le serveur de développement: #if str((sys.argv[1])) =='-dev': if self.version_dev == 1: adresse = serveur_fichiers[0] + '/dev/maj_djl/djl/' try: print ">", serveur_fichiers[0] #adresse = serveur_fichiers[0] + '/maj_djl/djl/' liste_fichiers = (home + '/.djl/fichiers_djl.tmp') urllib.urlretrieve(adresse + 'fichiers_djl', filename=liste_fichiers, reporthook=None) liste_fichiers = open(liste_fichiers, 'r') except IOError: #Si ça déconne avec le premier serveur, on essai le second: try: print ">:", serveur_fichiers[1] adresse = serveur_fichiers[1] + '/maj_djl/djl/' liste_fichiers = (home + '/.djl/fichiers_djl.tmp') urllib.urlretrieve(adresse + 'fichiers_djl', filename=liste_fichiers, reporthook=None) liste_fichiers = open(liste_fichiers, 'r') except IOError: print _("Impossible de se connecter au serveur principal") #Si le téléchargement merde, on créé un fichier vide: liste_fichiers = open(home + '/.djl/fichiers_djl.tmp', 'w') liste_fichiers.close() liste_fichiers = open(home + '/.djl/fichiers_djl.tmp', 'r') connection_ok = 0 liste_fichiers = liste_fichiers.readlines() if connection_ok == 1 and self.version_dev == 0: self.verif_liste_fichiers(adresse, liste_fichiers) def __init__(self): '''Initalisation...''' self.verif_root() #Vérifi que ça ne soit pas le root qui lance djl #print sys.argv if '-aide' in sys.argv: print """ Lancer le script sans argument pour lancer djl. Arguments (optionnels): -dev: l'utilisateur aura accès aux mises à jours de développement. -zconf: Supprime le fichier de configuration ~/.djl/config -res: retélécharge tous les fichiers source de djl (uniquement version stable). """ sys.exit() if '-dev' in sys.argv: self.version_dev = 1 else: self.version_dev = 0 if not "-r" in sys.argv: #Si il y a l'argument -r, c'est un redemarrage. self.verif_processus() #Vérifi qu'un processus djl ne soit pas déjà lancé self.cree_repertoires() #Vérifi que les répertoires indispensables à djl existent bien if '-zconf' in sys.argv: print "On supprime le fichier de configuration" try: os.remove(home + '/.djl/config') except: pass if '-res' in sys.argv: self.restaure = 1 #Force le téléchargement des fichiers sources (même si ils existent) print "On re-télécharge toutes les sources" self.verif_fichiers() #Commenter la ligne suivante pour ne pas vérifier au démarrage si tous les fichiers de djl son présents #self.verif_fichiers() self.cree_repertoires() #Vérifi que les répertoires indispensables à djl existent bien #Maintenant qu'on est sûr d'avoir tous les fichiers, on lance le programme: #Si c'est le premier démarrage de djl (le fichier de config n'existe pas), on lance la fenêtre de configuration: if not os.path.exists(home + '/.djl/config'): self.verif_demarrage() else: #Sinon on lance l'interface principale dans un processus séparé: self.lance() if __name__ == "__main__": main()