Reorganise the JBoss5 port:

- remove daemonctl, use root startup (following tomcat, geronimo, etc)
- allow arbitrary arguments to be handed to JBoss (long standing bug)
- reorganise the directory structure to follow hier(7)
  * JBOSS_HOME = /usr/local/share/jboss5
  * deployment directory = /var/jboss5
  * log directory = /var/log/jboss5
- Take maintainership
- Bump PORTREVISION

PR:		139372
Submitted by:	Jonathan Chen <jonc@chen.org.nz>
This commit is contained in:
Herve Quiroz 2009-11-18 22:11:46 +00:00
parent 83c73c7572
commit 6e3e974f23
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=244444
8 changed files with 126 additions and 812 deletions

View file

@ -5,123 +5,72 @@
# $FreeBSD$
#
PORTNAME= ${APP_TITLE:L}
PORTNAME= jboss
PORTVERSION= 5.1.0.GA
PORTREVISION= 1
PORTEPOCH= 1
CATEGORIES= java devel
MASTER_SITES= SF/${PORTNAME}/JBoss/JBoss-${PORTVERSION}
DISTNAME= ${PORTNAME}-${PORTVERSION}-src
MAINTAINER= ports@FreeBSD.org
MAINTAINER= jonc@chen.org.nz
COMMENT= Open-source J2EE application server (5.x family)
BUILD_DEPENDS= ant:${PORTSDIR}/devel/apache-ant
LATEST_LINK= jboss5
USE_JAVA= yes
JAVA_VERSION= 1.5+
USE_ANT= yes
DATADIR= ${PREFIX}/share/${UNIQUENAME}
DOCSDIR= ${PREFIX}/share/doc/${UNIQUENAME}
MANUAL_PACKAGE_BUILD= fetches files in build phase
MAKE_ARGS= -buildfile build/build.xml
USE_RC_SUBR= jboss5.sh
SUB_FILES= pkg-install pkg-deinstall pkg-message daemonctl.1 daemonctl.c
SUB_FILES= pkg-install pkg-deinstall pkg-message
PORTDATA= *
.if !defined(NOPORTDOCS)
PORTDOCS= *
.endif
APP_HOME?= ${PREFIX}/${APP_SHORTNAME}
DOCSDIR= ${PREFIX}/share/doc/${LATEST_LINK}
LOG_DIR= ${APP_HOME}/log
APP_TITLE= JBoss
APP_SHORTNAME= ${UNIQUENAME}
CONTROL_SCRIPT_NAME= ${APP_SHORTNAME}ctl
CONTROL_SCRIPT= ${PREFIX}/bin/${CONTROL_SCRIPT_NAME}
CONTROL_SCRIPT_MANPAGE_TITLE= ${CONTROL_SCRIPT_NAME:U}
STARTUP_SCRIPT_NAME= ${APP_SHORTNAME}.sh
STARTUP_SCRIPT= ${PREFIX}/etc/rc.d/${STARTUP_SCRIPT_NAME}
VAR_DIR?= /var
LOG_DIR?= ${VAR_DIR}/log/${UNIQUENAME}
DEPLOY_DIR?= ${VAR_DIR}/${UNIQUENAME}
USER= www
GROUP= www
STDOUT_LOG= ${LOG_DIR}/stdout.log
STDERR_LOG= ${LOG_DIR}/stderr.log
AUTO_START?= NO
STOP_TIMEOUT?= 5
PID_FILE= /var/run/${APP_SHORTNAME}.pid
JAVA_OPTS=
JAVA_CP= bin/run.jar:${JAVA_HOME}/lib/tools.jar
JAVA_MAIN= org.jboss.Main
MAN1= ${CONTROL_SCRIPT_NAME}.1
STOP_TIMEOUT?= 10
PID_FILE= /var/run/${UNIQUENAME}.pid
JBOSSOUTPUT= ${WRKSRC}/build/output/${PORTNAME}-${PORTVERSION}
APP_HOME_FILES= bin client lib server common
APP_HOME_FILES= bin/run.jar client lib common
PKGMESSAGE= ${WRKDIR}/pkg-message
PLIST_FILES= ${CONTROL_SCRIPT:S,^${PREFIX}/,,} \
${STDOUT_LOG:S,^${PREFIX}/,,} \
${STDERR_LOG:S,^${PREFIX}/,,}
SUB_LIST= APP_HOME=${APP_HOME} \
APP_SHORTNAME=${APP_SHORTNAME} \
APP_TITLE=${APP_TITLE} \
CONTROL_SCRIPT=${CONTROL_SCRIPT} \
CONTROL_SCRIPT_MANPAGE_TITLE=${CONTROL_SCRIPT_MANPAGE_TITLE} \
CONTROL_SCRIPT_NAME=${CONTROL_SCRIPT_NAME} \
SUB_LIST= APP_HOME=${DATADIR} \
APP_SHORTNAME=${UNIQUENAME} \
GROUP=${GROUP} \
JAVA=${JAVA} \
JAVA_CP=${JAVA_CP} \
JAVA_HOME=${JAVA_HOME} \
JAVA_MAIN=${JAVA_MAIN} \
JAVA_OPTS=${JAVA_OPTS} \
JAVA_PORT_VERSION=${JAVA_PORT_VERSION} \
JAVA_PORT_OS_DESCRIPTION=${JAVA_PORT_OS_DESCRIPTION} \
JAR_FILE=${JAR_FILE} \
LOG_DIR=${LOG_DIR} \
DEPLOY_DIR=${DEPLOY_DIR} \
PID_FILE=${PID_FILE} \
PKGNAME=${PKGNAME} \
PORTNAME=${PORTNAME} \
PORTVERSION=${PORTVERSION} \
PREFIX=${PREFIX} \
STARTUP_SCRIPT=${STARTUP_SCRIPT} \
STDERR_LOG=${STDERR_LOG} \
STDOUT_LOG=${STDOUT_LOG} \
STOP_TIMEOUT=${STOP_TIMEOUT} \
USER=${USER}
.include <bsd.port.pre.mk>
pre-patch:
@${ECHO_MSG} "Installation settings:"
@${ECHO_MSG} " Destination directory: ${APP_HOME}"
@${ECHO_MSG} " Control program location: ${CONTROL_SCRIPT}"
@${ECHO_MSG} " Startup script location: ${STARTUP_SCRIPT}"
@${ECHO_MSG} " Location of JDK: ${JAVA_HOME}"
@${ECHO_MSG} " Location of Java port: ${JAVA_PORT}"
@${ECHO_MSG} " Startup Java Options: ${JAVA_OPTS}"
@${ECHO_MSG} " Running as (user/group): ${USER}/${GROUP}"
@${ECHO_MSG} " Logfile stdout: ${STDOUT_LOG}"
@${ECHO_MSG} " Logfile stderr: ${STDERR_LOG}"
@${ECHO_MSG} " Starting after install: ${AUTO_START}"
@${ECHO_MSG} " Stop time-out: ${STOP_TIMEOUT} sec."
pre-install:
@${SETENV} PKG_PREFIX=${PREFIX} ${SH} ${PKGINSTALL} ${PKGNAME} PRE-INSTALL
do-install:
cd ${WRKDIR} && ${CC} ${CFLAGS} -o ${CONTROL_SCRIPT_NAME} daemonctl.c
${MKDIR} ${APP_HOME} && ${CHOWN} ${USER}:${GROUP} ${APP_HOME}
${MKDIR} ${LOG_DIR} && ${CHOWN} ${USER}:${GROUP} ${LOG_DIR}
${MKDIR} ${DATADIR}/bin && ${CHOWN} -R ${USER}:${GROUP} ${DATADIR}
${MKDIR} ${DEPLOY_DIR} && ${CHOWN} ${USER}:${GROUP} ${DEPLOY_DIR}
(cd ${JBOSSOUTPUT} && ${FIND} ${APP_HOME_FILES} |\
${CPIO} -pdmu -R ${USER}:${GROUP} ${APP_HOME})
${INSTALL} -o ${USER} -g ${GROUP} -m 06754\
${WRKDIR}/${CONTROL_SCRIPT_NAME} ${CONTROL_SCRIPT}
${INSTALL} -o ${USER} -g ${GROUP} -m 0640 /dev/null ${STDOUT_LOG}
${INSTALL} -o ${USER} -g ${GROUP} -m 0640 /dev/null ${STDERR_LOG}
${CPIO} -pdmu -R ${USER}:${GROUP} ${DATADIR})
(cd ${JBOSSOUTPUT}/server && ${FIND} . |\
${CPIO} -pdmu -R ${USER}:${GROUP} ${DEPLOY_DIR})
${INSTALL} -o ${USER} -g ${GROUP} -m 0640 /dev/null ${PID_FILE}
${INSTALL_MAN} ${WRKDIR}/daemonctl.1 ${MANPREFIX}/man/man1/${CONTROL_SCRIPT_NAME}.1
.if !defined(NOPORTDOCS)
cd ${JBOSSOUTPUT}/docs \
&& ${FIND} . -type d -exec ${MKDIR} ${DOCSDIR}/{} \; \
@ -129,15 +78,12 @@ do-install:
.endif
post-install:
@${FIND} -s ${APP_HOME_FILES:S,^,${JBOSSOUTPUT}/,} -not -type d | \
${SED} -ne 's,^${JBOSSOUTPUT},${APP_HOME:S,${PREFIX}/,,},p' >> ${TMPPLIST}
@${FIND} -s -d ${APP_HOME_FILES:S,^,${JBOSSOUTPUT}/,} -type d | \
${SED} -ne 's,^${JBOSSOUTPUT},@dirrm ${APP_HOME:S,${PREFIX}/,,},p' >> ${TMPPLIST}
@${ECHO_CMD} "@dirrm ${APP_HOME:S,^${PREFIX}/,,}/log" >> ${TMPPLIST}
@${ECHO_CMD} "@dirrm ${APP_HOME:S,^${PREFIX}/,,}" >> ${TMPPLIST}
.if ${AUTO_START} == "YES"
@${CONTROL_SCRIPT} start || true
.endif
@${ECHO_CMD} "@cwd ${VAR_DIR}" >> ${TMPPLIST}
@${FIND} -s ${JBOSSOUTPUT}/server -not -type d | \
${SED} -ne 's,^${JBOSSOUTPUT}/server/,${DEPLOY_DIR:S,^${VAR_DIR}/,,}/,p' >> ${TMPPLIST}
@${FIND} -s -d ${JBOSSOUTPUT}/server -type d | \
${SED} -ne 's,^${JBOSSOUTPUT}/server/,@dirrm ${DEPLOY_DIR:S,^${VAR_DIR}/,,}/,p' >> ${TMPPLIST}
@${ECHO_CMD} "@dirrm ${DEPLOY_DIR:S,^${VAR_DIR}/,,}" >> ${TMPPLIST}
.if !defined(BATCH)
@${CAT} ${PKGMESSAGE}
.endif

View file

@ -1,78 +0,0 @@
.Dd February 21, 2002
.Dt %%CONTROL_SCRIPT_MANPAGE_TITLE%% 1
.Os FreeBSD
.Sh NAME
.Nm %%CONTROL_SCRIPT_NAME%%
.Nd %%APP_TITLE%% server control interface
.Sh SYNOPSIS
.Nm
.Op Fl java-options
.Ar {start|restart|stop}
.Sh DESCRIPTION
The
.Nm
program provides an restricted interface to the %%APP_TITLE%%
application server. The
.Nm
program is only accessible to users in the 'www' group, and will
only invoke the %%JAVA_PORT_OS_DESCRIPTION%% %%JAVA_PORT_VERSION%% JVM.
.Pp
Any Java options listed are handed off directly to the JVM. Any
classpath options will be ignored.
.Pp
The program expects exactly one of the following terminating commands:
.Bl -tag -width indent
.It Ar start
Start %%APP_TITLE%%, if it is not already running.
.It Ar restart
Restart %%APP_TITLE%%. If it is already running, then it will be stopped and
then started right after that. Otherwise it will just be started up.
.It Ar stop
Stop %%APP_TITLE%%, if it is actually running.
.El
.Sh ERRORS
The following error conditions are detected. They will be checked in the
specified order. In each case an error message is printed with the name of the
control program prepended.
.Pp
If no argument is passed, then a simple help message is printed and the
program exists with error code 0.
.Pp
If at least one argument is passed, but it is different from
.Ar start ,
.Ar restart
or
.Ar stop
then the help message is printed as well, and the program exits with error
code 1.
.Pp
The following errors conditions are defined:
.Bl -tag -width indent
.It Em Illegal program argument (error code 1)
.It Em PID file not found (error code 2)
.It Em PID file too large (error code 3)
.It Em PID file contains illegal character (error code 4)
.It Em Kill of process failed (error code 5)
.It Em %%APP_TITLE%% is already running (error code 6)
.It Em %%APP_TITLE%% is not running (error code 7)
.It Em Unable to chdir to the %%APP_TITLE%% home directory (error code 8)
.It Em Unable to open the stdout log file (error code 9)
.It Em Unable to open the stderr log file (error code 10)
.It Em Unable to start %%APP_TITLE%% (error code 11)
.El
.Sh FILES
.Bl -tag -width -indent
.It Pa %%PID_FILE%%
The %%APP_TITLE%% PID file that is used to store the process ID of the
currently running process in. It is emptied as soon as the server is stopped
and filled with the process ID when it is started. It should never be writable
for anyone but
.Em www ,
.It Pa %%STARTUP_SCRIPT%%
A script that starts the
.Nm
program. It is used to start %%APP_TITLE%% at startup time.
.El
.Sh AUTHORS
.An Ernst de Haan Aq znerd@FreeBSD.org
.An Jonathan Chen Aq jonc@chen.org.nz

View file

@ -1,557 +0,0 @@
/*
* -*- mode: Fundamental; tab-width: 4; -*-
* ex:ts=4
*
* Daemon control program, with Java Startup options.
*
* Original by Ernst de Haan <znerd@freebsd.org>
* www/jakarta-tomcat4/files/daemonctl.c
*
* $FreeBSD$
*/
#include <assert.h>
#include <fcntl.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#include <sys/errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/uio.h>
#define TRUE 1
#define FALSE 0
/* The interval in seconds between the checks to make sure the process
died after a kill */
#define STOP_TIME_INTERVAL 1
#define ERR_ILLEGAL_ARGUMENT 1
#define ERR_PID_FILE_NOT_FOUND 2
#define ERR_KILL_FAILED 5
#define ERR_ALREADY_RUNNING 6
#define ERR_NOT_RUNNING 7
#define ERR_CHDIR_TO_APP_HOME 8
#define ERR_ACCESS_JAR_FILE 17
#define ERR_STDOUT_LOGFILE_OPEN 9
#define ERR_STDERR_LOGFILE_OPEN 10
#define ERR_FORK_FAILED 11
#define ERR_STAT_JAVA_HOME 12
#define ERR_JAVA_HOME_NOT_DIR 13
#define ERR_STAT_JAVA_CMD 14
#define ERR_JAVA_CMD_NOT_FILE 15
#define ERR_JAVA_CMD_NOT_EXECUTABLE 16
/*
Function declarations.
*/
static void printUsage (void);
static int readPID (void);
static void writePID (int pid);
static void clearPID (void);
static void start (int javaOpt, char * javaArgs [], int jbossOpt, char * jbossArgs []);
static void stop (void);
static void restart (int javaOpt, char * javaArgs [], int jbossOpt, char * jbossArgs []);
static void logOutput (char *);
/*
Globals
*/
static int isQuiet = FALSE;
static char * optQuiet = "-q", /* quiet option */
* optConfig = "-config"; /* jboss configuration option */
/**
* Main function. This function is called when this program is executed.
*
* @param argc
* the number of arguments plus one, so always greater than 0.
*
* @param argv
* the arguments in an array of character pointers, where the last argument
* element is followed by a NULL element.
*/
int
main (
int argc,
char *argv [])
{
/* Declare variables, like all other good ANSI C programs do :) */
int i, javaOpt, jbossOpt;
char *argument, **javaArgs, **jbossArgs;
/* Parse the arguments */
if (argc < 2)
{
printUsage ();
return 0;
}
/* XXX: Fix for setting up the environment for the java wrapper script */
setuid (geteuid ());
setgid (getegid ());
/*
Build up java and jboss option blocks.
*/
javaOpt = jbossOpt = 0;
for (i = 1; i < argc; i++)
{
if (strcmp (argv [i], optQuiet) == 0)
{
isQuiet = TRUE;
} else if (strcmp (argv [i], optConfig) == 0)
{
jbossOpt += 2;
if (++i >= argc)
{
printUsage ();
return ERR_ILLEGAL_ARGUMENT;
}
} else if (*argv [i] == '-')
{
javaOpt++;
}
}
if (javaOpt == 0)
javaArgs = NULL;
else
{
int j = 0;
javaArgs = malloc (sizeof (char *) * javaOpt);
for (i = 0; i < argc; i++)
{
if (strcmp (argv [i], optQuiet) &&
strcmp (argv [i], optConfig) &&
*argv [i] == '-')
{
javaArgs [j++] = argv [i];
}
}
}
if (jbossOpt == 0)
jbossArgs = NULL;
else
{
int j = 0;
jbossArgs = malloc (sizeof (char *) * jbossOpt);
for (i = 0; i < argc; i++)
{
if (strcmp (argv [i], optConfig) == 0)
{
jbossArgs [j++] = "-c";
jbossArgs [j++] = argv [++i];
}
}
}
/*
Decide on just what to call.
*/
argument = argv [argc - 1];
if (strcmp ("start", argument) == 0)
{
start (javaOpt, javaArgs, jbossOpt, jbossArgs);
} else if (strcmp ("stop", argument) == 0)
{
stop ();
} else if (strcmp ("restart", argument) == 0)
{
restart (javaOpt, javaArgs, jbossOpt, jbossArgs);
} else {
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Illegal argument \"%s\".\n", argument);
printUsage ();
exit (ERR_ILLEGAL_ARGUMENT);
}
return EXIT_SUCCESS;
}
/**
* Prints usage information to stdout.
*/
static void
printUsage (void)
{
printf ("Usage: %%CONTROL_SCRIPT_NAME%% [java-options] [-config jbossconfig] {start|stop|restart}\n");
}
/**
* Reads a PID from the PID file.
*
* @return
* the PID, or -1 if the file was empty.
*/
static int
readPID (void)
{
FILE * file;
int pid;
logOutput (">> Reading PID file (%%PID_FILE%%)...");
file = fopen ("%%PID_FILE%%", "r");
if (!file)
{
logOutput (" [ FAILED ]\n");
perror ("%%CONTROL_SCRIPT_NAME%%: Unable to open %%PID_FILE%% for reading: ");
exit (ERR_PID_FILE_NOT_FOUND);
}
if (fscanf (file, "%d", &pid) < 1)
pid = -1;
fclose (file);
logOutput (" [ DONE ]\n");
return pid;
}
/**
* Writes a process ID to the specified file. The file is identified by a file
* handle.
*
* @param pid
* the PID to store, always greater than 0.
*/
static void
writePID (
int pid)
{
FILE * file;
logOutput (">> Writing PID file...");
file = fopen ("%%PID_FILE%%", "w");
if (!file)
{
logOutput (" [ FAILED ]\n");
perror ("%%CONTROL_SCRIPT_NAME%%: Unable to open %%PID_FILE%% for writing: ");
exit (ERR_PID_FILE_NOT_FOUND);
}
fprintf (file, "%d\n", pid);
fclose (file);
logOutput (" [ DONE ]\n");
}
/**
Truncate the PID file.
*/
static void
clearPID (void)
{
if (truncate ("%%PID_FILE%%", 0) != 0)
{
perror ("%%CONTROL_SCRIPT_NAME%%: Unable to clear %%PID_FILE%%: ");
exit (ERR_PID_FILE_NOT_FOUND);
}
}
/**
* Checks if the specified process is running.
*
* @param pid
* the process id, greater than 0.
*
* @return
* 0 if the specified process is not running, a different value otherwise.
*/
static int
existsProcess (
int pid)
{
int result;
/* Check preconditions */
assert (pid > 0);
/* See if the process exists */
result = kill (pid, 0);
/* If the result is 0, then the process exists */
return result == 0;
}
/**
* Kills the process identified by the specified ID.
*
* @param pid
* the process id, greater than 0.
*/
static void
killProcess (
int pid)
{
int result;
unsigned int waited;
unsigned int forced;
unsigned int interval = STOP_TIME_INTERVAL;
unsigned int timeout = %%STOP_TIMEOUT%%;
/* Check preconditions */
assert (pid > 0);
if (!isQuiet)
printf (">> Terminating process %d...", pid);
result = kill (pid, SIGTERM);
if (result < 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to kill process %d: ", pid);
perror (NULL);
exit (ERR_KILL_FAILED);
}
/* Wait until the process is actually killed */
result = existsProcess (pid);
for (waited=0; result == 1 && waited < timeout; waited += interval)
{
logOutput (".");
fflush (stdout);
sleep (interval);
result = existsProcess (pid);
}
/* If the process still exists, then have no mercy and kill it */
forced = 0;
if (result == 1)
{
/* Force the process to die */
result = kill (pid, SIGKILL);
if (result == 0) {
forced = 1;
logOutput (" [ KILLED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Process %d did not terminate within %%STOP_TIMEOUT%% sec. Killed.\n", pid);
} else if (result != ESRCH) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to kill process %d: ", pid);
perror (NULL);
exit (ERR_KILL_FAILED);
}
}
if (forced == 0) {
logOutput (" [ DONE ]\n");
}
}
/**
* Starts the daemon.
*/
static void
start (
int javaOpt,
char * javaArgs [],
int jbossOpt,
char * jbossArgs [])
{
int i, argc;
char ** argv;
int pid;
int result;
int stdoutLogFile;
int stderrLogFile;
struct stat sb;
pid = readPID ();
logOutput (">> Starting %%APP_TITLE%% %%PORTVERSION%%...");
if (pid != -1)
{
/* Check if the process actually exists */
result = existsProcess (pid);
if (result == 1)
{
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% %%PORTVERSION%% is already running, PID is %d.\n", pid);
exit (ERR_ALREADY_RUNNING);
}
}
/* Check if the JDK home directory is actually a directory */
result = stat ("%%JAVA_HOME%%", &sb);
if (result != 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to stat %%JAVA_HOME%%: ");
perror (NULL);
exit (ERR_STAT_JAVA_HOME);
}
if (!S_ISDIR (sb.st_mode)) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Java home directory %%JAVA_HOME%% is not a directory.\n");
exit (ERR_JAVA_HOME_NOT_DIR);
}
/* Check if the Java command is actually an executable regular file */
result = stat ("%%JAVA%%", &sb);
if (result != 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to stat %%JAVA%%: ");
perror (NULL);
exit (ERR_STAT_JAVA_CMD);
}
if (!S_ISREG (sb.st_mode)) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Java command %%JAVA%% is not a regular file.\n");
exit (ERR_JAVA_CMD_NOT_FILE);
}
result = access ("%%JAVA%%", X_OK);
if (result != 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Java command %%JAVA%% is not executable: ");
perror (NULL);
exit (ERR_JAVA_CMD_NOT_EXECUTABLE);
}
/* Change directory */
result = chdir ("%%APP_HOME%%");
if (result < 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to access directory %%APP_HOME%%: ");
perror (NULL);
exit (ERR_CHDIR_TO_APP_HOME);
}
/* See if the JAR file exists */
result = access ("%%APP_HOME%%/%%JAR_FILE%%", R_OK);
if (result < 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to access JAR file %%APP_HOME%%/%%JAR_FILE%%: ");
perror (NULL);
exit (ERR_ACCESS_JAR_FILE);
}
/* Open the stdout log file */
stdoutLogFile = open ("%%STDOUT_LOG%%", O_WRONLY);
if (stdoutLogFile < 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to open %%STDOUT_LOG%% for writing: ");
perror (NULL);
exit (ERR_STDOUT_LOGFILE_OPEN);
}
lseek (stdoutLogFile, (off_t) 0, SEEK_END);
/* Open the stderr log file */
stderrLogFile = open ("%%STDERR_LOG%%", O_WRONLY);
if (stderrLogFile < 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to open %%STDERR_LOG%% for writing: ");
perror (NULL);
exit (ERR_STDERR_LOGFILE_OPEN);
}
lseek (stderrLogFile, (off_t) 0, SEEK_END);
/* Split this process in two */
switch (pid = fork ())
{
case -1:
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to fork: ");
perror (NULL);
exit (ERR_FORK_FAILED);
break;
case 0:
/* Redirect stdout to log file */
dup2 (stdoutLogFile, STDOUT_FILENO);
/* Redirect stderr to log file */
dup2 (stderrLogFile, STDERR_FILENO);
/* TODO: Support redirection of both stdout and stderr to the same
file using pipe (2) */
/*
Build the argument vector, with the java/jboss options if any.
*/
argv = malloc (sizeof (char *) * (javaOpt + jbossOpt + 5));
argc = 0;
argv [argc++] = "%%JAVA%%";
for (i = 0; i < javaOpt; i++)
argv [argc++] = javaArgs [i];
argv [argc++] = "-cp";
argv [argc++] = "%%JAVA_CP%%";
argv [argc++] = "%%JAVA_MAIN%%";
for (i = 0; i < jbossOpt; i++)
argv [argc++] = jbossArgs [i];
argv [argc++] = NULL;
/* Execute the command */
execv (argv [0], argv);
perror (NULL);
break;
default:
logOutput (" [ DONE ]\n");
writePID (pid);
}
}
/**
* Stops the daemon.
*/
static void
stop (void)
{
int pid;
pid = readPID ();
logOutput (">> Checking if %%APP_TITLE%% %%PORTVERSION%% is running...");
/* If there is a PID, see if the process still exists */
if (pid != -1)
{
int result = kill (pid, 0);
if (result != 0 && errno == ESRCH)
{
clearPID ();
pid = -1;
}
}
/* If there is no running process, produce an error */
if (pid == -1)
{
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% %%PORTVERSION%% is currently not running.\n");
exit (ERR_NOT_RUNNING);
}
logOutput (" [ DONE ]\n");
/* Terminate the process */
killProcess (pid);
clearPID ();
}
/**
* Restarts the process. If it not currently running, then it will fail.
*/
static void
restart (
int javaOpt,
char * javaArgs [],
int jbossOpt,
char * jbossArgs [])
{
stop ();
start (javaOpt, javaArgs, jbossOpt, jbossArgs);
}
/**
Output log to stdout.
*/
static void
logOutput (
char * string)
{
if (!isQuiet)
printf (string);
}

View file

@ -1,6 +1,6 @@
#!/bin/sh
#
# %%APP_TITLE%% startup script.
# %%APP_SHORTNAME%% startup script.
#
# $FreeBSD$
#
@ -9,53 +9,105 @@
# REQUIRE: NETWORKING SERVERS
# Add the following lines to /etc/rc.conf to enable %%APP_SHORTNAME%%:
# %%APP_SHORTNAME%%_enable (bool): Set to "NO" by default.
# Set it to "YES" to enable %%APP_SHORTNAME%%
# %%APP_SHORTNAME%%_flags (str): Set to "-server" by default.
# Extra JVM flags.
# %%APP_SHORTNAME%%_config (str): Set to "" by default
# JBoss server config, eg {all|default|minimal|standard}
# %%APP_SHORTNAME%%_enable (bool): Set to "YES" to enable %%APP_SHORTNAME%%
# %%APP_SHORTNAME%%_jvm_opts (str): Extra JVM flags.
# %%APP_SHORTNAME%%_args (str): Optional arguments to JBoss
# %%APP_SHORTNAME%%_logging (str) JBoss log output. A pipe command may be used.
#
. %%RC_SUBR%%
%%APP_SHORTNAME%%_user="%%USER%%"
%%APP_SHORTNAME%%_logdir="%%LOG_DIR%%"
name="%%APP_SHORTNAME%%"
rcvar=`set_rcvar`
start_cmd="%%APP_SHORTNAME%%_start"
restart_cmd="%%APP_SHORTNAME%%_restart"
pidfile="%%PID_FILE%%"
procname="%%JAVA%%"
load_rc_config $name
[ -z "$%%APP_SHORTNAME%%_enable" ] && %%APP_SHORTNAME%%_enable="NO"
[ -z "$%%APP_SHORTNAME%%_flags" ] && %%APP_SHORTNAME%%_flags="-server"
[ -z "$%%APP_SHORTNAME%%_config" ] && %%APP_SHORTNAME%%_config=""
%%APP_SHORTNAME%%_enable="${%%APP_SHORTNAME%%_enable:-"NO"}"
%%APP_SHORTNAME%%_jvm_opts="${%%APP_SHORTNAME%%_jvm_opts:-"-server -Xms128m -Xmx512m -XX:MaxPermSize=256m -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"}"
%%APP_SHORTNAME%%_logging="${%%APP_SHORTNAME%%_logging:-">> ${%%APP_SHORTNAME%%_logdir}/stdout.log 2>> ${%%APP_SHORTNAME%%_logdir}/stderr.log"}"
start_cmd="%%APP_SHORTNAME%%_start"
stop_cmd="%%APP_SHORTNAME%%_stop"
pidfile="%%PID_FILE%%"
JBOSS_HOME="%%APP_HOME%%"
JBOSS_DEPLOY="%%DEPLOY_DIR%%"
JBOSS_MAIN="org.jboss.Main"
JAVA_OPTS="${%%APP_SHORTNAME%%_jvm_opts} \
-Djboss.server.base.dir=${JBOSS_DEPLOY} \
-Djboss.server.base.url=file://${JBOSS_DEPLOY} \
-Djava.endorsed.dirs=${JBOSS_HOME}/lib/endorsed \
-classpath ${JBOSS_HOME}/bin/run.jar ${JBOSS_MAIN}"
%%APP_SHORTNAME%%_start ()
{
checkyesno %%APP_SHORTNAME%%_enable &&
{
if [ ! -f ${pidfile} ]
then
touch ${pidfile}
chown %%USER%%:%%GROUP%% ${pidfile}
fi
if [ ! -d "${%%APP_SHORTNAME%%_logdir}" ]
then
mkdir -p ${%%APP_SHORTNAME%%_logdir}
chown ${%%APP_SHORTNAME%%_user} ${%%APP_SHORTNAME%%_logdir}
fi
echo "Starting %%APP_SHORTNAME%%."
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} ${%%APP_SHORTNAME%%_configflag} ${%%APP_SHORTNAME%%_config} start
}
echo "Starting %%APP_SHORTNAME%%."
daemon -u ${%%APP_SHORTNAME%%_user} sh -c "java ${JAVA_OPTS} ${%%APP_SHORTNAME%%_args} ${%%APP_SHORTNAME%%_logging} &"
sleep 1 # let daemon(8) and sh(1) finish before executing pgrep(1)
pgrep -U ${%%APP_SHORTNAME%%_user} -f ${JBOSS_MAIN} > ${pidfile}
chown ${%%APP_SHORTNAME%%_user} $pidfile
}
%%APP_SHORTNAME%%_restart ()
%%APP_SHORTNAME%%_stop ()
{
checkyesno %%APP_SHORTNAME%%_enable &&
{
echo "Restarting %%APP_SHORTNAME%%."
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} ${%%APP_SHORTNAME%%_configflag} ${%%APP_SHORTNAME%%_config} restart
}
# Subvert the check_pid_file procname check.
if [ -f ${pidfile} ]
then
read rc_pid junk < $pidfile
if [ ! -z "${rc_pid}" ]
then
procname=`ps -o ucomm= ${rc_pid}`
fi
fi
rc_pid=$(check_pidfile $pidfile *$procname*)
if [ -z "${rc_pid}" ]
then
[ -n "${rc_fast}" ] && return 0
if [ -n "${pidfile}" ]
then
echo "${name} not running? (check ${pidfile})."
else
echo "${name} not running?"
fi
return 1
fi
echo "Stopping ${name}."
kill ${rc_pid} 2> /dev/null
jboss_wait_max_for_pid %%STOP_TIMEOUT%% ${rc_pid}
kill -KILL ${rc_pid} 2> /dev/null && echo "Killed."
rm -f ${pidfile}
}
load_rc_config $name
[ -n "${%%APP_SHORTNAME%%_config}" ] && %%APP_SHORTNAME%%_configflag="-config"
jboss_wait_max_for_pid ()
{
_timeout=$1
shift
_pid=$1
_prefix=
while [ $_timeout -gt 0 ]
do
echo -n ${_prefix:-"Waiting (max $_timeout secs) for PIDS: "}$_pid
_prefix=", "
sleep 2
kill -0 $_pid 2> /dev/null || break
_timeout=$(($_timeout-2))
done
if [ -n "$_prefix" ]; then
echo "."
fi
}
run_rc_command "$1"

View file

@ -1,12 +0,0 @@
--- ./tools/etc/buildmagic/build-common.xml.orig Sun Mar 25 20:25:52 2007
+++ ./tools/etc/buildmagic/build-common.xml Sun Mar 25 20:27:18 2007
@@ -20,6 +20,7 @@
<fail unless="buildmagic.ant.compatible">
Unsupported Ant version:
${ant.version}
- Please install a version which is compatible with Ant ${buildmagic.ant16.baseversion}.
+ Please install a version which is compatible with Ant ${buildmagic.ant16.baseversion}
+ or ${buildmagic.ant17.baseversion}.
</fail>
<!-- JDK Detection -->

View file

@ -1,39 +0,0 @@
--- ./build/build.xml.orig Sun Mar 25 21:29:21 2007
+++ ./build/build.xml Sun Mar 25 21:30:56 2007
@@ -40,6 +40,36 @@
-->
<target name="init" unless="init.disable" depends="_buildmagic:init">
+ <!-- Make sure we have the right version of Ant -->
+ <property name="buildmagic.ant15.baseversion" value="1.5"/>
+ <property name="buildmagic.ant16.baseversion" value="1.6"/>
+ <property name="buildmagic.ant17.baseversion" value="1.7"/>
+ <!--
+ | Add new conditions for other supported Ant versions when they
+ | become avaialble.
+ -->
+
+ <condition property="buildmagic.ant.compatible">
+ <or>
+ <contains string="${ant.version}"
+ substring="Ant version ${buildmagic.ant15.baseversion}"/>
+ <contains string="${ant.version}"
+ substring="Ant version ${buildmagic.ant16.baseversion}"/>
+ <contains string="${ant.version}"
+ substring="Ant version ${buildmagic.ant17.baseversion}"/>
+ </or>
+ </condition>
+
+ <fail unless="buildmagic.ant.compatible">
+
+ Unsupported Ant version:
+
+ ${ant.version}
+
+ Please install a version which is compatible with Ant ${buildmagic.ant15.baseversion} or ${buildmagic.ant16.baseversion}
+ or ${buildmagic.ant17.baseversion}.
+
+ </fail>
</target>

View file

@ -1,7 +1,5 @@
%%PKGNAME%% has been installed in %%APP_HOME%%.
%%PKGNAME%% has been installed in %%DATADIR%%.
If a user should be able to use %%CONTROL_SCRIPT_NAME%%, put it in the group '%%GROUP%%'.
The deployment directory for applications is %%DEPLOY_DIR%%.
Use 'man %%CONTROL_SCRIPT_NAME%%' for information about starting and stopping %%APP_TITLE%%.
To run the %%APP_TITLE%% server from startup, add %%APP_SHORTNAME%%_enable="YES" in your /etc/rc.conf. Extra options can be found in the startup script.
To run the %%PORTNAME%% server from startup, add %%APP_SHORTNAME%%_enable="YES" in your /etc/rc.conf. Extra options can be found in the startup script.

View file

@ -1,13 +1,17 @@
JBoss AS 5 GA will be Java EE 5 certified and will include the following core
technologies.
This is the final release of the JBoss 5.0 series for the Java EE5 codebase
that fully complies with the Java EE5 conformance testing certification
requirements.
* JBoss Microcontainer - POJO based microcontainer removing the dependency
on JMX
Many key features of JBoss 5 are provided by integrating other standalone
JBoss projects:
* JBoss Microcontainer 2.0.2 - POJO based microcontainer removing the
dependency on JMX
* EJB 3.0 - Fully certified as part of the Java EE 5 compliant JBoss AS 5
* Hibernate 3.2 - JPA certified
* JBoss Messaging 1.2 - the next generation messaging platform from JBoss
* Hibernate 3.3.1 - JPA certified
* JBoss Messaging 1.4.1 - the next generation messaging platform from JBoss
with HA features.
* JBoss WebServices 2.0 - new custom built JAX-WS compliant WebServices
* JBoss WebServices 3.0.4 - new custom built JAX-WS compliant WebServices
stack.
* JBoss Seam 1.1 - a powerful new application framework to build next
generation Web 2.0 applications by unifying and integrating popular