• Facebook
  • Twitter
  • Reddit
  • StumbleUpon
  • Digg
  • email

# -*- coding: cp1252 -*-
import os
import time
import blueplanet.client.StorageClient as StorageClient
PORT= StorageClient.PORT
 
# settings
nur_geaendertes_updaten= True
pfad= 'backup_A.txt'
ladegroesse= 1024 * 1024 * 4 # bytes of file loaded
 
# program
 
def entferne_ende(pfad):
    while pfad[-1] in os.linesep:
        pfad= pfad[:-1]
    return pfad
 
def get_pathes(pfad= pfad):
    return [entferne_ende(p).split('|') for p in file(pfad, 'rb').readlines() if p]
 
def c_err(p_von, err= ''):
    print 'ERROR:',p_von, err#,'konnte nicht kopiert werden.'
    if 'p_err_nach' in globals():
        print >> file(p_err_nach, 'ab'),'ERROR:',p_von, err
 
def copy_file(von, nach, rec= 0):
    try:
        if not nur_geaendertes_updaten or os.path.isfile(von) and (not sc.isfile(nach) or \
           (os.path.getmtime(von) > sc.get_last_change(nach) or \
            os.path.getsize(von) != sc.getsize(nach))):
            print ' ' * rec + '+', os.path.split(von)[1], 
            if os.access(von, os.R_OK):
                f_von= file(von, 'rb')
                d= f_von.read(ladegroesse)
                er= sc.write(nach, d, 'wb')
                d= f_von.read(ladegroesse)
                while d and not er:
                    er= sc.write(nach, d, 'ab')
                    d= f_von.read(ladegroesse)
                f_von.close()
                if not er:
                    print '(copied)'
                elif 'p_err_nach' in globals():
                    print >> file(p_err_nach, 'ab'),'ERROR:',von, er
            else:
                if 'p_err_nach' in globals():
                    print >> file(p_err_nach, 'ab'),'ERROR:',von
    except IOError, err:
        c_err(von, err)
 
def del_file(nach, rec= 0):
    print ' ' * rec + '-', os.path.split(nach)[1]
    e= False
    try:
        e= sc.remove(nach)
    except:
        c_err(p_von, 'delete failed')
    if e:
        c_err(p_von, 'delete failed ' + str(e))
 
def del_dir(nach, rec= 0):
    print ' ' * rec + '-', os.path.split(nach)[1]
    rec+= 1
    l_nach= sc.listdir(nach)
   # print l_nach#; hhhh
    for p_rel in l_nach:
        print p_rel
        p_nach= os.path.join(nach, p_rel)
        delete(p_nach, rec)
    os.rmdir(nach)
 
def delete(nach, rec= 0):
    #print nach
    e= False
    print ' ' * rec + '-', os.path.split(nach)[1],
    try:
        e= sc.remove(nach)
        print 'deleted'
    except OSError, err:
        c_err(nach, 'delete failed')
    if e:
        c_err(nach, 'delete failed ' + str(e))
 
def copy_dir(von, nach, rec= 0):
    if not sc.isdir(nach):
        sc.makedir(nach)
        print ' ' * rec + '+', os.path.split(von)[1]
    else:
        print ' ' * rec + ' ', os.path.split(von)[1]
    rec+= 1
    l_von= os.listdir(von)
    for rel_path in l_von:
        p_von= os.path.join(von, rel_path)
        p_nach= os.path.join(nach, rel_path)
        copy(p_von, p_nach, rec)
    if delete_not_mentioned:
        l_nach= sc.listdir(nach)
        ##print l_nach, nach
        for p_rel in l_nach:
            if p_rel not in l_von:
              #  print ' ' * rec + '#',p_rel
                p_del= os.path.join(nach, p_rel)
              #  print ' ' * rec + '#',p_del
                delete(p_del, rec)
 
def copy(von, nach, rec= 0):
    try:
        if os.path.isdir(von):
            copy_dir(von, nach, rec)
        elif os.path.isfile(von):
            copy_file(von, nach, rec)
        else:
            c_err(von)
    except:
        c_err(von, nach)
 
 
 
if __name__ == '__main__':
    sicherungpfad= 'sicherungen'
    try:
        import psyco
        psyco.full()
    except ImportError:
        pass
    import socket
    addr= ('localhost', 6325)
    try:
        sc= StorageClient.StorageClient()
        sc.connect((raw_input('IP(localhost): ') or 'localhost', int(raw_input('Port('+str(PORT)+'): ') or str(PORT))), raw_input('Password: [ENTER]'))
    except socket.error, e:
        if e[0] == 10061:
            print 'Es laeuft kein Server auf dem Rechner %s mit dem Port %i' % addr
        elif e[0] == 11001:
            print 'Zielrechner konnte nicht gefunden werden.'
        else:
            print e, 'unbekannter Fehler'
 
 
    while not sc.login(username, raw_input('Password(): ')):
        print 'konnte nicht als %s eingeloggt werden' % username
        username= raw_input('Username(all): ') or 'all'
 
    while 1:
        print 'copy from:'
        p_von= raw_input()
        print 'copy to (relative path on server)'
        p_nach= raw_input()
        delete_not_mentioned= (raw_input('Delete(n)? (j/n)') or 'n') == 'j'
        copy(p_von, p_nach)
        if (raw_input('Beenden(j)? (j/n)') or 'j') == 'j':
            break