Neale Pickett
·
2021-07-02
xmodem.py
1#! /usr/bin/python3
2
3import netarch
4
5class XmodemPacket(netarch.Packet):
6 def parse(self, data):
7 datastream = netarch.Unpacker(data)
8 self.opcode = datastream.uint8()
9 self.payload = datastream.buf
10
11 def opcode_1(self):
12 "Xfer"
13 datastream = netarch.Unpacker(self.payload)
14 self["seq"] = datastream.uint8()
15 self["~seq"] = datastream.uint8()
16
17 assert self["seq"] == 255 - self["~seq"]
18 assert len(datastream.buf) == 0x81
19
20 self["checksum"] = datastream.uint8(pos=-1)
21 self.payload = datastream.buf
22
23 def opcode_4(self):
24 "EOT"
25
26 def opcode_6(self):
27 "ACK"
28
29 def opcode_21(self):
30 "Begin transmission?"
31
32class XmodemSession(netarch.Session):
33 Packet = XmodemPacket
34
35 def process(self, packet):
36 packet.show()
37
38 if packet.opcode == 21:
39 # Open a new file for output
40 self.out = self.open_out("data.bin")
41 elif packet.opcode == 1:
42 self.out.write(bytes(packet.payload))
43
44
45netarch.main(XmodemSession)