def close(self): file.close(self) if not self._mode == "r": command = "diff {0} {1} | tee {2} ".format(hidden_file_path(self.path), self.path, self.path + ".diff") r = os.popen(command) server_id, ticket, self.session = self.get_tickets() diff_contents = r.read() data = { "ticket": ticket, "request": { "type": "write", "message": os.path.join(server_id[2], self.rpath), "relative": self.rpath, "payload": base64.b64encode(diff_contents), }, } data["request"] = secure.encrypt_with_key(json.dumps(data["request"]), self.session) result = lookup_fs(data, "", server_id, self.session) if result == None: raise IOError("Could not write to remote server: filename:%s" % (self.rpath)) else: # Keeps mirrored local copy up to date. command = "cp {0} {1}".format(self.path, hidden_file_path(self.path)) r = os.popen(command) unlock_file(self.rpath, self._name, self.password)
def get_file_from_server(self): server_id, ticket, self.session = self.get_tickets() data = { "ticket": ticket, "request": {"type": "open", "relative": self.rpath, "message": os.path.join(server_id[2], self.rpath)}, } data["request"] = secure.encrypt_with_key(json.dumps(data["request"]), self.session) check = lookup_fs(data, self.path, server_id, self.session) if check == None: self.get_file_from_server() return file.__init__(self, self.path, self._mode)
def file_write(file_to_lookup, diff_file_name, name, password, session=None): results = get_ticket_for_file(file_to_lookup, name, password) if(results == None): return None tickets, session, servers_id = results server_choice = random.randint(0, len(servers_id)-1) server_id = servers_id[server_choice] ticket = tickets[server_choice] contents = open(diff_file_name, "rb").read() data = { "ticket": ticket, "request": { "type":"write", "message": os.path.join(server_id[2], file_to_lookup), "relative": file_to_lookup, "payload":base64.b64encode(contents) } } data["request"] = secure.encrypt_with_key(json.dumps(data["request"]), session) print lookup_fs(data, "", server_id, session) return session
def look_for_changes(self): server_id, ticket, self.session = self.get_tickets() data = {"ticket": ticket, "request": {"type": "changed", "message": os.path.join(server_id[2], self.rpath)}} data["request"] = secure.encrypt_with_key(json.dumps(data["request"]), self.session) check = lookup_fs(data, self.path, server_id, self.session) # Some server socket error if check == None: self.look_for_changes() return local_m_time = os.path.getmtime(self.path) if local_m_time < float(check): return True else: return False
def file_open(file_to_lookup, name, password,local_file=None, session=None): results = get_ticket_for_file(file_to_lookup, name, password) if(results == None): return None tickets, session, servers_id = results server_choice = random.randint(0, len(servers_id)-1) server_id = servers_id[server_choice] ticket = tickets[server_choice] data = { "ticket": ticket, "request": { "type": "open", "message": os.path.join(server_id[2], file_to_lookup) } } data["request"] = secure.encrypt_with_key(json.dumps(data["request"]), session) local_file = os.path.join("cached", file_to_lookup) try: os.makedirs(os.path.dirname(local_file)) except OSError: pass print lookup_fs(data, local_file, server_id, session) return session
def replicate_changes(self, relative, body): print "I Am Replicating The Update" # Replicate changes. First must get ds entry from name = "fs/{0}:{1}".format(HOST, PORT) print "Connection AS at {0}:{1}".format(ASHOST, ASPORT) results = get_ticket_for_file(relative, name, password, ls_needed=False) if results == None: return None tickets, session, servers_id = results print results servers_id = [[h, p, f] for h, p, f in servers_id if not (h == HOST and p == str(PORT))] for i in range(0, len(servers_id)): # Note relative left out to let the file server know that # This is being replicated by a file server and doesnt need # further replication. ticket = tickets[i] server_id = servers_id[i] data = { "ticket": ticket, "request": {"type": "write", "message": os.path.join(server_id[2], relative), "payload": body}, } data["request"] = secure.encrypt_with_key(json.dumps(data["request"]), session) print lookup_fs(data, "", server_id, session)