#!/usr/bin/env python
"""
FTP Cloud Files - A FTP Proxy to Cloud FIles.
"""
import sys
import os
import logging

from optparse import OptionParser
from socket import gethostbyname, gaierror

from pyftpdlib import ftpserver

# Make it easier for testing add the parent directory of this script
# so we get pyftpdlib when not installed globally (and that look poetry to the
# untrained eye!)
sys.path.append(
    os.path.abspath(
        os.path.join(
            os.path.dirname(
                sys.argv[0]), "..")))

from ftpcloudfs.server import RackspaceCloudAuthorizer, RackspaceCloudFilesFS
from ftpcloudfs.constants import version, default_address, default_port
from ftpcloudfs.monkeypatching import MyDTPHandler


def setup_log(log_file=None):
    ''' Setup Logging '''

    def log(log_type, msg):
        """
        Dummy function.
        """
        log_type(msg)
    ftpserver.log = lambda msg: log(logging.info, msg)
    ftpserver.logline = lambda msg: log(logging.debug, msg)
    ftpserver.logerror = lambda msg: log(logging.error, msg)

    log_format = '%(asctime)-15s - %(levelname)s - %(message)s'
    logging.basicConfig(filename=log_file,
                        format=log_format,
                        level=logging.DEBUG)


def main():
    ''' Main function'''
    parser = OptionParser(usage="ftpcloudfs [OPTIONS].....")
    parser.add_option('-p', '--port',
                      type="int",
                      dest="port",
                      default=default_port,
                      help="Port to bind the server default: %d." %
                      (default_port))

    parser.add_option('-b', '--bind-address',
                      type="str",
                      dest="bind_address",
                      default=default_address,
                      help="Address to bind default: %s." % (default_address))

    parser.add_option('-s', '--service-net',
                      action="store_true",
                      dest="servicenet",
                      default=False,
                      help="Connect via Rackspace ServiceNet network.")
    
    parser.add_option('-l', '--log-file',
                      type="str",
                      dest="log_file",
                      default=None,
                      help="Log File: Default stdout")

    parser.add_option('-a', '--auth-url',
                      type="str",
                      dest="authurl",
                      default=None,
                      help="Auth URL for alternate providers (eg OpenStack)")

    (options, _) = parser.parse_args()

    setup_log(options.log_file)

    ftp_handler = ftpserver.FTPHandler
    ftp_handler.dtp_handler = MyDTPHandler

    ftp_handler.banner = 'Rackspace Cloud Files %s using %s' % \
        (version, ftp_handler.banner)
    ftp_handler.authorizer = RackspaceCloudAuthorizer()
    ftp_handler.authorizer.servicenet = options.servicenet
    ftp_handler.authorizer.authurl = options.authurl
    
    ftp_handler.abstracted_fs = RackspaceCloudFilesFS
    
    try:
        ftp_handler.masquerade_address = gethostbyname(options.bind_address)
    except gaierror, (_, errmsg):
        sys.exit('Address error: %s' % errmsg)

    ftpd = ftpserver.FTPServer((options.bind_address,
                                options.port),
                               ftp_handler)
    ftpd.serve_forever()


if __name__ == '__main__':
    main()
