View Javadoc
1   package emissary.server.api;
2   
3   import emissary.client.response.MapResponseEntity;
4   import emissary.command.ServerCommand;
5   import emissary.core.Namespace;
6   import emissary.core.NamespaceException;
7   import emissary.server.EmissaryServer;
8   
9   import jakarta.ws.rs.GET;
10  import jakarta.ws.rs.Path;
11  import jakarta.ws.rs.Produces;
12  import jakarta.ws.rs.core.MediaType;
13  import jakarta.ws.rs.core.Response;
14  import org.slf4j.Logger;
15  import org.slf4j.LoggerFactory;
16  
17  import java.util.Map;
18  
19  /**
20   * The env Emissary API endpoint that returns key=value pairs of config info for the running node
21   * <p>
22   * Suitable for parsing or sourcing in bash, as the 'env.sh' command calls it calls.
23   */
24  @Path("")
25  // context is /api
26  public class Env {
27  
28      public static final String EMISSARY_SERVER = "EmissaryServer";
29      private final Logger logger = LoggerFactory.getLogger(this.getClass());
30  
31      @GET
32      @Path("/env")
33      @Produces(MediaType.APPLICATION_JSON)
34      public Response getEnvJson() {
35          return Response.ok().entity(getEnv()).build();
36      }
37  
38      @GET
39      @Path("/env.sh")
40      @Produces(MediaType.TEXT_PLAIN)
41      public Response getEnvForBash() {
42          return Response.ok().entity(envString()).build();
43      }
44  
45      private MapResponseEntity getEnv() {
46          MapResponseEntity entity = new MapResponseEntity();
47          try {
48              EmissaryServer server = (EmissaryServer) Namespace.lookup(EMISSARY_SERVER);
49              ServerCommand command = server.getServerCommand();
50              entity.addKeyValue("CONFIG_DIR", command.getConfig().toAbsolutePath().toString());
51              entity.addKeyValue("PROJECT_BASE", command.getProjectBase().toAbsolutePath().toString());
52              entity.addKeyValue("OUTPUT_ROOT", command.getOutputDir().toAbsolutePath().toString());
53              entity.addKeyValue("BIN_DIR", command.getBinDir().toAbsolutePath().toString());
54              entity.addKeyValue("HOST", command.getHost());
55              entity.addKeyValue("PORT", Integer.toString(command.getPort()));
56              entity.addKeyValue("SCHEME", command.getScheme());
57              logger.debug("Returning env: {}", entity.getResponse());
58          } catch (NamespaceException e) {
59              logger.error("Error looking up namespace \"EMISSARY_SERVER\": {}", e.getMessage());
60              entity.addError("Error looking up namespace \"" + EMISSARY_SERVER + "\"");
61          }
62          return entity;
63      }
64  
65      private String envString() {
66          StringBuilder sb = new StringBuilder();
67          MapResponseEntity entity = getEnv();
68          if (entity.getErrors().size() > 0) {
69              for (String msg : entity.getErrors()) {
70                  sb.append(msg + "\n");
71              }
72          } else {
73              for (Map.Entry<String, String> entry : entity.getResponse().entrySet()) {
74                  sb.append("export " + entry.getKey() + "=\"" + entry.getValue() + "\"\n");
75              }
76          }
77          return sb.toString();
78      }
79  
80  }