

import os
import ftplib

def output(s):
  f = open("/home/gvsig/mirrorsupload.log","a+")
  f.write(s)
  f.write("\n")
  f.close()

def message(s):
  output(s)
  
def warning(s):
  output("!!! "+ s)

def debug(s):
  output(">>> "+ s)

class Site(object):

  def __init__(self, httpurl, host, port, folder, user, pas):
    self._httpurl = httpurl
    self._host = host
    self._user = user
    self._pas = pas
    self._ftp = None
    self._folder = folder
    
  def connect(self):
    message("CONNECT %s" % self._host)
    self._ftp = ftp = ftplib.FTP(self._host)
    self._ftp.login(self._user, self._pas)
    self._ftp.cwd(self._folder)
    self._ftp.set_pasv(True)
  
  def disconnect(self):
    self._ftp.quit()
  
  def makedir(self, rpath):
    message("MKDIR %s" % rpath)
    self._ftp.mkd(rpath) 

  def exists(self,rpath):
    try:
      self._ftp.cwd(rpath) 
      debug("EXIST %s TRUE" % rpath)
      return True
    except Exception, ex:
      debug("EXIST %s FALSE (%s)" % (rpath, str(ex)))
      return False
  
      
  def makedirs(self,rpath):
    if self.exists(rpath):
      return True
    parts = rpath.split("/")
    path = "/"
    for part in parts:
      if part != ".":
        path = os.path.join(path,part)
        if not self.exists(path):
          self.makedir(path) 
    return True
          
  def uploadfile(self, lpathname, rpathname):
    rpath = os.path.dirname(rpathname)
    rfname = os.path.basename(rpathname)
    if not self.makedirs(rpath) :
      return False
    self._ftp.cwd(rpath)
    f = open(lpathname,"r")
    try:
      message("UPLOAD %s  TO  %s" % (lpathname , rpathname))
      self._ftp.storbinary("STOR %s" % rfname, f)
    except Exception, ex:
      f.close()
      warning("upload error. " +str(ex))
      return False
    f.close()
    return True
  
  def uploadfiles(self, lroot, fnames):
    for fname in fnames:
      lpathname = os.path.join(lroot,fname)
      rpathname = os.path.join(self._folder, fname)
      try:
        if not self.uploadfile(lpathname, rpathname):
          return False
      except Exception, ex:
        warning("Error uploading file %s to %s (%s)" % (lpathname,rpathname, str(ex)))
        
def main():
    sitelist = "/home/gvsig/mirrors.lst"
    root    = "/srv/download/gvsig-desktop/mirrors/2.0.0-2066/gvsig-desktop"
    filelist = "/srv/download/gvsig-desktop/mirrors/2.0.0-2066/gvsig-desktop/dists/2.0.0/builds/2066/files.lst"
    
    f = open(filelist,"r")
    lines = f.readlines()
    f.close()
    fnames = list()
    for line in lines:
      fnames.append(line[:-1]) # remove \n
    
    fsites = open(sitelist,"r")
    for line in fsites.readlines():
      if line[0] in ("#", ";" , "//") :
        continue
      x = line[:-1].split(";")
      site = Site(x[0], x[1], x[2], x[3],x[4], x[5])
      site.connect()
      site.uploadfiles(root,fnames)
      site.disconnect()
      
    fsites.close()
      
if __name__ == "__main__":
  main()
  
  
