/**
  * attempts to resolve hostnameTarget from origin
  *
  * @return null if it definitively can't be resolved, best-effort IP address if possible, or blank
  *     if we could not run ssh or make sense of the output
  */
 public static String getResolvedAddress(
     Entity entity, SshMachineLocation origin, String hostnameTarget) {
   ProcessTaskWrapper<Integer> task =
       SshTasks.newSshExecTaskFactory(origin, "ping -c 1 -t 1 " + hostnameTarget)
           .summary("checking resolution of " + hostnameTarget)
           .allowingNonZeroExitCode()
           .newTask();
   DynamicTasks.queueIfPossible(task).orSubmitAndBlock(entity).asTask().blockUntilEnded();
   if (task.asTask().isError()) {
     log.warn(
         "ping could not be run, at "
             + entity
             + " / "
             + origin
             + ": "
             + Tasks.getError(task.asTask()));
     return "";
   }
   if (task.getExitCode() == null || task.getExitCode() != 0) {
     if (task.getExitCode() != null && task.getExitCode() < 10) {
       // small number means ping failed to resolve or ping the hostname
       log.debug(
           "not able to resolve "
               + hostnameTarget
               + " from "
               + origin
               + " for "
               + entity
               + " because exit code was "
               + task.getExitCode());
       return null;
     }
     // large number means ping probably did not run
     log.warn(
         "ping not run as expected, at "
             + entity
             + " / "
             + origin
             + " (code "
             + task.getExitCode()
             + "):\n"
             + task.getStdout().trim()
             + " --- "
             + task.getStderr().trim());
     return "";
   }
   String out = task.getStdout();
   try {
     String line1 = Strings.getFirstLine(out);
     String ip = Strings.getFragmentBetween(line1, "(", ")");
     if (Strings.isNonBlank(ip)) return ip;
   } catch (Exception e) {
     Exceptions.propagateIfFatal(e);
     /* ignore non-parseable output */
   }
   if (out.contains("127.0.0.1")) return "127.0.0.1";
   return "";
 }
  @Override
  public void customize() {
    newScript(CUSTOMIZING)
        .body
        .append(
            format("mkdir -p %s", getRunDir()),
            format("cp -R %s/dist/{conf,html,logs,sbin} %s", getExpandedInstallDir(), getRunDir()))
        .execute();

    // Install static content archive, if specified
    String archiveUrl = entity.getConfig(NginxController.STATIC_CONTENT_ARCHIVE_URL);
    if (Strings.isNonBlank(archiveUrl)) {
      getEntity().deploy(archiveUrl);
    }

    customizationCompleted = true;
    getEntity().doExtraConfigurationDuringStart();
  }
 @SuppressWarnings("rawtypes")
 private static void addNamedAction(
     MutableMap.Builder<String, URI> lb,
     RendererHints.NamedAction na,
     Entity entity,
     Sensor<?> sensor) {
   if (na instanceof RendererHints.NamedActionWithUrl) {
     try {
       String v =
           ((RendererHints.NamedActionWithUrl) na).getUrl(entity, (AttributeSensor<?>) sensor);
       if (Strings.isNonBlank(v)) {
         String action = na.getActionName().toLowerCase();
         lb.putIfAbsent("action:" + action, URI.create(v));
       }
     } catch (Exception e) {
       Exceptions.propagateIfFatal(e);
       log.warn("Unable to make use of URL sensor " + sensor + " on " + entity + ": " + e);
     }
   }
 }
 @Override
 public boolean isAuthenticated(HttpSession session) {
   if (session == null) return false;
   Object value = session.getAttribute(getAuthenticationKey());
   return Strings.isNonBlank(Strings.toString(value));
 }