mirror of
https://github.com/brouhaha/sosar.git
synced 2025-02-06 19:30:08 +00:00
116 lines
3.2 KiB
Python
Executable File
116 lines
3.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import argparse
|
|
import sys
|
|
|
|
from sosdisk import SOSDisk
|
|
|
|
|
|
def cmd_ls(args, disk):
|
|
disk.print_directory(recursive = args.recursive,
|
|
long = args.long)
|
|
|
|
def cmd_mkfs(args, disk):
|
|
print('XXX mkfs')
|
|
|
|
|
|
def cmd_extract(args, disk):
|
|
for sf in disk.files(path = '', recursive = True):
|
|
name = sf.get_name()
|
|
#print(name)
|
|
#print(len(name))
|
|
length = len(sf)
|
|
data = sf.read(length)
|
|
#print(len(data))
|
|
with open(name, 'wb') as f:
|
|
f.write(data)
|
|
break # XXX for debug, only extract first file
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
fmt_group = parser.add_mutually_exclusive_group()
|
|
|
|
fmt_group.add_argument('--do',
|
|
dest = 'format',
|
|
action = 'store_const',
|
|
const = 'do',
|
|
help = "image in DOS sector order")
|
|
|
|
fmt_group.add_argument('--po',
|
|
dest = 'format',
|
|
action = 'store_const',
|
|
const = 'po',
|
|
help = "image in SOS/ProDOS sector order")
|
|
|
|
parser.add_argument('image',
|
|
type = str,
|
|
help = "SOS/ProDOS disk image")
|
|
|
|
subparsers = parser.add_subparsers(title = 'commands',
|
|
dest = 'cmd')
|
|
|
|
ls_parser = subparsers.add_parser('ls',
|
|
help = 'list files')
|
|
ls_parser.set_defaults(cmd_fn = cmd_ls)
|
|
|
|
ls_parser.add_argument('-r', '--recursive',
|
|
action = 'store_true',
|
|
help = 'recursively list subdirectories')
|
|
|
|
ls_parser.add_argument('-l', '--long',
|
|
action = 'store_true',
|
|
help = 'list file attributes')
|
|
|
|
mkfs_parser = subparsers.add_parser('mkfs',
|
|
help = 'make new filesystem')
|
|
mkfs_parser.set_defaults(cmd_fn = cmd_mkfs)
|
|
|
|
mkfs_parser.add_argument('--size',
|
|
type = int,
|
|
default = 280,
|
|
help = 'filesystem size in blocks')
|
|
|
|
extract_parser = subparsers.add_parser('x',
|
|
help = 'extract file(s)')
|
|
extract_parser.set_defaults(cmd_fn = cmd_extract)
|
|
|
|
extract_parser.add_argument('-r', '--recursive',
|
|
action = 'store_true',
|
|
help = 'recursively extract subdirectory content')
|
|
|
|
extract_parser.add_argument('filename',
|
|
type = str,
|
|
nargs = '+',
|
|
help = 'filename(s) to extract',
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
#print(args)
|
|
|
|
if args.format is not None:
|
|
fmt = args.format
|
|
elif args.image.endswith('.do') or args.image.endswith('.dsk'):
|
|
fmt = 'do'
|
|
elif args.image.endswith('.po'):
|
|
fmt = 'po'
|
|
else:
|
|
print('must specify image file format', file = sys.stderr)
|
|
sys.exit(2)
|
|
|
|
file_mode = { 'mkfs': 'w',
|
|
'ls': 'r',
|
|
'x': 'r' } [args.cmd] + 'b'
|
|
|
|
image = open(args.image, file_mode)
|
|
|
|
if args.cmd == 'mkfs':
|
|
disk = SOSDisk(image, fmt, new = True, volume_block_count = args.size)
|
|
else:
|
|
disk = SOSDisk(image, fmt)
|
|
|
|
args.cmd_fn(args, disk)
|
|
|
|
disk.close()
|
|
|