Advertisement
zzarko

ModManager 0.1.5 Alpha

Aug 12th, 2012
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.61 KB | None | 0 0
  1. # ModManager 0.1.5 Alpha by sfan5
  2. VER = "0.1.5 Alpha"
  3.  
  4. import sys, httplib, os, urllib, tarfile, zipfile, argparse
  5.  
  6. homedir = os.path.expanduser('~')
  7. mmdir = os.path.join(homedir,".mm")
  8. if not os.path.exists(mmdir):
  9.     os.mkdir(mmdir)
  10. repos_txt = os.path.join(mmdir,"repos.txt")
  11. pkgs_txt = os.path.join(mmdir,"pkgs.txt")
  12. config_txt = os.path.join(mmdir,"config.txt")
  13. installed_txt = os.path.join(mmdir,"installed.txt")
  14.  
  15. def install_pkg_full(name):
  16.     p = install_pkg(name)
  17.     if(p[0] != "-1"):
  18.         print "Extracting Package"
  19.         if(p[1] == 1):
  20.             extract_pkg(p[0], p[2])
  21.         else:
  22.             extract_pkg(p[0])
  23.     else:
  24.         return p #Give Error to next Instance
  25. def extract_pkg(fname, renamedir=""):
  26.     if os.path.exists(config_txt):
  27.         config = open(config_txt, "r")
  28.         found = 0
  29.         moddir = ""
  30.         for conf in config:
  31.             c = conf.split("=")
  32.             if(c[0] == "moddir"):
  33.                     moddir = c[1]
  34.                     found = 1
  35.         config.close()
  36.         if(found == 1):
  37.             ar = -1
  38.             extension = fname.split(".")[-1]
  39.             if(extension == "bz2"):
  40.                 ar = tarfile.open(fname, "r:bz2")
  41.             if(extension == "gz"):
  42.                 ar = tarfile.open(fname, "r:gz")
  43.             if(extension == "zip"):
  44.                 ar = zipfile.ZipFile(fname, "r")
  45.             if(extension == "tar"):
  46.                 ar = tarfile.open(fname, "r")
  47.             if(ar != -1):
  48.                 try:
  49.                     ar.extractall(moddir.replace("\n",""))
  50.                     if(renamedir != ""):
  51.                         dirn = ""
  52.                         if(isinstance(ar, zipfile.ZipFile)):
  53.                             list = ar.namelist()
  54.                         if(isinstance(ar, tarfile.TarFile)):
  55.                             list = ar.getnames()
  56.                         for f in list: # Find first Directory in Archive
  57.                             if(f.split(os.sep)[-1] == "" or (not os.sep in f)): # Check if it is a Directory
  58.                                 dirn = f.replace(os.sep,"")
  59.                                 break
  60.                         if(dirn != ""):
  61.                             if(not os.path.exists(moddir.replace("\n","") + os.sep + renamedir)):
  62.                                 os.rename(moddir.replace("\n","") + os.sep + dirn, moddir.replace("\n","") + os.sep + renamedir)
  63.                     ar.close()
  64.                 except:
  65.                    print "Error while Extracting"
  66.             else:
  67.                 print "Wrong File Format .%s" % fname.split(".")[-1]
  68.         else:
  69.             print "'moddir' not found in Configuration, can't extract File"
  70.         os.remove(fname)
  71.     else:
  72.         print "Configuration not found, can't extract File."
  73.         print "Did you run command config moddir path_to_your_mods ?"
  74.  
  75. def install_pkg(name):
  76.     p = name # I used p everywhere....
  77.     if os.path.exists(pkgs_txt):
  78.         f = open(pkgs_txt,"r")
  79.         found = 0
  80.         repo = ""
  81.         for l in f:
  82.             ls = l.split(",")
  83.             if(ls[0] == p):
  84.                 found = 1
  85.                 repo = ls[1].replace("\n","")
  86.                 break
  87.         f.close()
  88.         if(found == 0):
  89.             print "Package '%s' not found" % p
  90.             return ["-1", 0]
  91.         else:
  92.             print "Fetching Package-Info for %s from '%s'.." % (p,repo),
  93.             con = httplib.HTTPConnection(repo)
  94.             con.connect()
  95.             con.request("GET", "/minetest/Pkg-" + p)
  96.             res = con.getresponse()
  97.             if(res.status == 200):
  98.                 print "OK"
  99.                 d = res.read()
  100.                 d = d.split("\n")
  101.                 name = ""
  102.                 depends = ""
  103.                 version = ""
  104.                 file = ""
  105.                 format = ""
  106.                 gitorious = ""
  107.                 for l in d:
  108.                     ls = l.split(":")
  109.                     if(ls[0] == "Depends"):
  110.                         depends = ls[1]
  111.                     if(ls[0] == "Version"):
  112.                         version = ls[1]
  113.                     if(ls[0] == "File"):
  114.                         file = ls[1]
  115.                         if(len(ls) == 3): # Make URLs compatible with the file format for Packages
  116.                             file = file + ":" + ls[2]
  117.                     if(ls[0] == "Name"):
  118.                         name = ls[1]
  119.                     if(ls[0] == "Format"):
  120.                         format = ls[1]
  121.                     if(ls[0] == "Gitorious"):
  122.                         gitorious = ls[1]
  123.                 if not depends == "": # First do all Depends
  124.                     dep = depends.split(",")
  125.                     all_depends_done = True
  126.                     for de in dep:
  127.                         print "Installing Dependence %s" % de
  128.                         x = install_pkg_full(de)
  129.                         if x[0] == "-1":
  130.                             return x #Give the Error to the next Instance
  131.                 if depends == "":
  132.                     if(file == "" and gitorious != ""):
  133.                         gito = gitorious.split(",")
  134.                         proj = gito[0]
  135.                         rep = gito[1]
  136.                         bran = gito[2]
  137.                         url = "https://gitorious.org/" + proj + "/" + rep + "/archive-tarball/" + bran
  138.                         format = "tar.gz"
  139.                         print "Downloading %s Version %s from Gitorious.." % (name,version),
  140.                     else:
  141.                         if "http://" in file or "https://" in file:
  142.                             url = file
  143.                             print "Downloading %s Version %s from '%s'(external).." % (name,version,file.split("/")[2]),
  144.                         else:
  145.                             url = "http://" + repo + "/minetest/" + file
  146.                             print "Downloading %s Version %s from '%s'.." % (name,version,repo),
  147.                     w = urllib.urlopen(url)
  148.                     if(format == ""):
  149.                         lfile = url.split('/')[-1]
  150.                     else:
  151.                         lfile = url.split('/')[-1] + "." + format
  152.                     lo = open(lfile, 'wb')
  153.                     lo.write(w.read())
  154.                     w.close()
  155.                     lo.close()
  156.                     print "OK"
  157.                     installed = open(installed_txt, "a")
  158.                     installed.write(name + ",")
  159.                     installed.close()
  160.                     if(gitorious != ""):
  161.                         return [lfile,1,p]
  162.                     else:
  163.                         return [lfile,0]
  164.             else:
  165.                 print "Error"
  166.                 return ["-1", 0]
  167.     else:
  168.         print "You should add some repos and/or update packages first."
  169.         return ["-1", 0]
  170.  
  171. def func_add_repo(args):
  172.     f = open(os.path.join(mmdir,"repos.txt"), "a")
  173.     f.write(args.repo + "\n")
  174.     f.close()
  175.     print "Added Reposity '%s'" % args.repo
  176.  
  177. def func_update(args):
  178.     if os.path.exists(repos_txt):
  179.         repos = open(repos_txt)
  180. #        if(os.path.exists(pkgs_txt):   #not needed, "w" option erases file
  181. #            os.remove(pkgs_txt)
  182.         f = open(pkgs_txt, "w")
  183.         for repo in repos:
  184.             repo = repo.replace("\n", "")
  185.             print "Fetching Packages from '%s'.." % repo,
  186.             con = httplib.HTTPConnection(repo)
  187.             con.connect()
  188.             con.request("GET", "/minetest/PackageList")
  189.             res = con.getresponse()
  190.             if(res.status == 200):
  191.                 data = res.read()
  192.                 data = data.split("\n")
  193.                 print "OK"
  194.                 for l in data:
  195.                     if not l == "":
  196.                         f.write(l + "," + repo + "\n")
  197.             else:
  198.                 print "Error %s" % res.status
  199.                 continue
  200.         f.close()
  201.         repos.close()
  202.     else:
  203.         print "You should add some repos first."
  204.  
  205. def func_install(args):
  206.     install_pkg_full(args.package)
  207.  
  208. def func_config(args):
  209.     config = open(config_txt, "w")
  210.     config.write(args.name + "=" + args.value + "\n")
  211.     config.close()
  212.     print "'" + args.name + "' was set to '" + args.value + "' in Configuration"
  213.  
  214. def func_installed(args):
  215.     if os.path.exists(installed_txt):
  216.         ins = open(installed_txt, "r")
  217.         i = ins.read()
  218.         ins.close()
  219.         i = i.split(",")
  220.         for e in i:
  221.             if(e != ""):
  222.                 print(e)
  223.     else:
  224.         i = []
  225.         print("No Packages installed")
  226.     return i
  227.  
  228. def func_available(args):
  229.     if os.path.exists(installed_txt):
  230.         ins = open(installed_txt, "r")
  231.         installed = ins.read()
  232.         ins.close()
  233.         installed = installed.split(",")
  234.     else:
  235.         installed = []
  236.     if os.path.exists(pkgs_txt):
  237.         ins = open(homedir + "/.mm/pkgs.txt", "r")
  238.         i = ins.readlines()
  239.         ins.close()
  240.         for e in i:
  241.             if(e != ""):
  242.                 ee = e.split(",")
  243.                 if ee[0] not in installed:
  244.                     print(ee[0])
  245.     else:
  246.         print("No Packages available")
  247. print("ModManager %s" % VER)
  248. description = """
  249. Minetest Mod Manager %s (c) sfan5 2012
  250. http://minetest.net/forum/viewtopic.php?id=618
  251. """ % VER
  252. about = """
  253. This program maintains a list of repositories and mods for Minetest, and can be used to install requested mods
  254. """
  255. parser = argparse.ArgumentParser(description=description, epilog=about)
  256. subparsers = parser.add_subparsers(title='Available commands')
  257.  
  258. parser_add = subparsers.add_parser('add-repo',help='Adds a Repo to the List of Repos')
  259. parser_add.add_argument('repo', help='Repo address')
  260. parser_add.set_defaults(func=func_add_repo)
  261.  
  262. parser_update = subparsers.add_parser('update',help='Updates the Package List')
  263. parser_update.set_defaults(func=func_update)
  264.  
  265. parser_install = subparsers.add_parser('install',help='Installs a Package')
  266. parser_install.add_argument('package', help='Repo address')
  267. parser_install.set_defaults(func=func_install)
  268.  
  269. parser_config = subparsers.add_parser('config',help='Configure ModManager')
  270. parser_config.add_argument('name', help='Parameter name')
  271. parser_config.add_argument('value', help='Parameter value')
  272. parser_config.set_defaults(func=func_config)
  273.  
  274. parser_installed = subparsers.add_parser('installed',help='Shows installed Packages')
  275. parser_installed.set_defaults(func=func_installed)
  276.  
  277. parser_available = subparsers.add_parser('available',help='Shows available Packages')
  278. parser_available.set_defaults(func=func_available)
  279.  
  280. #parse arguments and execute action
  281. args = parser.parse_args()
  282. args.func(args)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement