mirror of
https://github.com/kellyjonbrazil/jc.git
synced 2025-07-07 00:57:22 +02:00
fix mount on macOS when filesystem contains parenthesis
This commit is contained in:
@ -77,7 +77,7 @@ import jc.utils
|
|||||||
|
|
||||||
class info():
|
class info():
|
||||||
"""Provides parser metadata (version, author, etc.)"""
|
"""Provides parser metadata (version, author, etc.)"""
|
||||||
version = '1.10'
|
version = '1.11'
|
||||||
description = '`mount` command parser'
|
description = '`mount` command parser'
|
||||||
author = 'Kelly Brazil'
|
author = 'Kelly Brazil'
|
||||||
author_email = 'kellyjonbrazil@gmail.com'
|
author_email = 'kellyjonbrazil@gmail.com'
|
||||||
@ -111,18 +111,23 @@ def _osx_parse(data):
|
|||||||
for entry in data:
|
for entry in data:
|
||||||
output_line = {}
|
output_line = {}
|
||||||
|
|
||||||
filesystem = entry.split(' on ')
|
pattern = re.compile(
|
||||||
filesystem = filesystem[0]
|
r'''
|
||||||
output_line['filesystem'] = filesystem
|
(?P<filesystem>.*)
|
||||||
|
\son\s
|
||||||
|
(?P<mount_point>.*?)
|
||||||
|
\s
|
||||||
|
\((?P<options>.*?)\)\s*
|
||||||
|
''', re.VERBOSE
|
||||||
|
)
|
||||||
|
|
||||||
mount_point = entry.split(' on ')
|
mymatch = pattern.match(entry)
|
||||||
mount_point = mount_point[1].split(' (')
|
groups = mymatch.groupdict()
|
||||||
mount_point = mount_point[0]
|
|
||||||
output_line['mount_point'] = mount_point
|
|
||||||
|
|
||||||
options = entry.split('(', maxsplit=1)
|
if groups:
|
||||||
options = options[1].rstrip(')')
|
output_line['filesystem'] = groups['filesystem']
|
||||||
options = options.split(', ')
|
output_line['mount_point'] = groups['mount_point']
|
||||||
|
options = groups['options'].split(', ')
|
||||||
output_line['options'] = options
|
output_line['options'] = options
|
||||||
|
|
||||||
output.append(output_line)
|
output.append(output_line)
|
||||||
@ -218,7 +223,7 @@ def parse(data, raw=False, quiet=False):
|
|||||||
|
|
||||||
# check for OSX and AIX output
|
# check for OSX and AIX output
|
||||||
if ' type ' not in cleandata[0]:
|
if ' type ' not in cleandata[0]:
|
||||||
if 'node' in cleandata[0]:
|
if ' node ' in cleandata[0]:
|
||||||
raw_output = _aix_parse(cleandata)
|
raw_output = _aix_parse(cleandata)
|
||||||
else:
|
else:
|
||||||
raw_output = _osx_parse(cleandata)
|
raw_output = _osx_parse(cleandata)
|
||||||
|
1
tests/fixtures/generic/mount-parens-in-filesystem.json
vendored
Normal file
1
tests/fixtures/generic/mount-parens-in-filesystem.json
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
[{"filesystem":"/dev/disk3s1s1","mount_point":"/","options":["apfs","sealed","local","read-only","journaled"]},{"filesystem":"devfs","mount_point":"/dev","options":["devfs","local","nobrowse"]},{"filesystem":"/dev/disk3s6","mount_point":"/System/Volumes/VM","options":["apfs","local","noexec","journaled","noatime","nobrowse"]},{"filesystem":"/dev/disk3s2","mount_point":"/System/Volumes/Preboot","options":["apfs","local","journaled","nobrowse"]},{"filesystem":"/dev/disk3s4","mount_point":"/System/Volumes/Update","options":["apfs","local","journaled","nobrowse"]},{"filesystem":"/dev/disk2s2","mount_point":"/System/Volumes/xarts","options":["apfs","local","noexec","journaled","noatime","nobrowse"]},{"filesystem":"/dev/disk2s1","mount_point":"/System/Volumes/iSCPreboot","options":["apfs","local","journaled","nobrowse"]},{"filesystem":"/dev/disk2s3","mount_point":"/System/Volumes/Hardware","options":["apfs","local","journaled","nobrowse"]},{"filesystem":"/dev/disk3s5","mount_point":"/System/Volumes/Data","options":["apfs","local","journaled","nobrowse","protect","root data"]},{"filesystem":"map auto_home","mount_point":"/System/Volumes/Data/home","options":["autofs","automounted","nobrowse"]},{"filesystem":"MN - mydomain.com (ftp.mydomain.com):/","mount_point":"/Users/muescha/Library/Application Support/Mountain Duck/Volumes.noindex/MN - mydomain.com.localized","options":["nfs","asynchronous","nodev","nosuid","noowners","noatime","mounted by muescha"]},{"filesystem":"/dev/disk5s1","mount_point":"/Library/Developer/CoreSimulator/Volumes/iOS_21F79","options":["apfs","local","nodev","nosuid","read-only","journaled","noowners","noatime","nobrowse"]},{"filesystem":"/dev/disk7s1","mount_point":"/Library/Developer/CoreSimulator/Cryptex/Images/bundle/SimRuntimeBundle-A3CF7B3B-543B-4D71-BA03-12F939EA0B4D","options":["apfs","local","nodev","nosuid","read-only","journaled","noowners","noatime","nobrowse"]},{"filesystem":"/dev/disk9s1","mount_point":"/Library/Developer/CoreSimulator/Volumes/iOS_22C150","options":["apfs","sealed","local","nodev","nosuid","read-only","journaled","noowners","noatime","nobrowse"]}]
|
14
tests/fixtures/generic/mount-parens-in-filesystem.out
vendored
Normal file
14
tests/fixtures/generic/mount-parens-in-filesystem.out
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled)
|
||||||
|
devfs on /dev (devfs, local, nobrowse)
|
||||||
|
/dev/disk3s6 on /System/Volumes/VM (apfs, local, noexec, journaled, noatime, nobrowse)
|
||||||
|
/dev/disk3s2 on /System/Volumes/Preboot (apfs, local, journaled, nobrowse)
|
||||||
|
/dev/disk3s4 on /System/Volumes/Update (apfs, local, journaled, nobrowse)
|
||||||
|
/dev/disk2s2 on /System/Volumes/xarts (apfs, local, noexec, journaled, noatime, nobrowse)
|
||||||
|
/dev/disk2s1 on /System/Volumes/iSCPreboot (apfs, local, journaled, nobrowse)
|
||||||
|
/dev/disk2s3 on /System/Volumes/Hardware (apfs, local, journaled, nobrowse)
|
||||||
|
/dev/disk3s5 on /System/Volumes/Data (apfs, local, journaled, nobrowse, protect, root data)
|
||||||
|
map auto_home on /System/Volumes/Data/home (autofs, automounted, nobrowse)
|
||||||
|
MN - mydomain.com (ftp.mydomain.com):/ on /Users/muescha/Library/Application Support/Mountain Duck/Volumes.noindex/MN - mydomain.com.localized (nfs, asynchronous, nodev, nosuid, noowners, noatime, mounted by muescha)
|
||||||
|
/dev/disk5s1 on /Library/Developer/CoreSimulator/Volumes/iOS_21F79 (apfs, local, nodev, nosuid, read-only, journaled, noowners, noatime, nobrowse)
|
||||||
|
/dev/disk7s1 on /Library/Developer/CoreSimulator/Cryptex/Images/bundle/SimRuntimeBundle-A3CF7B3B-543B-4D71-BA03-12F939EA0B4D (apfs, local, nodev, nosuid, read-only, journaled, noowners, noatime, nobrowse)
|
||||||
|
/dev/disk9s1 on /Library/Developer/CoreSimulator/Volumes/iOS_22C150 (apfs, sealed, local, nodev, nosuid, read-only, journaled, noowners, noatime, nobrowse)
|
@ -30,6 +30,9 @@ class MyTests(unittest.TestCase):
|
|||||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/mount-spaces-in-filename.out'), 'r', encoding='utf-8') as f:
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/mount-spaces-in-filename.out'), 'r', encoding='utf-8') as f:
|
||||||
generic_mount_spaces_in_filename = f.read()
|
generic_mount_spaces_in_filename = f.read()
|
||||||
|
|
||||||
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/mount-parens-in-filesystem.out'), 'r', encoding='utf-8') as f:
|
||||||
|
generic_mount_parens_in_filesystem = f.read()
|
||||||
|
|
||||||
|
|
||||||
# output
|
# output
|
||||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/mount.json'), 'r', encoding='utf-8') as f:
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/mount.json'), 'r', encoding='utf-8') as f:
|
||||||
@ -53,6 +56,9 @@ class MyTests(unittest.TestCase):
|
|||||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/mount-spaces-in-filename.json'), 'r', encoding='utf-8') as f:
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/mount-spaces-in-filename.json'), 'r', encoding='utf-8') as f:
|
||||||
generic_mount_spaces_in_filename_json = json.loads(f.read())
|
generic_mount_spaces_in_filename_json = json.loads(f.read())
|
||||||
|
|
||||||
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/mount-parens-in-filesystem.json'), 'r', encoding='utf-8') as f:
|
||||||
|
generic_mount_parens_in_filesystem_json = json.loads(f.read())
|
||||||
|
|
||||||
|
|
||||||
def test_mount_nodata(self):
|
def test_mount_nodata(self):
|
||||||
"""
|
"""
|
||||||
@ -102,6 +108,12 @@ class MyTests(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
self.assertEqual(jc.parsers.mount.parse(self.generic_mount_spaces_in_filename, quiet=True), self.generic_mount_spaces_in_filename_json)
|
self.assertEqual(jc.parsers.mount.parse(self.generic_mount_spaces_in_filename, quiet=True), self.generic_mount_spaces_in_filename_json)
|
||||||
|
|
||||||
|
def test_mount_parens_in_filesystem(self):
|
||||||
|
"""
|
||||||
|
Test 'mount' with parenthesis in the filesystem
|
||||||
|
"""
|
||||||
|
self.assertEqual(jc.parsers.mount.parse(self.generic_mount_parens_in_filesystem, quiet=True), self.generic_mount_parens_in_filesystem_json)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Reference in New Issue
Block a user