This commit is contained in:
2025-11-27 19:11:06 +00:00
parent d2382a36dc
commit 063094f2a2
7 changed files with 400 additions and 3 deletions

121
pa/lab3/server3.py Normal file
View File

@@ -0,0 +1,121 @@
#!/usr/bin/env python
import hashlib
import os
import shutil
import pickle
# ===================================================
class Note(object):
def __init__(self, name, content):
self.name = name
self.content = content
def __str__(self):
return "Note '%s': %s" % (self.name, self.content)
def sha256(s):
return hashlib.sha256(s.encode('utf-8')).hexdigest()
CLASSY_MODE = 'CLASSY'
FREE_MODE = 'FREE'
def check_mode(mode):
try:
with open(directory + '/mode', 'r') as f:
return f.read() == mode
except:
return False
def set_mode(mode):
with open(directory + '/mode', 'w') as f:
f.write(mode)
def reset(mode):
shutil.rmtree(directory)
os.makedirs(directory)
set_mode(mode)
# ===================================================
# Print banner
notes_storage = " _______ ________ ______________________ _________ ____________________________ __________ _____ ________ ___________\n \ \ \_____ \ \__ ___/\_ _____/ / _____/ / _____/\__ ___/\_____ \ \______ \ / _ \ / _____/ \_ _____/\n / | \ / | \ | | | __)_ \_____ \ \_____ \ | | / | \ | _/ / /_\ \ / \ ___ | __)_ \n/ | \/ | \ | | | \ / \ / \ | | / | \ | | \/ | \\ \_\ \ | \\\n\____|__ /\_______ / |____| /_______ //_______ / ______/_______ / |____| \_______ / |____|_ /\____|__ / \______ //_______ /\n \/ \/ \/ \/ /_____/ \/ \/ \/ \/ \/ \/ "
print ("1. Ever lost your class notes??")
print ("2. Ever wanted to store notes but had no place to and then forgot everything and failed the exam???")
print ("3. Are you tired of having to carry your notebooks????")
print ("")
print ("If you answered YES, this is the service for you!!")
print (notes_storage)
print ("\n")
# Read username and setup directory
username = input('Username: ')
directory = "/tmp/notes/%s" % sha256(username)
if not os.path.exists(directory):
os.makedirs(directory)
# Read user choices
type_choice = ""
while type_choice not in ('0', '1'):
print("Which note type do you want:")
print("0: Classy note")
print("1: Free Note")
type_choice = input('>>> ')
def read_or_write_option():
action_choice = ""
while action_choice not in ('0', '1'):
print("0: Read note")
print("1: Write Note")
action_choice = input('>>> ')
note_name = input('note_name: ')
note_path = "%s/%s" % (directory, sha256(note_name))
if action_choice == '0':
if not os.path.isfile(note_path):
print("[ERROR] Can't read a file that does not exist")
exit(-1)
else:
with open(note_path, 'rb') as f:
note_content = f.read()
elif action_choice == '1':
note_content = ""
line = input("note_content: ")
while line:
note_content += line + '\n'
line = input()
return action_choice, note_path, note_name, note_content
# Main functionality
if type_choice == '0': # Classy note
if not check_mode(CLASSY_MODE):
reset(CLASSY_MODE)
action_choice, note_path, note_name, note_content = read_or_write_option()
if action_choice == '0': # read
note = pickle.loads(note_content)
print(note)
elif action_choice == '1': # write
note = Note(note_name, note_content)
with open(note_path, 'wb') as f:
pickle.dump(note, f)
else:
print("YT0!?")
elif type_choice == '1': # Free note
if not check_mode(FREE_MODE):
reset(FREE_MODE)
action_choice, note_path, _, note_content = read_or_write_option()
if action_choice == '0': # read
print(note_content)
elif action_choice == '1': # write
with open(note_path, 'wb') as f:
f.write(note_content.encode('utf8','surrogateescape'))
else:
print("HuM!?")
else:
print("WHaT!?")