Mercurial > lcfOS
comparison python/utils/iso9660.py @ 290:7b38782ed496
File moves
author | Windel Bouwman |
---|---|
date | Sun, 24 Nov 2013 11:24:15 +0100 |
parents | python/iso9660.py@1c7c1e619be8 |
children |
comparison
equal
deleted
inserted
replaced
289:bd2593de3ff8 | 290:7b38782ed496 |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 import argparse | |
4 | |
5 __doc__ = """ | |
6 ISO 9660 filesystem utility. | |
7 """ | |
8 | |
9 | |
10 class VolumeDescriptor: | |
11 @classmethod | |
12 def FromData(cls, d): | |
13 ty = d[0] | |
14 Id = d[1:6] | |
15 assert Id == 'CD001'.encode('ascii') | |
16 ver = d[6] | |
17 assert ver == 1 | |
18 cls = vol_desc_types[ty] | |
19 return cls(d) | |
20 | |
21 | |
22 vol_desc_types = {} | |
23 def vol_type(t): | |
24 def reg_func(cls): | |
25 vol_desc_types[t] = cls | |
26 return cls | |
27 return reg_func | |
28 | |
29 | |
30 @vol_type(0) | |
31 class BootRecordVolumeDescriptor(VolumeDescriptor): | |
32 def __init__(self, d): | |
33 boot_sys_id = d[7:39] | |
34 boot_id = d[39:71] | |
35 print(boot_sys_id) | |
36 print(boot_id) | |
37 | |
38 | |
39 @vol_type(1) | |
40 class PrimaryVolumeDescriptor(VolumeDescriptor): | |
41 def __init__(self, d): | |
42 sys_id = d[8:40] | |
43 vol_id = d[40:72] | |
44 print(sys_id) | |
45 print(vol_id) | |
46 | |
47 | |
48 @vol_type(255) | |
49 class VolumeDescriptorTerminator(VolumeDescriptor): | |
50 def __init__(self, d): | |
51 pass | |
52 | |
53 | |
54 class ISOfs: | |
55 def __init__(self): | |
56 self.vol_descriptors = [] | |
57 | |
58 def read(self, f): | |
59 # System area: | |
60 self.system_area = f.read(16 * 2048) | |
61 while True: | |
62 d = f.read(2048) | |
63 desc = VolumeDescriptor.FromData(d) | |
64 self.vol_descriptors.append(desc) | |
65 if type(desc) is VolumeDescriptorTerminator: | |
66 break | |
67 | |
68 def dump(self): | |
69 for vd in self.vol_descriptors: | |
70 print(vd) | |
71 | |
72 | |
73 if __name__ == '__main__': | |
74 parser = argparse.ArgumentParser(description=__doc__) | |
75 parser.add_argument('filename') | |
76 args = parser.parse_args() | |
77 fs = ISOfs() | |
78 with open(args.filename, 'rb') as f: | |
79 fs.read(f) | |
80 fs.dump() | |
81 | |
82 |