def main(stdin, flapp_stdout, flapp_stderr):
    append_record(flapp_stdout, "Automation script started.")
    parameters_json = stdin.read()
    (customer_email,
     customer_pgpinfo,
     customer_id,
     plan_id,
     subscription_id) = simplejson.loads(parameters_json)

    (abslogdir_fp,
    stripesecrets_log_fp,
    SSEC2secrets_log_fp,
    signup_log_fp) = create_log_filepaths(plan_id, customer_id, subscription_id)

    append_record(flapp_stdout, "Writing logs to %r." % (abslogdir_fp.path,))

    stripesecrets_log_fp.setContent(parameters_json)

    SSEC2_secretsfile = SSEC2secrets_log_fp.open('a+')
    signup_logfile = signup_log_fp.open('a+')
    signup_stdout = LoggingStream(signup_logfile, '>')
    signup_stderr = LoggingStream(signup_logfile, '')
    sys.stdout = signup_stderr

    def errhandler(err):
        fh = flapp_stderr.open('a+')
        fh.write(repr(err))
        fh.close()
        return err

    d = defer.succeed(None)
    d.addCallback(lambda ign: activate_subscribed_service(customer_email, customer_pgpinfo,
                                                          customer_id, subscription_id,
                                                          plan_id,
                                                          signup_stdout, signup_stderr,
                                                          SSEC2_secretsfile, signup_log_fp.path)
                  )
    d.addErrback(errhandler)
    d.addBoth(lambda ign: signup_logfile.close())
    if len(sys.argv) < 5:
        print "Usage: python replace_server.py STRIPE_SECRETS_PATH SSEC2_SECRETS_PATH AMI_IMAGE_ID INSTANCE_SIZE CUSTOMER_EMAIL"
        print "Happy replacement!"
        sys.exit(1)

    # Secrets necessary for correct logging
    stripe_secrets_path = sys.argv[1]
    stripe_secrets = simplejson.loads(FilePath(stripe_secrets_path).getContent())
    stripe_plan_id = stripe_secrets[3]
    stripe_customer_id = stripe_secrets[2]
    stripe_subscription_id = stripe_secrets[4]

    (abslogdir_fp,
    stripesecrets_log_fp,
    SSEC2secrets_log_fp,
    signup_log_fp) = create_log_filepaths(stripe_plan_id, stripe_customer_id, stripe_subscription_id)

    # The stripe secrets are unchanged.
    stripesecrets_log_fp.setContent(simplejson.dumps(stripe_secrets))

    SSEC2_secretsfile = SSEC2secrets_log_fp.open('a+')
    signup_logfile = signup_log_fp.open('a+')
    signup_stdout = LoggingStream(signup_logfile, '>')
    signup_stderr = LoggingStream(signup_logfile, '')
    # This is to work around the fact that fabric echoes all commands and output to sys.stdout.
    # It does have a way to disable that, but not (easily) to redirect it.
    sys.stdout = signup_stderr

    # Secrets necessary to provision SSEC2
    old_ssec2_secrets_path = sys.argv[2]
    old_ssec2_secrets = simplejson.loads(FilePath(old_ssec2_secrets_path).getContent())