From c4ee90c89a0b3c61b18f865e6650b27e156a9dcb Mon Sep 17 00:00:00 2001 From: Fraser Tweedale Date: Wed, 23 Jul 2014 02:40:07 -0400 Subject: Update pki-profile CLI commands to work with "raw" format Update CLI commands for working with the (now LDAP-based) profiles in the same format as was used by the files, by way of the --raw option. Also add the "edit" command to interactively edit a profile. --- .../netscape/cmstools/profile/ProfileAddCLI.java | 20 ++-- .../com/netscape/cmstools/profile/ProfileCLI.java | 15 +++ .../netscape/cmstools/profile/ProfileEditCLI.java | 113 +++++++++++++++++++++ .../cmstools/profile/ProfileModifyCLI.java | 30 ++++-- .../netscape/cmstools/profile/ProfileShowCLI.java | 34 +++++-- 5 files changed, 188 insertions(+), 24 deletions(-) create mode 100644 base/java-tools/src/com/netscape/cmstools/profile/ProfileEditCLI.java (limited to 'base/java-tools/src/com/netscape/cmstools/profile') diff --git a/base/java-tools/src/com/netscape/cmstools/profile/ProfileAddCLI.java b/base/java-tools/src/com/netscape/cmstools/profile/ProfileAddCLI.java index 62bd14526..306ff1905 100644 --- a/base/java-tools/src/com/netscape/cmstools/profile/ProfileAddCLI.java +++ b/base/java-tools/src/com/netscape/cmstools/profile/ProfileAddCLI.java @@ -1,11 +1,13 @@ package com.netscape.cmstools.profile; -import java.io.FileNotFoundException; +import java.io.IOException; import java.util.Arrays; +import java.util.Properties; import javax.xml.bind.JAXBException; import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Option; import org.apache.commons.cli.ParseException; import com.netscape.certsrv.profile.ProfileData; @@ -19,13 +21,17 @@ public class ProfileAddCLI extends CLI { public ProfileAddCLI(ProfileCLI profileCLI) { super("add", "Add profiles", profileCLI); this.profileCLI = profileCLI; + + Option optRaw = new Option(null, "raw", false, "Use raw format"); + optRaw.setArgName("raw"); + options.addOption(optRaw); } public void printHelp() { formatter.printHelp(getFullName() + " [OPTIONS...]", options); } - public void execute(String[] args) { + public void execute(String[] args) throws Exception { // Always check for "--help" prior to parsing if (Arrays.asList(args).contains("--help")) { // Display usage @@ -58,16 +64,18 @@ public class ProfileAddCLI extends CLI { System.exit(-1); } - try { + if (cmd.hasOption("raw")) { + Properties properties = ProfileCLI.readRawProfileFromFile(filename); + String profileId = properties.getProperty("profileId"); + profileCLI.profileClient.createProfileRaw(properties).store(System.out, null); + MainCLI.printMessage("Added profile " + profileId); + } else { ProfileData data = ProfileCLI.readProfileFromFile(filename); data = profileCLI.profileClient.createProfile(data); MainCLI.printMessage("Added profile " + data.getId()); ProfileCLI.printProfile(data, profileCLI.getClient().getConfig().getServerURI()); - } catch (FileNotFoundException | JAXBException e) { - System.err.println("Error: " + e.getMessage()); - System.exit(-1); } } } diff --git a/base/java-tools/src/com/netscape/cmstools/profile/ProfileCLI.java b/base/java-tools/src/com/netscape/cmstools/profile/ProfileCLI.java index 6d8c6b655..e9e21596a 100644 --- a/base/java-tools/src/com/netscape/cmstools/profile/ProfileCLI.java +++ b/base/java-tools/src/com/netscape/cmstools/profile/ProfileCLI.java @@ -3,8 +3,12 @@ package com.netscape.cmstools.profile; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.Locale; +import java.util.Properties; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -32,6 +36,7 @@ public class ProfileCLI extends CLI { addModule(new ProfileShowCLI(this)); addModule(new ProfileAddCLI(this)); addModule(new ProfileModifyCLI(this)); + addModule(new ProfileEditCLI(this)); addModule(new ProfileRemoveCLI(this)); addModule(new ProfileEnableCLI(this)); addModule(new ProfileDisableCLI(this)); @@ -128,6 +133,16 @@ public class ProfileCLI extends CLI { return data; } + public static Properties readRawProfileFromFile(String filename) + throws IOException, RuntimeException { + Properties properties = new Properties(); + properties.load(Files.newInputStream(Paths.get(filename))); + String profileId = properties.getProperty("profileId"); + if (profileId == null) + throw new RuntimeException("Error: Missing profileId property in profile data."); + return properties; + } + public static void saveEnrollmentTemplateToFile(String filename, CertEnrollmentRequest request) throws JAXBException, FileNotFoundException { JAXBContext context = JAXBContext.newInstance(CertEnrollmentRequest.class); diff --git a/base/java-tools/src/com/netscape/cmstools/profile/ProfileEditCLI.java b/base/java-tools/src/com/netscape/cmstools/profile/ProfileEditCLI.java new file mode 100644 index 000000000..50600ba15 --- /dev/null +++ b/base/java-tools/src/com/netscape/cmstools/profile/ProfileEditCLI.java @@ -0,0 +1,113 @@ +//--- BEGIN COPYRIGHT BLOCK --- +//This program is free software; you can redistribute it and/or modify +//it under the terms of the GNU General Public License as published by +//the Free Software Foundation; version 2 of the License. +// +//This program is distributed in the hope that it will be useful, +//but WITHOUT ANY WARRANTY; without even the implied warranty of +//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//GNU General Public License for more details. +// +//You should have received a copy of the GNU General Public License along +//with this program; if not, write to the Free Software Foundation, Inc., +//51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +//(C) 2014 Red Hat, Inc. +//All rights reserved. +//--- END COPYRIGHT BLOCK --- + +package com.netscape.cmstools.profile; + +import java.lang.ProcessBuilder; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Properties; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.ParseException; + +import com.netscape.cmstools.cli.CLI; + +public class ProfileEditCLI extends CLI { + + public ProfileCLI profileCLI; + + public ProfileEditCLI(ProfileCLI profileCLI) { + super("edit", "Edit profiles (config-store format)", profileCLI); + this.profileCLI = profileCLI; + } + + public void printHelp() { + formatter.printHelp(getFullName() + " [OPTIONS...]", options); + } + + public void execute(String[] args) throws Exception { + // Always check for "--help" prior to parsing + if (Arrays.asList(args).contains("--help")) { + // Display usage + printHelp(); + System.exit(0); + } + + CommandLine cmd = null; + + try { + cmd = parser.parse(options, args); + } catch (ParseException e) { + System.err.println("Error: " + e.getMessage()); + printHelp(); + System.exit(-1); + } + + String[] cmdArgs = cmd.getArgs(); + + if (cmdArgs.length < 1) { + System.err.println("Error: No Profile ID specified."); + printHelp(); + System.exit(-1); + } + + String profileId = cmdArgs[0]; + + // read profile into temporary file + Properties orig = profileCLI.profileClient.retrieveProfileRaw(profileId); + String enabled = orig.getProperty("enable"); + if (Boolean.valueOf(enabled)) { + System.err.println("Error: Cannot edit profile. Profile must be disabled."); + System.exit(-1); + } + Path tempFile = Files.createTempFile("pki", ".cfg"); + + try { + orig.store(Files.newOutputStream(tempFile), null); + + // invoke editor on temporary file + String editor = System.getenv("EDITOR"); + String[] command; + if (editor == null || editor.trim().isEmpty()) { + command = new String[] {"/usr/bin/env", "vi", tempFile.toString()}; + } else { + command = new String[] {editor.trim(), tempFile.toString()}; + } + ProcessBuilder pb = new ProcessBuilder(command); + pb.inheritIO(); + int exitCode = pb.start().waitFor(); + if (exitCode != 0) { + System.err.println("Error: editor exited abnormally."); + System.exit(-1); + } + + // read data from temporary file and modify if changed + Properties cur = new Properties(); + cur.load(Files.newInputStream(tempFile)); + + if (!cur.equals(orig)) { + profileCLI.profileClient.modifyProfileRaw(profileId, cur); + } + cur.store(System.out, null); + } finally { + Files.delete(tempFile); + } + } +} diff --git a/base/java-tools/src/com/netscape/cmstools/profile/ProfileModifyCLI.java b/base/java-tools/src/com/netscape/cmstools/profile/ProfileModifyCLI.java index bbeb91981..cc0f415b7 100644 --- a/base/java-tools/src/com/netscape/cmstools/profile/ProfileModifyCLI.java +++ b/base/java-tools/src/com/netscape/cmstools/profile/ProfileModifyCLI.java @@ -1,11 +1,13 @@ package com.netscape.cmstools.profile; -import java.io.FileNotFoundException; +import java.io.IOException; import java.util.Arrays; +import java.util.Properties; import javax.xml.bind.JAXBException; import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Option; import org.apache.commons.cli.ParseException; import com.netscape.certsrv.profile.ProfileData; @@ -19,6 +21,10 @@ public class ProfileModifyCLI extends CLI { public ProfileModifyCLI(ProfileCLI profileCLI) { super("mod", "Modify profiles", profileCLI); this.profileCLI = profileCLI; + + Option optRaw = new Option(null, "raw", false, "Use raw format"); + optRaw.setArgName("raw"); + options.addOption(optRaw); } public void printHelp() { @@ -59,14 +65,20 @@ public class ProfileModifyCLI extends CLI { } try { - ProfileData data = ProfileCLI.readProfileFromFile(filename); - data = profileCLI.profileClient.modifyProfile(data); - - MainCLI.printMessage("Modified profile " + data.getId()); - - ProfileCLI.printProfile(data, profileCLI.getClient().getConfig().getServerURI()); - - } catch (FileNotFoundException | JAXBException e) { + if (cmd.hasOption("raw")) { + Properties properties = ProfileCLI.readRawProfileFromFile(filename); + String profileId = properties.getProperty("profileId"); + profileCLI.profileClient.modifyProfileRaw(profileId, properties).store(System.out, null); + MainCLI.printMessage("Modified profile " + profileId); + } else { + ProfileData data = ProfileCLI.readProfileFromFile(filename); + data = profileCLI.profileClient.modifyProfile(data); + + MainCLI.printMessage("Modified profile " + data.getId()); + + ProfileCLI.printProfile(data, profileCLI.getClient().getConfig().getServerURI()); + } + } catch (IOException | JAXBException e) { System.err.println("Error: " + e.getMessage()); System.exit(-1); } diff --git a/base/java-tools/src/com/netscape/cmstools/profile/ProfileShowCLI.java b/base/java-tools/src/com/netscape/cmstools/profile/ProfileShowCLI.java index f5b636c1a..1dd85f43b 100644 --- a/base/java-tools/src/com/netscape/cmstools/profile/ProfileShowCLI.java +++ b/base/java-tools/src/com/netscape/cmstools/profile/ProfileShowCLI.java @@ -1,6 +1,8 @@ package com.netscape.cmstools.profile; +import java.io.FileOutputStream; import java.util.Arrays; +import java.util.Properties; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; @@ -26,9 +28,13 @@ public class ProfileShowCLI extends CLI { } public void createOptions() { - Option option = new Option(null, "output", true, "Output filename"); - option.setArgName("filename"); - options.addOption(option); + Option optFilename = new Option(null, "output", true, "Output filename"); + optFilename.setArgName("filename"); + options.addOption(optFilename); + + Option optRaw = new Option(null, "raw", false, "Use raw format"); + optRaw.setArgName("raw"); + options.addOption(optRaw); } public void execute(String[] args) throws Exception { @@ -70,14 +76,24 @@ public class ProfileShowCLI extends CLI { } } - ProfileData profileData = profileCLI.profileClient.retrieveProfile(profileId); - - MainCLI.printMessage("Profile \"" + profileId + "\""); + if (cmd.hasOption("raw")) { + Properties profileConfig = profileCLI.profileClient.retrieveProfileRaw(profileId); - if (filename != null) { - ProfileCLI.saveProfileToFile(filename, profileData); + if (filename != null) { + profileConfig.store(new FileOutputStream(filename), null); + MainCLI.printMessage("Saved profile " + profileId + " to " + filename); + } else { + profileConfig.store(System.out, null); + } } else { - ProfileCLI.printProfile(profileData, profileCLI.getClient().getConfig().getServerURI()); + MainCLI.printMessage("Profile \"" + profileId + "\""); + ProfileData profileData = profileCLI.profileClient.retrieveProfile(profileId); + + if (filename != null) { + ProfileCLI.saveProfileToFile(filename, profileData); + } else { + ProfileCLI.printProfile(profileData, profileCLI.getClient().getConfig().getServerURI()); + } } } -- cgit