Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

'UNfsv3SetattrCall' object has no attribute 'Sattr3' #487

Closed
elliottecton opened this issue Nov 3, 2018 · 2 comments
Closed

'UNfsv3SetattrCall' object has no attribute 'Sattr3' #487

elliottecton opened this issue Nov 3, 2018 · 2 comments

Comments

@elliottecton
Copy link

elliottecton commented Nov 3, 2018

I have compiled kaitai_struct 0.9 on Debian Linux to take advantage of importing custom types. I have two .ksy files:

** u_nfsv3_setattr_call.ksy **

meta:
  id: u_nfsv3_setattr_call
  imports:
    - ../nfs_structs

seq:
  - id: fhandle_length
    type: u4be
  - id: fhandle
    size: fhandle_length
  - id: new_attributes
    type: nfs_structs::sattr3

** nfs_structs.ksy **

meta:
  id: nfs_structs
types:
  createverf3:
    seq:
      - id: nfs3_createverfsize
        type: u8be
  writeverf3:
    seq:
      - id: nfs3_writeverfsize
        type: u8be
  nfsstat3:
    seq:
      - id: nfs_status3
        type: u4be
        enum: nfsstat3_enum
  nfs_fh3:
    seq:
      - id: fhandle_length
        type: u4be
      - id: fhandle
        size: fhandle_length
  sattr3:
    seq:
      - id: set_mode
        type: u4be
      - id: mode
        type: u4be
        if: set_mode == 1
      - id: set_uid
        type: u4be
      - id: uid
        type: u4be
        if: set_uid == 1
      - id: set_gid
        type: u4be
      - id: gid
        type: u4be
        if: set_gid == 1
      - id: set_size
        type: u4be
      - id: size
        type: u4be
        if: set_size == 1
  specdata3:
    seq:
      - id: specdata1
        type: u4be
  nfstime3:
    seq:
      - id: seconds
        type: u4be
      - id: nseconds
        type: u4be

enums:
  nfsstat3_enum:
    0: nfs3_ok
    1: nfs3err_perm
    2: nfs3err_noent
    5: nfs3err_io
    6: nfs3err_nxio
    13: nfs3err_acces
    17: nfs3err_exist
    18: nfs3err_xdev
    19: nfs3err_nodev
    20: nfs3err_notdir
    21: nfs3err_isdir
    22: nfs3err_inval
    27: nfs3err_fbig
    28: nfs3err_nospc
    30: nfs3err_rofs
    31: nfs3err_mlink
    63: nfs3err_nametoolong
    66: nfs3err_notempty
    69: nfs3err_dquot
    70: nfs3err_stale
    71: nfs3err_remote
    10001: nfs3err_badhandle
    10002: nfs3err_not_sync
    10003: nfs3err_bad_cookie
    10004: nfs3err_notsupp
    10005: nfs3err_toosmall
    10006: nfs3err_serverfault
    10007: nfs3err_badtype
    10008: nfs3err_jukebox

Everything compiles to python. Here are there resulting python files:

** u_nfsv3_setattr_call.py **

# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild

from pkg_resources import parse_version
from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO


if parse_version(ks_version) < parse_version('0.7'):
    raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))

class UNfsv3SetattrCall(KaitaiStruct):
    def __init__(self, _io, _parent=None, _root=None):
        self._io = _io
        self._parent = _parent
        self._root = _root if _root else self
        self._read()

    def _read(self):
        self.fhandle_length = self._io.read_u4be()
        self.fhandle = self._io.read_bytes(self.fhandle_length)
        self.new_attributes = self._root.Sattr3(self._io, self, self._root)

** nfs_structs.py **

# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild

from pkg_resources import parse_version
from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
from enum import Enum


if parse_version(ks_version) < parse_version('0.7'):
    raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))

class NfsStructs(KaitaiStruct):

    class Nfsstat3Enum(Enum):
        nfs3_ok = 0
        nfs3err_perm = 1
        nfs3err_noent = 2
        nfs3err_io = 5
        nfs3err_nxio = 6
        nfs3err_acces = 13
        nfs3err_exist = 17
        nfs3err_xdev = 18
        nfs3err_nodev = 19
        nfs3err_notdir = 20
        nfs3err_isdir = 21
        nfs3err_inval = 22
        nfs3err_fbig = 27
        nfs3err_nospc = 28
        nfs3err_rofs = 30
        nfs3err_mlink = 31
        nfs3err_nametoolong = 63
        nfs3err_notempty = 66
        nfs3err_dquot = 69
        nfs3err_stale = 70
        nfs3err_remote = 71
        nfs3err_badhandle = 10001
        nfs3err_not_sync = 10002
        nfs3err_bad_cookie = 10003
        nfs3err_notsupp = 10004
        nfs3err_toosmall = 10005
        nfs3err_serverfault = 10006
        nfs3err_badtype = 10007
        nfs3err_jukebox = 10008
    def __init__(self, _io, _parent=None, _root=None):
        self._io = _io
        self._parent = _parent
        self._root = _root if _root else self
        self._read()

    def _read(self):
        pass

    class Sattr3(KaitaiStruct):
        def __init__(self, _io, _parent=None, _root=None):
            self._io = _io
            self._parent = _parent
            self._root = _root if _root else self
            self._read()

        def _read(self):
            self.set_mode = self._io.read_u4be()
            if self.set_mode == 1:
                self.mode = self._io.read_u4be()

            self.set_uid = self._io.read_u4be()
            if self.set_uid == 1:
                self.uid = self._io.read_u4be()

            self.set_gid = self._io.read_u4be()
            if self.set_gid == 1:
                self.gid = self._io.read_u4be()

            self.set_size = self._io.read_u4be()
            if self.set_size == 1:
                self.size = self._io.read_u4be()



    class Createverf3(KaitaiStruct):
        def __init__(self, _io, _parent=None, _root=None):
            self._io = _io
            self._parent = _parent
            self._root = _root if _root else self
            self._read()

        def _read(self):
            self.nfs3_createverfsize = self._io.read_u8be()


    class Nfstime3(KaitaiStruct):
        def __init__(self, _io, _parent=None, _root=None):
            self._io = _io
            self._parent = _parent
            self._root = _root if _root else self
            self._read()

        def _read(self):
            self.seconds = self._io.read_u4be()
            self.nseconds = self._io.read_u4be()


    class Nfsstat3(KaitaiStruct):
        def __init__(self, _io, _parent=None, _root=None):
            self._io = _io
            self._parent = _parent
            self._root = _root if _root else self
            self._read()

        def _read(self):
            self.nfs_status3 = self._root.Nfsstat3Enum(self._io.read_u4be())


    class NfsFh3(KaitaiStruct):
        def __init__(self, _io, _parent=None, _root=None):
            self._io = _io
            self._parent = _parent
            self._root = _root if _root else self
            self._read()

        def _read(self):
            self.fhandle_length = self._io.read_u4be()
            self.fhandle = self._io.read_bytes(self.fhandle_length)


    class Writeverf3(KaitaiStruct):
        def __init__(self, _io, _parent=None, _root=None):
            self._io = _io
            self._parent = _parent
            self._root = _root if _root else self
            self._read()

        def _read(self):
            self.nfs3_writeverfsize = self._io.read_u8be()


    class Specdata3(KaitaiStruct):
        def __init__(self, _io, _parent=None, _root=None):
            self._io = _io
            self._parent = _parent
            self._root = _root if _root else self
            self._read()

        def _read(self):
            self.specdata1 = self._io.read_u4be()

When I run the following simple test.py:

from u_nfsv3_setattr_call import UNfsv3SetattrCall
data = UNfsv3SetattrCall.from_file("u_nfsv3_setattr_call.test")

I get the following error:

Traceback (most recent call last):
  File "/root/dev/kaitai_struct_formats/network/rpc/nfs/unit_test/v3_calls/02_SETATTR/test.py", line 3, in <module>
    data = UNfsv3SetattrCall.from_file("u_nfsv3_setattr_call.test")
  File "/usr/local/lib/python3.5/dist-packages/kaitaistruct.py", line 35, in from_file
    return cls(KaitaiStream(f))
  File "/root/dev/kaitai_struct_formats/network/rpc/nfs/unit_test/v3_calls/02_SETATTR/u_nfsv3_setattr_call.py", line 15, in __init__
    self._read()
  File "/root/dev/kaitai_struct_formats/network/rpc/nfs/unit_test/v3_calls/02_SETATTR/u_nfsv3_setattr_call.py", line 20, in _read
    self.new_attributes = self._root.Sattr3(self._io, self, self._root)
AttributeError: 'UNfsv3SetattrCall' object has no attribute 'Sattr3'

Is this a known compiler error? There appears to be some sort of class inheritance error going on when we import custom data types. Any insight would be greatly appreciated, as usual!

@KOLANICH
Copy link

KOLANICH commented Nov 3, 2018

Is this a known compiler error?

It is. #275 #452

@generalmimon
Copy link
Member

Duplicate of #703

@generalmimon generalmimon marked this as a duplicate of #703 Mar 2, 2024
@generalmimon generalmimon closed this as not planned Won't fix, can't repro, duplicate, stale Mar 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants