Пример #1
0
    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()
Пример #2
0
    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()
Пример #3
0
 def lockGitFSDir(self):
     dir = self.getGitFSDir();
     self.git_fs_dir_lock = LockFile(os.path.join(dir, 'directory_lock'))
     self.git_fs_dir_lock.lock();
Пример #4
0
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 {}