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.')