/**
* Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016
*
* Licensed 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.glite.security.voms.admin.persistence.tools;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.commons.lang.StringUtils;
import org.glite.security.voms.admin.configuration.VOMSConfiguration;
import org.glite.security.voms.admin.configuration.VOMSConfigurationConstants;
import org.glite.security.voms.admin.persistence.DBUtil;
import org.glite.security.voms.admin.persistence.HibernateFactory;
import org.glite.security.voms.admin.persistence.dao.lookup.LookupPolicyProvider;
import org.hibernate.cfg.Configuration;
public class AuditLogCtl {
Map<String, AuditLogCtlCommand> commands;
HelpFormatter helpFormatter = new HelpFormatter();
Options options;
private void printHelp() {
StringBuilder footer = new StringBuilder();
footer.append("\nAvaiable commands:\n");
for (AuditLogCtlCommand command : commands.values()) {
footer.append(String.format("\n%s:\n %s\n", command.getName(),
command.getDescription()));
}
helpFormatter.printHelp("AuditLogCtl [command]",
"\nPrints or deletes entries in the VOMS Admin audit LOG.\nOptions:\n\n",
options, null, true);
System.out.println(footer.toString());
}
private void errorAndHelpFormatter(String msg) {
System.err.println(msg);
printHelp();
System.exit(1);
}
private void errorAndExit(String msg) {
System.err.println(msg);
System.exit(1);
}
private void errorAndExit(String msg, Throwable t) {
System.err.println(msg);
t.printStackTrace(System.err);
System.exit(1);
}
private void initCommands() {
commands = new HashMap<String, AuditLogCtlCommand>();
commands.put(Count.NAME, new Count());
commands.put(Print.NAME, new Print());
commands.put(DeleteRecordCommand.NAME, new DeleteRecordCommand());
commands.put(DeleteRecordsCommand.NAME, new DeleteRecordsCommand());
}
private void loadVomsAdminConfiguration(CommandLine line) {
System.setProperty(VOMSConfigurationConstants.VO_NAME,
line.getOptionValue("vo"));
VOMSConfiguration.load(null);
}
private void initializeLookupPolicyProvider() {
boolean skipCaCheck = VOMSConfiguration.instance()
.getBoolean(VOMSConfigurationConstants.SKIP_CA_CHECK, false);
LookupPolicyProvider.initialize(skipCaCheck);
}
private void initializePersistence(CommandLine line) {
loadVomsAdminConfiguration(line);
initializeLookupPolicyProvider();
Configuration hibernateConfig = DBUtil
.loadHibernateConfiguration("/etc/voms-admin", line.getOptionValue("vo"));
hibernateConfig.configure();
HibernateFactory.initialize(hibernateConfig);
}
@SuppressWarnings("static-access")
private CommandLine parseArgs(String[] args) throws ParseException {
Option help = OptionBuilder.withDescription("prints help").create("help");
Option vo = OptionBuilder.withArgName("voname").hasArg()
.withDescription("Act on VO <voname>").create("vo");
Option fromTime = OptionBuilder.withArgName("time").hasArg()
.withDescription(
"Include records starting from this <time>. Time format is 'yyyy-MM-ddTHH:mm:ss.S'")
.create("fromTime");
Option toTime = OptionBuilder.withArgName("time").hasArg()
.withDescription(
"Include records to this <time>. Time format is 'yyyy-MM-ddTHH:mm:ss.S'")
.create("toTime");
Option type = OptionBuilder.withArgName("eventType").hasArg()
.withDescription("Include records matching <eventType>")
.create("eventType");
Option principal = OptionBuilder.withArgName("principal").hasArg()
.withDescription("Include records matching <principal>")
.create("principal");
Option first = OptionBuilder.withArgName("recordNumber").hasArg()
.withDescription("Start from <recordNumber> record").create("first");
Option maxResults = OptionBuilder.withArgName("maxResults").hasArg()
.withDescription("Return at most <maxResults> records")
.create("maxResults");
Option id = OptionBuilder.withArgName("recordId").hasArg()
.withDescription("Operate on record <recordId>").create("id");
options = new Options();
options.addOption(help);
options.addOption(vo);
options.addOption(fromTime);
options.addOption(toTime);
options.addOption(type);
options.addOption(principal);
options.addOption(first);
options.addOption(maxResults);
options.addOption(id);
CommandLineParser parser = new PosixParser();
return parser.parse(options, args);
}
private AuditLogCtlCommand validateCommandLine(CommandLine line) {
if (line.hasOption("help")) {
printHelp();
System.exit(0);
}
if (!line.hasOption("vo")) {
errorAndExit("Please specify a vo with the --vo option");
}
@SuppressWarnings("unchecked")
List<String> args = line.getArgList();
if (args.isEmpty()) {
errorAndExit("No command specified");
}
if (args.size() > 1) {
errorAndExit(
"More than one command argument: " + StringUtils.join(args, ","));
}
String command = args.get(0);
if (!commands.containsKey(command)) {
errorAndExit("Unrecognized command: " + command);
}
return commands.get(command);
}
private void executeCommand(CommandLine line) {
AuditLogCtlCommand command = validateCommandLine(line);
initializePersistence(line);
HibernateFactory.beginTransaction();
try {
command.execute(line);
HibernateFactory.commitTransaction();
} catch (Throwable t) {
HibernateFactory.rollbackTransaction();
errorAndExit("Command execution error: " + t.getMessage(), t);
}
}
public AuditLogCtl(String[] args) {
try {
initCommands();
CommandLine line = parseArgs(args);
executeCommand(line);
} catch (ParseException e) {
errorAndHelpFormatter("Parse error: " + e.getMessage());
}
}
public static void main(String[] args) {
new AuditLogCtl(args);
}
}