From ec1dc1874c71bdf2b6737543d94fa9621406d16f Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Wed, 7 Sep 2022 22:41:15 -0400 Subject: [PATCH] veserver.py: Allow different files to be served to each client. --- sortdir.po | Bin 143360 -> 143360 bytes veserver.py | 54 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/sortdir.po b/sortdir.po index 91441b4bc80022b01fcc60d195bd31a11018ef92..ae8823c26d7ff867ac2dad81d33b5617ab11e1ce 100644 GIT binary patch delta 60250 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 YMymOYRP!0BazgVNspd0MAtTlQ03QoWy8r+H diff --git a/veserver.py b/veserver.py index 7876db0..7979306 100755 --- a/veserver.py +++ b/veserver.py @@ -11,8 +11,8 @@ ########################################################################### pd25 = False # Default to old-style date/time --prodos25 to use new format -file1 = "/home/pi/virtual-1.po" # Disk image drive 1 --disk1 to override -file2 = "/home/pi/virtual-2.po" # Disk image drive 2 --disk2 to override +file1 = "/home/bobbi/virtual-1.po" # Disk image drive 1 --disk1 to override +file2 = "/home/bobbi/virtual-2.po" # Disk image drive 2 --disk2 to override serial_port = None # Serial port to use instead of ethernet baud_rate = 115200 # Baud rate for serial mode @@ -107,10 +107,36 @@ def printinfo(drv, blknum, isWrite, isError, cs): prevop = isWrite prevcs = cs +# +# Augment filename by adding IP +# If filename is basename.ext and IP is 192.168.2.3 +# will return basename-192.168.2.3.ext +# +def augment_filename(filename, ip): + idx = filename.rfind(".") + basename = filename[0 : idx] + ext = filename[idx:] + return basename + "-" + ip + ext + +# +# See if augmented filename exists, if so return that name +# otherwise return the unaugmented name +# +def select_filename(filename, ip): + if serial_port: + return filename + filename_with_ip = augment_filename(filename, ip) + try: + with open(filename_with_ip, "rb"): + pass + except: + return filename + return filename_with_ip + # # Read block with date/time update # -def read3(dataport, addr, d): +def read3(dataport, addr, ip, d): global packet d = dataport.recvmore(d, 3) @@ -124,6 +150,8 @@ def read3(dataport, addr, d): drv = 2 skip = skip2 + file = select_filename(file, ip) + blknum = d[2] + 256 * d[3] err = False @@ -164,12 +192,12 @@ def read3(dataport, addr, d): printinfo(drv, blknum, False, err, cs) b = dataport.sendto(bytearray(l), addr) - #print('Sent {} bytes to {}'.format(b, addr)) + #print('Sent {} bytes to {}'.format(b, ip)) # # Write block # -def write(dataport, addr, d): +def write(dataport, addr, ip, d): global packet d = dataport.recvmore(d, BLKSZ + 4) @@ -183,6 +211,8 @@ def write(dataport, addr, d): drv = 2 skip = skip2 + file = select_filename(file, ip) + cs = 0 for i in range (0, BLKSZ): cs ^= d[i+5] @@ -192,7 +222,7 @@ def write(dataport, addr, d): err = False if cs == d[517]: try: - with open(file, 'r+b') as f: + with open(file, 'rb') as f: b = blknum * BLKSZ + skip f.seek(b) for i in range (0, BLKSZ): @@ -220,7 +250,7 @@ def write(dataport, addr, d): printinfo(drv, blknum, True, err, cs) b = dataport.sendto(bytearray(l), addr) - #print('Sent {} bytes to {}'.format(b, addr)) + #print('Sent {} bytes to {}'.format(b, ip)) # # See if file is a 2MG and, if so, that it contains .PO image @@ -332,7 +362,7 @@ for a, v in args: elif a in ('-b', '--baud'): baud_rate = int(v) -print("VEServer v1.1") +print("VEServer v1.2") if pd25: print("ProDOS 2.5+ Clock Driver") else: @@ -347,11 +377,13 @@ with DataPort(serial_port, baud_rate) as dataport: while True: try: data, address = dataport.recvfrom(2) - # print('Received {} bytes from {}'.format(len(data), address)) + ip = address[0] + ip = ip[ip.rfind(":")+1:] + #print('Received {} bytes from {}'.format(len(data), ip)) if (data[0] == 0xc5): if (data[1] == 0x03) or (data[1] == 0x05): - read3(dataport, address, data) + read3(dataport, address, ip, data) elif (data[1] == 0x02) or (data[1] == 0x04): - write(dataport, address, data) + write(dataport, address, ip, data) except DataPort.Timeout: pass