/**
   * Update an Agent's setup information. When an agent's 'setup' is called after it has already
   * been setup, the connection information (i.e. address to contact, port, etc.) are updated but
   * the same agent token is kept.
   */
  private UpdateAgent_result cmdUpdateAgent(LatherContext ctx, UpdateAgent_args args)
      throws LatherRemoteException {
    Agent agent;
    String errRes;

    try {
      checkUserCanManageAgent(ctx, args.getUser(), args.getPword(), "update");
    } catch (PermissionException exc) {
      return new UpdateAgent_result("Permission denied");
    }

    validateAgent(ctx, args.getAgentToken(), false);

    String agentIP = args.getAgentIP();
    int port = args.getAgentPort();
    boolean isNewTransportAgent = args.isNewTransportAgent();
    boolean unidirectional = args.isUnidirectional();
    boolean acceptValidation = args.isAcceptCertificates();

    try {
      agent = agentManager.getAgent(args.getAgentToken());

      if ((errRes =
              testAgentConn(
                  agentIP,
                  port,
                  agent.getAuthToken(),
                  isNewTransportAgent,
                  unidirectional,
                  acceptValidation))
          != null) {
        return new UpdateAgent_result(errRes);
      }

      log.info(
          "Updating agent at "
              + agentIP
              + ":"
              + port
              + ""
              + "; new transport="
              + isNewTransportAgent
              + "; unidirectional="
              + unidirectional);

      if (isNewTransportAgent) {
        agentManager.updateNewTransportAgent(args.getAgentToken(), agentIP, port, unidirectional);
      } else {
        agentManager.updateLegacyAgent(args.getAgentToken(), agentIP, port);
      }

    } catch (AgentNotFoundException exc) {
      return new UpdateAgent_result("Agent not found for update");
    }
    return new UpdateAgent_result();
  }