Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- import sys
- import socket
- import re
- import os
- import time
- import datetime
- #-------------------------------------------------------------------------
- # INIT
- #-------------------------------------------------------------------------
- BUFFER_SIZE = 8192
- """CS_IP = socket.gethostbyname('tejo.ist.utl.pt')
- CS_PORT = 58011"""
- user = ""
- password = ""
- CS_IP = [l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2]
- if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)),
- s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET,
- socket.SOCK_DGRAM)]][0][1]]) if l][0][0]
- CS_PORT = 58002
- for i in range(0,len(sys.argv)-1):
- if sys.argv[i] == "-n":
- CS_IP = socket.gethostbyname(sys.argv[i+1])
- if sys.argv[i] == "-p":
- CS_PORT = int(sys.argv[i+1])
- print "CS_IP: " + CS_IP
- print "CS_PORT: " + str(CS_PORT)
- #-------------------------------------------------------------------------
- # FILE
- #-------------------------------------------------------------------------
- class File:
- def __init__(self, name, date, time, size, data):
- self.name = name
- self.datetime = datetime.datetime(int(date.split(".")[2]),int(date.split(".")[1]),int(date.split(".")[0]),int(time.split(":")[0]),int(time.split(":")[1]),int(time.split(":")[2]))
- self.size=int(size)
- self.data = data
- def __str__(self):
- return "{0:s} {1:02d}.{2:02d}.{3:04d} {4:02d}.{5:02d}.{6:02d} {7:d}".format(self.name, self.datetime.day, self.datetime.month, self.datetime.year, self.datetime.hour, self.datetime.minute, self.datetime.second, self.size)
- def getData(self):
- return self.data
- def getName(self):
- return self.name
- #-------------------------------------------------------------------------
- # AUX_FUNCTIONS
- #-------------------------------------------------------------------------
- def userLoggedIn():
- return user != "" and password !=""
- def send(msg):
- #print "Sent:"+msg
- s.send(msg)
- def receive(flag):
- if(flag):
- data = ""
- s.settimeout(0.1)
- while True:
- try:
- tempdata = s.recv(BUFFER_SIZE)
- if tempdata == "":
- break
- data += tempdata
- #print "[DEBUG]Received " + tempdata
- except socket.timeout:
- #print "Received:"+data
- s.settimeout(None)
- return data
- return data
- else:
- data = s.recv(BUFFER_SIZE)
- #print "Received:"+data
- return data
- def read_file(string):
- #print "name is "+string.split(" ")[0]+" ,"
- name = string.split(" ")[0]
- #print "date is "+string.split(" ")[1]+" ,"
- date = string.split(" ")[1]
- #print "time is "+string.split(" ")[2]+" ,"
- time = string.split(" ")[2]
- #print "size is "+string.split(" ")[3]+" ,"
- size = string.split(" ")[3]
- data_index = len(name) + 1 + len(date) + 1 + len(time) + 1 + len(size) + 1
- size = int(size)
- data = string[data_index:data_index+size]
- #print "data is "+data+" ,"
- file = File(name,date,time,size,data)
- #print "Remaining:"+string[data_index+size+1:]
- return file, string[data_index+size+1:]
- def command_parser(command,stage):
- if stage == "init" and command[:4] == "RBR ":
- return command_parser(command[4:],"nFiles")
- elif stage == "nFiles":
- files=[]
- n = int(command.split(" ")[0])
- file_string = command[len(command.split(" ")[0])+1:]
- for i in range(0,n):
- myfile , file_string = read_file(file_string)
- files.append(myfile)
- return files
- def createDir(dir):
- if not os.path.isdir(os.getcwd()+"/"+dir):
- os.mkdir(dir)
- def createFile(file,dir):
- f = open(dir+"/"+file.getName(), "w")
- f.write(file.getData())
- f.close()
- #-------------------------------------------------------------------------
- # AUT
- #-------------------------------------------------------------------------
- def AUT():
- send("AUT "+ user + " " + password + "\n")
- try:
- receipt = receive(0)
- if receipt == "AUR NEW\n":
- return "User " + user + " created"
- elif receipt == "AUR NOK\n":
- return "User or password incorrect, please try again."
- elif receipt == "AUR OK\n":
- return "Login successful."
- except socket.error:
- return "Connection error. Could not authenticate."
- #-------------------------------------------------------------------------
- # DLU
- #-------------------------------------------------------------------------
- def DLU():
- global user
- global password
- send("DLU\n")
- try:
- receipt = receive(0)
- if receipt == "DLR OK\n":
- temp_user = user
- user = ""
- password = ""
- return "User " + temp_user + " deleted"
- elif receipt == "DLR NOK\n":
- return "User not deleted, please delete all your files first."
- except socket.error:
- return "Connection error. Could not delete user."
- #-------------------------------------------------------------------------
- # LSD
- #-------------------------------------------------------------------------
- def LSD():
- send("LSD\n")
- try:
- receipt = receive(1)
- #print "[DEBUG]"+receipt
- message = ""
- if re.split(" |\n",receipt)[0] == "LDR" and re.split(" |\n",receipt)[1] != '0':
- for dir in re.split(" |\n",receipt)[2:]:
- message += dir + " "
- return message
- elif re.split(" |\n",receipt)[0] == "LDR" and re.split(" |\n",receipt)[1] == '0':
- return "No directories were found."
- except socket.error:
- return "Connection error. Could not list directories."
- #-------------------------------------------------------------------------
- # LSF
- #-------------------------------------------------------------------------
- def LSF(dir):
- send("LSF " + dir + "\n")
- receipt = receive(1)
- try:
- if re.split(" |\n",receipt)[0] == "LFD" and len(re.split(" |\n",receipt)) != 3:
- stri = "from: " + re.split(" |\n",receipt)[1] + " " + re.split(" |\n",receipt)[2] + "\n"
- i = 0
- for dir in re.split(" |\n",receipt)[4:]:
- i += 1
- stri += dir + " "
- if i % 4 == 0:
- stri += "\n"
- i = 0
- return stri
- elif re.split(" |\n",receipt)[0] == "LFD" and re.split(" |\n",receipt)[1] == "NOK":
- return "The directory " + dir + " does not exist."
- except socket.error:
- return "Connection error. Could not list files."
- #-------------------------------------------------------------------------
- # DEL
- #-------------------------------------------------------------------------
- #TO TEST
- def DEL(dir):
- send("DEL " + dir + "\n")
- try:
- receipt = receive(0)
- if receipt == "DDR OK\n":
- return "Directory " + dir + " and its contents were deleted successfully."
- elif receipt == "DDR NOK\n":
- return "Directory " + dir + " could not be deleted."
- except socket.error:
- return "Connection error. Could not delete directory. "
- #-------------------------------------------------------------------------
- # BCK
- #-------------------------------------------------------------------------
- #TO TEST
- def BCK(dir):
- dir_path = os.getcwd()+"/"+dir
- files = ""
- N = 0;
- try:
- for filename in os.listdir(dir_path):
- if os.path.isfile(dir_path+"/"+filename):
- mtime = time.gmtime(os.path.getmtime(dir_path+"/"+filename))
- files = files + " " + filename + " " + "{0:02d}.{1:02d}.{2:04d} {3:02d}:{4:02d}:{5:02d}".format(mtime.tm_mday, mtime.tm_mon,
- mtime.tm_year, mtime.tm_hour, mtime.tm_min, mtime.tm_sec)+ " "+ str(int(os.stat(dir_path+"/"+filename).st_size))
- #files = files + " " + lines
- N += 1
- #print "[DEBUG:FILES]"+files
- files = files[1:]
- if N != 0:
- #print "BCK " + dir + " " + str(N) + " " + files + "\n"
- send("BCK " + dir + " " + str(N) + " " + files + "\n")
- else:
- send("BCK " + dir + " "+ str(N) +"\n")
- receipt = receive(1)
- #print receipt
- if re.split(" |\n",receipt)[0] == "BKR" and len(re.split(" |\n",receipt)) > 3:
- print("backup to: " + re.split(" |\n",receipt)[1] + " " + re.split(" |\n",receipt)[2])
- return receipt
- elif re.split(" |\n",receipt)[0] == "BKR" and re.split(" |\n",receipt)[1] == "EOF":
- return "Backup request cannot be answered. Please try again later."
- elif re.split(" |\n",receipt)[0] == "BKR" and re.split(" |\n",receipt)[1] == "ERR":
- return "Backup request not well formulated. Please try again."
- except OSError:
- return "The directory " + dir + " does not exist."
- #-------------------------------------------------------------------------
- # UPL
- #-------------------------------------------------------------------------
- #TO TEST
- def UPL(dir, stri):
- message = "UPL "+dir + " " + re.split(" |\n",stri)[3]
- #print "[DEBUG:UPL]"+stri
- files = ""
- for i in range(0,int(re.split(" |\n",stri)[3])):
- name = re.split(" |\n",stri)[4*i+4]
- date = re.split(" |\n",stri)[4*i+5]
- time = re.split(" |\n",stri)[4*i+6]
- size = re.split(" |\n",stri)[4*i+7]
- f = open(dir + "/" + name, "r")
- data = f.read()
- f.close()
- message = message + " " + name + " " + date + " " + time + " " + size + " "+ data
- files += name + " "
- send(message + "\n")
- receipt = receive(0)
- if receipt == "UPR OK\n":
- return "Completed - " + dir + " : " + files[:-1]
- elif receipt == "UPR NOK\n":
- return "Backup error. Please try again."
- #-------------------------------------------------------------------------
- # RST
- #-------------------------------------------------------------------------
- def RST(dir):
- send("RST " + dir + "\n")
- receipt = receive(1)
- if re.split(" |\n",receipt)[0] == "RSR" and len(re.split(" |\n",receipt)) == 4:
- print("from: " + re.split(" |\n",receipt)[1] + " " + re.split(" |\n",receipt)[2])
- return receipt
- elif re.split(" |\n",receipt)[0] == "RSR" and re.split(" |\n",receipt)[1] == "EOF":
- return "Restore request cannot be answered. Directory " + dir + " may not exist."
- elif re.split(" |\n",receipt)[0] == "RSR" and re.split(" |\n",receipt)[1] == "ERR":
- return "Restore request not well formulated. Please try again."
- #-------------------------------------------------------------------------
- # RSB
- #-------------------------------------------------------------------------
- def RSB(dir):
- send("RSB " + dir + "\n")
- receipt = receive(1)
- if re.split(" |\n",receipt)[0] == "RBR" and len(re.split(" |\n",receipt)) != 3 :
- files = command_parser(receipt, "init")
- message = "Success - " +dir + ": "
- for f in files:
- createDir(dir)
- createFile(f, dir)
- message += f.getName() + " "
- return message
- elif re.split(" |\n",receipt)[0] == "RBR" and re.split(" |\n",receipt)[1] == "EOF":
- return "Restore request cannot be answered. Directory " + dir + " may not exist."
- elif re.split(" |\n",receipt)[0] == "RBR" and re.split(" |\n",receipt)[1] == "ERR":
- return "Restore request not well formulated. Please try again."
- #-------------------------------------------------------------------------
- # COMMAND
- #-------------------------------------------------------------------------
- while(True):
- command = raw_input()
- if command.split(" ")[0] == "login":
- if len(command.split(" "))!= 3 or len(command.split(" ")[1]) != 5 or len(command.split(" ")[2]) != 8:
- print("Wrong formatting. Command should be used as: login <user>(5chars) <password>(8chars)")
- else:
- user = command.split(" ")[1]
- password = command.split(" ")[2]
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((CS_IP, CS_PORT))
- print(AUT())
- s.close()
- elif command.split(" ")[0] == "deluser":
- if userLoggedIn():
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((CS_IP, CS_PORT))
- AUT()
- print(DLU())
- s.close()
- else:
- print "Please login first."
- elif command.split(" ")[0] == "dirlist":
- if userLoggedIn():
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((CS_IP, CS_PORT))
- AUT()
- print(LSD()[:-1])
- s.close()
- else:
- print "Please login first."
- elif command.split(" ")[0] == "filelist":
- if userLoggedIn():
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((CS_IP, CS_PORT))
- AUT()
- message = LSF(command.split(" ")[1])
- if message.split()[0] == "from:":
- print message[:-2]
- else:
- print message
- s.close()
- else:
- print "Please login first."
- elif command.split(" ")[0] == "delete":
- if userLoggedIn():
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((CS_IP, CS_PORT))
- AUT()
- print(DEL(command.split(" ")[1]))
- s.close()
- else:
- print "Please login first."
- elif command.split(" ")[0] == "backup":
- if userLoggedIn():
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((CS_IP, CS_PORT))
- AUT()
- dir = command.split(" ")[1]
- bck = BCK(dir)
- s.close()
- if(bck == None):
- print "The directory " + dir + " is empty."
- elif(bck[:3] != "BKR"):
- print bck
- else:
- bsip = str(re.split(" |\n",bck)[1])
- bsport = int(re.split(" |\n",bck)[2])
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((bsip, bsport))
- AUT()
- print(UPL(dir, bck))
- s.close()
- else:
- print "Please login first."
- elif command.split(" ")[0] == "restore":
- if userLoggedIn():
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((CS_IP, CS_PORT))
- AUT()
- dir = command.split(" ")[1]
- rst = RST(dir)
- s.close()
- if(rst[:3] != "RSR"):
- print rst
- else:
- bsip = re.split(" |\n",rst)[1]
- bsport = int(re.split(" |\n",rst)[2])
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((bsip, bsport))
- AUT()
- print(RSB(dir))
- s.close()
- else:
- print "Please login first."
- elif command.split(" ")[0] == "logout":
- if userLoggedIn():
- user = ""
- password = ""
- print "Logged out successfully."
- else:
- print "Please login first."
- elif command.split(" ")[0] == "exit":
- exit()
- else:
- print "Wrong command. All possible commands are as followed:\nlogin <user>(5chars) <password>(8chars)\ndeluser\nbackup <dir>\nrestore <dir>\ndirlist\nfilelist <dir>\ndelete <dir>\nlogout\nexit"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement