Package org.rzo.yajsw.os.posix.solaris

Source Code of org.rzo.yajsw.os.posix.solaris.SolarisService

package org.rzo.yajsw.os.posix.solaris;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.rzo.yajsw.Constants;
import org.rzo.yajsw.boot.WrapperLoader;
import org.rzo.yajsw.os.AbstractService;
import org.rzo.yajsw.os.JavaHome;
import org.rzo.yajsw.os.OperatingSystem;
import org.rzo.yajsw.os.posix.Utils;
import org.rzo.yajsw.os.posix.VelocityLog;

public class SolarisService extends AbstractService implements Constants
{
  String  _launchdDir;
  String  _plistTemplate;
  String  _plistFile;
  int    _stopTimeout;
  String  _plistName;

  String  _execCmd;

  String  _confFile;

  Utils  _utils  = new Utils();

  public void init()
  {
    if (_name == null)
    {
      System.out.println("no name for daemon -> abort");
      return;
    }
    _launchdDir = _config.getString("wrapper.launchd.dir", System.getProperty("user.home") + "/Library/LaunchAgents");
    File daemonDir = new File(_launchdDir);
    if (!daemonDir.exists() || !daemonDir.isDirectory())
    {
      System.out.println("Error " + _launchdDir + " : is not a directory");
      return;
    }
    String wrapperJar = WrapperLoader.getWrapperJar().trim();
    String wrapperHome = ".";
    try
    {
      wrapperHome = new File(wrapperJar).getParentFile().getCanonicalPath();
    }
    catch (IOException e1)
    {
      e1.printStackTrace();
    }
    String confFile = _config.getString("wrapper.config");
    String confDir = null;
    if (confFile != null)
    {
      File f = new File(confFile);
      if (f.exists())
        try
        {
          confDir = f.getParentFile().getCanonicalPath();
        }
        catch (IOException e)
        {
        }
    }
    if (confDir == null)
      confDir = wrapperHome + "/conf";
    if (confFile == null)
    {
      System.out.println("no conf file found -> abort");
      return;
    }
    try
    {
      _confFile = new File(confFile).getCanonicalPath();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
    _plistTemplate = _config.getString("wrapper.launchd.template", wrapperHome + "templeates/launchd.plist.vm");
    File daemonTemplate = new File(_plistTemplate);
    if (!daemonTemplate.exists() || !daemonTemplate.isFile())
    {
      System.out.println("Error " + _plistTemplate + " : template file not found");
      return;
    }
    File daemonScript = new File(daemonDir, "wrapper." + getName());
    if (daemonScript.exists())
      System.out.println(daemonScript.getAbsolutePath() + " already exists -> overwrite");

    _plistName = "wrapper." + _name;
    File plistFile = new File(_launchdDir, _plistName + ".plist");
    try
    {
      _plistFile = plistFile.getCanonicalPath();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
    JavaHome javaHome = OperatingSystem.instance().getJavaHome(_config);
    String java = System.clearProperty("java.home") + "/bin/java";
    try
    {
      java = new File(java).getCanonicalPath();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }

    _execCmd = String.format("%1$s -Dwrapper.service=true -Dwrapper.visible=false -jar %2$s -c %3$s", java, wrapperJar, _confFile);

  }

  public boolean install()
  {
    if (_plistFile == null)
    {
      System.out.println("Error : not initialized -> abort");
      return false;
    }
    try
    {
      File daemonTemplate = new File(_plistTemplate);
      VelocityEngine ve = new VelocityEngine();
      ve.setProperty(VelocityEngine.RESOURCE_LOADER, "file");
      ve.setProperty("file.resource.loader.path", daemonTemplate.getParent());
      ve.setProperty("runtime.log.logsystem.class", VelocityLog.class.getCanonicalName());
      ve.init();
      Template t = ve.getTemplate(daemonTemplate.getName());
      VelocityContext context = new VelocityContext();
      context.put("name", _plistName);
      context.put("command", Arrays.asList(_execCmd.split(" ")));
      context.put("autoStart", "AUTOMATIC".equals(_config.getString("wrapper.ntservice.starttype", DEFAULT_SERVICE_START_TYPE)));
      FileWriter writer = new FileWriter(_plistFile);

      t.merge(context, writer);
      writer.flush();
      writer.close();
      _utils.osCommand("launchctl load " + _plistFile, 5000);

    }
    catch (Exception ex)
    {
      ex.printStackTrace();
      return false;
    }
    return isInstalled();
  }

  public boolean isInstalled()
  {
    String sp = String.format(".*\\d+.*%1$s.*", _plistName);
    Pattern p = Pattern.compile(sp, Pattern.DOTALL);
    String list = _utils.osCommand("launchctl list", 5000);
    Matcher m = p.matcher(list);
    return m.matches();
  }

  public boolean isRunning()
  {
    int pid = getPid();
    return pid > 0;
  }

  public boolean start()
  {
    if (isRunning())
    {
      System.out.println("already running");
      return true;
    }
    _utils.osCommand("launchctl start " + _plistName, 5000);
    return isRunning();
  }

  public boolean stop()
  {
    if (isRunning())
    {
      _utils.osCommand("launchctl stop " + _plistName, 5000);
      return !isRunning();
    }
    return true;
  }

  public boolean uninstall()
  {
    if (isRunning())
      stop();
    _utils.osCommand("launchctl unload " + _plistFile, 5000);
    new File(_plistFile).delete();
    return true;
  }

  public int state()
  {
    int result = 0;
    if (isInstalled())
      result |= STATE_INSTALLED;
    if (isRunning())
      result |= STATE_RUNNING;
    return result;
  }

  public int getPid()
  {
    try
    {
      String sp = String.format("(\\d+)\\s*\\-\\s*%1$s", _plistName);
      Pattern p = Pattern.compile(sp, Pattern.DOTALL);
      String list = _utils.osCommand("launchctl list", 5000);
      Matcher m = p.matcher(list);
      m.find();
      int pid = Integer.parseInt(m.group(1));
      return pid;
    }
    catch (Exception ex)
    {
      // ex.printStackTrace();
    }

    return -1;

  }

  public void setLogger(Logger logger)
  {
    super.setLogger(logger);
    _utils.setLog(logger);
  }

}
TOP

Related Classes of org.rzo.yajsw.os.posix.solaris.SolarisService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.