Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # ModManager 0.1.5 Alpha by sfan5
- VER = "0.1.5 Alpha"
- import sys, httplib, os, urllib, tarfile, zipfile, argparse
- homedir = os.path.expanduser('~')
- mmdir = os.path.join(homedir,".mm")
- if not os.path.exists(mmdir):
- os.mkdir(mmdir)
- repos_txt = os.path.join(mmdir,"repos.txt")
- pkgs_txt = os.path.join(mmdir,"pkgs.txt")
- config_txt = os.path.join(mmdir,"config.txt")
- installed_txt = os.path.join(mmdir,"installed.txt")
- def install_pkg_full(name):
- p = install_pkg(name)
- if(p[0] != "-1"):
- print "Extracting Package"
- if(p[1] == 1):
- extract_pkg(p[0], p[2])
- else:
- extract_pkg(p[0])
- else:
- return p #Give Error to next Instance
- def extract_pkg(fname, renamedir=""):
- if os.path.exists(config_txt):
- config = open(config_txt, "r")
- found = 0
- moddir = ""
- for conf in config:
- c = conf.split("=")
- if(c[0] == "moddir"):
- moddir = c[1]
- found = 1
- config.close()
- if(found == 1):
- ar = -1
- extension = fname.split(".")[-1]
- if(extension == "bz2"):
- ar = tarfile.open(fname, "r:bz2")
- if(extension == "gz"):
- ar = tarfile.open(fname, "r:gz")
- if(extension == "zip"):
- ar = zipfile.ZipFile(fname, "r")
- if(extension == "tar"):
- ar = tarfile.open(fname, "r")
- if(ar != -1):
- try:
- ar.extractall(moddir.replace("\n",""))
- if(renamedir != ""):
- dirn = ""
- if(isinstance(ar, zipfile.ZipFile)):
- list = ar.namelist()
- if(isinstance(ar, tarfile.TarFile)):
- list = ar.getnames()
- for f in list: # Find first Directory in Archive
- if(f.split(os.sep)[-1] == "" or (not os.sep in f)): # Check if it is a Directory
- dirn = f.replace(os.sep,"")
- break
- if(dirn != ""):
- if(not os.path.exists(moddir.replace("\n","") + os.sep + renamedir)):
- os.rename(moddir.replace("\n","") + os.sep + dirn, moddir.replace("\n","") + os.sep + renamedir)
- ar.close()
- except:
- print "Error while Extracting"
- else:
- print "Wrong File Format .%s" % fname.split(".")[-1]
- else:
- print "'moddir' not found in Configuration, can't extract File"
- os.remove(fname)
- else:
- print "Configuration not found, can't extract File."
- print "Did you run command config moddir path_to_your_mods ?"
- def install_pkg(name):
- p = name # I used p everywhere....
- if os.path.exists(pkgs_txt):
- f = open(pkgs_txt,"r")
- found = 0
- repo = ""
- for l in f:
- ls = l.split(",")
- if(ls[0] == p):
- found = 1
- repo = ls[1].replace("\n","")
- break
- f.close()
- if(found == 0):
- print "Package '%s' not found" % p
- return ["-1", 0]
- else:
- print "Fetching Package-Info for %s from '%s'.." % (p,repo),
- con = httplib.HTTPConnection(repo)
- con.connect()
- con.request("GET", "/minetest/Pkg-" + p)
- res = con.getresponse()
- if(res.status == 200):
- print "OK"
- d = res.read()
- d = d.split("\n")
- name = ""
- depends = ""
- version = ""
- file = ""
- format = ""
- gitorious = ""
- for l in d:
- ls = l.split(":")
- if(ls[0] == "Depends"):
- depends = ls[1]
- if(ls[0] == "Version"):
- version = ls[1]
- if(ls[0] == "File"):
- file = ls[1]
- if(len(ls) == 3): # Make URLs compatible with the file format for Packages
- file = file + ":" + ls[2]
- if(ls[0] == "Name"):
- name = ls[1]
- if(ls[0] == "Format"):
- format = ls[1]
- if(ls[0] == "Gitorious"):
- gitorious = ls[1]
- if not depends == "": # First do all Depends
- dep = depends.split(",")
- all_depends_done = True
- for de in dep:
- print "Installing Dependence %s" % de
- x = install_pkg_full(de)
- if x[0] == "-1":
- return x #Give the Error to the next Instance
- if depends == "":
- if(file == "" and gitorious != ""):
- gito = gitorious.split(",")
- proj = gito[0]
- rep = gito[1]
- bran = gito[2]
- url = "https://gitorious.org/" + proj + "/" + rep + "/archive-tarball/" + bran
- format = "tar.gz"
- print "Downloading %s Version %s from Gitorious.." % (name,version),
- else:
- if "http://" in file or "https://" in file:
- url = file
- print "Downloading %s Version %s from '%s'(external).." % (name,version,file.split("/")[2]),
- else:
- url = "http://" + repo + "/minetest/" + file
- print "Downloading %s Version %s from '%s'.." % (name,version,repo),
- w = urllib.urlopen(url)
- if(format == ""):
- lfile = url.split('/')[-1]
- else:
- lfile = url.split('/')[-1] + "." + format
- lo = open(lfile, 'wb')
- lo.write(w.read())
- w.close()
- lo.close()
- print "OK"
- installed = open(installed_txt, "a")
- installed.write(name + ",")
- installed.close()
- if(gitorious != ""):
- return [lfile,1,p]
- else:
- return [lfile,0]
- else:
- print "Error"
- return ["-1", 0]
- else:
- print "You should add some repos and/or update packages first."
- return ["-1", 0]
- def func_add_repo(args):
- f = open(os.path.join(mmdir,"repos.txt"), "a")
- f.write(args.repo + "\n")
- f.close()
- print "Added Reposity '%s'" % args.repo
- def func_update(args):
- if os.path.exists(repos_txt):
- repos = open(repos_txt)
- # if(os.path.exists(pkgs_txt): #not needed, "w" option erases file
- # os.remove(pkgs_txt)
- f = open(pkgs_txt, "w")
- for repo in repos:
- repo = repo.replace("\n", "")
- print "Fetching Packages from '%s'.." % repo,
- con = httplib.HTTPConnection(repo)
- con.connect()
- con.request("GET", "/minetest/PackageList")
- res = con.getresponse()
- if(res.status == 200):
- data = res.read()
- data = data.split("\n")
- print "OK"
- for l in data:
- if not l == "":
- f.write(l + "," + repo + "\n")
- else:
- print "Error %s" % res.status
- continue
- f.close()
- repos.close()
- else:
- print "You should add some repos first."
- def func_install(args):
- install_pkg_full(args.package)
- def func_config(args):
- config = open(config_txt, "w")
- config.write(args.name + "=" + args.value + "\n")
- config.close()
- print "'" + args.name + "' was set to '" + args.value + "' in Configuration"
- def func_installed(args):
- if os.path.exists(installed_txt):
- ins = open(installed_txt, "r")
- i = ins.read()
- ins.close()
- i = i.split(",")
- for e in i:
- if(e != ""):
- print(e)
- else:
- i = []
- print("No Packages installed")
- return i
- def func_available(args):
- if os.path.exists(installed_txt):
- ins = open(installed_txt, "r")
- installed = ins.read()
- ins.close()
- installed = installed.split(",")
- else:
- installed = []
- if os.path.exists(pkgs_txt):
- ins = open(homedir + "/.mm/pkgs.txt", "r")
- i = ins.readlines()
- ins.close()
- for e in i:
- if(e != ""):
- ee = e.split(",")
- if ee[0] not in installed:
- print(ee[0])
- else:
- print("No Packages available")
- print("ModManager %s" % VER)
- description = """
- Minetest Mod Manager %s (c) sfan5 2012
- http://minetest.net/forum/viewtopic.php?id=618
- """ % VER
- about = """
- This program maintains a list of repositories and mods for Minetest, and can be used to install requested mods
- """
- parser = argparse.ArgumentParser(description=description, epilog=about)
- subparsers = parser.add_subparsers(title='Available commands')
- parser_add = subparsers.add_parser('add-repo',help='Adds a Repo to the List of Repos')
- parser_add.add_argument('repo', help='Repo address')
- parser_add.set_defaults(func=func_add_repo)
- parser_update = subparsers.add_parser('update',help='Updates the Package List')
- parser_update.set_defaults(func=func_update)
- parser_install = subparsers.add_parser('install',help='Installs a Package')
- parser_install.add_argument('package', help='Repo address')
- parser_install.set_defaults(func=func_install)
- parser_config = subparsers.add_parser('config',help='Configure ModManager')
- parser_config.add_argument('name', help='Parameter name')
- parser_config.add_argument('value', help='Parameter value')
- parser_config.set_defaults(func=func_config)
- parser_installed = subparsers.add_parser('installed',help='Shows installed Packages')
- parser_installed.set_defaults(func=func_installed)
- parser_available = subparsers.add_parser('available',help='Shows available Packages')
- parser_available.set_defaults(func=func_available)
- #parse arguments and execute action
- args = parser.parse_args()
- args.func(args)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement