Skip to content
CLI.java 10.4 KiB
Newer Older
Sonia Zorba's avatar
Sonia Zorba committed
/*
 * Copyright (C) 2021 Istituto Nazionale di Astrofisica
 * SPDX-License-Identifier: GPL-3.0-or-later
 */
package it.inaf.ia2.gms.cli;

Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.ia2.client.ClientException;
import it.inaf.ia2.gms.client.GmsClient;
Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.ia2.gms.client.model.GroupPermission;
import it.inaf.ia2.gms.client.model.Permission;
Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.ia2.gms.client.model.UserPermission;
Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.ia2.rap.client.ClientCredentialsRapClient;
Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.ia2.rap.client.RapClient;
Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.ia2.rap.data.AccessTokenResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.util.List;
import java.util.Properties;

    public static void main(String[] args) throws Exception {
        new CLI(args).run();
    }

    private final String args[];
    private int argIndex;

    private String gmsBaseUrl;
    private String rapBaseUrl;
    private String clientId;
    private String clientSecret;
    private String token;

    private GmsClient client;

    private CLI(String... args) {
        this.args = args;
    }

    private void run() throws Exception {
        if (args.length < 2) {
            displayUsage();
        }

        boolean commandParsed = false;
        while (argIndex < args.length && !commandParsed) {
            switch (args[argIndex]) {
                case "--config-file":
                    loadConfigFromFile(new File(getNextArg()));
                    break;
                case "--token-file":
                    loadTokenFromFile(new File(getNextArg()));
                    break;
                case "--gms-url":
                    gmsBaseUrl = getNextArg();
                    break;
                case "--rap-url":
                    rapBaseUrl = getNextArg();
                    break;
                case "--client-id":
                    clientId = getNextArg();
                    break;
                case "--client-secret":
                    clientSecret = getNextArg();
                    break;
                default:
                    verifyConfigLoaded();
                    createClient();
Sonia Zorba's avatar
Sonia Zorba committed
                    try {
                        parseCommand();
                    } catch (ClientException ex) {
                        System.err.println(ex.getMessage());
                    }
Sonia Zorba's avatar
Sonia Zorba committed

        if (!commandParsed) {
            displayUsage();
        }
    }

    private String getNextArg() {
        if (argIndex + 1 == args.length) {
            System.err.println("Missing value for option " + args[argIndex]);
            System.exit(1);
        }
        return args[++argIndex];
    private void verifyConfigLoaded() {

        if (gmsBaseUrl == null) {
            // Attempt reading gms.properties in current directory
            loadConfigFromFile(new File("gms.properties"));
        }

        if (clientId == null && token == null) {
            // Attempt loading token.txt in current directory
            loadTokenFromFile(new File("token.txt"));
        }

        if (token != null && (clientSecret == null || rapBaseUrl == null)) {
            System.err.println("Client secret and RAP base URL not configured");
            System.exit(1);
        }
    }

    private void createClient() {
Sonia Zorba's avatar
Sonia Zorba committed

        client = new GmsClient(gmsBaseUrl);

        if (token != null) {
            client.setAccessToken(token);
Sonia Zorba's avatar
Sonia Zorba committed
        } else {
Sonia Zorba's avatar
Sonia Zorba committed
            RapClient rapClient = new ClientCredentialsRapClient(rapBaseUrl)
Sonia Zorba's avatar
Sonia Zorba committed
                    .setClientId(clientId)
Sonia Zorba's avatar
Sonia Zorba committed
                    .setClientSecret(clientSecret);
            AccessTokenResponse accessTokenResponse = rapClient.getAccessTokenFromClientCredentials();
            client.setAccessToken(accessTokenResponse.getAccessToken());
        }
    }

    private void loadConfigFromFile(File config) {

        if (!config.exists()) {
            System.err.println("Config file " + config.getAbsolutePath() + " doesn't exist");
            System.exit(1);
        }

        Properties properties = new Properties();
Sonia Zorba's avatar
Sonia Zorba committed
        try ( InputStream in = new FileInputStream(config)) {
            properties.load(in);
        } catch (IOException ex) {
            throw new UncheckedIOException(ex);
        gmsBaseUrl = properties.getProperty("gms_url");
        if (gmsBaseUrl == null) {
            System.err.println("Missing gms_url in gms.properties");
            System.exit(1);
        }
        rapBaseUrl = properties.getProperty("rap_url");
        clientId = properties.getProperty("client_id");
        clientSecret = properties.getProperty("client_secret");
    }

    private void loadTokenFromFile(File tokenFile) {
        if (!tokenFile.exists()) {
            System.err.println("Token file " + tokenFile.getAbsolutePath() + " doesn't exist");
            System.exit(1);
        }

Sonia Zorba's avatar
Sonia Zorba committed
        try ( InputStream in = new FileInputStream(tokenFile)) {
            java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\A");
            token = s.next().trim();
        } catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }
Sonia Zorba's avatar
Sonia Zorba committed
            case "list-groups": {
                String parent = "";
                if (args.length == argIndex + 2) {
                    parent = args[argIndex + 1];
                }
                for (String group : client.listGroups(parent, false)) {
                    System.out.println(group);
                }
                break;
            }
            case "create-group":
                if (argIndex + 2 < args.length) {
                    leaf = Boolean.parseBoolean(args[argIndex + 2]);
                client.createGroup(args[argIndex + 1], leaf);
                System.out.println("Group created");
                break;
Sonia Zorba's avatar
Sonia Zorba committed
            case "get-group-permissions": {
                String parent = "";
                if (args.length == argIndex + 2) {
                    parent = args[argIndex + 1];
                }
                for (GroupPermission gp : client.getGroupPermissions(parent)) {
                    System.out.println(gp.getUserId() + " " + gp.getPermission());
                }
                break;
            }
            case "delete-group":
Sonia Zorba's avatar
Sonia Zorba committed
                client.deleteGroup(getNextArg());
                System.out.println("Group deleted");
                break;
Sonia Zorba's avatar
Sonia Zorba committed
            case "get-user-groups": {
                String userId = getNextArg();
                String parent = "";
                if (args.length == argIndex + 2) {
                    parent = args[argIndex + 1];
                }
                for (String group : client.getUserGroups(userId, parent)) {
                    System.out.println(group);
                }
                break;
            }
            case "add-member":
                if (argIndex + 2 >= args.length) {
                    displayUsage();
                }
                client.addMember(args[argIndex + 1], args[argIndex + 2]);
                System.out.println("Member added");
                break;
            case "remove-member":
                if (argIndex + 2 >= args.length) {
                    displayUsage();
                }
                client.removeMember(args[argIndex + 1], args[argIndex + 2]);
                System.out.println("Member removed");
                break;
Sonia Zorba's avatar
Sonia Zorba committed
            case "get-user-permissions":
                for (UserPermission up : client.getUserPermissions(getNextArg())) {
                    System.out.println(up.getGroup() + " " + up.getPermission());
                }
                break;
            case "set-permission":
                if (argIndex + 3 >= args.length) {
                    displayUsage();
                }
                client.setPermission(args[argIndex + 1], args[argIndex + 2], Permission.valueOf(args[argIndex + 3]));
                System.out.println("Permission changed");
                break;
            case "add-permission":
                if (argIndex + 3 >= args.length) {
                    displayUsage();
                }
                client.addPermission(args[argIndex + 1], args[argIndex + 2], Permission.valueOf(args[argIndex + 3]));
                System.out.println("Permission added");
                break;
            case "delete-permission":
                if (argIndex + 2 >= args.length) {
                    displayUsage();
                }
                client.removePermission(args[argIndex + 1], args[argIndex + 2]);
                System.out.println("Permission removed");
            case "get-member-email-addresses":
                Permission permission = null;
                if (argIndex + 2 < args.length) {
                    permission = Permission.valueOf(args[argIndex + 2]);
                }
                List<String> addresses = client.getMemberEmailAddresses(args[argIndex + 1], permission);
                for (String address : addresses) {
                    System.out.println(address);
                }
                break;
            default:
                displayUsage();
                break;
        }
    }

    private void displayUsage() {
        System.out.println("gms-client\n"
                + "    [--config-file <file>]\n"
                + "    [--token-file <file>]\n"
                + "    [--gms-url <url>]\n"
                + "    [--rap-url <url>]\n"
                + "    [--client-id <id>]\n"
                + "    [--client-secret <secret>]\n"
Sonia Zorba's avatar
Sonia Zorba committed
                + "    list-groups [<name1.name2.name3>]\n"
                + "    create-group <name1.name2.name3> [<leaf>]\n"
Sonia Zorba's avatar
Sonia Zorba committed
                + "    get-user-groups <user_id> [<name1.name2.name3>]\n"
                + "    get-group-permissions [<name1.name2.name3>]\n"
                + "    get-user-permissions <user_id>\n"
                + "    add-member <name1.name2.name3> <user_id>\n"
                + "    remove-member <name1.name2.name3> <user_id>\n"
                + "    set-permission <name1.name2.name3> <user_id> <permission>\n"
                + "    add-permission <name1.name2.name3> <user_id> <permission>\n"
                + "    delete-permission <name1.name2.name3> <user_id>\n"
                + "    get-member-email-addresses <name1.name2.name3> [<permission>]");
        System.exit(0);
    }
}