1
0
mirror of https://github.com/kellyjonbrazil/jc.git synced 2025-07-15 01:24:29 +02:00

add OSX support for stat

This commit is contained in:
Kelly Brazil
2020-05-22 16:05:04 -07:00
parent 8dd9a9f9cb
commit ede21bca13

View File

@ -6,7 +6,7 @@ Usage:
Compatibility: Compatibility:
'linux' 'linux', 'darwin'
Examples: Examples:
@ -100,17 +100,18 @@ Examples:
.. ..
] ]
""" """
import shlex
import jc.utils import jc.utils
class info(): class info():
version = '1.1' version = '1.2'
description = 'stat command parser' description = 'stat command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
# compatible options: linux, darwin, cygwin, win32, aix, freebsd # compatible options: linux, darwin, cygwin, win32, aix, freebsd
compatible = ['linux'] compatible = ['linux', 'darwin']
magic_commands = ['stat'] magic_commands = ['stat']
@ -149,12 +150,16 @@ def process(proc_data):
"access_time": string, # - = null "access_time": string, # - = null
"modify_time": string, # - = null "modify_time": string, # - = null
"change_time": string, # - = null "change_time": string, # - = null
"birth_time": string # - = null "birth_time": string, # - = null
"device": integer,
"rdev": integer,
"block_size": integer,
"osx_flags": integer
} }
] ]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['size', 'blocks', 'io_blocks', 'inode', 'links', 'uid', 'gid'] int_list = ['size', 'blocks', 'io_blocks', 'inode', 'links', 'uid', 'gid', 'device', 'rdev', 'block_size', 'osx_flags']
for key in int_list: for key in int_list:
if key in entry: if key in entry:
try: try:
@ -198,81 +203,108 @@ def parse(data, raw=False, quiet=False):
cleandata = list(filter(None, cleandata)) cleandata = list(filter(None, cleandata))
if cleandata: if cleandata:
# stats output contains 8 lines
for line in cleandata:
# line #1 # linux output
if line.find('File:') == 2: if cleandata[0].startswith(' File: '):
output_line = {} # stats output contains 8 lines
line_list = line.split(maxsplit=1) for line in cleandata:
output_line['file'] = line_list[1]
# populate link_to field if -> found # line #1
if ' -> ' in output_line['file']: if line.find('File:') == 2:
filename = output_line['file'].split(' -> ')[0].strip('\u2018').rstrip('\u2019') output_line = {}
link = output_line['file'].split(' -> ')[1].strip('\u2018').rstrip('\u2019') line_list = line.split(maxsplit=1)
output_line['file'] = filename output_line['file'] = line_list[1]
output_line['link_to'] = link
else:
filename = output_line['file'].split(' -> ')[0].strip('\u2018').rstrip('\u2019')
output_line['file'] = filename
continue # populate link_to field if -> found
if ' -> ' in output_line['file']:
filename = output_line['file'].split(' -> ')[0].strip('\u2018').rstrip('\u2019')
link = output_line['file'].split(' -> ')[1].strip('\u2018').rstrip('\u2019')
output_line['file'] = filename
output_line['link_to'] = link
else:
filename = output_line['file'].split(' -> ')[0].strip('\u2018').rstrip('\u2019')
output_line['file'] = filename
# line #2 continue
if line.find('Size:') == 2:
line_list = line.split(maxsplit=7)
output_line['size'] = line_list[1]
output_line['blocks'] = line_list[3]
output_line['io_blocks'] = line_list[6]
output_line['type'] = line_list[7]
continue
# line #3 # line #2
if line.startswith('Device:'): if line.find('Size:') == 2:
line_list = line.split() line_list = line.split(maxsplit=7)
output_line['device'] = line_list[1] output_line['size'] = line_list[1]
output_line['inode'] = line_list[3] output_line['blocks'] = line_list[3]
output_line['links'] = line_list[5] output_line['io_blocks'] = line_list[6]
continue output_line['type'] = line_list[7]
continue
# line #4 # line #3
if line.startswith('Access: ('): if line.startswith('Device:'):
line = line.replace('(', ' ').replace(')', ' ').replace('/', ' ') line_list = line.split()
line_list = line.split() output_line['device'] = line_list[1]
output_line['access'] = line_list[1] output_line['inode'] = line_list[3]
output_line['flags'] = line_list[2] output_line['links'] = line_list[5]
output_line['uid'] = line_list[4] continue
output_line['user'] = line_list[5]
output_line['gid'] = line_list[7]
output_line['group'] = line_list[8]
continue
# line #5 # line #4
if line.startswith('Access: 2'): if line.startswith('Access: ('):
line_list = line.split(maxsplit=1) line = line.replace('(', ' ').replace(')', ' ').replace('/', ' ')
output_line['access_time'] = line_list[1] line_list = line.split()
continue output_line['access'] = line_list[1]
output_line['flags'] = line_list[2]
output_line['uid'] = line_list[4]
output_line['user'] = line_list[5]
output_line['gid'] = line_list[7]
output_line['group'] = line_list[8]
continue
# line #6 # line #5
if line.startswith('Modify:'): if line.startswith('Access: 2'):
line_list = line.split(maxsplit=1) line_list = line.split(maxsplit=1)
output_line['modify_time'] = line_list[1] output_line['access_time'] = line_list[1]
continue continue
# line #7 # line #6
if line.startswith('Change:'): if line.startswith('Modify:'):
line_list = line.split(maxsplit=1) line_list = line.split(maxsplit=1)
output_line['change_time'] = line_list[1] output_line['modify_time'] = line_list[1]
continue continue
# line #8 # line #7
if line.find('Birth:') == 1: if line.startswith('Change:'):
line_list = line.split(maxsplit=1) line_list = line.split(maxsplit=1)
output_line['birth_time'] = line_list[1] output_line['change_time'] = line_list[1]
continue
# line #8
if line.find('Birth:') == 1:
line_list = line.split(maxsplit=1)
output_line['birth_time'] = line_list[1]
raw_output.append(output_line)
continue
# OSX output
else:
for line in cleandata:
value = shlex.split(line)
output_line = {
'device': value[0],
'inode': value[1],
'flags': value[2],
'links': value[3],
'user': value[4],
'group': value[5],
'rdev': value[6],
'size': value[7],
'access_time': value[8],
'modify_time': value[9],
'change_time': value[10],
'birth_time': value[11],
'block_size': value[12],
'blocks': value[13],
'osx_flags': value[14]
}
raw_output.append(output_line) raw_output.append(output_line)
continue
if raw: if raw:
return raw_output return raw_output