sosar/sosar.py

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()