Annotation of qemu/QMP/qom-fuse, revision 1.1

1.1     ! root        1: #!/usr/bin/python
        !             2: ##
        !             3: # QEMU Object Model test tools
        !             4: #
        !             5: # Copyright IBM, Corp. 2012
        !             6: #
        !             7: # Authors:
        !             8: #  Anthony Liguori   <[email protected]>
        !             9: #
        !            10: # This work is licensed under the terms of the GNU GPL, version 2 or later.  See
        !            11: # the COPYING file in the top-level directory.
        !            12: ##
        !            13: 
        !            14: import fuse, stat
        !            15: from fuse import Fuse
        !            16: import os, posix
        !            17: from errno import *
        !            18: from qmp import QEMUMonitorProtocol
        !            19: 
        !            20: fuse.fuse_python_api = (0, 2)
        !            21: 
        !            22: class QOMFS(Fuse):
        !            23:     def __init__(self, qmp, *args, **kwds):
        !            24:         Fuse.__init__(self, *args, **kwds)
        !            25:         self.qmp = qmp
        !            26:         self.qmp.connect()
        !            27:         self.ino_map = {}
        !            28:         self.ino_count = 1
        !            29: 
        !            30:     def get_ino(self, path):
        !            31:         if self.ino_map.has_key(path):
        !            32:             return self.ino_map[path]
        !            33:         self.ino_map[path] = self.ino_count
        !            34:         self.ino_count += 1
        !            35:         return self.ino_map[path]
        !            36: 
        !            37:     def is_object(self, path):
        !            38:         try:
        !            39:             items = self.qmp.command('qom-list', path=path)
        !            40:             return True
        !            41:         except:
        !            42:             return False
        !            43: 
        !            44:     def is_property(self, path):
        !            45:         try:
        !            46:             path, prop = path.rsplit('/', 1)
        !            47:             for item in self.qmp.command('qom-list', path=path):
        !            48:                 if item['name'] == prop:
        !            49:                     return True
        !            50:             return False
        !            51:         except:
        !            52:             return False
        !            53: 
        !            54:     def is_link(self, path):
        !            55:         try:
        !            56:             path, prop = path.rsplit('/', 1)
        !            57:             for item in self.qmp.command('qom-list', path=path):
        !            58:                 if item['name'] == prop:
        !            59:                     if item['type'].startswith('link<'):
        !            60:                         return True
        !            61:                     return False
        !            62:             return False
        !            63:         except:
        !            64:             return False
        !            65: 
        !            66:     def read(self, path, length, offset):
        !            67:         if not self.is_property(path):
        !            68:             return -ENOENT
        !            69: 
        !            70:         path, prop = path.rsplit('/', 1)
        !            71:         try:
        !            72:             data = str(self.qmp.command('qom-get', path=path, property=prop))
        !            73:             data += '\n' # make values shell friendly
        !            74:         except:
        !            75:             return -EPERM
        !            76: 
        !            77:         if offset > len(data):
        !            78:             return ''
        !            79: 
        !            80:         return str(data[offset:][:length])
        !            81: 
        !            82:     def readlink(self, path):
        !            83:         if not self.is_link(path):
        !            84:             return False
        !            85:         path, prop = path.rsplit('/', 1)
        !            86:         prefix = '/'.join(['..'] * (len(path.split('/')) - 1))
        !            87:         return prefix + str(self.qmp.command('qom-get', path=path,
        !            88:                                              property=prop))
        !            89: 
        !            90:     def getattr(self, path):
        !            91:         if self.is_link(path):
        !            92:             value = posix.stat_result((0755 | stat.S_IFLNK,
        !            93:                                        self.get_ino(path),
        !            94:                                        0,
        !            95:                                        2,
        !            96:                                        1000,
        !            97:                                        1000,
        !            98:                                        4096,
        !            99:                                        0,
        !           100:                                        0,
        !           101:                                        0))
        !           102:         elif self.is_object(path):
        !           103:             value = posix.stat_result((0755 | stat.S_IFDIR,
        !           104:                                        self.get_ino(path),
        !           105:                                        0,
        !           106:                                        2,
        !           107:                                        1000,
        !           108:                                        1000,
        !           109:                                        4096,
        !           110:                                        0,
        !           111:                                        0,
        !           112:                                        0))
        !           113:         elif self.is_property(path):
        !           114:             value = posix.stat_result((0644 | stat.S_IFREG,
        !           115:                                        self.get_ino(path),
        !           116:                                        0,
        !           117:                                        1,
        !           118:                                        1000,
        !           119:                                        1000,
        !           120:                                        4096,
        !           121:                                        0,
        !           122:                                        0,
        !           123:                                        0))
        !           124:         else:
        !           125:             value = -ENOENT
        !           126:         return value
        !           127: 
        !           128:     def readdir(self, path, offset):
        !           129:         yield fuse.Direntry('.')
        !           130:         yield fuse.Direntry('..')
        !           131:         for item in self.qmp.command('qom-list', path=path):
        !           132:             yield fuse.Direntry(str(item['name']))
        !           133: 
        !           134: if __name__ == '__main__':
        !           135:     import sys, os
        !           136: 
        !           137:     fs = QOMFS(QEMUMonitorProtocol(os.environ['QMP_SOCKET']))
        !           138:     fs.main(sys.argv)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.