diff options
Diffstat (limited to 'src/backend')
-rw-r--r--[-rwxr-xr-x] | src/backend/libsisyphus.py | 152 |
1 files changed, 108 insertions, 44 deletions
diff --git a/src/backend/libsisyphus.py b/src/backend/libsisyphus.py index 17a292f..30baffc 100755..100644 --- a/src/backend/libsisyphus.py +++ b/src/backend/libsisyphus.py @@ -22,12 +22,14 @@ mirrorCfg = '/etc/sisyphus/mirrors.conf' # only run as root (CLI + GUI frontend) + def checkRoot(): if not os.getuid() == 0: sys.exit("\nYou need root permissions to do this, exiting!\n") # only run in binary mode (binmode) or hybrid mode (mixedmode) (CLI + GUI frontend) + def checkSystemMode(): portageBinCfg = '/opt/redcore-build/conf/intel/portage/make.conf.amd64-binmode' portageCfgSym = '/etc/portage/make.conf' @@ -44,38 +46,47 @@ 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) + 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) + 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') + 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) + 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') + 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) + def fetchRemoteDatabase(): remotePkgsURL = getRemotePkgsURL() remoteDscsURL = getRemoteDscsURL() @@ -89,59 +100,72 @@ def fetchRemoteDatabase(): # generate local CSV's to be imported into the database (CLI + GUI frontend) + def makeLocalDatabase(): - subprocess.check_call(['/usr/share/sisyphus/helpers/make_local_csv']) # this is really hard to do in python, so we cheat with a bash helper script + # this is really hard to do in python, so we cheat with a bash helper script + subprocess.check_call(['/usr/share/sisyphus/helpers/make_local_csv']) # download and import remote CSV's into the database (CLI + GUI frontend) + def syncRemoteDatabase(): fetchRemoteDatabase() sisyphusdb = sqlite3.connect(sisyphusDB) sisyphusdb.cursor().execute('''drop table if exists remote_packages''') - sisyphusdb.cursor().execute('''create table remote_packages (category TEXT,name TEXT,version TEXT,slot TEXT)''') + sisyphusdb.cursor().execute( + '''create table remote_packages (category TEXT,name TEXT,version TEXT,slot TEXT)''') with open(remotePkgsDB) as rmtCsv: for row in csv.reader(rmtCsv): - sisyphusdb.cursor().execute("insert into remote_packages (category, name, version, slot) values (?, ?, ?, ?);", row) + sisyphusdb.cursor().execute( + "insert into remote_packages (category, name, version, slot) values (?, ?, ?, ?);", row) sisyphusdb.commit() sisyphusdb.close() sisyphusdb = sqlite3.connect(sisyphusDB) sisyphusdb.cursor().execute('''drop table if exists remote_descriptions''') - sisyphusdb.cursor().execute('''create table remote_descriptions (category TEXT,name TEXT,description TEXT)''') + sisyphusdb.cursor().execute( + '''create table remote_descriptions (category TEXT,name TEXT,description TEXT)''') with open(remoteDscsDB) as rmtCsv: for row in csv.reader(rmtCsv): - sisyphusdb.cursor().execute("insert into remote_descriptions (category, name, description) values (?, ?, ?);", row) + sisyphusdb.cursor().execute( + "insert into remote_descriptions (category, name, description) values (?, ?, ?);", row) sisyphusdb.commit() sisyphusdb.close() # generate and import local CSV's into the database (CLI + GUI frontend) + def syncLocalDatabase(): makeLocalDatabase() sisyphusdb = sqlite3.connect(sisyphusDB) sisyphusdb.cursor().execute('''drop table if exists local_packages''') - sisyphusdb.cursor().execute('''create table local_packages (category TEXT,name TEXT,version TEXT,slot TEXT)''') + sisyphusdb.cursor().execute( + '''create table local_packages (category TEXT,name TEXT,version TEXT,slot TEXT)''') with open(localPkgsDB) as lclCsv: for row in csv.reader(lclCsv): - sisyphusdb.cursor().execute("insert into local_packages (category, name, version, slot) values (?, ?, ?, ?);", row) + sisyphusdb.cursor().execute( + "insert into local_packages (category, name, version, slot) values (?, ?, ?, ?);", row) sisyphusdb.commit() sisyphusdb.close() # sync portage tree (CLI + GUI frontend) + def syncPortageTree(): subprocess.call(['emerge', '--sync', '--quiet']) # sync portage configuration files (CLI + GUI frontend) + def syncPortageCfg(): os.chdir(portageCfg) subprocess.call(['git', 'pull', '--quiet']) # check remote timestamps...if newer than local timestamps, sync everything (CLI + GUI frontend) + @animation.wait('syncing remote database') def syncAll(): checkRoot() @@ -150,12 +174,14 @@ def syncAll(): remoteDscsURL = getRemoteDscsURL() http = urllib3.PoolManager() - reqRemotePkgsTS = http.request('HEAD',remotePkgsURL) - remotePkgsTS = int(parser.parse(reqRemotePkgsTS.headers['last-modified']).strftime("%s")) + reqRemotePkgsTS = http.request('HEAD', remotePkgsURL) + remotePkgsTS = int(parser.parse( + reqRemotePkgsTS.headers['last-modified']).strftime("%s")) localPkgsTS = int(os.path.getctime(remotePkgsDB)) - reqRemoteDscsTS = http.request('HEAD',remoteDscsURL) - remoteDscsTS = int(parser.parse(reqRemoteDscsTS.headers['last-modified']).strftime("%s")) + reqRemoteDscsTS = http.request('HEAD', remoteDscsURL) + remoteDscsTS = int(parser.parse( + reqRemoteDscsTS.headers['last-modified']).strftime("%s")) localDscsTS = int(os.path.getctime(remoteDscsDB)) if remotePkgsTS < localPkgsTS: @@ -171,12 +197,14 @@ def syncAll(): # if something is installed with portage directly using emerge, sisyphus won't be aware of it # this will parse local portage database and import the changes into sisyphus database + @animation.wait('syncing local database') def startSyncSPM(): syncLocalDatabase() # sync portage tree and portage configuration files (CLI frontend) + @animation.wait('syncing portage') def startSync(): syncPortageTree() @@ -186,6 +214,7 @@ def startSync(): # if for some reason sisyphus database gets corrupted or deleted, we can still regenerate it from portage database # this will fetch remote information from mirrors, parse local portage database and regenerate sisyphus database + @animation.wait('resurrecting database') def rescueDB(): if os.path.exists(remotePkgsDB): @@ -202,10 +231,12 @@ def rescueDB(): # call portage to solve package(s) dependencies (CLI frontend) + @animation.wait('resolving dependencies') def solvePkgDeps(pkgList): pkgDeps = [] - portageExec = subprocess.Popen(['emerge', '-qgp'] + pkgList, stdout=subprocess.PIPE) + portageExec = subprocess.Popen( + ['emerge', '-qgp'] + pkgList, stdout=subprocess.PIPE) for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): if "/" in portageOutput.rstrip(): pkgDep = str(portageOutput.rstrip().split("]")[1].strip("\ ")) @@ -214,18 +245,22 @@ def solvePkgDeps(pkgList): # call portage to solve world dependencies (CLI frontend) + @animation.wait('resolving dependencies') def solveWorldDeps(): worldDeps = [] - portageExec = subprocess.Popen(['emerge', '-uDNqgp', '--backtrack=100', '--with-bdeps=y', '@world'], stdout=subprocess.PIPE) + portageExec = subprocess.Popen( + ['emerge', '-uDNqgp', '--backtrack=100', '--with-bdeps=y', '@world'], stdout=subprocess.PIPE) for portageOutput in io.TextIOWrapper(portageExec.stdout, encoding="utf-8"): if "/" in portageOutput.rstrip(): - worldDep = str(portageOutput.rstrip().split("]")[1].split("[")[0].strip("\ ")) + worldDep = str(portageOutput.rstrip().split("]")[ + 1].split("[")[0].strip("\ ")) worldDeps.append(worldDep) return worldDeps # fetch binaries and call portage to install the package(s) from local cache (CLI frontend) + def startInstall(pkgList): syncAll() @@ -247,17 +282,22 @@ def startInstall(pkgList): for index, binpkg in enumerate(pkgBins): subprocess.call(['qtbz2', '-x'] + str(binpkg + '.tbz2').split()) - CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + str(binpkg + '.xpak').split() + ['CATEGORY']) - os.remove(str(binpkg + '.xpak')) # we extracted the categories, safe to delete + CATEGORY = subprocess.check_output( + ['qxpak', '-x', '-O'] + str(binpkg + '.xpak').split() + ['CATEGORY']) + # we extracted the categories, safe to delete + os.remove(str(binpkg + '.xpak')) if os.path.isdir(portageCache + CATEGORY.decode().strip()): - shutil.move(str(binpkg + '.tbz2'), os.path.join(portageCache + CATEGORY.decode().strip(), os.path.basename(str(binpkg + '.tbz2')))) + shutil.move(str(binpkg + '.tbz2'), os.path.join(portageCache + + CATEGORY.decode().strip(), os.path.basename(str(binpkg + '.tbz2')))) else: os.makedirs(portageCache + CATEGORY.decode().strip()) - shutil.move(str(binpkg + '.tbz2'), os.path.join(portageCache + CATEGORY.decode().strip(), os.path.basename(str(binpkg + '.tbz2')))) + shutil.move(str(binpkg + '.tbz2'), os.path.join(portageCache + + CATEGORY.decode().strip(), os.path.basename(str(binpkg + '.tbz2')))) if os.path.exists(str(binpkg + '.tbz2')): - os.remove(str(binpkg + '.tbz2')) # we moved the binaries in cache, safe to delete + # we moved the binaries in cache, safe to delete + os.remove(str(binpkg + '.tbz2')) portageExec = subprocess.Popen(['emerge', '-q'] + pkgList) portageExec.wait() @@ -265,6 +305,7 @@ def startInstall(pkgList): # call portage to uninstall the package(s) (CLI frontend) + def startUninstall(pkgList): portageExec = subprocess.Popen(['emerge', '-cqa'] + pkgList) portageExec.wait() @@ -272,6 +313,7 @@ def startUninstall(pkgList): # call portage to force-uninstall the package(s) (CLI frontend) + def startUninstallForce(pkgList): portageExec = subprocess.Popen(['emerge', '-Cqa'] + pkgList) portageExec.wait() @@ -279,6 +321,7 @@ def startUninstallForce(pkgList): # call portage to remove orphan package(s) (CLI frontend) + def removeOrphans(): portageExec = subprocess.Popen(['emerge', '-cqa']) portageExec.wait() @@ -286,6 +329,7 @@ def removeOrphans(): # fetch binaries and call portage to perform a system upgrade using local cache (CLI frontend) + def startUpgrade(): syncAll() @@ -307,51 +351,63 @@ def startUpgrade(): for index, worldpkg in enumerate(worldBins): subprocess.call(['qtbz2', '-x'] + str(worldpkg + '.tbz2').split()) - CATEGORY = subprocess.check_output(['qxpak', '-x', '-O'] + str(worldpkg + '.xpak').split() + ['CATEGORY']) - os.remove(str(worldpkg + '.xpak')) # we extracted the categories, safe to delete + CATEGORY = subprocess.check_output( + ['qxpak', '-x', '-O'] + str(worldpkg + '.xpak').split() + ['CATEGORY']) + # we extracted the categories, safe to delete + os.remove(str(worldpkg + '.xpak')) if os.path.isdir(portageCache + CATEGORY.decode().strip()): - shutil.move(str(worldpkg + '.tbz2'), os.path.join(portageCache + CATEGORY.decode().strip(), os.path.basename(str(worldpkg + '.tbz2')))) + shutil.move(str(worldpkg + '.tbz2'), os.path.join(portageCache + + CATEGORY.decode().strip(), os.path.basename(str(worldpkg + '.tbz2')))) else: os.makedirs(portageCache + CATEGORY.decode().strip()) - shutil.move(str(worldpkg + '.tbz2'), os.path.join(portageCache + CATEGORY.decode().strip(), os.path.basename(str(worldpkg + '.tbz2')))) + shutil.move(str(worldpkg + '.tbz2'), os.path.join(portageCache + + CATEGORY.decode().strip(), os.path.basename(str(worldpkg + '.tbz2')))) if os.path.exists(str(worldpkg + '.tbz2')): - os.remove(str(worldpkg + '.tbz2')) # we moved the binaries in cache, safe to delete + # we moved the binaries in cache, safe to delete + os.remove(str(worldpkg + '.tbz2')) - portageExec = subprocess.Popen(['emerge', '-uDNq', '--backtrack=100', '--with-bdeps=y', '@world']) + portageExec = subprocess.Popen( + ['emerge', '-uDNq', '--backtrack=100', '--with-bdeps=y', '@world']) portageExec.wait() syncLocalDatabase() # call portage to search for package(s) (CLI frontend) + def startSearch(pkgList): - subprocess.check_call(['emerge', '-sg'] + pkgList) # FIXME : query sisyphus.db instead of searching through portage + # FIXME : query sisyphus.db instead of searching through portage + subprocess.check_call(['emerge', '-sg'] + pkgList) # check remote timestamps...if newer than local timestamps, sync everything (CLI + GUI frontend) + def startUpdate(): syncAll() # display information about installed core packages and portage configuration (CLI frontend) + def sysInfo(): subprocess.check_call(['emerge', '--info']) # kill background portage process if sisyphus dies (CLI + GUI frontend) + def portageKill(portageCmd): - portageCmd.terminate() + portageCmd.terminate() # get a list of mirrors (GUI frontend) + def getMirrors(): mirrorList = [] with open(mirrorCfg) as mirrorFile: for line in mirrorFile.readlines(): if 'PORTAGE_BINHOST=' in line: url = line.split("=")[1].replace('"', '').rstrip() - mirror = {'isActive':True,'Url':url} + mirror = {'isActive': True, 'Url': url} if line.startswith('#'): mirror['isActive'] = False mirrorList.append(mirror) @@ -360,14 +416,19 @@ def getMirrors(): # set the active mirror (GUI frontend) + def setActiveMirror(mirrorList): with open(mirrorCfg, 'w+') as mirrorFile: - mirrorFile.write("#######################################################\n") - mirrorFile.write("# Support for multiple mirrors is somewhat incomplete #\n") - mirrorFile.write("# Uncomment only one mirror from the list bellow #\n") - mirrorFile.write("#######################################################\n") + mirrorFile.write( + "#######################################################\n") + mirrorFile.write( + "# Support for multiple mirrors is somewhat incomplete #\n") + mirrorFile.write( + "# Uncomment only one mirror from the list bellow #\n") + mirrorFile.write( + "#######################################################\n") mirrorFile.write("\n") - for line in mirrorList : + for line in mirrorList: mirror = 'PORTAGE_BINHOST=' + '"' + line['Url'] + '"' if not line['isActive']: mirror = '# ' + mirror @@ -376,25 +437,27 @@ def setActiveMirror(mirrorList): # get a list of mirrors (CLI frontend) + def listRepo(): mirrorList = getMirrors() for i, line in enumerate(mirrorList): if line['isActive']: - print(i+1,'*',line['Url']) + print(i + 1, '*', line['Url']) else: - print(i+1,' ',line['Url']) + print(i + 1, ' ', line['Url']) # set the active mirror (CLI frontend) + def setRepo(mirror): mirror = int(mirror[0]) mirrorList = getMirrors() - if mirror not in range(1,len(mirrorList)+1): + if mirror not in range(1, len(mirrorList) + 1): print('mirror index is wrong, please check with "sisyphus mirror list"') else: - for i in range(0,len(mirrorList)): - indx = i+1 - if indx == mirror : + for i in range(0, len(mirrorList)): + indx = i + 1 + if indx == mirror: mirrorList[i]['isActive'] = True else: mirrorList[i]['isActive'] = False @@ -402,6 +465,7 @@ def setRepo(mirror): # display help menu (CLI frontend) + def showHelp(): print("\nUsage : sisyphus command [package(s)] || [file(s)]\n") print("Sisyphus is a simple python wrapper around portage, gentoolkit, and portage-utils that provides") |