blob: 1e52d06e472fd41158aad30c07a446b56be67b7e [file] [log] [blame]
/*
* 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.karaf.admin.main;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.felix.gogo.commands.Action;
import org.apache.felix.gogo.commands.Command;
import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
import org.apache.karaf.admin.command.*;
import org.apache.karaf.admin.command.ChangeSshPortCommand;
import org.apache.karaf.admin.internal.AdminServiceImpl;
import org.fusesource.jansi.AnsiConsole;
public class Execute {
static Class<? extends Action> x = CreateCommand.class;
private static final Class<?> [] COMMAND_CLASSES = new Class[] {
CreateCommand.class,
StartCommand.class,
StopCommand.class,
DestroyCommand.class,
ListCommand.class,
ChangeSshPortCommand.class,
ChangeRmiRegistryPortCommand.class,
ChangeRmiServerPortCommand.class};
private static final Map<String, Class<?>> COMMANDS = new TreeMap<String, Class<?>>();
static {
for (Class<?> c : COMMAND_CLASSES) {
Command ann = c.getAnnotation(Command.class);
if (ann == null) {
continue;
}
COMMANDS.put(ann.name(), c);
}
}
// For testing
static boolean exitAllowed = true;
/**
* Environment variable for specifying extra options to the Karaf admin
* process kicked off from this Java process.
*/
private static final String ENV_KARAF_OPTS = "KARAF_OPTS";
/**
* System property for specifying extra options to the Karaf admin
* process kicked off from this Java process.
*/
private static final String PROP_KARAF_OPTS = "karaf.opts";
public static void main(String[] args) throws Exception {
AnsiConsole.systemInstall();
if (args.length == 0) {
listCommands();
exit(0);
}
String commandName = args[0];
Class<?> cls = COMMANDS.get(commandName);
if (cls == null) {
System.err.println("Command not found: " + commandName);
exit(-1);
}
String storage = System.getProperty("karaf.instances");
if (storage == null) {
System.err.println("System property 'karaf.instances' is not set. \n" +
"This property needs to be set to the full path of the instance.properties file.");
exit(-1);
}
File storageFile = new File(storage);
System.setProperty("user.dir", storageFile.getParentFile().getParentFile().getCanonicalPath());
try {
String karafOpts = System.getenv(ENV_KARAF_OPTS);
if (karafOpts != null) {
System.setProperty(PROP_KARAF_OPTS, karafOpts);
}
} catch(Exception e) {
System.err.println("Could not read KARAF_OPTS environment variable: " + e.getMessage());
if (System.getProperty("karaf.showStackTrace") != null) {
throw e;
}
}
Object command = cls.newInstance();
if (command instanceof AdminCommandSupport) {
try {
execute((AdminCommandSupport) command, storageFile, args);
} catch (Exception e) {
System.err.println("Error execution command '" + commandName + "': " + e.getMessage());
if (System.getProperty("karaf.showStackTrace") != null) {
throw e;
}
}
} else {
System.err.println("Not an admin command: " + commandName);
exit(-1);
}
}
static void execute(AdminCommandSupport command, File storageFile, String[] args) throws Exception {
DefaultActionPreparator dap = new DefaultActionPreparator();
List<Object> params = new ArrayList<Object>(Arrays.asList(args));
params.remove(0); // this is the actual command name
if (!dap.prepare(command, null, params)) {
return;
}
AdminServiceImpl admin = new AdminServiceImpl();
admin.setStorageLocation(storageFile);
admin.init();
command.setAdminService(admin);
command.execute(null);
}
private static void listCommands() {
System.out.println("Available commands:");
for (Map.Entry<String, Class<?>> entry : COMMANDS.entrySet()) {
Command ann = entry.getValue().getAnnotation(Command.class);
System.out.printf(" %s - %s\n", entry.getKey(), ann.description());
}
System.out.println("Type 'command --help' for more help on the specified command.");
}
private static void exit(int rc) {
if (exitAllowed) {
System.exit(rc);
} else {
throw new RuntimeException("" + rc);
}
}
}