예제 #1
0
 def create(self, path):
     netnspath = netns._get_netnspath(path)
     try:
         netns.create(netnspath, self.libc)
     except OSError as e:
         raise NetlinkError(e.errno)
     info = self.ipr._dump_one_ns(netnspath, set())
     info['header']['type'] = RTM_NEWNETNS
     info['header']['target'] = self.target
     info['event'] = 'RTM_NEWNETNS'
     del info['value']
     return (info,)
예제 #2
0
파일: netns.py 프로젝트: sandcake/pyroute2
 def spec_normalize(spec):
     if isinstance(spec, basestring):
         ret = {'path': spec}
     else:
         ret = dict(spec)
     path = netns._get_netnspath(ret['path'])
     # on Python3 _get_netnspath() returns bytes, not str, so
     # we have to decode it here in order to avoid issues with
     # cache keys and DB inserts
     if hasattr(path, 'decode'):
         path = path.decode('utf-8')
     ret['path'] = path
     return ret
예제 #3
0
 def defaults(cls, spec):
     ret = dict(spec)
     defaults = {}
     if 'hostname' in spec:
         defaults['kind'] = 'remote'
         defaults['protocol'] = 'ssh'
         defaults['target'] = spec['hostname']
     if 'netns' in spec:
         defaults['kind'] = 'netns'
         defaults['target'] = spec['netns']
         ret['netns'] = netns._get_netnspath(spec['netns'])
     for key in defaults:
         if key not in ret:
             ret[key] = defaults[key]
     return ret
예제 #4
0
 def netns(self, cmd, *argv, **kwarg):
     path = kwarg.get('path', kwarg.get('NSINFO_PATH'))
     if path is None:
         raise ValueError('netns spec is required')
     netnspath = netns._get_netnspath(path)
     if cmd == 'add':
         return self.create(netnspath)
     elif cmd == 'del':
         return self.remove(netnspath)
     elif cmd not in ('get', 'set'):
         raise ValueError('method not supported')
     for item in self.dump():
         if item.get_attr('NSINFO_PATH') == netnspath:
             return (item,)
     return ()
예제 #5
0
 def remove(self, path):
     netnspath = netns._get_netnspath(path)
     info = None
     try:
         info = self.ipr._dump_one_ns(netnspath, set())
     except SkipInode:
         raise NetlinkError(errno.EEXIST)
     info['header']['type'] = RTM_DELNETNS
     info['header']['target'] = self.target
     info['event'] = 'RTM_DELNETNS'
     del info['value']
     try:
         netns.remove(netnspath, self.libc)
     except OSError as e:
         raise NetlinkError(e.errno)
     return (info,)
예제 #6
0
파일: netns.py 프로젝트: sandcake/pyroute2
 def __setitem__(self, key, value):
     if self.state == 'system':
         raise ValueError('attempt to change a readonly object')
     if key == 'path':
         value = netns._get_netnspath(value)
     return super(NetNS, self).__setitem__(key, value)