Last active
July 13, 2023 12:34
-
-
Save kofemann/3e40ef20902d840ccafea5f8f88411a6 to your computer and use it in GitHub Desktop.
Simple python script to parse NFS packes in pdml file generated by wireshark
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# Licensed under GNU GENERAL PUBLIC LICENSE Version 2 | |
# | |
# parses files produced by : `tshark -r file.pcap -q -n -T pdml` | |
# | |
import xml.sax | |
import sys | |
nfsstat4 = { | |
0 : "NFS4_OK", | |
1 : "NFS4ERR_PERM", | |
2 : "NFS4ERR_NOENT", | |
5 : "NFS4ERR_IO", | |
6 : "NFS4ERR_NXIO", | |
13 : "NFS4ERR_ACCESS", | |
17 : "NFS4ERR_EXIST", | |
18 : "NFS4ERR_XDEV", | |
20 : "NFS4ERR_NOTDIR", | |
21 : "NFS4ERR_ISDIR", | |
22 : "NFS4ERR_INVAL", | |
27 : "NFS4ERR_FBIG", | |
28 : "NFS4ERR_NOSPC", | |
30 : "NFS4ERR_ROFS", | |
31 : "NFS4ERR_MLINK", | |
63 : "NFS4ERR_NAMETOOLONG", | |
66 : "NFS4ERR_NOTEMPTY", | |
69 : "NFS4ERR_DQUOT", | |
70 : "NFS4ERR_STALE", | |
10001 : "NFS4ERR_BADHANDLE", | |
10003 : "NFS4ERR_BAD_COOKIE", | |
10004 : "NFS4ERR_NOTSUPP", | |
10005 : "NFS4ERR_TOOSMALL", | |
10006 : "NFS4ERR_SERVERFAULT", | |
10007 : "NFS4ERR_BADTYPE", | |
10008 : "NFS4ERR_DELAY", | |
10009 : "NFS4ERR_SAME", | |
10010 : "NFS4ERR_DENIED", | |
10011 : "NFS4ERR_EXPIRED", | |
10012 : "NFS4ERR_LOCKED", | |
10013 : "NFS4ERR_GRACE", | |
10014 : "NFS4ERR_FHEXPIRED", | |
10015 : "NFS4ERR_SHARE_DENIED", | |
10016 : "NFS4ERR_WRONGSEC", | |
10017 : "NFS4ERR_CLID_INUSE", | |
10018 : "NFS4ERR_RESOURCE", | |
10019 : "NFS4ERR_MOVED", | |
10020 : "NFS4ERR_NOFILEHANDLE", | |
10021 : "NFS4ERR_MINOR_VERS_MISMATCH", | |
10022 : "NFS4ERR_STALE_CLIENTID", | |
10023 : "NFS4ERR_STALE_STATEID", | |
10024 : "NFS4ERR_OLD_STATEID", | |
10025 : "NFS4ERR_BAD_STATEID", | |
10026 : "NFS4ERR_BAD_SEQID", | |
10027 : "NFS4ERR_NOT_SAME", | |
10028 : "NFS4ERR_LOCK_RANGE", | |
10029 : "NFS4ERR_SYMLINK", | |
10030 : "NFS4ERR_RESTOREFH", | |
10031 : "NFS4ERR_LEASE_MOVED", | |
10032 : "NFS4ERR_ATTRNOTSUPP", | |
10033 : "NFS4ERR_NO_GRACE", | |
10034 : "NFS4ERR_RECLAIM_BAD", | |
10035 : "NFS4ERR_RECLAIM_CONFLICT", | |
10036 : "NFS4ERR_BADXDR", | |
10037 : "NFS4ERR_LOCKS_HELD", | |
10038 : "NFS4ERR_OPENMODE", | |
10039 : "NFS4ERR_BADOWNER", | |
10040 : "NFS4ERR_BADCHAR", | |
10041 : "NFS4ERR_BADNAME", | |
10042 : "NFS4ERR_BAD_RANGE", | |
10043 : "NFS4ERR_LOCK_NOTSUPP", | |
10044 : "NFS4ERR_OP_ILLEGAL", | |
10045 : "NFS4ERR_DEADLOCK", | |
10046 : "NFS4ERR_FILE_OPEN", | |
10047 : "NFS4ERR_ADMIN_REVOKED", | |
10048 : "NFS4ERR_CB_PATH_DOWN", | |
10049 : "NFS4ERR_BADIOMODE", | |
10050 : "NFS4ERR_BADLAYOUT", | |
10051 : "NFS4ERR_BAD_SESSION_DIGEST", | |
10052 : "NFS4ERR_BADSESSION", | |
10053 : "NFS4ERR_BADSLOT", | |
10054 : "NFS4ERR_COMPLETE_ALREADY", | |
10055 : "NFS4ERR_CONN_NOT_BOUND_TO_SESSION", | |
10056 : "NFS4ERR_DELEG_ALREADY_WANTED", | |
10057 : "NFS4ERR_BACK_CHAN_BUSY", | |
10058 : "NFS4ERR_LAYOUTTRYLATER", | |
10059 : "NFS4ERR_LAYOUTUNAVAILABLE", | |
10060 : "NFS4ERR_NOMATCHING_LAYOUT", | |
10061 : "NFS4ERR_RECALLCONFLICT", | |
10062 : "NFS4ERR_UNKNOWN_LAYOUTTYPE", | |
10063 : "NFS4ERR_SEQ_MISORDERED", | |
10064 : "NFS4ERR_SEQUENCE_POS", | |
10065 : "NFS4ERR_REQ_TOO_BIG", | |
10066 : "NFS4ERR_REP_TOO_BIG", | |
10067 : "NFS4ERR_REP_TOO_BIG_TO_CACHE", | |
10068 : "NFS4ERR_RETRY_UNCACHED_REP", | |
10069 : "NFS4ERR_UNSAFE_COMPOUND", | |
10070 : "NFS4ERR_TOO_MANY_OPS", | |
10071 : "NFS4ERR_OP_NOT_IN_SESSION", | |
10072 : "NFS4ERR_HASH_ALG_UNSUPP", | |
10074 : "NFS4ERR_CLIENTID_BUSY", | |
10075 : "NFS4ERR_PNFS_IO_HOLE", | |
10076 : "NFS4ERR_SEQ_FALSE_RETRY", | |
10077 : "NFS4ERR_BAD_HIGH_SLOT", | |
10078 : "NFS4ERR_DEADSESSION", | |
10079 : "NFS4ERR_ENCR_ALG_UNSUPP", | |
10080 : "NFS4ERR_PNFS_NO_LAYOUT", | |
10081 : "NFS4ERR_NOT_ONLY_OP", | |
10082 : "NFS4ERR_WRONG_CRED", | |
10083 : "NFS4ERR_WRONG_TYPE", | |
10084 : "NFS4ERR_DIRDELEG_UNAVAIL", | |
10085 : "NFS4ERR_REJECT_DELEG", | |
10086 : "NFS4ERR_RETURNCONFLICT", | |
10087 : "NFS4ERR_DELEG_REVOKED", | |
10088 : "NFS4ERR_PARTNER_NOTSUPP", | |
10089 : "NFS4ERR_PARTNER_NO_AUTH", | |
10090 : "NFS4ERR_UNION_NOTSUPP", | |
10091 : "NFS4ERR_OFFLOAD_DENIED", | |
10092 : "NFS4ERR_WRONG_LFS", | |
10093 : "NFS4ERR_BADLABEL", | |
10094 : "NFS4ERR_OFFLOAD_NO_REQS", | |
10095 : "NFS4ERR_NOXATTR", | |
10096 : "NFS4ERR_XATTR2BIG", | |
} | |
nfs_opnum4 = { | |
3 : "OP_ACCESS", | |
4 : "OP_CLOSE", | |
5 : "OP_COMMIT", | |
6 : "OP_CREATE", | |
7 : "OP_DELEGPURGE", | |
8 : "OP_DELEGRETURN", | |
9 : "OP_GETATTR", | |
10 : "OP_GETFH", | |
11 : "OP_LINK", | |
12 : "OP_LOCK", | |
13 : "OP_LOCKT", | |
14 : "OP_LOCKU", | |
15 : "OP_LOOKUP", | |
16 : "OP_LOOKUPP", | |
17 : "OP_NVERIFY", | |
18 : "OP_OPEN", | |
19 : "OP_OPENATTR", | |
20 : "OP_OPEN_CONFIRM", | |
21 : "OP_OPEN_DOWNGRADE", | |
22 : "OP_PUTFH", | |
23 : "OP_PUTPUBFH", | |
24 : "OP_PUTROOTFH", | |
25 : "OP_READ", | |
26 : "OP_READDIR", | |
27 : "OP_READLINK", | |
28 : "OP_REMOVE", | |
29 : "OP_RENAME", | |
30 : "OP_RENEW", | |
31 : "OP_RESTOREFH", | |
32 : "OP_SAVEFH", | |
33 : "OP_SECINFO", | |
34 : "OP_SETATTR", | |
35 : "OP_SETCLIENTID", | |
36 : "OP_SETCLIENTID_CONFIRM", | |
37 : "OP_VERIFY", | |
38 : "OP_WRITE", | |
39 : "OP_RELEASE_LOCKOWNER", | |
40 : "OP_BACKCHANNEL_CTL", | |
41 : "OP_BIND_CONN_TO_SESSION", | |
42 : "OP_EXCHANGE_ID", | |
43 : "OP_CREATE_SESSION", | |
44 : "OP_DESTROY_SESSION", | |
45 : "OP_FREE_STATEID", | |
46 : "OP_GET_DIR_DELEGATION", | |
47 : "OP_GETDEVICEINFO", | |
48 : "OP_GETDEVICELIST", | |
49 : "OP_LAYOUTCOMMIT", | |
50 : "OP_LAYOUTGET", | |
51 : "OP_LAYOUTRETURN", | |
52 : "OP_SECINFO_NO_NAME", | |
53 : "OP_SEQUENCE", | |
54 : "OP_SET_SSV", | |
55 : "OP_TEST_STATEID", | |
56 : "OP_WANT_DELEGATION", | |
57 : "OP_DESTROY_CLIENTID", | |
58 : "OP_RECLAIM_COMPLETE", | |
59 : "OP_ALLOCATE", | |
60 : "OP_COPY", | |
61 : "OP_COPY_NOTIFY", | |
62 : "OP_DEALLOCATE", | |
63 : "OP_IO_ADVISE", | |
64 : "OP_LAYOUTERROR", | |
65 : "OP_LAYOUTSTATS", | |
66 : "OP_OFFLOAD_CANCEL", | |
67 : "OP_OFFLOAD_STATUS", | |
68 : "OP_READ_PLUS", | |
69 : "OP_SEEK", | |
70 : "OP_WRITE_SAME", | |
71 : "OP_CLONE", | |
72 : "OP_GETXATTR", | |
73 : "OP_SETXATTR", | |
74 : "OP_LISTXATTRS", | |
75 : "OP_REMOVEXATTR", | |
10044 : "OP_ILLEGAL", | |
} | |
nfs_cb_opnum4 = { | |
3 : "OP_CB_GETATTR", | |
4 : "OP_CB_RECALL", | |
5 : "OP_CB_LAYOUTRECALL", | |
6 : "OP_CB_NOTIFY", | |
7 : "OP_CB_PUSH_DELEG", | |
8 : "OP_CB_RECALL_ANY", | |
9 : "OP_CB_RECALLABLE_OBJ_AVAIL", | |
10 : "OP_CB_RECALL_SLOT", | |
11 : "OP_CB_SEQUENCE", | |
12 : "OP_CB_WANTS_CANCELLED", | |
13 : "OP_CB_NOTIFY_LOCK", | |
14 : "OP_CB_NOTIFY_DEVICEID", | |
15 : "OP_CB_OFFLOAD", | |
10044 : "OP_CB_ILLEGAL", | |
} | |
interest = [ | |
'frame.number', | |
'frame.time_epoch', | |
'frame.time_relative', | |
'ip.src', | |
'ip.dst', | |
'tcp.srcport', | |
'tcp.dstport', | |
'rpc.xid', | |
'rpc.msgtyp', | |
'nfs.main_opcode', | |
'nfs.nfsstat4', | |
'nfs.fhandle', | |
'nfs.stateid4.other', | |
'nfs.cb.operation' | |
] | |
class PdmlHandler(xml.sax.ContentHandler): | |
def __init__(self): | |
self._packet = {} | |
def startElement(self, name, attributes): | |
if name == 'packet': | |
self._packet = {} | |
elif name == 'field': | |
fname = attributes.getValue('name') | |
if fname in interest: | |
self._packet[fname] = attributes.getValue('show') | |
def endElement(self, name): | |
if name == 'packet' and 'rpc.xid' in self._packet: | |
if 'nfs.main_opcode' in self._packet: | |
self._packet['nfs.main_opcode'] = nfs_opnum4[int(self._packet['nfs.main_opcode'])] | |
if 'nfs.cb.operation' in self._packet: | |
self._packet['nfs.cb.operation'] = nfs_cb_opnum4[int(self._packet['nfs.cb.operation'])] | |
if 'nfs.nfsstat4' in self._packet: | |
self._packet['nfs.nfsstat4'] = nfsstat4[int(self._packet['nfs.nfsstat4'])] | |
print(self._packet) | |
def parse(f): | |
handler = PdmlHandler() | |
xml.sax.parse(f, handler) | |
def main(): | |
if len(sys.argv) != 2: | |
print("Usage: nfs_scan < file | - >") | |
sys.exit(1) | |
packets = '/dev/stdin' if sys.argv[1] == "-" else sys.argv[1] | |
with open(packets, mode='r', encoding='utf-8', errors='replace') as f: | |
parse(f) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment