import calendar import datetime import os import re import sys import time from PyQt4.QtCore import * from PyQt4.QtGui import * from sface.config import config from sface.sfiprocess import SfiProcess #from sface.sfithread import SfiThread class SfiRenewer(QObject): def __init__(self, hrn, newExpiration, parent=None): QObject.__init__(self, parent) self.hrn = hrn self.newExpiration = newExpiration self.faultString = None self.renewProcess = SfiProcess(self) self.connect(self.renewProcess, SIGNAL('finished()'), self.finishedGetRecord) self.renewProcess.getRecord(hrn=config.getSlice(), filename="/tmp/slicerecord") def finishedGetRecord(self): faultString = self.renewProcess.getFaultString() if faultString: self.emitFinished("fault", faultString) return f = open("/tmp/slicerecord", "r") data = f.read() f.close() # find the expiration time exp = re.compile('expires="[^"]*"') if exp.search(data)==None: # didn't find it self.emitFinished("failure", "failed to find expiration in slice record") return # change the expiration time delta = 24*60*60 # always extend the slice by one extra day to cover slop for time zone differences data = exp.sub('expires="' + str(calendar.timegm(self.newExpiration.timetuple())+delta) + '"', data) open("/tmp/slicerecord", "w").write(data) self.disconnect(self.renewProcess, SIGNAL('finished()'), self.finishedGetRecord) self.connect(self.renewProcess, SIGNAL('finished()'), self.finishedUpdateRecord) self.renewProcess.updateRecord("/tmp/slicerecord") def finishedUpdateRecord(self): faultString = self.renewProcess.getFaultString() if faultString: self.emitFinished("fault", faultString) return # we have to force sfi.py to download an updated slice credential sliceCredName = os.path.expanduser("~/.sfi/slice_" + self.hrn.split(".")[-1] + ".cred") if os.path.exists(sliceCredName): os.remove(sliceCredName) open("/tmp/expiration", "w").write(self.newExpiration.strftime("%Y-%m-%dT%H:%M:%SZ")) # call renewSlivers on the aggregate self.disconnect(self.renewProcess, SIGNAL('finished()'), self.finishedUpdateRecord) self.connect(self.renewProcess, SIGNAL('finished()'), self.finishedRenewSlivers) self.renewProcess.renewSlivers(self.newExpiration.strftime("%Y-%m-%dT%H:%M:%SZ")) def finishedRenewSlivers(self): faultString = self.renewProcess.getFaultString() if faultString: self.emitFinished("fault", faultString) return self.emitFinished("success") def emitFinished(self, status, statusMsg=None): self.status = status self.statusMsg = statusMsg self.emit(SIGNAL("finished()")) class RenewWindow(QDialog): def __init__(self, parent=None): super(RenewWindow, self).__init__(parent) self.setWindowTitle("Renew Slivers") self.renewProcess = None self.duration = QComboBox() self.expirations = [] durations = ( (1, "One Week"), (2, "Two Weeks"), (3, "Three Weeks"), (4, "One Month") ) now = datetime.datetime.utcnow() for (weeks, desc) in durations: exp = now + datetime.timedelta(days = weeks * 7) desc = desc + " " + exp.strftime("%Y-%m-%d %H:%M:%S") self.expirations.append(exp) self.duration.addItem(desc) self.duration.setCurrentIndex(0) self.status = QLabel("") self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonBox.button(QDialogButtonBox.Ok).setDefault(True) layout = QVBoxLayout() layout.addWidget(self.duration) layout.addWidget(self.status) layout.addWidget(self.buttonBox) self.setLayout(layout) #self.status.hide() self.connect(self.buttonBox, SIGNAL("accepted()"), self, SLOT("accept()")) self.connect(self.buttonBox, SIGNAL("rejected()"), self, SLOT("reject()")) def accept(self): self.setStatus("Renewing Slice...") self.renewProcess = SfiRenewer(config.getSlice(), self.get_new_expiration(), self) self.connect(self.renewProcess, SIGNAL('finished()'), self.renewFinished) self.duration.setEnabled(False) self.buttonBox.setEnabled(False) def setStatus(self, x): self.status.setText(x) def renewFinished(self): if self.renewProcess.status == "success": color = "green" # give the user the button self.buttonBox.clear() self.buttonBox.addButton(QDialogButtonBox.Close) else: color = "red" if self.renewProcess.statusMsg: self.setStatus("Renew %s: %s" % (color, self.renewProcess.status, self.renewProcess.statusMsg)) else: self.setStatus("Renew %s" % (color, self.renewProcess.status)) self.buttonBox.setEnabled(True) self.disconnect(self.renewProcess, SIGNAL('finished()'), self.renewFinished) self.renewProcess = None def get_new_expiration(self): index = self.duration.currentIndex() return self.expirations[index]