- misc bug fixes
- moving askquestion to EquoInterface (that is gonna be renamed to EntropyInterface when done) git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@973 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
@@ -6,6 +6,7 @@ TODO list:
|
||||
- equo world: removal packages, first ask all, then do
|
||||
- separate packages for license restrictions
|
||||
- add a check when installing a package from a different arch
|
||||
- convert all print_* into TextInterface::updateProgress
|
||||
|
||||
notice this:
|
||||
>> ## Ebuild: pkg_prerm()
|
||||
|
||||
+3
-2
@@ -61,6 +61,7 @@ def configurator(options):
|
||||
'''
|
||||
def update():
|
||||
cache_status = False
|
||||
Text = TextInterface()
|
||||
while 1:
|
||||
scandata = scanfs(dcache = cache_status)
|
||||
if (cache_status):
|
||||
@@ -93,7 +94,7 @@ def update():
|
||||
continue
|
||||
print_info(darkred("Configuration file: ")+darkgreen(etpConst['systemroot']+scandata[key]['destination']))
|
||||
if cmd == -3:
|
||||
rc = entropyTools.askquestion(">> Overwrite ?")
|
||||
rc = Text.askQuestion(">> Overwrite ?")
|
||||
if rc == "No":
|
||||
continue
|
||||
print_info(darkred("Moving ")+darkgreen(etpConst['systemroot']+scandata[key]['source'])+darkred(" to ")+brown(etpConst['systemroot']+scandata[key]['destination']))
|
||||
@@ -120,7 +121,7 @@ def update():
|
||||
continue
|
||||
print_info(darkred("Configuration file: ")+darkgreen(etpConst['systemroot']+scandata[key]['destination']))
|
||||
if cmd == -7:
|
||||
rc = entropyTools.askquestion(">> Discard ?")
|
||||
rc = Text.askQuestion(">> Discard ?")
|
||||
if rc == "No":
|
||||
continue
|
||||
print_info(darkred("Discarding ")+darkgreen(etpConst['systemroot']+scandata[key]['source']))
|
||||
|
||||
+3
-2
@@ -315,8 +315,9 @@ except KeyboardInterrupt:
|
||||
#except Timeout:
|
||||
# pass
|
||||
except Exception:
|
||||
from entropyTools import askquestion, printException
|
||||
from entropyTools import printException
|
||||
from remoteTools import getOnlineContent, reportApplicationError
|
||||
Text = TextInterface()
|
||||
print_error(darkred("Hi. My name is Bug Reporter. I am sorry to inform you that Equo crashed. Well, you know, shit happens."))
|
||||
print_error(darkred("But there's something you could do to help Equo to be a better application."))
|
||||
print_error(darkred("-- EVEN IF I DON'T WANT YOU TO SUBMIT THE SAME REPORT MULTIPLE TIMES --"))
|
||||
@@ -352,7 +353,7 @@ except Exception:
|
||||
conntest = getOnlineContent("http://svn.sabayonlinux.org")
|
||||
if (conntest != False):
|
||||
print_error(darkgreen("Of course you are on the Internet..."))
|
||||
rc = askquestion(" Erm... Can I send the error to my creators so they can fix me?")
|
||||
rc = Text.askQuestion(" Erm... Can I send the error to my creators so they can fix me?")
|
||||
if rc == "No":
|
||||
print_error(darkgreen("Ok, ok ok ok... Sorry!"))
|
||||
loadconfcache()
|
||||
|
||||
+38
-22
@@ -29,7 +29,7 @@ from clientConstants import *
|
||||
from outputTools import *
|
||||
import remoteTools
|
||||
import exceptionTools
|
||||
from entropyTools import compareMd5, bytesIntoHuman, askquestion, getRandomNumber, dep_getkey, uncompressTarBz2, extractXpak, applicationLockCheck, countdown, isRoot, spliturl, remove_tag, dep_striptag, md5sum, allocateMaskedFile, istextfile, isnumber, extractEdb, unpackXpak, lifobuffer, ebeep, parallelStep
|
||||
from entropyTools import compareMd5, bytesIntoHuman, getRandomNumber, dep_getkey, uncompressTarBz2, extractXpak, applicationLockCheck, countdown, isRoot, spliturl, remove_tag, dep_striptag, md5sum, allocateMaskedFile, istextfile, isnumber, extractEdb, unpackXpak, lifobuffer, ebeep, parallelStep
|
||||
from databaseTools import openRepositoryDatabase, openClientDatabase
|
||||
import confTools
|
||||
import dumpTools
|
||||
@@ -50,7 +50,7 @@ class EquoInterface(TextInterface):
|
||||
@input noclientdb(bool): if enabled, client database non-existance will be ignored
|
||||
@input xcache(bool): enable/disable database caching
|
||||
'''
|
||||
def __init__(self, indexing = True, noclientdb = False, xcache = True):
|
||||
def __init__(self, indexing = True, noclientdb = False, xcache = True, server = False, server_readonly = True, server_noupload = True):
|
||||
|
||||
import dumpTools
|
||||
self.dumpTools = dumpTools
|
||||
@@ -63,7 +63,12 @@ class EquoInterface(TextInterface):
|
||||
self.indexing = indexing
|
||||
self.noclientdb = noclientdb
|
||||
self.xcache = xcache
|
||||
self.openClientDatatabase()
|
||||
if server:
|
||||
self.server_readonly = server_readonly
|
||||
self.server_noupload = server_noupload
|
||||
self.openServerDatabase()
|
||||
else:
|
||||
self.openClientDatabase()
|
||||
self.repoDbCache = {}
|
||||
# Packages installation stuff
|
||||
self.transaction_ready = False
|
||||
@@ -84,18 +89,29 @@ class EquoInterface(TextInterface):
|
||||
self.clientDbconn.closeDB()
|
||||
self.openClientDatatabase()
|
||||
|
||||
def reopenServerDbconn(self, readonly = True, noupload = True):
|
||||
self.serverDbconn.closeDB()
|
||||
self.server_readonly = readonly
|
||||
self.server_noupload = noupload
|
||||
self.openServerDatabase()
|
||||
|
||||
def closeAllRepositoryDatabases(self):
|
||||
for item in self.repoDbCache:
|
||||
self.repoDbCache[item].closeDB()
|
||||
del self.repoDbCache[item]
|
||||
self.repoDbCache.clear()
|
||||
|
||||
def openClientDatatabase(self):
|
||||
def openClientDatabase(self):
|
||||
self.clientDbconn = self.databaseTools.openClientDatabase(indexing = self.indexing,
|
||||
generate = self.noclientdb,
|
||||
xcache = self.xcache
|
||||
)
|
||||
|
||||
def openServerDatabase(self):
|
||||
self.serverDbconn = self.databaseTools.openServerDatabase(readOnly = self.server_readonly,
|
||||
noUpload = self.server_noupload
|
||||
)
|
||||
|
||||
def openRepositoryDatabase(self, repoid):
|
||||
if not self.repoDbCache.has_key((repoid,etpConst['systemroot'])):
|
||||
dbconn = self.databaseTools.openRepositoryDatabase(repoid, xcache = self.xcache, indexing = self.indexing)
|
||||
@@ -113,6 +129,7 @@ class EquoInterface(TextInterface):
|
||||
indexing = self.indexing,
|
||||
readOnly = readOnly
|
||||
)
|
||||
return dbconn
|
||||
|
||||
def listAllAvailableBranches(self):
|
||||
branches = set()
|
||||
@@ -832,7 +849,7 @@ class EquoInterface(TextInterface):
|
||||
monotree = set(idpackages) # monodimensional tree
|
||||
|
||||
# check if dependstable is sane before beginning
|
||||
rx = self.clientDbconn.retrieveDepends(idpackages[0])
|
||||
self.clientDbconn.retrieveDepends(idpackages[0])
|
||||
|
||||
while (not dependsOk):
|
||||
treedepth += 1
|
||||
@@ -1015,13 +1032,14 @@ class EquoInterface(TextInterface):
|
||||
# filter out packages that are in actionQueue comparing key + slot
|
||||
if install and removal:
|
||||
myremmatch = {}
|
||||
[myremmatch.update({(self.entropyTools.dep_getkey(self.clientDbconn.retrieveAtom(x)),self.clientDbconn.retrieveSlot(x)): x}) for x in removal]
|
||||
for x in removal:
|
||||
myremmatch.update({(self.entropyTools.dep_getkey(self.clientDbconn.retrieveAtom(x)),self.clientDbconn.retrieveSlot(x)): x})
|
||||
for packageInfo in install:
|
||||
dbconn = self.openRepositoryDatabase(packageInfo[1])
|
||||
testtuple = (self.entropyTools.dep_getkey(dbconn.retrieveAtom(packageInfo[0])),dbconn.retrieveSlot(packageInfo[0]))
|
||||
if testtuple in myremmatch:
|
||||
# remove from removalQueue
|
||||
if myremmatch[testtuple] in removalQueue:
|
||||
if myremmatch[testtuple] in removal:
|
||||
removal.remove(myremmatch[testtuple])
|
||||
del testtuple
|
||||
del myremmatch
|
||||
@@ -1169,7 +1187,7 @@ def fetchFile(url, digest = None):
|
||||
filename = os.path.basename(url)
|
||||
filepath = etpConst['packagesbindir']+"/"+etpConst['branch']+"/"+filename
|
||||
if os.path.exists(filepath):
|
||||
os.remove(filepath)
|
||||
os.remove(filepath)
|
||||
|
||||
# load class
|
||||
fetchConn = remoteTools.urlFetcher(url, filepath)
|
||||
@@ -1179,21 +1197,20 @@ def fetchFile(url, digest = None):
|
||||
fetchChecksum = fetchConn.download()
|
||||
data_transfer = fetchConn.datatransfer
|
||||
except KeyboardInterrupt:
|
||||
return -4, data_transfer
|
||||
return -4, data_transfer
|
||||
except:
|
||||
return -1, data_transfer
|
||||
return -1, data_transfer
|
||||
if fetchChecksum == "-3":
|
||||
return -3, data_transfer
|
||||
if (digest):
|
||||
#print digest+" <--> "+fetchChecksum
|
||||
if (fetchChecksum != digest):
|
||||
# not properly downloaded
|
||||
del fetchConn
|
||||
return -2, data_transfer
|
||||
else:
|
||||
del fetchConn
|
||||
return 0, data_transfer
|
||||
return -3, data_transfer
|
||||
|
||||
del fetchConn
|
||||
if (digest):
|
||||
#print digest+" <--> "+fetchChecksum
|
||||
if (fetchChecksum != digest):
|
||||
# not properly downloaded
|
||||
return -2, data_transfer
|
||||
else:
|
||||
return 0, data_transfer
|
||||
return 0, data_transfer
|
||||
|
||||
def matchChecksum(infoDict):
|
||||
@@ -1365,7 +1382,6 @@ def removePackage(infoDict):
|
||||
'''
|
||||
def unpackPackage(infoDict):
|
||||
|
||||
package = infoDict['download']
|
||||
equoLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"Unpacking package: "+str(infoDict['atom']))
|
||||
|
||||
if os.path.isdir(infoDict['unpackdir']):
|
||||
@@ -1978,7 +1994,7 @@ def stepExecutor(step, infoDict, loopString = None):
|
||||
elif step == "cleanup":
|
||||
print_info(red(" ## ")+blue("Cleaning temporary files for: ")+red(os.path.basename(infoDict['atom'])))
|
||||
xtermTitle(loopString+' Cleaning temporary files for: '+os.path.basename(infoDict['atom']))
|
||||
parallelClean = parallelStep(cleanupPackage,infoDict)
|
||||
parallelStep(cleanupPackage,infoDict)
|
||||
# we don't care if cleanupPackage fails since it's not critical
|
||||
'''
|
||||
output = cleanupPackage(infoDict)
|
||||
|
||||
+20
-29
@@ -112,8 +112,6 @@ def searchInstalledPackages(packages, idreturn = False, dbconn = None):
|
||||
if (result):
|
||||
for pkg in result:
|
||||
idpackage = pkg[1]
|
||||
atom = pkg[0]
|
||||
branch = clientDbconn.retrieveBranch(idpackage)
|
||||
if (idreturn):
|
||||
dataInfo.add(idpackage)
|
||||
else:
|
||||
@@ -141,24 +139,22 @@ def searchBelongs(files, idreturn = False, dbconn = None):
|
||||
dataInfo = set() # when idreturn is True
|
||||
results = {}
|
||||
flatresults = {}
|
||||
for file in files:
|
||||
for xfile in files:
|
||||
like = False
|
||||
if file.find("*") != -1:
|
||||
import re
|
||||
out = re.subn("\*","%",file)
|
||||
file = out[0]
|
||||
if xfile.find("*") != -1:
|
||||
xfile.replace("*","%")
|
||||
like = True
|
||||
results[file] = set()
|
||||
idpackages = clientDbconn.searchBelongs(file, like)
|
||||
results[xfile] = set()
|
||||
idpackages = clientDbconn.searchBelongs(xfile, like)
|
||||
for idpackage in idpackages:
|
||||
if not flatresults.get(idpackage):
|
||||
results[file].add(idpackage)
|
||||
results[xfile].add(idpackage)
|
||||
flatresults[idpackage] = True
|
||||
|
||||
if (results):
|
||||
for result in results:
|
||||
# print info
|
||||
file = result
|
||||
xfile = result
|
||||
result = results[result]
|
||||
for idpackage in result:
|
||||
if (idreturn):
|
||||
@@ -168,7 +164,7 @@ def searchBelongs(files, idreturn = False, dbconn = None):
|
||||
else:
|
||||
printPackageInfo(idpackage, clientDbconn, clientSearch = True)
|
||||
if (not idreturn) and (not etpUi['quiet']):
|
||||
print_info(blue(" Keyword: ")+bold("\t"+file))
|
||||
print_info(blue(" Keyword: ")+bold("\t"+xfile))
|
||||
print_info(blue(" Found: ")+bold("\t"+str(len(result)))+red(" entries"))
|
||||
|
||||
if (idreturn):
|
||||
@@ -191,9 +187,9 @@ def searchDepends(atoms, idreturn = False, dbconn = None):
|
||||
for atom in atoms:
|
||||
result = clientDbconn.atomMatch(atom)
|
||||
matchInRepo = False
|
||||
if (result[0] == -1) and dbclose:
|
||||
if (result[0] == -1):
|
||||
matchInRepo = True
|
||||
result = atomMatch(atom)
|
||||
result = Equo.atomMatch(atom)
|
||||
if (result[0] != -1):
|
||||
if (matchInRepo):
|
||||
dbconn = Equo.openRepositoryDatabase(result[1])
|
||||
@@ -316,11 +312,11 @@ def searchFiles(atoms, idreturn = False, dbconn = None):
|
||||
dataInfo.add((result,files))
|
||||
else:
|
||||
if etpUi['quiet']:
|
||||
for file in files:
|
||||
print file
|
||||
for xfile in files:
|
||||
print xfile
|
||||
else:
|
||||
for file in files:
|
||||
print_info(blue(" ### ")+red(file))
|
||||
for xfile in files:
|
||||
print_info(blue(" ### ")+red(xfile))
|
||||
if (not idreturn) and (not etpUi['quiet']):
|
||||
print_info(blue(" Package: ")+bold("\t"+atom))
|
||||
print_info(blue(" Found: ")+bold("\t"+str(len(files)))+red(" files"))
|
||||
@@ -341,10 +337,9 @@ def searchOrphans():
|
||||
# start to list all files on the system:
|
||||
dirs = etpConst['filesystemdirs']
|
||||
foundFiles = set()
|
||||
for dir in dirs:
|
||||
for currentdir,subdirs,files in os.walk(dir):
|
||||
for xdir in dirs:
|
||||
for currentdir,subdirs,files in os.walk(xdir):
|
||||
for filename in files:
|
||||
file = currentdir+"/"+filename
|
||||
# filter python compiled objects?
|
||||
if filename.endswith(".pyo") or filename.startswith(".pyc") or filename == '.keep':
|
||||
continue
|
||||
@@ -466,7 +461,7 @@ def searchInstalled(idreturn = False):
|
||||
|
||||
installedPackages = clientDbconn.listAllPackages()
|
||||
installedPackages.sort()
|
||||
if (not idreturn):
|
||||
if not idreturn:
|
||||
if (not etpUi['quiet']):
|
||||
print_info(red(" @@ ")+blue("These are the installed packages:"))
|
||||
for package in installedPackages:
|
||||
@@ -485,7 +480,7 @@ def searchInstalled(idreturn = False):
|
||||
else:
|
||||
idpackages = set()
|
||||
for x in installedPackages:
|
||||
idpackages.add(package[1])
|
||||
idpackages.add(x[1])
|
||||
return list(idpackages)
|
||||
|
||||
|
||||
@@ -498,7 +493,6 @@ def searchPackage(packages, idreturn = False):
|
||||
print_info(darkred(" @@ ")+darkgreen("Searching..."))
|
||||
# search inside each available database
|
||||
repoNumber = 0
|
||||
searchError = False
|
||||
for repo in etpRepositories:
|
||||
foundPackages[repo] = {}
|
||||
repoNumber += 1
|
||||
@@ -522,8 +516,6 @@ def searchPackage(packages, idreturn = False):
|
||||
# print info
|
||||
for pkg in foundPackages[repo][package]:
|
||||
idpackage = pkg[1]
|
||||
atom = pkg[0]
|
||||
branch = dbconn.retrieveBranch(idpackage)
|
||||
if (idreturn):
|
||||
dataInfo.add((idpackage,repo))
|
||||
else:
|
||||
@@ -634,7 +626,7 @@ def searchDescription(descriptions, idreturn = False):
|
||||
Internal functions
|
||||
'''
|
||||
def __searchDescriptions(descriptions, dbconn, idreturn = False):
|
||||
dataInfo = [] # when idreturn is True
|
||||
dataInfo = set() # when idreturn is True
|
||||
mydescdata = {}
|
||||
|
||||
for desc in descriptions:
|
||||
@@ -643,9 +635,8 @@ def __searchDescriptions(descriptions, dbconn, idreturn = False):
|
||||
mydescdata[desc] = result
|
||||
for pkg in mydescdata[desc]:
|
||||
idpackage = pkg[1]
|
||||
atom = pkg[0]
|
||||
if (idreturn):
|
||||
dataInfo.append([idpackage,repo])
|
||||
dataInfo.add(idpackage)
|
||||
elif (etpUi['quiet']):
|
||||
print dbconn.retrieveAtom(idpackage)
|
||||
else:
|
||||
|
||||
+10
-12
@@ -28,7 +28,6 @@
|
||||
from entropyConstants import *
|
||||
from clientConstants import *
|
||||
from outputTools import *
|
||||
import entropyTools
|
||||
import exceptionTools
|
||||
|
||||
def repositories(options):
|
||||
@@ -224,12 +223,12 @@ def syncRepositories(reponames = [], forceUpdate = False):
|
||||
import cacheTools
|
||||
cacheTools.generateCache(depcache = True, configcache = False)
|
||||
|
||||
if repoConn.syncErrors:
|
||||
syncErrors = repoConn.syncErrors
|
||||
del repoConn
|
||||
if syncErrors:
|
||||
if (not etpUi['quiet']):
|
||||
print_warning(darkred(" @@ ")+red("Something bad happened. Please have a look."))
|
||||
del repoConn
|
||||
return 128
|
||||
del repoConn
|
||||
|
||||
rc = False
|
||||
try:
|
||||
@@ -259,11 +258,13 @@ class repositoryController(TextInterface):
|
||||
|
||||
import remoteTools
|
||||
import dumpTools
|
||||
import entropyTools
|
||||
self.remoteTools = remoteTools
|
||||
self.dumpTools = dumpTools
|
||||
self.entropyTools = entropyTools
|
||||
|
||||
# check if I am root
|
||||
if (not entropyTools.isRoot()):
|
||||
if (not self.entropyTools.isRoot()):
|
||||
raise exceptionTools.PermissionDenied("PermissionDenied: not allowed as user.")
|
||||
|
||||
# check etpRepositories
|
||||
@@ -371,10 +372,9 @@ class repositoryController(TextInterface):
|
||||
|
||||
fetchConn = self.remoteTools.urlFetcher(url, filepath)
|
||||
rc = fetchConn.download()
|
||||
if rc in ("-1","-2","-3"):
|
||||
del fetchConn
|
||||
return False
|
||||
del fetchConn
|
||||
if rc in ("-1","-2","-3"):
|
||||
return False
|
||||
return True
|
||||
|
||||
def removeRepositoryFiles(self, repo, dbfilenameid):
|
||||
@@ -392,15 +392,13 @@ class repositoryController(TextInterface):
|
||||
|
||||
self.validateRepositoryId(repo)
|
||||
|
||||
import entropyTools
|
||||
path = eval("entropyTools."+cmethod[1])(etpRepositories[repo]['dbpath']+"/"+etpConst[cmethod[2]])
|
||||
path = eval("self.entropyTools."+cmethod[1])(etpRepositories[repo]['dbpath']+"/"+etpConst[cmethod[2]])
|
||||
return path
|
||||
|
||||
def verifyDatabaseChecksum(self, repo):
|
||||
|
||||
self.validateRepositoryId(repo)
|
||||
|
||||
import entropyTools
|
||||
try:
|
||||
f = open(etpRepositories[repo]['dbpath']+"/"+etpConst['etpdatabasehashfile'],"r")
|
||||
md5hash = f.readline().strip()
|
||||
@@ -408,7 +406,7 @@ class repositoryController(TextInterface):
|
||||
f.close()
|
||||
except:
|
||||
return -1
|
||||
rc = entropyTools.compareMd5(etpRepositories[repo]['dbpath']+"/"+etpConst['etpdatabasefile'],md5hash)
|
||||
rc = self.entropyTools.compareMd5(etpRepositories[repo]['dbpath']+"/"+etpConst['etpdatabasefile'],md5hash)
|
||||
return rc
|
||||
|
||||
def closeTransactions(self):
|
||||
|
||||
+15
-17
@@ -31,19 +31,17 @@ from outputTools import *
|
||||
from databaseTools import backupClientDatabase
|
||||
import entropyTools
|
||||
import equoTools
|
||||
import exceptionTools
|
||||
Equo = equoTools.EquoInterface(noclientdb = True)
|
||||
|
||||
def database(options):
|
||||
|
||||
if len(options) < 1:
|
||||
return -10
|
||||
return -10
|
||||
|
||||
# check if I am root
|
||||
if (not entropyTools.isRoot()):
|
||||
print_error(red("You are not ")+bold("root")+red("."))
|
||||
return 1
|
||||
|
||||
Equo = equoTools.EquoInterface(noclientdb = True)
|
||||
return 1
|
||||
|
||||
if (options[0] == "generate"):
|
||||
|
||||
@@ -57,13 +55,13 @@ def database(options):
|
||||
|
||||
print_warning(bold("ATTENTION: ")+red("The installed package database will be generated again using Gentoo one."))
|
||||
print_warning(red("If you dont know what you're doing just, don't do this. Really. I'm not joking."))
|
||||
rc = entropyTools.askquestion(" Understood?")
|
||||
rc = Equo.askQuestion(" Understood?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
rc = entropyTools.askquestion(" Really?")
|
||||
rc = Equo.askQuestion(" Really?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
rc = entropyTools.askquestion(" This is your last chance. Ok?")
|
||||
rc = Equo.askQuestion(" This is your last chance. Ok?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
@@ -156,13 +154,13 @@ def database(options):
|
||||
|
||||
print_warning(bold("####### ATTENTION -> ")+red("The installed package database will be resurrected, this will take a LOT of time."))
|
||||
print_warning(bold("####### ATTENTION -> ")+red("Please use this function ONLY if you are using an Entropy-enabled Sabayon distribution."))
|
||||
rc = entropyTools.askquestion(" Can I continue ?")
|
||||
rc = Equo.askQuestion(" Can I continue ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
rc = entropyTools.askquestion(" Are you REALLY sure ?")
|
||||
rc = Equo.askQuestion(" Are you REALLY sure ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
rc = entropyTools.askquestion(" Do you even know what you're doing ?")
|
||||
rc = Equo.askQuestion(" Do you even know what you're doing ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
@@ -309,7 +307,7 @@ def database(options):
|
||||
if x[0] not in installedCounters:
|
||||
# check if the package is in toBeAdded
|
||||
if (toBeAdded):
|
||||
atomkey = entropyTools.dep_getkey(clientDbconn.retrieveAtom(x[1]))
|
||||
atomkey = entropyTools.dep_getkey(Equo.clientDbconn.retrieveAtom(x[1]))
|
||||
atomslot = Equo.clientDbconn.retrieveSlot(x[1])
|
||||
add = True
|
||||
for pkgdata in toBeAdded:
|
||||
@@ -339,7 +337,7 @@ def database(options):
|
||||
atom = Equo.clientDbconn.retrieveAtom(x)
|
||||
print_info(brown(" # ")+red(atom))
|
||||
rc = "Yes"
|
||||
if etpUi['ask']: rc = entropyTools.askquestion(">> Continue with removal?")
|
||||
if etpUi['ask']: rc = Equo.askQuestion(">> Continue with removal?")
|
||||
if rc == "Yes":
|
||||
queue = 0
|
||||
totalqueue = str(len(toBeRemoved))
|
||||
@@ -355,7 +353,7 @@ def database(options):
|
||||
for x in toBeAdded:
|
||||
print_info(darkgreen(" # ")+red(x[0]))
|
||||
rc = "Yes"
|
||||
if etpUi['ask']: rc = entropyTools.askquestion(">> Continue with adding?")
|
||||
if etpUi['ask']: rc = Equo.askQuestion(">> Continue with adding?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
# now analyze
|
||||
@@ -532,9 +530,9 @@ def getinfo(dict = False):
|
||||
info['Installed database'] = conn
|
||||
if (conn):
|
||||
# print db info
|
||||
info['Removal internal protected directories'] = clientDbconn.listConfigProtectDirectories()
|
||||
info['Removal internal protected directory masks'] = clientDbconn.listConfigProtectDirectories(mask = True)
|
||||
info['Total installed packages'] = len(clientDbconn.listAllIdpackages())
|
||||
info['Removal internal protected directories'] = Equo.clientDbconn.listConfigProtectDirectories()
|
||||
info['Removal internal protected directory masks'] = Equo.clientDbconn.listConfigProtectDirectories(mask = True)
|
||||
info['Total installed packages'] = len(Equo.clientDbconn.listAllIdpackages())
|
||||
|
||||
# repository databases info (if found on the system)
|
||||
info['Repository databases'] = {}
|
||||
|
||||
+8
-10
@@ -221,7 +221,7 @@ def worldUpdate(onlyfetch = False, replay = False, upgradeTo = None, resume = Fa
|
||||
|
||||
if (not etpUi['pretend']):
|
||||
if human:
|
||||
rc = Equo.entropyTools.askquestion(" Would you like to query them ?")
|
||||
rc = Equo.askQuestion(" Would you like to query them ?")
|
||||
if rc == "No":
|
||||
return 0,0
|
||||
|
||||
@@ -376,7 +376,7 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals
|
||||
|
||||
if (deps):
|
||||
if (etpUi['ask']):
|
||||
rc = Equo.entropyTools.askquestion(" Would you like to continue with dependencies calculation ?")
|
||||
rc = Equo.askQuestion(" Would you like to continue with dependencies calculation ?")
|
||||
if rc == "No":
|
||||
dirscleanup()
|
||||
return 0,0
|
||||
@@ -423,14 +423,12 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals
|
||||
pkgsToReinstall = 0
|
||||
pkgsToDowngrade = 0
|
||||
pkgsToRemove = len(removalQueue)
|
||||
actionQueue = {}
|
||||
|
||||
if (runQueue):
|
||||
if (etpUi['ask'] or etpUi['pretend']):
|
||||
if not (etpUi['quiet']): print_info(red(" @@ ")+blue("These are the packages that would be ")+bold("merged:"))
|
||||
|
||||
count = 0
|
||||
atomlen = len(runQueue)
|
||||
for packageInfo in runQueue:
|
||||
count += 1
|
||||
|
||||
@@ -525,7 +523,7 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals
|
||||
print_info(red(" @@ ")+blue("Freed disk space:\t\t")+bold(str(Equo.entropyTools.bytesIntoHuman(abs(deltaSize)))))
|
||||
|
||||
if (etpUi['ask']):
|
||||
rc = Equo.entropyTools.askquestion(" Would you like to run the queue ?")
|
||||
rc = Equo.askQuestion(" Would you like to run the queue ?")
|
||||
if rc == "No":
|
||||
dirscleanup()
|
||||
return 0,0
|
||||
@@ -855,7 +853,7 @@ def removePackages(packages = [], atomsdata = [], deps = True, deep = False, sys
|
||||
lookForOrphanedPackages = False
|
||||
|
||||
if (etpUi['ask']):
|
||||
rc = Equo.entropyTools.askquestion(question)
|
||||
rc = Equo.askQuestion(question)
|
||||
if rc == "No":
|
||||
lookForOrphanedPackages = False
|
||||
if (not deps):
|
||||
@@ -902,7 +900,7 @@ def removePackages(packages = [], atomsdata = [], deps = True, deep = False, sys
|
||||
question = " Would you like to proceed?"
|
||||
if human:
|
||||
question = " Would you like to proceed with a selective removal ?"
|
||||
rc = Equo.entropyTools.askquestion(question)
|
||||
rc = Equo.askQuestion(question)
|
||||
if rc == "No":
|
||||
return 0,0
|
||||
elif (deps):
|
||||
@@ -979,7 +977,7 @@ def removePackages(packages = [], atomsdata = [], deps = True, deep = False, sys
|
||||
# if human
|
||||
if not (etpUi['quiet']): print_info(red(" -- ")+bold("(")+blue(str(currentqueue))+"/"+red(totalqueue)+bold(") ")+">>> "+darkgreen(infoDict['removeatom']))
|
||||
if human:
|
||||
rc = Equo.entropyTools.askquestion(" Remove this one ?")
|
||||
rc = Equo.askQuestion(" Remove this one ?")
|
||||
if rc == "No":
|
||||
# update resume cache
|
||||
resume_cache['removalQueue'].remove(idpackage)
|
||||
@@ -1074,7 +1072,7 @@ def dependenciesTest(clientDbconn = None, reagent = False):
|
||||
|
||||
if (packagesNeeded) and (not etpUi['quiet']) and (not reagent):
|
||||
if (etpUi['ask']):
|
||||
rc = Equo.entropyTools.askquestion(" Would you like to install the available packages?")
|
||||
rc = Equo.askQuestion(" Would you like to install the available packages?")
|
||||
if rc == "No":
|
||||
return 0,packagesNeeded
|
||||
else:
|
||||
@@ -1229,7 +1227,7 @@ def librariesTest(clientDbconn = None, reagent = False, listfiles = False):
|
||||
|
||||
if (atomsdata) and (not reagent):
|
||||
if (etpUi['ask']):
|
||||
rc = Equo.entropyTools.askquestion(" Would you like to install them?")
|
||||
rc = Equo.askQuestion(" Would you like to install them?")
|
||||
if rc == "No":
|
||||
return 0,atomsdata
|
||||
else:
|
||||
|
||||
+41
-47
@@ -20,9 +20,9 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
'''
|
||||
|
||||
# Never do "import portage" here, please use entropyTools binding
|
||||
# EXIT STATUSES: 400-499
|
||||
|
||||
import os
|
||||
import time
|
||||
import shutil
|
||||
from entropyConstants import *
|
||||
from serverConstants import *
|
||||
from entropyTools import *
|
||||
@@ -30,14 +30,9 @@ from outputTools import *
|
||||
import mirrorTools
|
||||
import dumpTools
|
||||
import exceptionTools
|
||||
import databaseTools
|
||||
import remoteTools
|
||||
|
||||
import os
|
||||
import commands
|
||||
import string
|
||||
import time
|
||||
import shutil
|
||||
|
||||
Text = TextInterface()
|
||||
|
||||
# Logging initialization
|
||||
import logTools
|
||||
@@ -79,7 +74,7 @@ def sync(options, justTidy = False):
|
||||
database(["sync"])
|
||||
if (not activatorRequestNoAsk):
|
||||
# ask question
|
||||
rc = askquestion(" Should I continue with the tidy procedure ?")
|
||||
rc = Text.askQuestion(" Should I continue with the tidy procedure ?")
|
||||
if rc == "No":
|
||||
sys.exit(0)
|
||||
|
||||
@@ -92,7 +87,6 @@ def sync(options, justTidy = False):
|
||||
|
||||
# now it's time to do some tidy
|
||||
# collect all the binaries in the database
|
||||
import databaseTools
|
||||
dbconn = databaseTools.openServerDatabase(readOnly = True, noUpload = True)
|
||||
dbBinaries = dbconn.listBranchPackagesTbz2(mybranch)
|
||||
dbconn.closeDB()
|
||||
@@ -129,12 +123,12 @@ def sync(options, justTidy = False):
|
||||
continue
|
||||
|
||||
print_info(green(" * ")+red("This is the list of files that would be removed from the mirrors: "))
|
||||
for file in removeList:
|
||||
print_info(green("\t* ")+brown(file))
|
||||
for xfile in removeList:
|
||||
print_info(green("\t* ")+brown(xfile))
|
||||
|
||||
# ask question
|
||||
if (not activatorRequestNoAsk):
|
||||
rc = askquestion(" Would you like to continue ?")
|
||||
rc = Text.askQuestion(" Would you like to continue ?")
|
||||
if rc == "No":
|
||||
sys.exit(0)
|
||||
|
||||
@@ -145,38 +139,38 @@ def sync(options, justTidy = False):
|
||||
print_info(green(" * ")+red("Connecting to: ")+bold(extractFTPHostFromUri(uri)))
|
||||
ftp = mirrorTools.handlerFTP(uri)
|
||||
ftp.setCWD(etpConst['binaryurirelativepath']+"/"+mybranch)
|
||||
for file in removeList:
|
||||
for xfile in removeList:
|
||||
|
||||
activatorLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"sync: removing (remote) file "+file)
|
||||
print_info(green(" * ")+red("Removing file: ")+bold(file), back = True)
|
||||
activatorLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"sync: removing (remote) file "+xfile)
|
||||
print_info(green(" * ")+red("Removing file: ")+bold(xfile), back = True)
|
||||
# remove remotely
|
||||
if (ftp.isFileAvailable(file)):
|
||||
rc = ftp.deleteFile(file)
|
||||
if (ftp.isFileAvailable(xfile)):
|
||||
rc = ftp.deleteFile(xfile)
|
||||
if (rc):
|
||||
print_info(green(" * ")+red("Package file: ")+bold(file)+red(" removed successfully from ")+bold(extractFTPHostFromUri(uri)))
|
||||
print_info(green(" * ")+red("Package file: ")+bold(xfile)+red(" removed successfully from ")+bold(extractFTPHostFromUri(uri)))
|
||||
else:
|
||||
print_warning(brown(" * ")+red("ATTENTION: remote file ")+bold(file)+red(" cannot be removed."))
|
||||
print_warning(brown(" * ")+red("ATTENTION: remote file ")+bold(xfile)+red(" cannot be removed."))
|
||||
# checksum
|
||||
if (ftp.isFileAvailable(file+etpConst['packageshashfileext'])):
|
||||
rc = ftp.deleteFile(file+etpConst['packageshashfileext'])
|
||||
if (ftp.isFileAvailable(xfile+etpConst['packageshashfileext'])):
|
||||
rc = ftp.deleteFile(xfile+etpConst['packageshashfileext'])
|
||||
if (rc):
|
||||
print_info(green(" * ")+red("Checksum file: ")+bold(file+etpConst['packageshashfileext'])+red(" removed successfully from ")+bold(extractFTPHostFromUri(uri)))
|
||||
print_info(green(" * ")+red("Checksum file: ")+bold(xfile+etpConst['packageshashfileext'])+red(" removed successfully from ")+bold(extractFTPHostFromUri(uri)))
|
||||
else:
|
||||
print_warning(brown(" * ")+red("ATTENTION: remote checksum file ")+bold(file)+red(" cannot be removed."))
|
||||
print_warning(brown(" * ")+red("ATTENTION: remote checksum file ")+bold(xfile)+red(" cannot be removed."))
|
||||
# remove locally
|
||||
if os.path.isfile(etpConst['packagesbindir']+"/"+mybranch+"/"+file):
|
||||
activatorLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"sync: removing (local) file "+file)
|
||||
print_info(green(" * ")+red("Package file: ")+bold(file)+red(" removed successfully from ")+bold(etpConst['packagesbindir']+"/"+mybranch))
|
||||
os.remove(etpConst['packagesbindir']+"/"+mybranch+"/"+file)
|
||||
if os.path.isfile(etpConst['packagesbindir']+"/"+mybranch+"/"+xfile):
|
||||
activatorLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"sync: removing (local) file "+xfile)
|
||||
print_info(green(" * ")+red("Package file: ")+bold(xfile)+red(" removed successfully from ")+bold(etpConst['packagesbindir']+"/"+mybranch))
|
||||
os.remove(etpConst['packagesbindir']+"/"+mybranch+"/"+xfile)
|
||||
try:
|
||||
os.remove(etpConst['packagesbindir']+"/"+mybranch+"/"+file+etpConst['packagesexpirationfileext'])
|
||||
os.remove(etpConst['packagesbindir']+"/"+mybranch+"/"+xfile+etpConst['packagesexpirationfileext'])
|
||||
except OSError:
|
||||
pass
|
||||
# checksum
|
||||
if os.path.isfile(etpConst['packagesbindir']+"/"+mybranch+"/"+file+etpConst['packageshashfileext']):
|
||||
activatorLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"sync: removing (local) file "+file+etpConst['packageshashfileext'])
|
||||
print_info(green(" * ")+red("Checksum file: ")+bold(file+etpConst['packageshashfileext'])+red(" removed successfully from ")+bold(etpConst['packagesbindir']+"/"+mybranch))
|
||||
os.remove(etpConst['packagesbindir']+"/"+mybranch+"/"+file+etpConst['packageshashfileext'])
|
||||
if os.path.isfile(etpConst['packagesbindir']+"/"+mybranch+"/"+xfile+etpConst['packageshashfileext']):
|
||||
activatorLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"sync: removing (local) file "+xfile+etpConst['packageshashfileext'])
|
||||
print_info(green(" * ")+red("Checksum file: ")+bold(xfile+etpConst['packageshashfileext'])+red(" removed successfully from ")+bold(etpConst['packagesbindir']+"/"+mybranch))
|
||||
os.remove(etpConst['packagesbindir']+"/"+mybranch+"/"+xfile+etpConst['packageshashfileext'])
|
||||
ftp.closeConnection()
|
||||
|
||||
print_info(green(" * ")+red("Syncronization across mirrors completed."))
|
||||
@@ -316,9 +310,9 @@ def packages(options):
|
||||
# it's already on the mirror, but... is its size correct??
|
||||
localSize = int(os.stat(etpConst['packagesbindir']+"/"+mybranch+"/"+localPackage)[6])
|
||||
remoteSize = 0
|
||||
for file in remotePackagesInfo:
|
||||
if file.split()[8] == localPackage:
|
||||
remoteSize = int(file.split()[4])
|
||||
for xfile in remotePackagesInfo:
|
||||
if xfile.split()[8] == localPackage:
|
||||
remoteSize = int(xfile.split()[4])
|
||||
if (localSize != remoteSize) and (localSize != 0):
|
||||
# size does not match, adding to the upload queue
|
||||
if localPackage not in finePackages:
|
||||
@@ -334,9 +328,9 @@ def packages(options):
|
||||
# it's already on the mirror, but... is its size correct??
|
||||
localSize = int(os.stat(etpConst['packagesbindir']+"/"+mybranch+"/"+remotePackage)[6])
|
||||
remoteSize = 0
|
||||
for file in remotePackagesInfo:
|
||||
if file.split()[8] == remotePackage:
|
||||
remoteSize = int(file.split()[4])
|
||||
for xfile in remotePackagesInfo:
|
||||
if xfile.split()[8] == remotePackage:
|
||||
remoteSize = int(xfile.split()[4])
|
||||
if (localSize != remoteSize) and (localSize != 0):
|
||||
# size does not match, remove first
|
||||
#print "removal of "+localPackage+" because its size differ"
|
||||
@@ -465,7 +459,7 @@ def packages(options):
|
||||
if (etpUi['pretend']):
|
||||
continue
|
||||
if (etpUi['ask']):
|
||||
rc = askquestion("\n Would you like to run the steps above ?")
|
||||
rc = Text.askQuestion("\n Would you like to run the steps above ?")
|
||||
if rc == "No":
|
||||
print "\n"
|
||||
continue
|
||||
@@ -701,12 +695,12 @@ def packages(options):
|
||||
pkgbranches = [x for x in pkgbranches if os.path.isdir(etpConst['packagessuploaddir']+"/"+x)]
|
||||
for branch in pkgbranches:
|
||||
branchcontent = os.listdir(etpConst['packagessuploaddir']+"/"+branch)
|
||||
for file in branchcontent:
|
||||
source = etpConst['packagessuploaddir']+"/"+branch+"/"+file
|
||||
for xfile in branchcontent:
|
||||
source = etpConst['packagessuploaddir']+"/"+branch+"/"+xfile
|
||||
destdir = etpConst['packagesbindir']+"/"+branch
|
||||
if not os.path.isdir(destdir):
|
||||
os.makedirs(destdir)
|
||||
dest = destdir+"/"+file
|
||||
dest = destdir+"/"+xfile
|
||||
shutil.move(source,dest)
|
||||
if os.path.isfile(dest+etpConst['packagesexpirationfileext']): # clear expiration file
|
||||
os.remove(dest+etpConst['packagesexpirationfileext'])
|
||||
@@ -980,8 +974,8 @@ def syncRemoteDatabases(noUpload = False, justStats = False):
|
||||
print_info(green(" * ")+red("Starting to update the needed mirrors ..."))
|
||||
_uploadList = []
|
||||
for uri in etpConst['activatoruploaduris']:
|
||||
for list in uploadList:
|
||||
if list[0].startswith(uri):
|
||||
for xlist in uploadList:
|
||||
if xlist[0].startswith(uri):
|
||||
_uploadList.append(uri)
|
||||
break
|
||||
|
||||
|
||||
+81
-84
@@ -30,6 +30,7 @@ except ImportError: # fallback to embedded pysqlite
|
||||
from pysqlite2 import dbapi2
|
||||
import dumpTools
|
||||
import exceptionTools
|
||||
Text = TextInterface()
|
||||
|
||||
# Logging initialization
|
||||
# FIXME: remove database logging
|
||||
@@ -137,77 +138,6 @@ def backupClientDatabase():
|
||||
return dest
|
||||
return ""
|
||||
|
||||
def doServerDatabaseSyncLock(noUpload):
|
||||
|
||||
import mirrorTools
|
||||
import activatorTools
|
||||
|
||||
# check if the database is locked locally
|
||||
if os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaselockfile']):
|
||||
self.updateProgress(red("Entropy database is already locked by you :-)"), importance = 1, type = "info", header = red(" * "))
|
||||
else:
|
||||
# check if the database is locked REMOTELY
|
||||
self.updateProgress(red("Locking and Syncing Entropy database..."), importance = 1, type = "info", header = red(" * "), back = True)
|
||||
for uri in etpConst['activatoruploaduris']:
|
||||
ftp = mirrorTools.handlerFTP(uri)
|
||||
try:
|
||||
ftp.setCWD(etpConst['etpurirelativepath'])
|
||||
except:
|
||||
bdir = ""
|
||||
for mydir in etpConst['etpurirelativepath'].split("/"):
|
||||
bdir += "/"+mydir
|
||||
if (not ftp.isFileAvailable(bdir)):
|
||||
try:
|
||||
ftp.mkdir(bdir)
|
||||
except Exception, e:
|
||||
if str(e).find("550") != -1:
|
||||
pass
|
||||
raise
|
||||
ftp.setCWD(etpConst['etpurirelativepath'])
|
||||
if (ftp.isFileAvailable(etpConst['etpdatabaselockfile'])) and (not os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaselockfile'])):
|
||||
import time
|
||||
self.updateProgress(bold("WARNING")+red(": online database is already locked. Waiting up to 2 minutes..."), importance = 1, type = "info", header = red(" * "), back = True)
|
||||
unlocked = False
|
||||
count = 120
|
||||
while count:
|
||||
time.sleep(1)
|
||||
count -= 1
|
||||
if (not ftp.isFileAvailable(etpConst['etpdatabaselockfile'])):
|
||||
self.updateProgress(bold("HOORAY")+red(": online database has been unlocked. Locking back and syncing..."), importance = 1, type = "info", header = red(" * "))
|
||||
unlocked = True
|
||||
break
|
||||
if (unlocked):
|
||||
break
|
||||
|
||||
self.updateProgress(darkgreen("Mirrors status table:"), importance = 1, type = "info", header = brown(" * "))
|
||||
dbstatus = activatorTools.getMirrorsLock()
|
||||
for db in dbstatus:
|
||||
|
||||
db[1] = green("Unlocked")
|
||||
if (db[1]):
|
||||
db[1] = red("Locked")
|
||||
db[2] = green("Unlocked")
|
||||
if (db[2]):
|
||||
db[2] = red("Locked")
|
||||
|
||||
p_uri = entropyTools.extractFTPHostFromUri(db[0])
|
||||
self.updateProgress(
|
||||
bold("%s: ")+red("[")+brown("DATABASE: %s")+red("] [")+brown("DOWNLOAD: %s")+red("]") % (p_uri,db[1],db[2],),
|
||||
importance = 1,
|
||||
type = "info",
|
||||
header = "\t"
|
||||
)
|
||||
del p_uri
|
||||
|
||||
ftp.closeConnection()
|
||||
raise exceptionTools.OnlineMirrorError("OnlineMirrorError: cannot lock mirror "+entropyTools.extractFTPHostFromUri(uri))
|
||||
|
||||
# if we arrive here, it is because all the mirrors are unlocked so... damn, LOCK!
|
||||
activatorTools.lockDatabases(True)
|
||||
|
||||
# ok done... now sync the new db, if needed
|
||||
activatorTools.syncRemoteDatabases(noUpload)
|
||||
|
||||
class etpDatabase(TextInterface):
|
||||
|
||||
def __init__(self, readOnly = False, noUpload = False, dbFile = etpConst['etpdatabasefilepath'], clientDatabase = False, xcache = False, dbname = 'etpdb', indexing = True):
|
||||
@@ -234,8 +164,78 @@ class etpDatabase(TextInterface):
|
||||
if not ((self.clientDatabase) or (self.readOnly)):
|
||||
# server side is calling
|
||||
# lock mirror remotely and ensure to have latest database revision
|
||||
doServerDatabaseSyncLock(self.noUpload)
|
||||
self.doServerDatabaseSyncLock(self.noUpload)
|
||||
|
||||
def doServerDatabaseSyncLock(self, noUpload):
|
||||
|
||||
import mirrorTools
|
||||
import activatorTools
|
||||
|
||||
# check if the database is locked locally
|
||||
if os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaselockfile']):
|
||||
self.updateProgress(red("Entropy database is already locked by you :-)"), importance = 1, type = "info", header = red(" * "))
|
||||
else:
|
||||
# check if the database is locked REMOTELY
|
||||
self.updateProgress(red("Locking and Syncing Entropy database..."), importance = 1, type = "info", header = red(" * "), back = True)
|
||||
for uri in etpConst['activatoruploaduris']:
|
||||
ftp = mirrorTools.handlerFTP(uri)
|
||||
try:
|
||||
ftp.setCWD(etpConst['etpurirelativepath'])
|
||||
except:
|
||||
bdir = ""
|
||||
for mydir in etpConst['etpurirelativepath'].split("/"):
|
||||
bdir += "/"+mydir
|
||||
if (not ftp.isFileAvailable(bdir)):
|
||||
try:
|
||||
ftp.mkdir(bdir)
|
||||
except Exception, e:
|
||||
if str(e).find("550") != -1:
|
||||
pass
|
||||
raise
|
||||
ftp.setCWD(etpConst['etpurirelativepath'])
|
||||
if (ftp.isFileAvailable(etpConst['etpdatabaselockfile'])) and (not os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaselockfile'])):
|
||||
import time
|
||||
self.updateProgress(bold("WARNING")+red(": online database is already locked. Waiting up to 2 minutes..."), importance = 1, type = "info", header = red(" * "), back = True)
|
||||
unlocked = False
|
||||
count = 120
|
||||
while count:
|
||||
time.sleep(1)
|
||||
count -= 1
|
||||
if (not ftp.isFileAvailable(etpConst['etpdatabaselockfile'])):
|
||||
self.updateProgress(bold("HOORAY")+red(": online database has been unlocked. Locking back and syncing..."), importance = 1, type = "info", header = red(" * "))
|
||||
unlocked = True
|
||||
break
|
||||
if (unlocked):
|
||||
break
|
||||
|
||||
self.updateProgress(darkgreen("Mirrors status table:"), importance = 1, type = "info", header = brown(" * "))
|
||||
dbstatus = activatorTools.getMirrorsLock()
|
||||
for db in dbstatus:
|
||||
|
||||
db[1] = green("Unlocked")
|
||||
if (db[1]):
|
||||
db[1] = red("Locked")
|
||||
db[2] = green("Unlocked")
|
||||
if (db[2]):
|
||||
db[2] = red("Locked")
|
||||
|
||||
p_uri = entropyTools.extractFTPHostFromUri(db[0])
|
||||
self.updateProgress(
|
||||
bold("%s: ")+red("[")+brown("DATABASE: %s")+red("] [")+brown("DOWNLOAD: %s")+red("]") % (p_uri,db[1],db[2],),
|
||||
importance = 1,
|
||||
type = "info",
|
||||
header = "\t"
|
||||
)
|
||||
del p_uri
|
||||
|
||||
ftp.closeConnection()
|
||||
raise exceptionTools.OnlineMirrorError("OnlineMirrorError: cannot lock mirror "+entropyTools.extractFTPHostFromUri(uri))
|
||||
|
||||
# if we arrive here, it is because all the mirrors are unlocked so... damn, LOCK!
|
||||
activatorTools.lockDatabases(True)
|
||||
|
||||
# ok done... now sync the new db, if needed
|
||||
activatorTools.syncRemoteDatabases(noUpload)
|
||||
|
||||
def closeDB(self):
|
||||
|
||||
@@ -420,7 +420,7 @@ class etpDatabase(TextInterface):
|
||||
header = brown(" * ")
|
||||
)
|
||||
# lock database
|
||||
doServerDatabaseSyncLock(self.noUpload)
|
||||
self.doServerDatabaseSyncLock(self.noUpload)
|
||||
# now run queue
|
||||
self.runTreeUpdatesActions(update_actions)
|
||||
|
||||
@@ -696,7 +696,7 @@ class etpDatabase(TextInterface):
|
||||
reagent_cmds += atoms
|
||||
|
||||
# ask branch question
|
||||
rc = entropyTools.askquestion(" Would you like to continue with the default branch \"%s\" ?" % (etpConst['branch'],))
|
||||
rc = self.askQuestion(" Would you like to continue with the default branch \"%s\" ?" % (etpConst['branch'],))
|
||||
if rc == "No":
|
||||
# ask which
|
||||
mybranch = etpConst['branch']
|
||||
@@ -711,7 +711,7 @@ class etpDatabase(TextInterface):
|
||||
)
|
||||
continue
|
||||
# ask to confirm
|
||||
rc = entropyTools.askquestion(" Confirm %s ?" % (mybranch,))
|
||||
rc = self.askQuestion(" Confirm %s ?" % (mybranch,))
|
||||
if rc == "Yes":
|
||||
break
|
||||
reagent_cmds.append("--branch=%s" % (mybranch,))
|
||||
@@ -799,7 +799,7 @@ class etpDatabase(TextInterface):
|
||||
versiontag = '#'+etpData['versiontag']
|
||||
|
||||
foundid = self.isPackageAvailable(etpData['category']+"/"+etpData['name']+"-"+etpData['version']+versiontag)
|
||||
if (foundid < 0): # same atom doesn't exist
|
||||
if (foundid < 0): # same atom doesn't exist in any branch
|
||||
idpk, revision, etpDataUpdated, accepted = self.addPackage(etpData, revision = forcedRevision)
|
||||
else:
|
||||
idpk, revision, etpDataUpdated, accepted = self.updatePackage(etpData, forcedRevision) # only when the same atom exists
|
||||
@@ -2562,9 +2562,6 @@ class etpDatabase(TextInterface):
|
||||
|
||||
def retrieveDepends(self, idpackage):
|
||||
|
||||
#cache = self.fetchInfoCache(idpackage,'retrieveDepends')
|
||||
#if cache != None: return cache
|
||||
|
||||
# sanity check on the table
|
||||
sanity = self.isDependsTableSane()
|
||||
if not sanity: # is empty, need generation
|
||||
@@ -2573,14 +2570,14 @@ class etpDatabase(TextInterface):
|
||||
self.cursor.execute('SELECT dependencies.idpackage FROM dependstable,dependencies WHERE dependstable.idpackage = (?) and dependstable.iddependency = dependencies.iddependency', (idpackage,))
|
||||
result = self.fetchall2set(self.cursor.fetchall())
|
||||
|
||||
#self.storeInfoCache(idpackage,'retrieveDepends',result)
|
||||
return result
|
||||
|
||||
# You must provide the full atom to this function
|
||||
# WARNING: this function does not support branches !!!
|
||||
def isPackageAvailable(self,pkgkey):
|
||||
pkgkey = entropyTools.removePackageOperators(pkgkey)
|
||||
self.cursor.execute('SELECT idpackage FROM baseinfo WHERE atom = "'+pkgkey+'"')
|
||||
# WARNING: this function does not support branches
|
||||
# NOTE: server side uses this regardless branch specification because it already handles it in updatePackage()
|
||||
def isPackageAvailable(self,pkgatom):
|
||||
pkgatom = entropyTools.removePackageOperators(pkgatom)
|
||||
self.cursor.execute('SELECT idpackage FROM baseinfo WHERE atom = (?)', (pkgatom,))
|
||||
result = self.cursor.fetchone()
|
||||
if result:
|
||||
return result[0]
|
||||
|
||||
@@ -1368,25 +1368,6 @@ def umountProc():
|
||||
else:
|
||||
return True
|
||||
|
||||
def askquestion(prompt):
|
||||
xtermTitle("Entropy got a question for you")
|
||||
responses, colours = ["Yes", "No"], [green, red]
|
||||
print darkgreen(prompt),
|
||||
try:
|
||||
while True:
|
||||
response=raw_input("["+"/".join([colours[i](responses[i]) for i in range(len(responses))])+"] ")
|
||||
for key in responses:
|
||||
# An empty response will match the first value in responses.
|
||||
if response.upper()==key[:len(response)].upper():
|
||||
xtermTitleReset()
|
||||
return key
|
||||
print "I cannot understand '%s'" % response,
|
||||
except (EOFError, KeyboardInterrupt):
|
||||
print "Interrupted."
|
||||
xtermTitleReset()
|
||||
sys.exit(100)
|
||||
xtermTitleReset()
|
||||
|
||||
class lifobuffer:
|
||||
|
||||
def __init__(self):
|
||||
|
||||
+43
-14
@@ -22,10 +22,7 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
'''
|
||||
|
||||
__docformat__ = "epytext"
|
||||
|
||||
from sys import stderr, stdout, modules
|
||||
from os import environ, getenv
|
||||
import sys, os
|
||||
import curses
|
||||
import readline
|
||||
from entropyConstants import etpUi
|
||||
@@ -162,33 +159,33 @@ codes["UNMERGE_WARN"] = codes["red"]
|
||||
codes["MERGE_LIST_PROGRESS"] = codes["yellow"]
|
||||
|
||||
def xtermTitle(mystr, raw=False):
|
||||
if dotitles and "TERM" in environ and stderr.isatty():
|
||||
myt=environ["TERM"]
|
||||
if dotitles and "TERM" in os.environ and sys.stderr.isatty():
|
||||
myt=os.environ["TERM"]
|
||||
legal_terms = ["xterm","Eterm","aterm","rxvt","screen","kterm","rxvt-unicode","gnome"]
|
||||
if myt in legal_terms:
|
||||
if not raw:
|
||||
mystr = "\x1b]0;%s\x07" % mystr
|
||||
stderr.write(mystr)
|
||||
stderr.flush()
|
||||
sys.stderr.write(mystr)
|
||||
sys.stderr.flush()
|
||||
|
||||
default_xterm_title = None
|
||||
|
||||
def xtermTitleReset():
|
||||
global default_xterm_title
|
||||
if default_xterm_title is None:
|
||||
prompt_command = getenv('PROMPT_COMMAND')
|
||||
prompt_command = os.getenv('PROMPT_COMMAND')
|
||||
if prompt_command == "":
|
||||
default_xterm_title = ""
|
||||
elif prompt_command is not None:
|
||||
import commands
|
||||
default_xterm_title = commands.getoutput(prompt_command)
|
||||
else:
|
||||
pwd = getenv('PWD','')
|
||||
home = getenv('HOME', '')
|
||||
pwd = os.getenv('PWD','')
|
||||
home = os.getenv('HOME', '')
|
||||
if home != '' and pwd.startswith(home):
|
||||
pwd = '~' + pwd[len(home):]
|
||||
default_xterm_title = '\x1b]0;%s@%s:%s\x07' % (
|
||||
getenv('LOGNAME', ''), getenv('HOSTNAME', '').split('.', 1)[0], pwd)
|
||||
os.getenv('LOGNAME', ''), os.getenv('HOSTNAME', '').split('.', 1)[0], pwd)
|
||||
xtermTitle(default_xterm_title, raw=True)
|
||||
|
||||
def notitles():
|
||||
@@ -225,7 +222,7 @@ def create_color_func(color_key):
|
||||
return derived_func
|
||||
|
||||
for c in compat_functions_colors:
|
||||
setattr(modules[__name__], c, create_color_func(c))
|
||||
setattr(sys.modules[__name__], c, create_color_func(c))
|
||||
|
||||
def enlightenatom(atom):
|
||||
out = atom.split("/")
|
||||
@@ -269,7 +266,7 @@ def print_generic(msg): # here we'll wrap any nice formatting
|
||||
def writechar(char):
|
||||
if etpUi['mute']:
|
||||
return
|
||||
stdout.write(char); stdout.flush()
|
||||
sys.stdout.write(char); sys.stdout.flush()
|
||||
|
||||
def readtext(request):
|
||||
xtermTitle("Entropy needs your attention")
|
||||
@@ -308,6 +305,38 @@ class TextInterface:
|
||||
elif importance in (2,3):
|
||||
eval("print_"+type)(header+count_str+text, back = back)
|
||||
|
||||
# @input question: question to do
|
||||
#
|
||||
# @input importance:
|
||||
# values: 0,1,2 (latter is a blocker - popup menu on a GUI env)
|
||||
# used to specify information importance, 0<important<2
|
||||
#
|
||||
# @input responses:
|
||||
# list of options whose users can choose between
|
||||
#
|
||||
# feel free to reimplement this
|
||||
def askQuestion(self, question, importance = 0, responses = ["Yes","No"]):
|
||||
colours = [green, red, blue, darkgreen, darkred, darkblue, brown, purple]
|
||||
if len(responses) > len(colours):
|
||||
import exceptionTools
|
||||
raise exceptionTools.IncorrectParameter("IncorrectParameter: maximum responses length = %s" % (len(colours),))
|
||||
print darkgreen(question),
|
||||
try:
|
||||
while True:
|
||||
xtermTitle("Entropy got a question for you")
|
||||
response = raw_input("["+"/".join([colours[i](responses[i]) for i in range(len(responses))])+"] ")
|
||||
for key in responses:
|
||||
# An empty response will match the first value in responses.
|
||||
if response.upper()==key[:len(response)].upper():
|
||||
xtermTitleReset()
|
||||
return key
|
||||
print "I cannot understand '%s'" % response,
|
||||
except (EOFError, KeyboardInterrupt):
|
||||
print "Interrupted."
|
||||
xtermTitleReset()
|
||||
sys.exit(100)
|
||||
xtermTitleReset()
|
||||
|
||||
def nocolor(self):
|
||||
nocolor()
|
||||
|
||||
|
||||
+34
-42
@@ -19,25 +19,19 @@
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
'''
|
||||
|
||||
# Never do "import portage" here, please use entropyTools binding
|
||||
|
||||
# EXIT STATUSES: 500-599
|
||||
|
||||
import os
|
||||
import shutil
|
||||
from entropyConstants import *
|
||||
from serverConstants import *
|
||||
from entropyTools import *
|
||||
import exceptionTools
|
||||
import os
|
||||
import shutil
|
||||
import databaseTools
|
||||
Text = TextInterface()
|
||||
|
||||
# Logging initialization
|
||||
import logTools
|
||||
reagentLog = logTools.LogFile(level=etpConst['reagentloglevel'],filename = etpConst['reagentlogfile'], header = "[Reagent]")
|
||||
|
||||
# reagentLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"testFunction: example. ")
|
||||
|
||||
def generator(package, dbconnection = None, enzymeRequestBranch = etpConst['branch'], inject = False):
|
||||
|
||||
reagentLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"generator: called -> Package: "+str(package)+" | dbconnection: "+str(dbconnection))
|
||||
@@ -45,49 +39,47 @@ def generator(package, dbconnection = None, enzymeRequestBranch = etpConst['bran
|
||||
# check if the package provided is valid
|
||||
validFile = False
|
||||
if os.path.isfile(package) and package.endswith(".tbz2"):
|
||||
validFile = True
|
||||
validFile = True
|
||||
if (not validFile):
|
||||
print_warning(package+" does not exist !")
|
||||
print_warning(package+" does not exist !")
|
||||
|
||||
packagename = os.path.basename(package)
|
||||
print_info(brown(" * ")+red("Processing: ")+bold(packagename)+red(", please wait..."))
|
||||
mydata = extractPkgData(package, enzymeRequestBranch, inject = inject)
|
||||
|
||||
|
||||
if dbconnection is None:
|
||||
dbconn = databaseTools.openServerDatabase(readOnly = False, noUpload = True)
|
||||
dbconn = databaseTools.openServerDatabase(readOnly = False, noUpload = True)
|
||||
else:
|
||||
dbconn = dbconnection
|
||||
|
||||
dbconn = dbconnection
|
||||
|
||||
idpk, revision, etpDataUpdated, accepted = dbconn.handlePackage(mydata)
|
||||
|
||||
|
||||
# add package info to our official repository etpConst['officialrepositoryname']
|
||||
if (accepted):
|
||||
dbconn.removePackageFromInstalledTable(idpk)
|
||||
dbconn.addPackageToInstalledTable(idpk,etpConst['officialrepositoryname'])
|
||||
|
||||
dbconn.addPackageToInstalledTable(idpk,etpConst['officialrepositoryname'])
|
||||
|
||||
if dbconnection is None:
|
||||
dbconn.commitChanges()
|
||||
dbconn.closeDB()
|
||||
dbconn.commitChanges()
|
||||
dbconn.closeDB()
|
||||
|
||||
packagename = packagename[:-5]+"~"+str(revision)+".tbz2"
|
||||
|
||||
if (accepted) and (revision != 0):
|
||||
reagentLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"generator: entry for "+str(os.path.basename(etpDataUpdated['download']))+" has been updated to revision: "+str(revision))
|
||||
print_info(green(" * ")+red("Package ")+bold(os.path.basename(etpDataUpdated['download']))+red(" entry has been updated. Revision: ")+bold(str(revision)))
|
||||
return True, idpk
|
||||
reagentLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"generator: entry for "+str(os.path.basename(etpDataUpdated['download']))+" has been updated to revision: "+str(revision))
|
||||
print_info(green(" * ")+red("Package ")+bold(os.path.basename(etpDataUpdated['download']))+red(" entry has been updated. Revision: ")+bold(str(revision)))
|
||||
return True, idpk
|
||||
elif (accepted) and (revision == 0):
|
||||
reagentLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"generator: entry for "+str(os.path.basename(etpDataUpdated['download']))+" newly created or version bumped.")
|
||||
print_info(green(" * ")+red("Package ")+bold(os.path.basename(etpDataUpdated['download']))+red(" entry newly created."))
|
||||
return True, idpk
|
||||
reagentLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"generator: entry for "+str(os.path.basename(etpDataUpdated['download']))+" newly created or version bumped.")
|
||||
print_info(green(" * ")+red("Package ")+bold(os.path.basename(etpDataUpdated['download']))+red(" entry newly created."))
|
||||
return True, idpk
|
||||
else:
|
||||
reagentLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"generator: entry for "+str(os.path.basename(etpDataUpdated['download']))+" kept intact, no updates needed.")
|
||||
print_info(green(" * ")+red("Package ")+bold(os.path.basename(etpDataUpdated['download']))+red(" does not need to be updated. Current revision: ")+bold(str(revision)))
|
||||
return False, idpk
|
||||
|
||||
|
||||
reagentLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"generator: entry for "+str(os.path.basename(etpDataUpdated['download']))+" kept intact, no updates needed.")
|
||||
print_info(green(" * ")+red("Package ")+bold(os.path.basename(etpDataUpdated['download']))+red(" does not need to be updated. Current revision: ")+bold(str(revision)))
|
||||
return False, idpk
|
||||
|
||||
def inject(options):
|
||||
|
||||
|
||||
requestedBranch = etpConst['branch']
|
||||
mytbz2s = []
|
||||
for opt in options:
|
||||
@@ -204,7 +196,7 @@ def update(options):
|
||||
atom = dbconn.retrieveAtom(x)
|
||||
print_info(brown(" # ")+red(atom))
|
||||
if reagentRequestAsk:
|
||||
rc = askquestion(">> Would you like to remove them now ?")
|
||||
rc = Text.askQuestion(">> Would you like to remove them now ?")
|
||||
else:
|
||||
rc = "Yes"
|
||||
if rc == "Yes":
|
||||
@@ -221,7 +213,7 @@ def update(options):
|
||||
for x in toBeAdded:
|
||||
print_info(brown(" # ")+red(x[0]))
|
||||
if reagentRequestAsk:
|
||||
rc = askquestion(">> Would you like to package them now ?")
|
||||
rc = Text.askQuestion(">> Would you like to package them now ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
@@ -437,7 +429,7 @@ def database(options):
|
||||
pass
|
||||
dbconn.closeDB()
|
||||
print_info(red(" * ")+bold("WARNING")+red(": database file already exists. Overwriting."))
|
||||
rc = askquestion("\n Do you want to continue ?")
|
||||
rc = Text.askQuestion("\n Do you want to continue ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
os.remove(etpConst['etpdatabasefilepath'])
|
||||
@@ -462,7 +454,7 @@ def database(options):
|
||||
f.flush()
|
||||
f.close()
|
||||
|
||||
rc = askquestion(" Would you like to sync packages first (important if you don't have them synced) ?")
|
||||
rc = Text.askQuestion(" Would you like to sync packages first (important if you don't have them synced) ?")
|
||||
if rc == "Yes":
|
||||
activatorTools.packages(["sync","--ask"])
|
||||
|
||||
@@ -561,7 +553,7 @@ def database(options):
|
||||
print_error(green(" * ")+red("Supplied directory does not exist."))
|
||||
return 5
|
||||
print_info(green(" * ")+red("Initializing an empty database file with Entropy structure ..."),back = True)
|
||||
connection = databaseTools.sqlite.connect(mypath[0])
|
||||
connection = databaseTools.dbapi2.connect(mypath[0])
|
||||
cursor = connection.cursor()
|
||||
for sql in etpSQLInitDestroyAll.split(";"):
|
||||
if sql:
|
||||
@@ -617,7 +609,7 @@ def database(options):
|
||||
atom = dbconn.retrieveAtom(pkg)
|
||||
print_info(red(" (*) ")+bold(atom))
|
||||
|
||||
rc = askquestion(" Would you like to continue ?")
|
||||
rc = Text.askQuestion(" Would you like to continue ?")
|
||||
if rc == "No":
|
||||
return 9
|
||||
|
||||
@@ -723,7 +715,7 @@ def database(options):
|
||||
print_info(red("\t (*) ")+bold(pkgatom)+blue(" [")+red(branch)+blue("]"))
|
||||
|
||||
# ask to continue
|
||||
rc = askquestion(" Would you like to continue ?")
|
||||
rc = Text.askQuestion(" Would you like to continue ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
@@ -785,7 +777,7 @@ def database(options):
|
||||
print_info(darkred(" (*) ")+blue("[")+red(branch)+blue("] ")+brown(pkgatom))
|
||||
|
||||
# ask to continue
|
||||
rc = askquestion(" Would you like to continue ?")
|
||||
rc = Text.askQuestion(" Would you like to continue ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
@@ -867,7 +859,7 @@ def database(options):
|
||||
toBeDownloaded.append([idpackage,pkgfile,pkgbranch])
|
||||
|
||||
if (not databaseRequestNoAsk):
|
||||
rc = askquestion(" Would you like to continue ?")
|
||||
rc = Text.askQuestion(" Would you like to continue ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
@@ -984,7 +976,7 @@ def database(options):
|
||||
print_info(green(" - ")+red(pkgatom)+" -> "+bold(str(pkgbranch)+"/"+pkgfile))
|
||||
|
||||
if (not databaseRequestNoAsk):
|
||||
rc = askquestion(" Would you like to continue ?")
|
||||
rc = Text.askQuestion(" Would you like to continue ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
|
||||
@@ -111,8 +111,8 @@ def reportApplicationError(errorstring):
|
||||
proxy_support = urllib2.ProxyHandler(etpConst['proxy'])
|
||||
opener = urllib2.build_opener(proxy_support)
|
||||
urllib2.install_opener(opener)
|
||||
file = urllib2.urlopen(url)
|
||||
result = file.readlines()
|
||||
xfile = urllib2.urlopen(url)
|
||||
result = xfile.readlines()
|
||||
socket.setdefaulttimeout(2)
|
||||
return result
|
||||
except:
|
||||
@@ -125,7 +125,7 @@ def reportApplicationError(errorstring):
|
||||
# ATTENTION: this functions fills global variable etpFileTransferMetadata !!
|
||||
# take care of that
|
||||
|
||||
class urlFetcher(TextInterface):
|
||||
class urlFetcher:
|
||||
|
||||
def __init__(self, url, pathToSave, checksum = True, showSpeed = True):
|
||||
|
||||
@@ -177,8 +177,8 @@ class urlFetcher(TextInterface):
|
||||
self.remotefile = urllib2.urlopen(self.url)
|
||||
except KeyboardInterrupt:
|
||||
self.close()
|
||||
raise KeyboardInterrupt
|
||||
except Exception, e:
|
||||
raise
|
||||
except:
|
||||
self.close()
|
||||
self.status = "-3"
|
||||
return self.status
|
||||
|
||||
+42
-44
@@ -24,14 +24,12 @@ import shutil
|
||||
from entropyConstants import *
|
||||
from clientConstants import *
|
||||
from outputTools import *
|
||||
import equoTools
|
||||
import uiTools
|
||||
Equo = equoTools.EquoInterface()
|
||||
|
||||
def smart(options):
|
||||
|
||||
# check if I am root
|
||||
if (not Equo.entropyTools.isRoot()):
|
||||
if (not uiTools.Equo.entropyTools.isRoot()):
|
||||
print_error(red("You are not ")+bold("root")+red("."))
|
||||
return 1
|
||||
|
||||
@@ -85,12 +83,12 @@ def QuickpkgHandler(mypackages, savedir = None):
|
||||
|
||||
packages = []
|
||||
for opt in mypackages:
|
||||
match = Equo.clientDbconn.atomMatch(opt)
|
||||
match = uiTools.Equo.clientDbconn.atomMatch(opt)
|
||||
if match[0] != -1:
|
||||
packages.append(match)
|
||||
else:
|
||||
if not etpUi['quiet']: print_warning(darkred(" * ")+red("Cannot find: ")+bold(opt))
|
||||
packages = Equo.entropyTools.filterDuplicatedEntries(packages)
|
||||
packages = uiTools.Equo.entropyTools.filterDuplicatedEntries(packages)
|
||||
if (not packages):
|
||||
print_error(darkred(" * ")+red("No valid packages specified."))
|
||||
return 2
|
||||
@@ -100,19 +98,19 @@ def QuickpkgHandler(mypackages, savedir = None):
|
||||
pkgInfo = {}
|
||||
pkgData = {}
|
||||
for pkg in packages:
|
||||
atom = Equo.clientDbconn.retrieveAtom(pkg[0])
|
||||
atom = uiTools.Equo.clientDbconn.retrieveAtom(pkg[0])
|
||||
pkgInfo[pkg] = atom
|
||||
pkgData[pkg] = Equo.clientDbconn.getPackageData(pkg[0])
|
||||
pkgData[pkg] = uiTools.Equo.clientDbconn.getPackageData(pkg[0])
|
||||
print_info(brown("\t[")+red("from:")+bold("installed")+brown("]")+" - "+atom)
|
||||
|
||||
if (not etpUi['quiet']) or (etpUi['ask']):
|
||||
rc = Equo.entropyTools.askquestion(">> Would you like to recompose the selected packages ?")
|
||||
rc = uiTools.Equo.askQuestion(">> Would you like to recompose the selected packages ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
for pkg in packages:
|
||||
if not etpUi['quiet']: print_info(brown(" * ")+red("Compressing: ")+darkgreen(pkgInfo[pkg]))
|
||||
resultfile = Equo.entropyTools.quickpkg(pkgdata = pkgData[pkg], dirpath = savedir)
|
||||
resultfile = uiTools.Equo.entropyTools.quickpkg(pkgdata = pkgData[pkg], dirpath = savedir)
|
||||
if resultfile == None:
|
||||
if not etpUi['quiet']: print_error(darkred(" * ")+red("Error creating package for: ")+bold(pkgInfo[pkg])+darkred(". Cannot continue."))
|
||||
return 3
|
||||
@@ -141,7 +139,7 @@ def CommonFlate(mytbz2s, action, savedir = None):
|
||||
|
||||
for tbz2 in mytbz2s:
|
||||
#print_info(brown(" * ")+darkred("Analyzing: ")+tbz2)
|
||||
if not (os.path.isfile(tbz2) and tbz2.endswith(".tbz2") and Equo.entropyTools.isEntropyTbz2(tbz2)):
|
||||
if not (os.path.isfile(tbz2) and tbz2.endswith(".tbz2") and uiTools.Equo.entropyTools.isEntropyTbz2(tbz2)):
|
||||
print_error(darkred(" * ")+bold(tbz2)+red(" is not a valid tbz2"))
|
||||
return 1
|
||||
|
||||
@@ -166,19 +164,19 @@ def InflateHandler(mytbz2s, savedir):
|
||||
etptbz2path = savedir+"/"+os.path.basename(tbz2)
|
||||
if os.path.realpath(tbz2) != os.path.realpath(etptbz2path): # can convert a file without copying
|
||||
shutil.copy2(tbz2,etptbz2path)
|
||||
mydata = Equo.entropyTools.extractPkgData(etptbz2path)
|
||||
mydata = uiTools.Equo.entropyTools.extractPkgData(etptbz2path)
|
||||
# append arbitrary revision
|
||||
mydata['revision'] = 9999
|
||||
# create temp database
|
||||
dbpath = etpConst['packagestmpdir']+"/"+str(Equo.entropyTools.getRandomNumber())
|
||||
dbpath = etpConst['packagestmpdir']+"/"+str(uiTools.Equo.entropyTools.getRandomNumber())
|
||||
while os.path.isfile(dbpath):
|
||||
dbpath = etpConst['packagestmpdir']+"/"+str(Equo.entropyTools.getRandomNumber())
|
||||
dbpath = etpConst['packagestmpdir']+"/"+str(uiTools.Equo.entropyTools.getRandomNumber())
|
||||
# create
|
||||
mydbconn = Equo.openGenericDatabase(dbpath)
|
||||
mydbconn = uiTools.Equo.openGenericDatabase(dbpath)
|
||||
mydbconn.initializeDatabase()
|
||||
mydbconn.addPackage(mydata, revision = mydata['revision'])
|
||||
mydbconn.closeDB()
|
||||
Equo.entropyTools.aggregateEdb(tbz2file = etptbz2path, dbfile = dbpath)
|
||||
uiTools.Equo.entropyTools.aggregateEdb(tbz2file = etptbz2path, dbfile = dbpath)
|
||||
os.remove(dbpath)
|
||||
print_info(darkgreen(" * ")+darkred("Inflated package: ")+etptbz2path)
|
||||
|
||||
@@ -189,9 +187,9 @@ def DeflateHandler(mytbz2s, savedir):
|
||||
# analyze files
|
||||
for tbz2 in mytbz2s:
|
||||
print_info(darkgreen(" * ")+darkred("Deflating: ")+tbz2, back = True)
|
||||
mytbz2 = Equo.entropyTools.removeEdb(tbz2,savedir)
|
||||
mytbz2 = uiTools.Equo.entropyTools.removeEdb(tbz2,savedir)
|
||||
tbz2name = os.path.basename(mytbz2)[:-5] # remove .tbz2
|
||||
tbz2name = Equo.entropyTools.remove_tag(tbz2name)+".tbz2"
|
||||
tbz2name = uiTools.Equo.entropyTools.remove_tag(tbz2name)+".tbz2"
|
||||
newtbz2 = os.path.dirname(mytbz2)+"/"+tbz2name
|
||||
print_info(darkgreen(" * ")+darkred("Deflated package: ")+newtbz2)
|
||||
|
||||
@@ -206,7 +204,7 @@ def ExtractHandler(mytbz2s, savedir):
|
||||
if os.path.isfile(dbpath):
|
||||
os.remove(dbpath)
|
||||
# extract
|
||||
out = Equo.entropyTools.extractEdb(tbz2,dbpath = dbpath)
|
||||
out = uiTools.Equo.entropyTools.extractEdb(tbz2,dbpath = dbpath)
|
||||
print_info(darkgreen(" * ")+darkred("Extracted Entropy metadata from: ")+out)
|
||||
|
||||
return 0
|
||||
@@ -219,12 +217,12 @@ def smartPackagesHandler(mypackages):
|
||||
|
||||
packages = []
|
||||
for opt in mypackages:
|
||||
match = Equo.atomMatch(opt)
|
||||
match = uiTools.Equo.atomMatch(opt)
|
||||
if match[0] != -1:
|
||||
packages.append(match)
|
||||
else:
|
||||
print_warning(darkred(" * ")+red("Cannot find: ")+bold(opt))
|
||||
packages = Equo.entropyTools.filterDuplicatedEntries(packages)
|
||||
packages = uiTools.Equo.entropyTools.filterDuplicatedEntries(packages)
|
||||
if (not packages):
|
||||
print_error(darkred(" * ")+red("No valid packages specified."))
|
||||
return 2
|
||||
@@ -233,12 +231,12 @@ def smartPackagesHandler(mypackages):
|
||||
print_info(darkgreen(" * ")+red("This is the list of the packages that would be merged into a single one:"))
|
||||
pkgInfo = {}
|
||||
for pkg in packages:
|
||||
dbconn = Equo.openRepositoryDatabase(pkg[1])
|
||||
dbconn = uiTools.Equo.openRepositoryDatabase(pkg[1])
|
||||
atom = dbconn.retrieveAtom(pkg[0])
|
||||
pkgInfo[pkg] = atom
|
||||
print_info(brown("\t[")+red("from:")+pkg[1]+brown("]")+" - "+atom)
|
||||
|
||||
rc = Equo.entropyTools.askquestion(">> Would you like to create the packages above ?")
|
||||
rc = uiTools.Equo.askQuestion(">> Would you like to create the packages above ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
@@ -256,7 +254,7 @@ def smartpackagegenerator(matchedPackages):
|
||||
fetchdata = []
|
||||
matchedAtoms = {}
|
||||
for x in matchedPackages:
|
||||
xdbconn = Equo.openRepositoryDatabase(x[1])
|
||||
xdbconn = uiTools.Equo.openRepositoryDatabase(x[1])
|
||||
matchedAtoms[x] = {}
|
||||
xatom = xdbconn.retrieveAtom(x[0])
|
||||
xdownload = xdbconn.retrieveDownloadURL(x[0])
|
||||
@@ -271,9 +269,9 @@ def smartpackagegenerator(matchedPackages):
|
||||
return rc[0]
|
||||
|
||||
# create unpack dir and unpack all packages
|
||||
unpackdir = etpConst['entropyunpackdir']+"/smartpackage-"+str(Equo.entropyTools.getRandomNumber())
|
||||
unpackdir = etpConst['entropyunpackdir']+"/smartpackage-"+str(uiTools.Equo.entropyTools.getRandomNumber())
|
||||
while os.path.isdir(unpackdir):
|
||||
unpackdir = etpConst['entropyunpackdir']+"/smartpackage-"+str(Equo.entropyTools.getRandomNumber())
|
||||
unpackdir = etpConst['entropyunpackdir']+"/smartpackage-"+str(uiTools.Equo.entropyTools.getRandomNumber())
|
||||
if os.path.isdir(unpackdir):
|
||||
shutil.rmtree(unpackdir)
|
||||
os.makedirs(unpackdir)
|
||||
@@ -281,22 +279,22 @@ def smartpackagegenerator(matchedPackages):
|
||||
os.mkdir(unpackdir+"/db")
|
||||
# create master database
|
||||
dbfile = unpackdir+"/db/merged.db"
|
||||
mergeDbconn = Equo.openGenericDatabase(dbfile, dbname = "client")
|
||||
mergeDbconn = uiTools.Equo.openGenericDatabase(dbfile, dbname = "client")
|
||||
mergeDbconn.initializeDatabase()
|
||||
mergeDbconn.createXpakTable()
|
||||
tmpdbfile = dbfile+"--readingdata"
|
||||
for package in matchedPackages:
|
||||
print_info(darkgreen(" * ")+brown(matchedAtoms[package]['atom'])+": "+red("collecting Entropy metadata"))
|
||||
Equo.entropyTools.extractEdb(etpConst['entropyworkdir']+"/"+matchedAtoms[package]['download'],tmpdbfile)
|
||||
uiTools.Equo.entropyTools.extractEdb(etpConst['entropyworkdir']+"/"+matchedAtoms[package]['download'],tmpdbfile)
|
||||
# read db and add data to mergeDbconn
|
||||
mydbconn = Equo.openGenericDatabase(tmpdbfile)
|
||||
mydbconn = uiTools.Equo.openGenericDatabase(tmpdbfile)
|
||||
idpackages = mydbconn.listAllIdpackages()
|
||||
|
||||
for myidpackage in idpackages:
|
||||
data = mydbconn.getPackageData(myidpackage)
|
||||
if len(idpackages) == 1:
|
||||
# just a plain package that would like to become smart
|
||||
xpakdata = Equo.entropyTools.readXpak(etpConst['entropyworkdir']+"/"+matchedAtoms[package]['download'])
|
||||
xpakdata = uiTools.Equo.entropyTools.readXpak(etpConst['entropyworkdir']+"/"+matchedAtoms[package]['download'])
|
||||
else:
|
||||
xpakdata = mydbconn.retrieveXpakMetadata(myidpackage) # already a smart package
|
||||
# add
|
||||
@@ -312,7 +310,7 @@ def smartpackagegenerator(matchedPackages):
|
||||
# merge packages
|
||||
for package in matchedPackages:
|
||||
print_info(darkgreen(" * ")+brown(matchedAtoms[package]['atom'])+": "+red("unpacking content"))
|
||||
rc = Equo.entropyTools.uncompressTarBz2(etpConst['entropyworkdir']+"/"+matchedAtoms[x]['download'], extractPath = unpackdir+"/content")
|
||||
rc = uiTools.Equo.entropyTools.uncompressTarBz2(etpConst['entropyworkdir']+"/"+matchedAtoms[x]['download'], extractPath = unpackdir+"/content")
|
||||
if rc != 0:
|
||||
print_error(darkred(" * ")+red("Unpack failed due to unknown reasons."))
|
||||
return rc
|
||||
@@ -324,7 +322,7 @@ def smartpackagegenerator(matchedPackages):
|
||||
for x in matchedAtoms:
|
||||
atoms.append(matchedAtoms[x]['atom'].split("/")[1])
|
||||
atoms = '+'.join(atoms)
|
||||
rc = Equo.entropyTools.compressTarBz2(etpConst['smartpackagesdir']+"/"+atoms+".tbz2",unpackdir+"/content")
|
||||
rc = uiTools.Equo.entropyTools.compressTarBz2(etpConst['smartpackagesdir']+"/"+atoms+".tbz2",unpackdir+"/content")
|
||||
if rc != 0:
|
||||
print_error(darkred(" * ")+red("Compress failed due to unknown reasons."))
|
||||
return rc
|
||||
@@ -333,7 +331,7 @@ def smartpackagegenerator(matchedPackages):
|
||||
print_error(darkred(" * ")+red("Compressed file does not exist."))
|
||||
return 1
|
||||
|
||||
Equo.entropyTools.aggregateEdb(etpConst['smartpackagesdir']+"/"+atoms+".tbz2",dbfile)
|
||||
uiTools.Equo.entropyTools.aggregateEdb(etpConst['smartpackagesdir']+"/"+atoms+".tbz2",dbfile)
|
||||
print_info("\t"+etpConst['smartpackagesdir']+"/"+atoms+".tbz2")
|
||||
shutil.rmtree(unpackdir,True)
|
||||
return 0
|
||||
@@ -352,7 +350,7 @@ def smartappsHandler(mypackages, emptydeps = False):
|
||||
|
||||
packages = set()
|
||||
for opt in mypackages:
|
||||
match = Equo.atomMatch(opt)
|
||||
match = uiTools.Equo.atomMatch(opt)
|
||||
if match[0] != -1:
|
||||
packages.add(match)
|
||||
else:
|
||||
@@ -366,12 +364,12 @@ def smartappsHandler(mypackages, emptydeps = False):
|
||||
print_info(darkgreen(" * ")+red("This is the list of the packages that would be worked out:"))
|
||||
pkgInfo = {}
|
||||
for pkg in packages:
|
||||
dbconn = Equo.openRepositoryDatabase(pkg[1])
|
||||
dbconn = uiTools.Equo.openRepositoryDatabase(pkg[1])
|
||||
atom = dbconn.retrieveAtom(pkg[0])
|
||||
pkgInfo[pkg] = atom
|
||||
print_info(brown("\t[")+red("from:")+pkg[1]+red("|SMART")+brown("]")+" - "+atom)
|
||||
|
||||
rc = Equo.entropyTools.askquestion(">> Would you like to create the packages above ?")
|
||||
rc = uiTools.Equo.askQuestion(">> Would you like to create the packages above ?")
|
||||
if rc == "No":
|
||||
return 0
|
||||
|
||||
@@ -386,7 +384,7 @@ def smartappsHandler(mypackages, emptydeps = False):
|
||||
# tool that generates .tar.bz2 packages with all the binary dependencies included
|
||||
def smartgenerator(atomInfo, emptydeps = False):
|
||||
|
||||
dbconn = Equo.openRepositoryDatabase(atomInfo[1])
|
||||
dbconn = uiTools.Equo.openRepositoryDatabase(atomInfo[1])
|
||||
idpackage = atomInfo[0]
|
||||
atom = dbconn.retrieveAtom(idpackage)
|
||||
|
||||
@@ -397,7 +395,7 @@ def smartgenerator(atomInfo, emptydeps = False):
|
||||
pkgfilename = os.path.basename(pkgfilepath)
|
||||
pkgname = pkgfilename.split(".tbz2")[0]
|
||||
|
||||
pkgdependencies, removal, result = Equo.retrieveInstallQueue([atomInfo], empty_deps = emptydeps)
|
||||
pkgdependencies, removal, result = uiTools.Equo.retrieveInstallQueue([atomInfo], empty_deps = emptydeps)
|
||||
# flatten them
|
||||
pkgs = []
|
||||
if (result == 0):
|
||||
@@ -415,14 +413,14 @@ def smartgenerator(atomInfo, emptydeps = False):
|
||||
if pkgs:
|
||||
print_info(darkgreen(" * ")+red("This is the list of the dependencies that would be included:"))
|
||||
for i in pkgs:
|
||||
mydbconn = Equo.openRepositoryDatabase(i[1])
|
||||
mydbconn = uiTools.Equo.openRepositoryDatabase(i[1])
|
||||
atom = mydbconn.retrieveAtom(i[0])
|
||||
print_info(darkgreen(" (x) ")+red(atom))
|
||||
|
||||
fetchdata = []
|
||||
fetchdata.append([atom,atomInfo])
|
||||
for x in pkgs:
|
||||
xdbconn = Equo.openRepositoryDatabase(x[1])
|
||||
xdbconn = uiTools.Equo.openRepositoryDatabase(x[1])
|
||||
xatom = xdbconn.retrieveAtom(x[0])
|
||||
fetchdata.append([xatom,x])
|
||||
# run installPackages with onlyfetch
|
||||
@@ -438,7 +436,7 @@ def smartgenerator(atomInfo, emptydeps = False):
|
||||
os.makedirs(pkgtmpdir)
|
||||
mainBinaryPath = etpConst['packagesbindir']+"/"+pkgbranch+"/"+pkgfilename
|
||||
print_info(darkgreen(" * ")+red("Unpacking main package ")+bold(str(pkgfilename)))
|
||||
Equo.entropyTools.uncompressTarBz2(mainBinaryPath,pkgtmpdir) # first unpack
|
||||
uiTools.Equo.entropyTools.uncompressTarBz2(mainBinaryPath,pkgtmpdir) # first unpack
|
||||
|
||||
binaryExecs = []
|
||||
for item in pkgcontent:
|
||||
@@ -454,13 +452,13 @@ def smartgenerator(atomInfo, emptydeps = False):
|
||||
|
||||
# now uncompress all the rest
|
||||
for dep in pkgs:
|
||||
mydbconn = Equo.openRepositoryDatabase(dep[1])
|
||||
mydbconn = uiTools.Equo.openRepositoryDatabase(dep[1])
|
||||
download = os.path.basename(mydbconn.retrieveDownloadURL(dep[0]))
|
||||
depbranch = mydbconn.retrieveBranch(dep[0])
|
||||
depatom = mydbconn.retrieveAtom(dep[0])
|
||||
print_info(darkgreen(" * ")+red("Unpacking dependency package ")+bold(depatom))
|
||||
deppath = etpConst['packagesbindir']+"/"+depbranch+"/"+download
|
||||
Equo.entropyTools.uncompressTarBz2(deppath,pkgtmpdir) # first unpack
|
||||
uiTools.Equo.entropyTools.uncompressTarBz2(deppath,pkgtmpdir) # first unpack
|
||||
|
||||
|
||||
# remove unwanted files (header files)
|
||||
@@ -552,13 +550,13 @@ def smartgenerator(atomInfo, emptydeps = False):
|
||||
f.flush()
|
||||
f.close()
|
||||
# now compile
|
||||
Equo.entropyTools.spawnCommand("cd "+pkgtmpdir+"/ ; g++ -Wall "+item+".cc -o "+item+".exe")
|
||||
uiTools.Equo.entropyTools.spawnCommand("cd "+pkgtmpdir+"/ ; g++ -Wall "+item+".cc -o "+item+".exe")
|
||||
os.remove(pkgtmpdir+"/"+item+".cc")
|
||||
|
||||
smartpath = etpConst['smartappsdir']+"/"+pkgname+"-"+etpConst['currentarch']+".tbz2"
|
||||
print_info(darkgreen(" * ")+red("Compressing smart application: ")+bold(atom))
|
||||
print_info("\t"+smartpath)
|
||||
Equo.entropyTools.compressTarBz2(smartpath,pkgtmpdir+"/")
|
||||
uiTools.Equo.entropyTools.compressTarBz2(smartpath,pkgtmpdir+"/")
|
||||
shutil.rmtree(pkgtmpdir,True)
|
||||
|
||||
return 0
|
||||
Reference in New Issue
Block a user