Search in sources :

Example 1 with Ack

use of io.socket.client.Ack in project ignite by apache.

the class AbstractListener method call.

/**
 * {@inheritDoc}
 */
@SuppressWarnings("unchecked")
@Override
public final void call(Object... args) {
    final Ack cb = safeCallback(args);
    args = removeCallback(args);
    try {
        final Map<String, Object> params;
        if (args == null || args.length == 0)
            params = Collections.emptyMap();
        else if (args.length == 1)
            params = fromJSON(args[0], Map.class);
        else
            throw new IllegalArgumentException("Wrong arguments count, must be <= 1: " + Arrays.toString(args));
        if (pool == null)
            pool = newThreadPool();
        pool.submit(new Runnable() {

            @Override
            public void run() {
                try {
                    Object res = execute(params);
                    // We can GZip manually for now.
                    if (res instanceof RestResult) {
                        RestResult restRes = (RestResult) res;
                        if (restRes.getData() != null) {
                            ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
                            Base64OutputStream b64os = new Base64OutputStream(baos, true, 0, null);
                            GZIPOutputStream gzip = new GZIPOutputStream(b64os);
                            gzip.write(restRes.getData().getBytes(UTF8));
                            gzip.close();
                            restRes.zipData(baos.toString());
                        }
                    }
                    cb.call(null, toJSON(res));
                } catch (Exception e) {
                    cb.call(e, null);
                }
            }
        });
    } catch (Exception e) {
        cb.call(e, null);
    }
}
Also used : RestResult(org.apache.ignite.console.agent.rest.RestResult) Ack(io.socket.client.Ack) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Base64OutputStream(org.apache.commons.codec.binary.Base64OutputStream) GZIPOutputStream(java.util.zip.GZIPOutputStream) Map(java.util.Map)

Example 2 with Ack

use of io.socket.client.Ack in project ignite by apache.

the class DemoListener method start.

/**
 * Start broadcast topology to server-side.
 */
public Emitter.Listener start() {
    return new Emitter.Listener() {

        @Override
        public void call(final Object... args) {
            final Ack demoStartCb = safeCallback(args);
            final long timeout = args.length > 1 && args[1] instanceof Long ? (long) args[1] : DFLT_TIMEOUT;
            if (refreshTask != null)
                refreshTask.cancel(true);
            final CountDownLatch latch = AgentClusterDemo.tryStart();
            pool.schedule(new Runnable() {

                @Override
                public void run() {
                    try {
                        U.await(latch);
                        demoStartCb.call();
                        refreshTask = pool.scheduleWithFixedDelay(new Runnable() {

                            @Override
                            public void run() {
                                try {
                                    RestResult top = restExecutor.topology(true, true);
                                    client.emit(EVENT_DEMO_TOPOLOGY, toJSON(top));
                                } catch (IOException e) {
                                    log.info("Lost connection to the demo cluster", e);
                                    // TODO WTF????
                                    stop().call();
                                }
                            }
                        }, 0L, timeout, TimeUnit.MILLISECONDS);
                    } catch (Exception e) {
                        demoStartCb.call(e);
                    }
                }
            }, 0, TimeUnit.MILLISECONDS);
        }
    };
}
Also used : RestResult(org.apache.ignite.console.agent.rest.RestResult) Ack(io.socket.client.Ack) IOException(java.io.IOException) CountDownLatch(java.util.concurrent.CountDownLatch) IOException(java.io.IOException)

Example 3 with Ack

use of io.socket.client.Ack in project ignite by apache.

the class AgentLauncher method main.

/**
 * @param args Args.
 */
public static void main(String[] args) throws Exception {
    log.info("Starting Apache Ignite Web Console Agent...");
    final AgentConfiguration cfg = new AgentConfiguration();
    JCommander jCommander = new JCommander(cfg);
    String osName = System.getProperty("os.name").toLowerCase();
    jCommander.setProgramName("ignite-web-agent." + (osName.contains("win") ? "bat" : "sh"));
    try {
        jCommander.parse(args);
    } catch (ParameterException pe) {
        log.error("Failed to parse command line parameters: " + Arrays.toString(args), pe);
        jCommander.usage();
        return;
    }
    String prop = cfg.configPath();
    AgentConfiguration propCfg = new AgentConfiguration();
    try {
        File f = AgentUtils.resolvePath(prop);
        if (f == null)
            log.warn("Failed to find agent property file: {}", prop);
        else
            propCfg.load(f.toURI().toURL());
    } catch (IOException e) {
        if (!AgentConfiguration.DFLT_CFG_PATH.equals(prop))
            log.warn("Failed to load agent property file: " + prop, e);
    }
    cfg.merge(propCfg);
    if (cfg.help()) {
        jCommander.usage();
        return;
    }
    System.out.println();
    System.out.println("Agent configuration:");
    System.out.println(cfg);
    System.out.println();
    if (cfg.tokens() == null) {
        String webHost;
        try {
            webHost = new URI(cfg.serverUri()).getHost();
        } catch (URISyntaxException e) {
            log.error("Failed to parse Ignite Web Console uri", e);
            return;
        }
        System.out.println("Security token is required to establish connection to the web console.");
        System.out.println(String.format("It is available on the Profile page: https://%s/profile", webHost));
        String tokens = String.valueOf(readPassword("Enter security tokens separated by comma: "));
        cfg.tokens(Arrays.asList(tokens.trim().split(",")));
    }
    URI uri = URI.create(cfg.serverUri());
    // Create proxy authenticator using passed properties.
    switch(uri.getScheme()) {
        case "http":
        case "https":
            final String username = System.getProperty(uri.getScheme() + ".proxyUsername");
            final char[] pwd = System.getProperty(uri.getScheme() + ".proxyPassword", "").toCharArray();
            Authenticator.setDefault(new Authenticator() {

                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, pwd);
                }
            });
            break;
        default:
    }
    IO.Options opts = new IO.Options();
    opts.path = "/agents";
    // Workaround for use self-signed certificate
    if (Boolean.getBoolean("trust.all")) {
        SSLContext ctx = SSLContext.getInstance("TLS");
        // Create an SSLContext that uses our TrustManager
        ctx.init(null, getTrustManagers(), null);
        opts.sslContext = ctx;
    }
    final Socket client = IO.socket(uri, opts);
    final RestExecutor restExecutor = new RestExecutor(cfg.nodeUri());
    try {
        final ClusterListener clusterLsnr = new ClusterListener(client, restExecutor);
        final DemoListener demoHnd = new DemoListener(client, restExecutor);
        Emitter.Listener onConnect = new Emitter.Listener() {

            @Override
            public void call(Object... args) {
                log.info("Connection established.");
                JSONObject authMsg = new JSONObject();
                try {
                    authMsg.put("tokens", toJSON(cfg.tokens()));
                    authMsg.put("disableDemo", cfg.disableDemo());
                    String clsName = AgentLauncher.class.getSimpleName() + ".class";
                    String clsPath = AgentLauncher.class.getResource(clsName).toString();
                    if (clsPath.startsWith("jar")) {
                        String manifestPath = clsPath.substring(0, clsPath.lastIndexOf('!') + 1) + "/META-INF/MANIFEST.MF";
                        Manifest manifest = new Manifest(new URL(manifestPath).openStream());
                        Attributes attr = manifest.getMainAttributes();
                        authMsg.put("ver", attr.getValue("Implementation-Version"));
                        authMsg.put("bt", attr.getValue("Build-Time"));
                    }
                    client.emit("agent:auth", authMsg, new Ack() {

                        @Override
                        public void call(Object... args) {
                            if (args != null) {
                                if (args[0] instanceof String) {
                                    log.error((String) args[0]);
                                    System.exit(1);
                                }
                                if (args[0] == null && args[1] instanceof JSONArray) {
                                    try {
                                        List<String> activeTokens = fromJSON(args[1], List.class);
                                        if (!F.isEmpty(activeTokens)) {
                                            Collection<String> missedTokens = cfg.tokens();
                                            cfg.tokens(activeTokens);
                                            missedTokens.removeAll(activeTokens);
                                            if (!F.isEmpty(missedTokens)) {
                                                String tokens = F.concat(missedTokens, ", ");
                                                log.warn("Failed to authenticate with token(s): {}. " + "Please reload agent archive or check settings", tokens);
                                            }
                                            log.info("Authentication success.");
                                            clusterLsnr.watch();
                                            return;
                                        }
                                    } catch (Exception e) {
                                        log.error("Failed to authenticate agent. Please check agent\'s tokens", e);
                                        System.exit(1);
                                    }
                                }
                            }
                            log.error("Failed to authenticate agent. Please check agent\'s tokens");
                            System.exit(1);
                        }
                    });
                } catch (JSONException | IOException e) {
                    log.error("Failed to construct authentication message", e);
                    client.close();
                }
            }
        };
        DatabaseListener dbHnd = new DatabaseListener(cfg);
        RestListener restHnd = new RestListener(restExecutor);
        final CountDownLatch latch = new CountDownLatch(1);
        log.info("Connecting to: {}", cfg.serverUri());
        client.on(EVENT_CONNECT, onConnect).on(EVENT_CONNECT_ERROR, onError).on(EVENT_ERROR, onError).on(EVENT_DISCONNECT, onDisconnect).on(EVENT_LOG_WARNING, onLogWarning).on(EVENT_CLUSTER_BROADCAST_START, clusterLsnr.start()).on(EVENT_CLUSTER_BROADCAST_STOP, clusterLsnr.stop()).on(EVENT_DEMO_BROADCAST_START, demoHnd.start()).on(EVENT_DEMO_BROADCAST_STOP, demoHnd.stop()).on(EVENT_RESET_TOKENS, new Emitter.Listener() {

            @Override
            public void call(Object... args) {
                String tok = String.valueOf(args[0]);
                log.warn("Security token has been reset: {}", tok);
                cfg.tokens().remove(tok);
                if (cfg.tokens().isEmpty()) {
                    client.off();
                    latch.countDown();
                }
            }
        }).on(EVENT_SCHEMA_IMPORT_DRIVERS, dbHnd.availableDriversListener()).on(EVENT_SCHEMA_IMPORT_SCHEMAS, dbHnd.schemasListener()).on(EVENT_SCHEMA_IMPORT_METADATA, dbHnd.metadataListener()).on(EVENT_NODE_VISOR_TASK, restHnd).on(EVENT_NODE_REST, restHnd);
        client.connect();
        latch.await();
    } finally {
        restExecutor.stop();
        client.close();
    }
}
Also used : Emitter(io.socket.emitter.Emitter) DemoListener(org.apache.ignite.console.agent.handlers.DemoListener) ClusterListener(org.apache.ignite.console.agent.handlers.ClusterListener) RestListener(org.apache.ignite.console.agent.handlers.RestListener) DatabaseListener(org.apache.ignite.console.agent.handlers.DatabaseListener) Attributes(java.util.jar.Attributes) URISyntaxException(java.net.URISyntaxException) URI(java.net.URI) URL(java.net.URL) JCommander(com.beust.jcommander.JCommander) ParameterException(com.beust.jcommander.ParameterException) List(java.util.List) Authenticator(java.net.Authenticator) PasswordAuthentication(java.net.PasswordAuthentication) DemoListener(org.apache.ignite.console.agent.handlers.DemoListener) IO(io.socket.client.IO) RestExecutor(org.apache.ignite.console.agent.rest.RestExecutor) Ack(io.socket.client.Ack) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException) IOException(java.io.IOException) SSLContext(javax.net.ssl.SSLContext) DatabaseListener(org.apache.ignite.console.agent.handlers.DatabaseListener) Manifest(java.util.jar.Manifest) CountDownLatch(java.util.concurrent.CountDownLatch) ParameterException(com.beust.jcommander.ParameterException) URISyntaxException(java.net.URISyntaxException) JSONException(org.json.JSONException) ConnectException(java.net.ConnectException) SSLHandshakeException(javax.net.ssl.SSLHandshakeException) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) RestListener(org.apache.ignite.console.agent.handlers.RestListener) JSONObject(org.json.JSONObject) ClusterListener(org.apache.ignite.console.agent.handlers.ClusterListener) Collection(java.util.Collection) JSONObject(org.json.JSONObject) File(java.io.File) Socket(io.socket.client.Socket)

Aggregations

Ack (io.socket.client.Ack)3 IOException (java.io.IOException)2 CountDownLatch (java.util.concurrent.CountDownLatch)2 RestResult (org.apache.ignite.console.agent.rest.RestResult)2 JCommander (com.beust.jcommander.JCommander)1 ParameterException (com.beust.jcommander.ParameterException)1 IO (io.socket.client.IO)1 Socket (io.socket.client.Socket)1 Emitter (io.socket.emitter.Emitter)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 File (java.io.File)1 Authenticator (java.net.Authenticator)1 ConnectException (java.net.ConnectException)1 PasswordAuthentication (java.net.PasswordAuthentication)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 URL (java.net.URL)1 UnknownHostException (java.net.UnknownHostException)1 Collection (java.util.Collection)1 List (java.util.List)1