def cleanQueue(self, secureDeleteFn=None): """Removes all timed-out or trash messages from the filestore. If secureDeleteFn is provided, it is called with a list of filenames to be removed. Otherwise, files are removed using secureDelete. Returns 1 if a clean is already in progress; otherwise returns 0. """ # We don't need to hold the lock here; we synchronize via the # filesystem. rmv = [] allowedTime = int(time.time()) - INPUT_TIMEOUT for m in os.listdir(self.dir): if m.startswith("rmv_") or m.startswith("rmvm_"): rmv.append(os.path.join(self.dir, m)) elif m.startswith("inp_"): try: s = os.stat(m) if s[stat.ST_MTIME] < allowedTime: self._changeState(m[4:], "inp", "rmv") rmv.append(os.path.join(self.dir, m)) except OSError: pass if secureDeleteFn: secureDeleteFn(rmv) else: secureDelete(rmv, blocking=1)
def __init__(self, keyroot, keyname, hashroot): """Load a set of keys named "keyname" on a server where all keys are stored under the directory "keyroot" and hashlogs are stored under "hashroot". """ self.keyroot = keyroot self.keyname = keyname self.hashroot= hashroot self.keydir = keydir = os.path.join(keyroot, "key_"+keyname) self.hashlogFile = os.path.join(hashroot, "hash_"+keyname) self.packetKeyFile = os.path.join(keydir, "mix.key") self.mmtpKeyFile = os.path.join(keydir, "mmtp.key") self.certFile = os.path.join(keydir, "mmtp.cert") if os.path.exists(self.mmtpKeyFile): secureDelete(self.mmtpKeyFile) if os.path.exists(self.certFile): secureDelete(self.certFile) self.descFile = os.path.join(keydir, "ServerDesc") self.publishedFile = os.path.join(keydir, "published") self.serverinfo = None self.validAfter = None self.validUntil = None self.published = os.path.exists(self.publishedFile) if not os.path.exists(keydir): createPrivateDir(keydir)
def __init__(self, keyroot, keyname, hashroot): """Load a set of keys named "keyname" on a server where all keys are stored under the directory "keyroot" and hashlogs are stored under "hashroot". """ self.keyroot = keyroot self.keyname = keyname self.hashroot = hashroot self.keydir = keydir = os.path.join(keyroot, "key_" + keyname) self.hashlogFile = os.path.join(hashroot, "hash_" + keyname) self.packetKeyFile = os.path.join(keydir, "mix.key") self.mmtpKeyFile = os.path.join(keydir, "mmtp.key") self.certFile = os.path.join(keydir, "mmtp.cert") if os.path.exists(self.mmtpKeyFile): secureDelete(self.mmtpKeyFile) if os.path.exists(self.certFile): secureDelete(self.certFile) self.descFile = os.path.join(keydir, "ServerDesc") self.publishedFile = os.path.join(keydir, "published") self.serverinfo = None self.validAfter = None self.validUntil = None self.published = os.path.exists(self.publishedFile) if not os.path.exists(keydir): createPrivateDir(keydir)
def delete(self): """Remove this keyset from disk.""" files = [ self.packetKeyFile, self.descFile, self.publishedFile, self.hashlogFile ] files = [f for f in files if os.path.exists(f)] secureDelete(files, blocking=1) mixminion.server.HashLog.deleteHashLog(self.hashlogFile) os.rmdir(self.keydir)
def delete(self): """Remove this keyset from disk.""" files = [self.packetKeyFile, self.descFile, self.publishedFile, self.hashlogFile ] files = [f for f in files if os.path.exists(f)] secureDelete(files, blocking=1) mixminion.server.HashLog.deleteHashLog(self.hashlogFile) os.rmdir(self.keydir)
def removeIdentityKey(self): """Remove this server's identity key.""" fn = os.path.join(self.keyDir, "identity.key") if not os.path.exists(fn): LOG.info("No identity key to remove.") else: LOG.warn("Removing identity key in 10 seconds") time.sleep(10) LOG.warn("Removing identity key") secureDelete([fn], blocking=1) if os.path.exists(self.dhFile): LOG.info("Removing diffie-helman parameters file") secureDelete([self.dhFile], blocking=1)
def cleanMetadata(self,secureDeleteFn=None): """Find all orphaned metadata files and remove them.""" hSet = {} for h in self.getAllMessages(): hSet[h] = 1 rmv = [] for h in [fn[5:] for fn in os.listdir(self.dir) if fn.startswith("meta_")]: if not hSet.get(h): rmv.append("meta_"+h) if rmv: LOG.warn("Removing %s orphaned metadata files from %s", len(rmv), self.dir) if secureDeleteFn: secureDeleteFn(rmv) else: secureDelete(rmv, blocking=1)
def cleanMetadata(self, secureDeleteFn=None): """Find all orphaned metadata files and remove them.""" hSet = {} for h in self.getAllMessages(): hSet[h] = 1 rmv = [] for h in [ fn[5:] for fn in os.listdir(self.dir) if fn.startswith("meta_") ]: if not hSet.get(h): rmv.append("meta_" + h) if rmv: LOG.warn("Removing %s orphaned metadata files from %s", len(rmv), self.dir) if secureDeleteFn: secureDeleteFn(rmv) else: secureDelete(rmv, blocking=1)
def fileOpsTiming(): print "#================= File ops =====================" installSIGCHLDHandler() dname = mix_mktemp(".d") os.mkdir(dname) lockfile = Lockfile(os.path.join("dname")) t1 = time() for _ in xrange(2000): lockfile.acquire(blocking=1) lockfile.release() t = time()-t1 print "Lockfile: lock+unlock", timestr(t/2000.) for i in xrange(200): f = open(os.path.join(dname, str(i)), 'wb') f.write(s32K) f.close() lst = [os.path.join(dname,str(i)) for i in range(100) ] t1 = time() secureDelete(lst) t = time()-t1 print "secureDelete (100x32)", timestr(t) waitForChildren() t = time()-t1 print " (sync)", timestr(t) lst = [ os.path.join(dname,str(i)) for i in range(100,200) ] t1 = time() for fname in lst: secureDelete(fname) t = time()-t1 print "secureDelete (1)", timestr(t/100) waitForChildren() t = time()-t1 print " (sync)", timestr(t/100)
def __init__(self, location, create=0, scrub=0): """Creates a file store object for a given directory, 'location'. If 'create' is true, creates the directory if necessary. If 'scrub' is true, removes any incomplete or invalidated messages from the store.""" secureDelete([]) # Make sure secureDelete is configured. HACK! self._lock = threading.RLock() self.dir = location if not os.path.isabs(location): LOG.warn("Directory path %s isn't absolute.", location) if os.path.exists(location) and not os.path.isdir(location): raise MixFatalError("%s is not a directory" % location) createPrivateDir(location, nocreate=(not create)) if scrub: self.cleanQueue() # Count messages on first time through. self.n_entries = -1
def deleteHashLog(filename): """Remove all files associated with a hashlog.""" try: _HASHLOG_DICT_LOCK.acquire() try: _, hl = _OPEN_HASHLOGS[filename] LOG.trace("deleteHashLog() removing open hashlog at %s",filename) hl.close() except KeyError: LOG.trace("deleteHashLog() removing closed hashlog at %s",filename) pass remove = [] parent,name = os.path.split(filename) prefix1 = name+"." prefix2 = name+"." if os.path.exists(parent): for fn in os.listdir(parent): if fn.startswith(prefix1) or fn.startswith(prefix2): remove.append(os.path.join(parent, fn)) remove = [f for f in remove if os.path.exists(f)] secureDelete(remove, blocking=1) finally: _HASHLOG_DICT_LOCK.release()
def deleteHashLog(filename): """Remove all files associated with a hashlog.""" try: _HASHLOG_DICT_LOCK.acquire() try: _, hl = _OPEN_HASHLOGS[filename] LOG.trace("deleteHashLog() removing open hashlog at %s", filename) hl.close() except KeyError: LOG.trace("deleteHashLog() removing closed hashlog at %s", filename) pass remove = [] parent, name = os.path.split(filename) prefix1 = name + "." prefix2 = name + "." if os.path.exists(parent): for fn in os.listdir(parent): if fn.startswith(prefix1) or fn.startswith(prefix2): remove.append(os.path.join(parent, fn)) remove = [f for f in remove if os.path.exists(f)] secureDelete(remove, blocking=1) finally: _HASHLOG_DICT_LOCK.release()