summaryrefslogtreecommitdiff
path: root/src/backend/libsisyphus.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/libsisyphus.py')
-rwxr-xr-xsrc/backend/libsisyphus.py78
1 files changed, 71 insertions, 7 deletions
diff --git a/src/backend/libsisyphus.py b/src/backend/libsisyphus.py
index 1f15140..d89c029 100755
--- a/src/backend/libsisyphus.py
+++ b/src/backend/libsisyphus.py
@@ -9,9 +9,11 @@ import subprocess
import sys
import urllib3
import io
+import wget
from dateutil import parser
-redcore_portage_config_path = '/opt/redcore-build'
+portageCfg = '/opt/redcore-build/'
+portageCache = '/var/cache/packages/'
remotePkgsDB = '/var/lib/sisyphus/csv/remotePackagesPre.csv'
remoteDscsDB = '/var/lib/sisyphus/csv/remoteDescriptionsPre.csv'
localPkgsDB = '/var/lib/sisyphus/csv/localPackagesPre.csv'
@@ -27,14 +29,14 @@ def checkRoot():
# only run in binary mode (binmode) or hybrid mode (mixedmode) (CLI + GUI frontend)
def checkSystemMode():
- portage_binmode_make_conf = '/opt/redcore-build/conf/intel/portage/make.conf.amd64-binmode'
- portage_make_conf_symlink = '/etc/portage/make.conf'
+ portageBinCfg = '/opt/redcore-build/conf/intel/portage/make.conf.amd64-binmode'
+ portageCfgSym = '/etc/portage/make.conf'
- if not os.path.islink(portage_make_conf_symlink):
+ if not os.path.islink(portageCfgSym):
print("\nmake.conf is not a symlink, refusing to run!\n")
sys.exit(1)
else:
- if os.path.realpath(portage_make_conf_symlink) == portage_binmode_make_conf:
+ if os.path.realpath(portageCfgSym) == portageBinCfg:
pass
else:
print("\nThe system is not set to binmode, refusing to run!\n")
@@ -42,20 +44,34 @@ def checkSystemMode():
# get current mirror information, so we know where we download from (CLI + GUI frontend)
+def getBinhostURL():
+ binhostURL = []
+
+ portageExec = subprocess.Popen(['emerge', '--info', '--verbose'], stdout=subprocess.PIPE)
+ for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"):
+ if "PORTAGE_BINHOST" in portageOutput.rstrip():
+ binhostURL = str(portageOutput.rstrip().split("=")[1].strip('\"'))
+
+ return binhostURL
+
def getRemotePkgsURL():
remotePkgsURL = []
+
portageExec = subprocess.Popen(['emerge', '--info', '--verbose'], stdout=subprocess.PIPE)
for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"):
if "PORTAGE_BINHOST" in portageOutput.rstrip():
remotePkgsURL = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages', 'csv') + 'remotePackagesPre.csv')
+
return remotePkgsURL
def getRemoteDscsURL():
remoteDscsURL = []
+
portageExec = subprocess.Popen(['emerge', '--info', '--verbose'], stdout=subprocess.PIPE)
for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"):
if "PORTAGE_BINHOST" in portageOutput.rstrip():
remoteDscsURL = str(portageOutput.rstrip().split("=")[1].strip('\"').replace('packages', 'csv') + 'remoteDescriptionsPre.csv')
+
return remoteDscsURL
# download remote CSV's to be imported into the database (CLI + GUI frontend)
@@ -121,7 +137,7 @@ def syncPortageTree():
# sync portage configuration files (CLI + GUI frontend)
def syncPortageCfg():
- os.chdir(redcore_portage_config_path)
+ os.chdir(portageCfg)
subprocess.call(['git', 'pull', '--quiet'])
# check remote timestamps...if newer than local timestamps, sync everything (CLI + GUI frontend)
@@ -184,11 +200,59 @@ def rescueDB():
syncRemoteDatabase()
syncLocalDatabase()
+# call portage to solve package(s) dependencies (CLI frontend)
+
+@animation.wait('resolving dependencies')
+def solveDeps(pkgList):
+ deps = []
+ portageExec = subprocess.Popen(['emerge', '-pq'] + pkgList, stdout=subprocess.PIPE)
+ for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"):
+ if "/" in portageOutput.rstrip():
+ dep = str(portageOutput.rstrip().split("]")[1].strip("\ "))
+ deps.append(dep)
+ return deps
+
+# bypass portage buggy fetcher, use our method instead (CLI frontend)
+
+def fetchBins(pkgList):
+ binhostURL = getBinhostURL()
+ deps = solveDeps(pkgList)
+ pbins = []
+
+ if input("Would you like to merge these packages?" + " " + str(deps) + " " + "[y/N]" + " ").lower().strip()[:1] == "y":
+ for index, url in enumerate([binhostURL + package + '.tbz2' for package in deps]):
+ print("\n" + ">>> Fetching" + " " + url)
+ wget.download(url)
+
+ for index, package in enumerate(deps):
+ pbin = str(package.rstrip().split("/")[1])
+ pbins.append(pbin)
+
+ return pbins
+ else:
+ sys.exit("\n" + "Quitting!")
+
# call portage to install the package(s) (CLI frontend)
def startInstall(pkgList):
syncAll()
- portageExec = subprocess.Popen(['emerge', '-aq'] + pkgList)
+ pbins = fetchBins(pkgList)
+
+ for index, binary in enumerate(pbins):
+ subprocess.call(['qtbz2', '-x'] + str(binary + '.tbz2').split())
+ CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + str(binary + '.xpak').split() + ['CATEGORY'])
+ os.remove(str(binary + '.xpak')) # we extracted the categories, safe to delete
+
+ if os.path.isdir(portageCache + CATEGORY.decode().strip()):
+ shutil.move(str(binary + '.tbz2'), os.path.join(portageCache + CATEGORY.decode().strip(), os.path.basename(str(binary + '.tbz2'))))
+ else:
+ os.makedirs(portageCache + CATEGORY.decode().strip())
+ shutil.move(str(binary + '.tbz2'), os.path.join(portageCache + CATEGORY.decode().strip(), os.path.basename(str(binary + '.tbz2'))))
+
+ if os.path.exists(str(binary + '.tbz2')):
+ os.remove(str(binary + '.tbz2')) # we moved the binaries in cache, safe to delete
+
+ portageExec = subprocess.Popen(['emerge', '-Kq'] + pkgList)
portageExec.wait()
syncLocalDatabase()