def getUUIDFromFile(filename, create=False): uuid = mUUID() uuid.readFromFile(filename) if uuid.valid(): return uuid lf = LockFile(filename + '.lock') try: lf.lock() uuid.readFromFile(filename) if uuid.valid(): return uuid uuid = mUUID() uuid.generate() if not uuid.writeToFile(filename): return None return uuid finally: lf.unlock()
def lockGitFSDir(self): dir = self.getGitFSDir(); self.git_fs_dir_lock = LockFile(os.path.join(dir, 'directory_lock')) self.git_fs_dir_lock.lock();
class GitFSBase(PacketizeMixIn, GitFSStringMixIn, object): def __init__(self): self.socket = None self.config = None self.control_socket_path = None self.stringFromDict=self.marshalDict self.dictFromString=self.parseDict self.gitfs_dir_exists = False # really just means unknown self._length_bytes = 2 self.packet=[] # priorities are from least to greatest. self.config_file_priorities={'default': [ 'filesystem', 'system', 'gitfsdir' ], 'build_host': [ 'system', 'filesystem', 'gitfsdir' ], 'build_command': [ 'system', 'filesystem', 'gitfsdir' ], } self.config_files={ 'gitfsdir': '${GITFSDIR}/config', 'system': '/etc/gitfs/config', 'filesystem': '${GITFSROOT}/@gitfs/config', } def getConfigFileName(self, name): if name not in self.config_files: logging.debug('config_files %s=%s' %(name, self.config_files[name])) return None path = self.config_files[name] os.environ['GITFSDIR'] = self.getGitFSDir() path = os.path.expandvars(path) path = os.path.expanduser(path) return path def lockGitFSDir(self): dir = self.getGitFSDir(); self.git_fs_dir_lock = LockFile(os.path.join(dir, 'directory_lock')) self.git_fs_dir_lock.lock(); def getMTabFileName(self): return os.path.join(self.getGitFSDir(), 'mtab') def getMTab(self, lock=True): cf = ConfigFile() if lock: self.lockGitFSDir() try: cf.readFile(self.getMTabFileName()) except IOError: pass finally: if lock: self.unlockGitFSDir() logging.debug('read configuration: %s\n' %cf.getConfig()) return cf.getConfig() def updateMTab(self, mtab): cf = ConfigFile() cf.setConfig(mtab) self.lockGitFSDir() try: cf.writeFile(self.getMTabFileName()) finally: self.unlockGitFSDir() def getConfig(self, name): if self.config is not None and name in self.config: return self.config[name] cf = ConfigFile() files = [] f = self.getConfigFileName(name) logging.debug('getConfig filename for %s is %s' %(name, f)) if f is None: return None files.append(f) if name == 'gitfsdir': self.lockGitFSDir() try: cf.readFile(files) except IOError: # ignore files that don't exist and the like. pass finally: if name == 'gitfsdir': self.unlockGitFSDir() self.config = cf.getConfig() return self.config def flushConfig(self): self.config = None def unlockGitFSDir(self): self.git_fs_dir_lock.unlock() self.git_fs_dir_lock = None def _sendDict(self, dict): if self.socket == None: logging.debug('need to create new socket to connect to %s' %self.socket_path) if not os.path.exists(self.socket_path): logging.debug('socket %s doesn\'t exist' %self.socket_path) raise socket.error("Socket Not Found") logging.debug('about to create unix socket') self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) logging.debug('new socket = %s' %self.socket) logging.debug('about to connect.') self.socket.connect(self.socket_path) logging.debug('setting timeout.') self.socket.settimeout(2) self.request = self.socket self.sendDict(dict) def _recvDict(self): self.getPacket() if len(self.packet) == 0: return None dict = self.packet[0] self.packet=[] logging.debug('_recvDict returning %s' %dict) return dict def handleDict(self, dict): self.packet.append(dict) def executeRemote(self, dict): while True: try: self._sendDict(dict) dict = self._recvDict() return dict except socket.timeout as to: logging.debug('socket timeout') self.socket = None return None except socket.error as so: logging.debug("socket error so=%s" %so) self.socket = None if so.errno != errno.EPIPE: raise so def getInfoRemote(self): res = self.executeRemote({'action': 'info'}) if res == None: return {} try: if res['status'] != 'ok': return {} return res except KeyError: return {}