X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.launcher%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcli%2FSlcMain.java;h=4c5c82dd136f65493791e61941ec908136ebd8c2;hb=7e3da04a2593e3949edce627bd945bbaacc3480b;hp=c7a7263311ffdabe28eb32ae2610ca7ad9c96d1e;hpb=a75c0516aca20f9a8c8fdd32feee402257ff2b61;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.launcher/src/main/java/org/argeo/slc/cli/SlcMain.java b/runtime/org.argeo.slc.launcher/src/main/java/org/argeo/slc/cli/SlcMain.java index c7a726331..4c5c82dd1 100644 --- a/runtime/org.argeo.slc.launcher/src/main/java/org/argeo/slc/cli/SlcMain.java +++ b/runtime/org.argeo.slc.launcher/src/main/java/org/argeo/slc/cli/SlcMain.java @@ -16,41 +16,48 @@ package org.argeo.slc.cli; import java.io.File; -import java.io.FileInputStream; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; -import java.util.Properties; +import java.util.Map; +import java.util.ServiceLoader; import java.util.UUID; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.apache.commons.io.IOUtils; +import javax.security.auth.Subject; +import javax.security.auth.login.LoginContext; + import org.argeo.osgi.boot.OsgiBoot; -import org.argeo.slc.SlcException; -import org.eclipse.core.runtime.adaptor.EclipseStarter; -import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.launch.Framework; +import org.osgi.framework.launch.FrameworkFactory; -@SuppressWarnings("restriction") +/** Configures an SLC runtime and runs a process. */ public class SlcMain implements Runnable { - /** Unique launch module */ - public final static String UNIQUE_LAUNCH_MODULE_PROPERTY = "slc.launch.module"; - - /** Unique launch flow */ - public final static String UNIQUE_LAUNCH_FLOW_PROPERTY = "slc.launch.flow"; - - /** Unique launch flow */ - public final static String UNIQUE_LAUNCH_ARGS_PROPERTY_BASE = "slc.launch.args"; + public final static String NIX = "NIX"; + public final static String WINDOWS = "WINDOWS"; + public final static String SOLARIS = "SOLARIS"; + + public final static String os; + static { + String osName = System.getProperty("os.name"); + if (osName.startsWith("Win")) + os = WINDOWS; + else if (osName.startsWith("Solaris")) + os = SOLARIS; + else + os = NIX; + } - private final Options options = new Options(); + // private final DateFormat dateFormat = new + // SimpleDateFormat("HH:mm:ss,SSS"); + private Long timeout = 30 * 1000l; private final String[] args; - private final String commandName = "slc"; - // private static String bundlesToInstall = "/usr/share/osgi;in=*.jar"; private String bundlesToInstall = System.getProperty("user.home") + "/dev/src/slc/dep/org.argeo.slc.dep.minimal/target/dependency;in=*.jar," @@ -61,56 +68,37 @@ public class SlcMain implements Runnable { public SlcMain(String[] args) { this.args = args; - // bundlesToStart.add("org.springframework.osgi.extender"); - // bundlesToStart.add("org.argeo.slc.agent"); - bundlesToStart.add("org.springframework.osgi.extender"); bundlesToStart.add("org.argeo.node.repo.jackrabbit"); bundlesToStart.add("org.argeo.security.dao.os"); bundlesToStart.add("org.argeo.slc.node.jackrabbit"); bundlesToStart.add("org.argeo.slc.agent"); bundlesToStart.add("org.argeo.slc.agent.jcr"); + // bundlesToStart.add("org.argeo.slc.agent.cli"); } - @SuppressWarnings("unchecked") public void run() { - String module = null; - String moduleUrl = null; - String flow = null; + long begin = System.currentTimeMillis(); + // System.out.println(dateFormat.format(new Date())); + Boolean isTransient = false; + File dataDir = null; + final LoginContext lc; try { + // Authenticate + lc = new LoginContext(os); + lc.login(); - CommandLineParser clParser = new GnuParser(); - CommandLine cl = clParser.parse(options, args); - - List arguments = cl.getArgList(); - if (arguments.size() == 0) { - // TODO default behaviour - } else { - module = arguments.get(0); - File moduleFile = new File(module); - if (moduleFile.exists()) { - if (moduleFile.isDirectory()) { - moduleUrl = "reference:file:" - + moduleFile.getCanonicalPath(); - } else { - moduleUrl = "file:" + moduleFile.getCanonicalPath(); - } - } - - if (arguments.size() == 1) { - // TODO module info - } else { - flow = arguments.get(1); - } - } - + // Prepare directories String executionDir = System.getProperty("user.dir"); - File slcDir = new File(executionDir, "target/.slc"); + File slcDir = new File(executionDir, ".slc"); File tempDir = new File(System.getProperty("java.io.tmpdir")); - File dataDir = new File(tempDir, "slc-data-" - + UUID.randomUUID().toString()); + if (isTransient) + dataDir = new File(tempDir, "slc-data-" + + UUID.randomUUID().toString()); + else + dataDir = new File(slcDir, "data"); if (!dataDir.exists()) dataDir.mkdirs(); @@ -118,45 +106,97 @@ public class SlcMain implements Runnable { if (!confDir.exists()) confDir.mkdirs(); - BundleContext bundleContext = null; - try { - String[] osgiRuntimeArgs = { "-configuration", - confDir.getCanonicalPath(), "-data", - dataDir.getCanonicalPath(), "-console", "-clean" }; - bundleContext = EclipseStarter.startup(osgiRuntimeArgs, null); - } catch (Exception e) { - throw new RuntimeException("Cannot start Equinox.", e); - } + System.setProperty("log4j.configuration", "file:./log4j.properties"); + if (isTransient) + System.setProperty("argeo.node.repo.configuration", + "osgibundle:repository-memory.xml"); + + // Start Equinox + ServiceLoader ff = ServiceLoader + .load(FrameworkFactory.class); + FrameworkFactory frameworkFactory = ff.iterator().next(); + Map configuration = new HashMap(); + configuration.put("osgi.configuration.area", + confDir.getCanonicalPath()); + configuration.put("osgi.instance.area", dataDir.getCanonicalPath()); + // configuration.put("osgi.clean", "true"); + // configuration.put("osgi.console", ""); + + // Spring configs currently require System properties + System.getProperties().putAll(configuration); + + Framework framework = frameworkFactory.newFramework(configuration); + framework.start(); + BundleContext bundleContext = framework.getBundleContext(); + // String[] osgiRuntimeArgs = { "-configuration", + // confDir.getCanonicalPath(), "-data", + // dataDir.getCanonicalPath(), "-clean" }; + // BundleContext bundleContext = EclipseStarter.startup( + // osgiRuntimeArgs, null); // OSGi bootstrap OsgiBoot osgiBoot = new OsgiBoot(bundleContext); osgiBoot.installUrls(osgiBoot.getBundlesUrls(bundlesToInstall)); - if (moduleUrl != null) { - Bundle bundle = osgiBoot.installUrl(moduleUrl); - module = bundle.getSymbolicName(); - // TODO deal with version - } - - System.setProperty(UNIQUE_LAUNCH_MODULE_PROPERTY, module); - System.setProperty(UNIQUE_LAUNCH_FLOW_PROPERTY, flow); - System.setProperty("log4j.configuration", "file:./log4j.properties"); - System.setProperty("argeo.node.repo.configuration", - "osgibundle:repository-memory.xml"); - // start runtime + // Start runtime osgiBoot.startBundles(bundlesToStart); - } catch (ParseException e) { - System.err.println("Problem with command line arguments. " - + e.getMessage()); - badExit(); - } catch (SlcException e) { - System.err.println(e.getMessage()); - badExit(); + // Find SLC Agent + ServiceReference sr = null; + while (sr == null) { + sr = bundleContext + .getServiceReference("org.argeo.slc.execution.SlcAgentCli"); + if (System.currentTimeMillis() - begin > timeout) + throw new RuntimeException("Cannot find SLC agent CLI"); + Thread.sleep(100); + } + final Object agentCli = bundleContext.getService(sr); + + // ServiceTracker agentTracker = new ServiceTracker(bundleContext, + // "org.argeo.slc.execution.SlcAgentCli", null); + // agentTracker.open(); + // final Object agentCli = agentTracker.waitForService(30 * 1000); + // if (agentCli == null) + // throw new RuntimeException("Cannot find SLC agent CLI"); + + long duration = System.currentTimeMillis() - begin; + System.out.println("Initialized in " + (duration / 1000) + "s " + + (duration % 1000) + "ms"); + // Run as a privileged action + Subject.doAs(Subject.getSubject(AccessController.getContext()), + new PrivilegedAction() { + + public String run() { + try { + Class[] parameterTypes = { String[].class }; + Method method = agentCli.getClass().getMethod( + "process", parameterTypes); + Object[] methodArgs = { args }; + Object ret = method + .invoke(agentCli, methodArgs); + return ret.toString(); + } catch (Exception e) { + throw new RuntimeException("Cannot run " + + Arrays.toString(args) + " on " + + agentCli, e); + } + } + + }); + + // Shutdown OSGi runtime + framework.stop(); + framework.waitForStop(60 * 1000); + + System.exit(0); } catch (Exception e) { - System.err.println("Unexpected exception when bootstrapping."); e.printStackTrace(); - badExit(); + System.exit(1); + } finally { + if (isTransient && dataDir != null && dataDir.exists()) { + // TODO clean up transient data dir + } + } } @@ -164,44 +204,6 @@ public class SlcMain implements Runnable { new SlcMain(args).run(); } - public void printUsage() { - new HelpFormatter().printHelp(commandName, options, true); - } - - protected static void addProperty(Properties properties, String property) { - int eqIndex = property.indexOf('='); - if (eqIndex == 0) - throw new SlcException("Badly formatted property " + property); - - if (eqIndex > 0) { - String key = property.substring(0, eqIndex); - String value = property.substring(eqIndex + 1); - properties.setProperty(key, value); - - } else { - properties.setProperty(property, "true"); - } - } - - protected static void loadPropertyFile(Properties properties, - String propertyFile) { - FileInputStream in = null; - try { - in = new FileInputStream(propertyFile); - properties.load(in); - } catch (Exception e) { - throw new SlcException("Could not load proeprty file " - + propertyFile); - } finally { - IOUtils.closeQuietly(in); - } - } - - private void badExit() { - printUsage(); - System.exit(1); - } - protected static void info(Object msg) { System.out.println(msg); } @@ -209,4 +211,5 @@ public class SlcMain implements Runnable { protected static void debug(Object msg) { System.out.println(msg); } + }