Advertisement
Guest User

Untitled

a guest
Oct 10th, 2018
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.86 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import sys
  3. import socket
  4. import re
  5. import os
  6. import time
  7. import datetime
  8.  
  9. #-------------------------------------------------------------------------
  10. #           INIT
  11. #-------------------------------------------------------------------------
  12.  
  13. BUFFER_SIZE = 8192
  14. """CS_IP = socket.gethostbyname('tejo.ist.utl.pt')
  15. CS_PORT = 58011"""
  16.  
  17. user = ""
  18. password = ""
  19. CS_IP = [l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2]
  20.             if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)),
  21.             s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET,
  22.             socket.SOCK_DGRAM)]][0][1]]) if l][0][0]
  23.  
  24. CS_PORT = 58002
  25.  
  26. for i in range(0,len(sys.argv)-1):
  27.     if sys.argv[i] == "-n":
  28.         CS_IP = socket.gethostbyname(sys.argv[i+1])
  29.     if sys.argv[i] == "-p":
  30.         CS_PORT = int(sys.argv[i+1])
  31.  
  32. print "CS_IP: " + CS_IP
  33. print "CS_PORT: " + str(CS_PORT)
  34.  
  35. #-------------------------------------------------------------------------
  36. #           FILE
  37. #-------------------------------------------------------------------------
  38. class File:
  39.     def __init__(self, name, date, time, size, data):
  40.         self.name = name
  41.         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]))
  42.         self.size=int(size)
  43.         self.data = data
  44.  
  45.     def __str__(self):
  46.         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)
  47.  
  48.     def getData(self):
  49.         return self.data
  50.  
  51.     def getName(self):
  52.         return self.name
  53. #-------------------------------------------------------------------------
  54. #           AUX_FUNCTIONS
  55. #-------------------------------------------------------------------------
  56.  
  57. def userLoggedIn():
  58.     return user != "" and password !=""
  59.  
  60. def send(msg):
  61.     #print "Sent:"+msg
  62.     s.send(msg)
  63.  
  64. def receive(flag):
  65.     if(flag):
  66.         data = ""
  67.         s.settimeout(0.1)
  68.         while True:
  69.             try:
  70.                 tempdata = s.recv(BUFFER_SIZE)
  71.                 if tempdata == "":
  72.                     break
  73.                 data += tempdata
  74.                 #print "[DEBUG]Received " + tempdata
  75.             except socket.timeout:
  76.                 #print "Received:"+data
  77.                 s.settimeout(None)
  78.                 return data
  79.         return data
  80.     else:
  81.         data = s.recv(BUFFER_SIZE)
  82.         #print "Received:"+data
  83.         return data
  84.  
  85. def read_file(string):
  86.     #print "name is "+string.split(" ")[0]+" ,"
  87.     name = string.split(" ")[0]
  88.     #print "date is "+string.split(" ")[1]+" ,"
  89.     date = string.split(" ")[1]
  90.     #print "time is "+string.split(" ")[2]+" ,"
  91.     time = string.split(" ")[2]
  92.     #print "size is "+string.split(" ")[3]+" ,"
  93.     size = string.split(" ")[3]
  94.     data_index = len(name) + 1 + len(date) + 1 + len(time) + 1 + len(size) + 1
  95.     size = int(size)
  96.     data = string[data_index:data_index+size]
  97.     #print "data is "+data+" ,"
  98.     file = File(name,date,time,size,data)
  99.     #print "Remaining:"+string[data_index+size+1:]
  100.     return file, string[data_index+size+1:]
  101.  
  102. def command_parser(command,stage):
  103.     if stage == "init" and command[:4] == "RBR ":
  104.         return command_parser(command[4:],"nFiles")
  105.     elif stage == "nFiles":
  106.         files=[]
  107.         n = int(command.split(" ")[0])
  108.         file_string = command[len(command.split(" ")[0])+1:]
  109.         for i in range(0,n):
  110.             myfile , file_string = read_file(file_string)
  111.             files.append(myfile)
  112.         return files
  113.  
  114. def createDir(dir):
  115.     if not os.path.isdir(os.getcwd()+"/"+dir):
  116.         os.mkdir(dir)
  117.  
  118. def createFile(file,dir):
  119.     f = open(dir+"/"+file.getName(), "w")
  120.     f.write(file.getData())
  121.     f.close()
  122.  
  123. #-------------------------------------------------------------------------
  124. #           AUT
  125. #-------------------------------------------------------------------------
  126. def AUT():
  127.     send("AUT "+ user + " " + password + "\n")
  128.     try:
  129.         receipt = receive(0)
  130.         if receipt == "AUR NEW\n":
  131.             return "User " + user + " created"
  132.         elif receipt == "AUR NOK\n":
  133.             return "User or password incorrect, please try again."
  134.         elif receipt == "AUR OK\n":
  135.             return "Login successful."
  136.     except socket.error:
  137.         return "Connection error. Could not authenticate."
  138. #-------------------------------------------------------------------------
  139. #           DLU
  140. #-------------------------------------------------------------------------
  141. def DLU():
  142.     global user
  143.     global password
  144.     send("DLU\n")
  145.     try:
  146.         receipt = receive(0)
  147.  
  148.         if receipt == "DLR OK\n":
  149.             temp_user = user
  150.             user = ""
  151.             password = ""
  152.             return "User " + temp_user + " deleted"
  153.         elif receipt == "DLR NOK\n":
  154.             return "User not deleted, please delete all your files first."
  155.     except socket.error:
  156.         return "Connection error. Could not delete user."
  157. #-------------------------------------------------------------------------
  158. #           LSD
  159. #-------------------------------------------------------------------------
  160. def LSD():
  161.     send("LSD\n")
  162.  
  163.     try:
  164.         receipt = receive(1)
  165.         #print "[DEBUG]"+receipt
  166.         message = ""
  167.         if re.split(" |\n",receipt)[0] == "LDR" and re.split(" |\n",receipt)[1] != '0':
  168.             for dir in re.split(" |\n",receipt)[2:]:
  169.                 message += dir + " "
  170.             return message
  171.         elif re.split(" |\n",receipt)[0] == "LDR" and re.split(" |\n",receipt)[1] == '0':
  172.             return "No directories were found."
  173.     except socket.error:
  174.         return "Connection error. Could not list directories."
  175.  
  176. #-------------------------------------------------------------------------
  177. #           LSF
  178. #-------------------------------------------------------------------------
  179. def LSF(dir):
  180.     send("LSF " + dir + "\n")
  181.     receipt = receive(1)
  182.     try:
  183.         if re.split(" |\n",receipt)[0] == "LFD" and len(re.split(" |\n",receipt)) != 3:
  184.             stri = "from: " + re.split(" |\n",receipt)[1] + " " + re.split(" |\n",receipt)[2] + "\n"
  185.             i = 0
  186.             for dir in re.split(" |\n",receipt)[4:]:
  187.                 i += 1
  188.                 stri += dir + " "
  189.                 if i % 4 == 0:
  190.                     stri += "\n"
  191.                     i = 0
  192.             return stri
  193.         elif re.split(" |\n",receipt)[0] == "LFD" and re.split(" |\n",receipt)[1] == "NOK":
  194.             return "The directory " + dir + " does not exist."
  195.     except socket.error:
  196.         return "Connection error. Could not list files."
  197. #-------------------------------------------------------------------------
  198. #           DEL
  199. #-------------------------------------------------------------------------
  200. #TO TEST
  201. def DEL(dir):
  202.     send("DEL " + dir + "\n")
  203.     try:
  204.         receipt = receive(0)
  205.  
  206.         if receipt == "DDR OK\n":
  207.             return "Directory " + dir + " and its contents were deleted successfully."
  208.         elif receipt == "DDR NOK\n":
  209.             return "Directory " + dir + " could not be deleted."
  210.     except socket.error:
  211.         return "Connection error. Could not delete directory. "
  212. #-------------------------------------------------------------------------
  213. #           BCK
  214. #-------------------------------------------------------------------------
  215. #TO TEST
  216. def BCK(dir):
  217.     dir_path = os.getcwd()+"/"+dir
  218.     files = ""
  219.     N = 0;
  220.     try:
  221.         for filename in os.listdir(dir_path):
  222.             if os.path.isfile(dir_path+"/"+filename):
  223.                 mtime = time.gmtime(os.path.getmtime(dir_path+"/"+filename))
  224.                 files = files + " " + filename + " " + "{0:02d}.{1:02d}.{2:04d} {3:02d}:{4:02d}:{5:02d}".format(mtime.tm_mday, mtime.tm_mon,
  225.                 mtime.tm_year, mtime.tm_hour, mtime.tm_min, mtime.tm_sec)+ " "+ str(int(os.stat(dir_path+"/"+filename).st_size))
  226.                 #files = files + " " + lines
  227.                 N += 1
  228.         #print "[DEBUG:FILES]"+files
  229.         files = files[1:]
  230.         if N != 0:
  231.             #print "BCK " + dir + " " + str(N) + " " + files + "\n"
  232.             send("BCK " + dir + " " + str(N) + " " + files + "\n")
  233.         else:
  234.             send("BCK " + dir + " "+ str(N) +"\n")
  235.  
  236.         receipt = receive(1)
  237.         #print receipt
  238.  
  239.         if re.split(" |\n",receipt)[0] == "BKR" and len(re.split(" |\n",receipt)) > 3:
  240.             print("backup to: " + re.split(" |\n",receipt)[1] + " " + re.split(" |\n",receipt)[2])
  241.             return receipt
  242.  
  243.         elif re.split(" |\n",receipt)[0] == "BKR" and re.split(" |\n",receipt)[1] == "EOF":
  244.             return "Backup request cannot be answered. Please try again later."
  245.  
  246.         elif re.split(" |\n",receipt)[0] == "BKR" and re.split(" |\n",receipt)[1] == "ERR":
  247.             return "Backup request not well formulated. Please try again."
  248.     except OSError:
  249.         return "The directory " + dir + " does not exist."
  250.  
  251. #-------------------------------------------------------------------------
  252. #           UPL
  253. #-------------------------------------------------------------------------
  254. #TO TEST
  255. def UPL(dir, stri):
  256.     message = "UPL "+dir + " " + re.split(" |\n",stri)[3]
  257.     #print "[DEBUG:UPL]"+stri
  258.     files = ""
  259.     for i in range(0,int(re.split(" |\n",stri)[3])):
  260.         name = re.split(" |\n",stri)[4*i+4]
  261.         date = re.split(" |\n",stri)[4*i+5]
  262.         time = re.split(" |\n",stri)[4*i+6]
  263.         size = re.split(" |\n",stri)[4*i+7]
  264.         f = open(dir + "/" + name, "r")
  265.         data = f.read()
  266.         f.close()
  267.         message = message + " " + name + " " + date + " " + time + " " + size + " "+ data
  268.         files += name + " "
  269.     send(message + "\n")
  270.  
  271.     receipt = receive(0)
  272.  
  273.     if receipt == "UPR OK\n":
  274.         return "Completed - " + dir + " : " + files[:-1]
  275.     elif receipt == "UPR NOK\n":
  276.         return "Backup error. Please try again."
  277.  
  278. #-------------------------------------------------------------------------
  279. #           RST
  280. #-------------------------------------------------------------------------
  281. def RST(dir):
  282.     send("RST " + dir + "\n")
  283.     receipt = receive(1)
  284.  
  285.     if re.split(" |\n",receipt)[0] == "RSR" and len(re.split(" |\n",receipt)) == 4:
  286.         print("from: " + re.split(" |\n",receipt)[1] + " " + re.split(" |\n",receipt)[2])
  287.         return receipt
  288.     elif re.split(" |\n",receipt)[0] == "RSR" and re.split(" |\n",receipt)[1] == "EOF":
  289.         return "Restore request cannot be answered. Directory " + dir + " may not exist."
  290.  
  291.     elif re.split(" |\n",receipt)[0] == "RSR" and re.split(" |\n",receipt)[1] == "ERR":
  292.         return "Restore request not well formulated. Please try again."
  293.  
  294. #-------------------------------------------------------------------------
  295. #           RSB
  296. #-------------------------------------------------------------------------
  297. def RSB(dir):
  298.     send("RSB " + dir + "\n")
  299.     receipt = receive(1)
  300.  
  301.     if re.split(" |\n",receipt)[0] == "RBR" and len(re.split(" |\n",receipt)) != 3 :
  302.         files = command_parser(receipt, "init")
  303.         message = "Success - " +dir + ": "
  304.         for f in files:
  305.             createDir(dir)
  306.             createFile(f, dir)
  307.             message += f.getName() + " "
  308.         return message
  309.     elif re.split(" |\n",receipt)[0] == "RBR" and re.split(" |\n",receipt)[1] == "EOF":
  310.         return "Restore request cannot be answered. Directory " + dir + " may not exist."
  311.     elif re.split(" |\n",receipt)[0] == "RBR" and re.split(" |\n",receipt)[1] == "ERR":
  312.         return "Restore request not well formulated. Please try again."
  313.  
  314. #-------------------------------------------------------------------------
  315. #           COMMAND
  316. #-------------------------------------------------------------------------
  317.  
  318. while(True):
  319.  
  320.     command = raw_input()
  321.  
  322.     if command.split(" ")[0] == "login":
  323.  
  324.         if len(command.split(" "))!= 3 or len(command.split(" ")[1]) != 5 or len(command.split(" ")[2]) != 8:
  325.             print("Wrong formatting. Command should be used as: login <user>(5chars) <password>(8chars)")
  326.         else:
  327.             user = command.split(" ")[1]
  328.             password = command.split(" ")[2]
  329.             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  330.             s.connect((CS_IP, CS_PORT))
  331.             print(AUT())
  332.             s.close()
  333.  
  334.     elif command.split(" ")[0] == "deluser":
  335.         if userLoggedIn():
  336.             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  337.             s.connect((CS_IP, CS_PORT))
  338.             AUT()
  339.             print(DLU())
  340.             s.close()
  341.         else:
  342.             print "Please login first."
  343.  
  344.     elif command.split(" ")[0] == "dirlist":
  345.         if userLoggedIn():
  346.             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  347.             s.connect((CS_IP, CS_PORT))
  348.             AUT()
  349.             print(LSD()[:-1])
  350.             s.close()
  351.         else:
  352.             print "Please login first."
  353.  
  354.     elif command.split(" ")[0] == "filelist":
  355.         if userLoggedIn():
  356.             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  357.             s.connect((CS_IP, CS_PORT))
  358.             AUT()
  359.             message = LSF(command.split(" ")[1])
  360.             if message.split()[0] == "from:":
  361.                 print message[:-2]
  362.             else:
  363.                 print message
  364.             s.close()
  365.         else:
  366.             print "Please login first."
  367.  
  368.     elif command.split(" ")[0] == "delete":
  369.         if userLoggedIn():
  370.             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  371.             s.connect((CS_IP, CS_PORT))
  372.             AUT()
  373.             print(DEL(command.split(" ")[1]))
  374.             s.close()
  375.         else:
  376.             print "Please login first."
  377.  
  378.     elif command.split(" ")[0] == "backup":
  379.         if userLoggedIn():
  380.             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  381.             s.connect((CS_IP, CS_PORT))
  382.             AUT()
  383.             dir = command.split(" ")[1]
  384.             bck = BCK(dir)
  385.             s.close()
  386.             if(bck == None):
  387.                 print "The directory " + dir + " is empty."
  388.             elif(bck[:3] != "BKR"):
  389.                 print bck
  390.             else:
  391.                 bsip = str(re.split(" |\n",bck)[1])
  392.                 bsport = int(re.split(" |\n",bck)[2])
  393.                 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  394.                 s.connect((bsip, bsport))
  395.                 AUT()
  396.                 print(UPL(dir, bck))
  397.                 s.close()
  398.         else:
  399.             print "Please login first."
  400.  
  401.     elif command.split(" ")[0] == "restore":
  402.         if userLoggedIn():
  403.             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  404.             s.connect((CS_IP, CS_PORT))
  405.             AUT()
  406.             dir = command.split(" ")[1]
  407.             rst = RST(dir)
  408.             s.close()
  409.             if(rst[:3] != "RSR"):
  410.                 print rst
  411.             else:
  412.                 bsip = re.split(" |\n",rst)[1]
  413.                 bsport = int(re.split(" |\n",rst)[2])
  414.                 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  415.                 s.connect((bsip, bsport))
  416.                 AUT()
  417.                 print(RSB(dir))
  418.                 s.close()
  419.         else:
  420.             print "Please login first."
  421.  
  422.     elif command.split(" ")[0] == "logout":
  423.         if userLoggedIn():
  424.             user = ""
  425.             password = ""
  426.             print "Logged out successfully."
  427.         else:
  428.             print "Please login first."
  429.  
  430.     elif command.split(" ")[0] == "exit":
  431.         exit()
  432.     else:
  433.         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