示例#1
0
def main(argv=sys.argv):
    parser = ArgumentParser(description=__doc__)
    parser.add_argument('config')
    parser.add_argument('csvfile', type=str, action='store',
                        help="CSV file")
    parser.add_argument('-q', dest='quiet', action='store_true',
                        help="Dont print every address")

    commit = parser.add_mutually_exclusive_group()
    commit.add_argument('-n', dest='commit_never', action='store_true',
                        help="Dont commit changes and dont ask")
    commit.add_argument('-y', dest='commit_always', action='store_true',
                        help="Commit changes without asking")

    args = parser.parse_args()

    config_uri = args.config
    setup_logging(config_uri)
    settings = get_appsettings(config_uri)
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)

    transaction.begin()

    known_domains = {}
    counter = 0

    with open(args.csvfile, 'r') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            local, password, redirect, dname = row

            if dname in known_domains:
                domain = known_domains[dname]
            else:
                try:
                    domain = Domain.query(name=dname).one()
                except NoResultFound:
                    domain = Domain(name=dname)
                    DBSession.add(domain)
                known_domains[domain.name] = domain

            if not local:
                if not redirect:
                    print('Invalid address: catch-all without redirect')
                    return 1
                domain.catchall = redirect
                print('*@%s -> %s' % (domain.name, domain.catchall))
                continue

            address = Address()
            address.local_part = local
            address.password = password or None
            address.redirect = redirect or None
            address.domain = domain
            address.domain_id = domain.id

            DBSession.add(address)

            if not args.quiet:
                print(address.address, end='')
                if address.password:
                    print(' [...%s]' % address.password[-8:], end='')
                if address.redirect:
                    print(' -> %s' % address.redirect, end='')
                print()

            counter += 1

    if args.commit_always:
        transaction.commit()
        print('saved.')
    elif args.commit_never:
        transaction.abort()
        print('aborted.')
    else:
        r = input('Commit %d addresses? ' % counter)
        if r.strip().lower() == 'y':
            transaction.commit()
            print('saved.')
        else:
            transaction.abort()
            print('aborted.')