/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ignite.console.agent; import com.beust.jcommander.Parameter; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.apache.ignite.internal.util.typedef.F; import static java.nio.charset.StandardCharsets.UTF_8; /** * Agent configuration. */ public class AgentConfiguration { /** Default path to agent property file. */ public static final String DFLT_CFG_PATH = "default.properties"; /** Default server URI. */ private static final String DFLT_SERVER_URI = "http://localhost:3000"; /** Default Ignite node HTTP URI. */ private static final String DFLT_NODE_URI = "http://localhost:8080"; /** */ @Parameter(names = {"-t", "--tokens"}, description = "User's tokens separated by comma used to connect to Ignite Console.") private List<String> tokens; /** */ @Parameter(names = {"-s", "--server-uri"}, description = "URI for connect to Ignite Console via web-socket protocol" + " " + " Default value: " + DFLT_SERVER_URI) private String srvUri; /** */ @Parameter(names = {"-n", "--node-uri"}, description = "URI for connect to Ignite node REST server" + " " + " Default value: " + DFLT_NODE_URI) private String nodeUri; /** URI for connect to Ignite demo node REST server */ private String demoNodeUri; /** */ @Parameter(names = {"-c", "--config"}, description = "Path to agent property file" + " " + " Default value: " + DFLT_CFG_PATH) private String cfgPath; /** */ @Parameter(names = {"-d", "--driver-folder"}, description = "Path to folder with JDBC drivers" + " " + " Default value: ./jdbc-drivers") private String driversFolder; /** */ @Parameter(names = {"-dd", "--disable-demo"}, description = "Disable demo mode on this agent " + " " + " Default value: false") private Boolean disableDemo; /** */ @Parameter(names = {"-h", "--help"}, help = true, description = "Print this help message") private Boolean help; /** * @return Tokens. */ public List<String> tokens() { return tokens; } /** * @param tokens Tokens. */ public void tokens(List<String> tokens) { this.tokens = tokens; } /** * @return Server URI. */ public String serverUri() { return srvUri; } /** * @param srvUri URI. */ public void serverUri(String srvUri) { this.srvUri = srvUri; } /** * @return Node URI. */ public String nodeUri() { return nodeUri; } /** * @param nodeUri Node URI. */ public void nodeUri(String nodeUri) { this.nodeUri = nodeUri; } /** * @return Demo node URI. */ public String demoNodeUri() { return demoNodeUri; } /** * @param demoNodeUri Demo node URI. */ public void demoNodeUri(String demoNodeUri) { this.demoNodeUri = demoNodeUri; } /** * @return Configuration path. */ public String configPath() { return cfgPath == null ? DFLT_CFG_PATH : cfgPath; } /** * @return Configured drivers folder. */ public String driversFolder() { return driversFolder; } /** * @param driversFolder Driver folder. */ public void driversFolder(String driversFolder) { this.driversFolder = driversFolder; } /** * @return Disable demo mode. */ public Boolean disableDemo() { return disableDemo != null ? disableDemo : Boolean.FALSE; } /** * @param disableDemo Disable demo mode. */ public void disableDemo(Boolean disableDemo) { this.disableDemo = disableDemo; } /** * @return {@code true} If agent options usage should be printed. */ public Boolean help() { return help != null ? help : Boolean.FALSE; } /** * @param cfgUrl URL. */ public void load(URL cfgUrl) throws IOException { Properties props = new Properties(); try (Reader reader = new InputStreamReader(cfgUrl.openStream(), UTF_8)) { props.load(reader); } String val = (String)props.remove("tokens"); if (val != null) tokens(new ArrayList<>(Arrays.asList(val.split(",")))); val = (String)props.remove("server-uri"); if (val != null) serverUri(val); val = (String)props.remove("node-uri"); if (val != null) nodeUri(val); val = (String)props.remove("driver-folder"); if (val != null) driversFolder(val); } /** * @param cmd Command. */ public void merge(AgentConfiguration cmd) { if (tokens == null) tokens(cmd.tokens()); if (srvUri == null) serverUri(cmd.serverUri()); if (srvUri == null) serverUri(DFLT_SERVER_URI); if (nodeUri == null) nodeUri(cmd.nodeUri()); if (nodeUri == null) nodeUri(DFLT_NODE_URI); if (driversFolder == null) driversFolder(cmd.driversFolder()); if (disableDemo == null) disableDemo(cmd.disableDemo()); } /** {@inheritDoc} */ @Override public String toString() { StringBuilder sb = new StringBuilder(); if (!F.isEmpty(tokens)) { sb.append("User's security tokens : "); boolean first = true; for (String tok : tokens) { if (first) first = false; else sb.append(','); if (tok.length() > 4) { sb.append(new String(new char[tok.length() - 4]).replace('\0', '*')); sb.append(tok.substring(tok.length() - 4)); } else sb.append(new String(new char[tok.length()]).replace('\0', '*')); } sb.append('\n'); } sb.append("URI to Ignite node REST server: ").append(nodeUri == null ? DFLT_NODE_URI : nodeUri).append('\n'); sb.append("URI to Ignite Console server : ").append(srvUri == null ? DFLT_SERVER_URI : srvUri).append('\n'); sb.append("Path to agent property file : ").append(configPath()).append('\n'); String drvFld = driversFolder(); if (drvFld == null) { File agentHome = AgentUtils.getAgentHome(); if (agentHome != null) drvFld = new File(agentHome, "jdbc-drivers").getPath(); } sb.append("Path to JDBC drivers folder : ").append(drvFld).append('\n'); sb.append("Demo mode : ").append(disableDemo() ? "disabled" : "enabled"); return sb.toString(); } }