1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-23 00:43:28 +00:00

- Fix cold-boot startup failure

- Add note on starting up JBoss4 with rcNG
- Add new "-config" option to jboss4ctl for JBoss4 startup config
- Move some notices in pkg-message [1]

PR:		75345
Submitted by:	maintainer
Approved by:	maintainer [1]
This commit is contained in:
Herve Quiroz 2004-12-22 20:44:23 +00:00
parent 5fb6091f09
commit f1aa6ae264
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=124852
8 changed files with 338 additions and 350 deletions

View File

@ -7,7 +7,7 @@
PORTNAME= ${APP_TITLE:L}
PORTVERSION= 4.0.0
PORTREVISION= 1
PORTREVISION= 2
CATEGORIES= java
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}
@ -52,7 +52,7 @@ JAVA_OPTS=
JAVA_CP= bin/run.jar:${JAVA_HOME}/lib/tools.jar
JAVA_MAIN= org.jboss.Main
DAEMONCTL_DIR= ${FILESDIR}
DAEMONCTL_FILES=daemonctl.c daemonctl.1 startup.sh
DAEMONCTL_FILES=daemonctl.c daemonctl.1 startup.sh pkg-message
MAN1= ${CONTROL_SCRIPT_NAME}.1
JBOSSOUTPUT= ${WRKSRC}/build/output/${PORTNAME}-${PORTVERSION}
@ -63,6 +63,8 @@ PLIST_FILES= ${CONTROL_SCRIPT:S,^${PREFIX}/,,} \
${STDOUT_LOG:S,^${PREFIX}/,,} \
${STDERR_LOG:S,^${PREFIX}/,,}
PKGMESSAGE= ${WRKDIR}/pkg-message.fmt
.include <bsd.port.pre.mk>
do-configure:
@ -86,6 +88,7 @@ do-configure:
-e "s|%%JAR_FILE%%|${JAR_FILE}|g;" \
-e "s|%%LOG_DIR%%|${LOG_DIR}|g;" \
-e "s|%%PID_FILE%%|${PID_FILE}|g;" \
-e "s|%%PKGNAME%%|${PKGNAME}|g;" \
-e "s|%%PORTNAME%%|${PORTNAME}|g;" \
-e "s|%%PORTVERSION%%|${PORTVERSION}|g;" \
-e "s|%%PREFIX%%|${PREFIX}|g;" \
@ -94,6 +97,7 @@ do-configure:
-e "s|%%STDOUT_LOG%%|${STDOUT_LOG}|g;" \
-e "s|%%STOP_TIMEOUT%%|${STOP_TIMEOUT}|g;" \
-e "s|%%USER%%|${USER}|g;" ${DAEMONCTL_FILES})
@${FMT} -s 80 ${WRKDIR}/pkg-message >${PKGMESSAGE}
post-configure:
@${ECHO_MSG} "Installation settings:"
@ -141,11 +145,11 @@ post-install:
${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}
@${ECHO_MSG} "${PKGNAME} has been installed in ${APP_HOME}."
@${ECHO_MSG} "If a user should be able to use ${CONTROL_SCRIPT_NAME}, put it in the group ${GROUP}."
@${ECHO_MSG} "Use 'man ${CONTROL_SCRIPT_NAME}' for information about starting and stopping ${PORTNAME}."
.if ${AUTO_START} == "YES"
@${CONTROL_SCRIPT} start || true
.endif
.if !defined(BATCH)
@${CAT} ${PKGMESSAGE}
.endif
.include <bsd.port.post.mk>

View File

@ -7,7 +7,7 @@
* Original by Ernst de Haan <znerd@freebsd.org>
* www/jakarta-tomcat4/files/daemonctl.c
*
* $FreeBSD: /tmp/pcvs/ports/java/jboss4/files/Attic/daemonctl.c,v 1.2 2004-12-18 02:11:35 hq Exp $
* $FreeBSD: /tmp/pcvs/ports/java/jboss4/files/Attic/daemonctl.c,v 1.3 2004-12-22 20:44:23 hq Exp $
*/
#include <assert.h>
@ -27,17 +27,12 @@
#define TRUE 1
#define FALSE 0
/* The maximum size of the PID file, in bytes */
#define MAX_FILE_SIZE 32
/* 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_PID_FILE_TOO_LARGE 3
#define ERR_PID_FILE_CONTAINS_ILLEGAL_CHAR 4
#define ERR_KILL_FAILED 5
#define ERR_ALREADY_RUNNING 6
#define ERR_NOT_RUNNING 7
@ -56,18 +51,20 @@
Function declarations.
*/
static void printUsage (void);
static int openPIDFile (void);
static int readPID (int);
static void writePID (int file, int pid);
static void start (int optcount, char * opts []);
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 optcount, char * opts []);
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.
@ -84,10 +81,9 @@ main (
int argc,
char *argv [])
{
/* Declare variables, like all other good ANSI C programs do :) */
int i, jopt;
char *argument, **jargs;
int i, javaOpt, jbossOpt;
char *argument, **javaArgs, **jbossArgs;
/* Parse the arguments */
if (argc < 2)
@ -101,26 +97,58 @@ main (
setgid (getegid ());
/*
Build up java-option block.
Build up java and jboss option blocks.
*/
jopt = 0;
javaOpt = jbossOpt = 0;
for (i = 1; i < argc; i++)
{
if (strcmp (argv [i], "-q") == 0)
if (strcmp (argv [i], optQuiet) == 0)
{
isQuiet = TRUE;
else if (*argv [i] == '-')
jopt++;
} else if (strcmp (argv [i], optConfig) == 0)
{
jbossOpt += 2;
if (++i >= argc)
{
printUsage ();
return ERR_ILLEGAL_ARGUMENT;
}
} else if (*argv [i] == '-')
{
javaOpt++;
}
}
if (jopt == 0)
jargs = NULL;
if (javaOpt == 0)
javaArgs = NULL;
else
{
int j = 0;
jargs = malloc (sizeof (char *) * jopt);
javaArgs = malloc (sizeof (char *) * javaOpt);
for (i = 0; i < argc; i++)
{
if (strcmp (argv [i], "-q") && *argv [i] == '-')
jargs [j++] = argv [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];
}
}
}
@ -130,14 +158,15 @@ main (
argument = argv [argc - 1];
if (strcmp ("start", argument) == 0)
{
start (jopt, jargs);
start (javaOpt, javaArgs, jbossOpt, jbossArgs);
} else if (strcmp ("stop", argument) == 0)
{
stop ();
} else if (strcmp ("restart", argument) == 0)
{
restart (jopt, jargs);
restart (javaOpt, javaArgs, jbossOpt, jbossArgs);
} else {
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Illegal argument \"%s\".\n", argument);
@ -145,134 +174,85 @@ main (
exit (ERR_ILLEGAL_ARGUMENT);
}
return 0;
return EXIT_SUCCESS;
}
/**
* Prints usage information to stdout.
*/
static void
printUsage (void)
{
printf ("Usage: %%CONTROL_SCRIPT_NAME%% [java-options] {start|stop|restart}\n");
printf ("Usage: %%CONTROL_SCRIPT_NAME%% [java-options] [-config jbossconfig] {start|stop|restart}\n");
}
/**
* Attempts to open the PID file. If that file is successfully opened, then
* the file handle (an int) will be returned.
*
* @return
* the file handle.
*/
static int
openPIDFile (void)
{
int file;
/* Attempt to open the PID file */
file = open ("%%PID_FILE%%", O_RDWR);
if (file < 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to open %%PID_FILE%% for reading and writing: ");
perror (NULL);
exit (ERR_PID_FILE_NOT_FOUND);
}
return file;
}
/**
* Reads a PID from the specified file. The file is identified by a file
* handle.
*
* @param file
* the file handle.
* Reads a PID from the PID file.
*
* @return
* the PID, or -1 if the file was empty.
*/
static int
readPID (
int file)
readPID (void)
{
char *buffer;
int hadNewline = 0;
unsigned int count;
unsigned int i;
FILE * file;
int pid;
/* Read the PID file contents */
buffer = (char *) malloc ((MAX_FILE_SIZE + 1) * sizeof (char));
count = read (file, buffer, MAX_FILE_SIZE + 1);
if (count > MAX_FILE_SIZE) {
logOutput (">> Reading PID file (%%PID_FILE%%)...");
file = fopen ("%%PID_FILE%%", "r");
if (!file)
{
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: The file %%PID_FILE%% contains more than %d bytes.\n", MAX_FILE_SIZE);
exit (ERR_PID_FILE_TOO_LARGE);
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);
/* Convert the bytes to a number */
pid = 0;
for (i=0; i<count; i++) {
char c = buffer[i];
if (c >= '0' && c <= '9') {
char digit = c - '0';
pid *= 10;
pid += digit;
} else if (i == (count - 1) && c == '\n') {
/* XXX: Ignore a newline at the end of the file */
hadNewline = 1;
} else {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: The file %%PID_FILE%% contains an illegal character (%d) at position %d.\n", c, i);
exit (ERR_PID_FILE_CONTAINS_ILLEGAL_CHAR);
}
}
logOutput (" [ DONE ]\n");
if (count == 0 || (count == 1 && hadNewline == 1)) {
return -1;
}
return pid;
}
/**
* Writes a process ID to the specified file. The file is identified by a file
* handle.
*
* @param file
* the file handle, always greater than 0.
*
* @param pid
* the PID to store, always greater than 0.
*/
static void
writePID (
int file,
int pid)
{
char *buffer;
int nbytes;
/* Check preconditions */
assert (file > 0);
assert (pid > 0);
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);
lseek (file, (off_t) 0, SEEK_SET);
ftruncate (file, (off_t) 0);
nbytes = asprintf (&buffer, "%d\n", pid);
write (file, buffer, nbytes);
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.
@ -287,7 +267,6 @@ static int
existsProcess (
int pid)
{
int result;
/* Check preconditions */
@ -297,14 +276,9 @@ existsProcess (
result = kill (pid, 0);
/* If the result is 0, then the process exists */
if (result == 0) {
return 1;
} else {
return 0;
}
return result == 0;
}
/**
* Kills the process identified by the specified ID.
*
@ -315,7 +289,6 @@ static void
killProcess (
int pid)
{
int result;
unsigned int waited;
unsigned int forced;
@ -347,13 +320,13 @@ killProcess (
/* If the process still exists, then have no mercy and kill it */
forced = 0;
if (result == 1) {
if (result == 1)
{
/* Force the process to die */
result = kill (pid, SIGKILL);
if (result == 0) {
forced = 1;
logOutput (" [ DONE ]\n");
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");
@ -373,27 +346,28 @@ killProcess (
*/
static void
start (
int optcount,
char * opts [])
int javaOpt,
char * javaArgs [],
int jbossOpt,
char * jbossArgs [])
{
int file;
int i, argc;
char ** argv;
int pid;
int result;
int stdoutLogFile;
int stderrLogFile;
struct stat sb;
/* Open and read the PID file */
logOutput (">> Reading PID file (%%PID_FILE%%)...");
file = openPIDFile ();
pid = readPID (file);
pid = readPID ();
logOutput (">> Starting %%APP_TITLE%% %%PORTVERSION%%...");
if (pid != -1) {
if (pid != -1)
{
/* Check if the process actually exists */
result = existsProcess (pid);
if (result == 1) {
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);
@ -474,19 +448,16 @@ start (
lseek (stderrLogFile, (off_t) 0, SEEK_END);
/* Split this process in two */
pid = fork ();
if (pid == -1) {
switch (pid = fork ())
{
case -1:
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to fork: ");
perror (NULL);
exit (ERR_FORK_FAILED);
}
if (pid == 0)
{
int i, argc;
char **argv;
break;
case 0:
/* Redirect stdout to log file */
dup2 (stdoutLogFile, STDOUT_FILENO);
@ -494,29 +465,31 @@ start (
dup2 (stderrLogFile, STDERR_FILENO);
/* TODO: Support redirection of both stdout and stderr to the same
file using pipe (2) */
file using pipe (2) */
/*
Build the argument vector, with the java-options if any.
Build the argument vector, with the java/jboss options if any.
*/
argv = malloc (sizeof (char *) * (optcount + 5));
argv = malloc (sizeof (char *) * (javaOpt + jbossOpt + 5));
argc = 0;
argv [argc++] = "%%JAVA%%";
for (i = 0; i < optcount; i++)
argv [argc++] = opts [i];
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);
} else
{
break;
default:
logOutput (" [ DONE ]\n");
writePID (file, pid);
writePID (pid);
}
}
@ -526,28 +499,26 @@ start (
static void
stop (void)
{
int file;
int pid;
/* Open and read the PID file */
logOutput (">> Reading PID file (%%PID_FILE%%)...");
file = openPIDFile ();
pid = readPID (file);
pid = readPID ();
logOutput (">> Checking if %%APP_TITLE%% %%PORTVERSION%% is running...");
/* If there is a PID, see if the process still exists */
if (pid != -1) {
if (pid != -1)
{
int result = kill (pid, 0);
if (result != 0 && errno == ESRCH) {
ftruncate (file, (off_t) 0);
if (result != 0 && errno == ESRCH)
{
clearPID ();
pid = -1;
}
}
/* If there is no running process, produce an error */
if (pid == -1) {
if (pid == -1)
{
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% %%PORTVERSION%% is currently not running.\n");
exit (ERR_NOT_RUNNING);
@ -556,9 +527,7 @@ stop (void)
/* Terminate the process */
killProcess (pid);
/* Clear the PID file */
ftruncate (file, (off_t) 0);
clearPID ();
}
@ -567,11 +536,13 @@ stop (void)
*/
static void
restart (
int optcount,
char * opts [])
int javaOpt,
char * javaArgs [],
int jbossOpt,
char * jbossArgs [])
{
stop ();
start (optcount, opts);
start (javaOpt, javaArgs, jbossOpt, jbossArgs);
}
/**

View File

@ -0,0 +1,7 @@
%%PKGNAME%% has been installed in %%APP_HOME%%.
If a user should be able to use %%CONTROL_SCRIPT_NAME%%, put it in the group '%%GROUP%%'.
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.

View File

@ -1,10 +1,8 @@
#!/bin/sh
# -*- mode: Fundamental; tab-width: 4; -*-
# ex:ts=4
#
# %%APP_TITLE%% startup script.
#
# $FreeBSD: /tmp/pcvs/ports/java/jboss4/files/Attic/startup.sh,v 1.2 2004-12-18 02:11:35 hq Exp $
# $FreeBSD: /tmp/pcvs/ports/java/jboss4/files/Attic/startup.sh,v 1.3 2004-12-22 20:44:23 hq Exp $
#
# PROVIDE: %%APP_SHORTNAME%%
@ -15,6 +13,8 @@
# 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}
#
. %%RC_SUBR%%
@ -28,19 +28,31 @@ procname="%%JAVA%%"
[ -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%%_start ()
{
checkyesno %%APP_SHORTNAME%%_enable &&
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} start &&
{
if [ ! -f ${pidfile} ]
then
touch ${pidfile}
chown %%USER%%:%%GROUP%% ${pidfile}
fi
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} ${%%APP_SHORTNAME%%_configflag} ${%%APP_SHORTNAME%%_config} start &&
echo -n " %%APP_SHORTNAME%%"
}
}
%%APP_SHORTNAME%%_restart ()
{
checkyesno %%APP_SHORTNAME%%_enable &&
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} restart
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} ${%%APP_SHORTNAME%%_configflag} ${%%APP_SHORTNAME%%_config} restart
}
load_rc_config $name
[ -n "${%%APP_SHORTNAME%%_config}" ] && %%APP_SHORTNAME%%_configflag="-config"
run_rc_command "$1"

View File

@ -7,7 +7,7 @@
PORTNAME= ${APP_TITLE:L}
PORTVERSION= 4.0.0
PORTREVISION= 1
PORTREVISION= 2
CATEGORIES= java
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}
@ -52,7 +52,7 @@ JAVA_OPTS=
JAVA_CP= bin/run.jar:${JAVA_HOME}/lib/tools.jar
JAVA_MAIN= org.jboss.Main
DAEMONCTL_DIR= ${FILESDIR}
DAEMONCTL_FILES=daemonctl.c daemonctl.1 startup.sh
DAEMONCTL_FILES=daemonctl.c daemonctl.1 startup.sh pkg-message
MAN1= ${CONTROL_SCRIPT_NAME}.1
JBOSSOUTPUT= ${WRKSRC}/build/output/${PORTNAME}-${PORTVERSION}
@ -63,6 +63,8 @@ PLIST_FILES= ${CONTROL_SCRIPT:S,^${PREFIX}/,,} \
${STDOUT_LOG:S,^${PREFIX}/,,} \
${STDERR_LOG:S,^${PREFIX}/,,}
PKGMESSAGE= ${WRKDIR}/pkg-message.fmt
.include <bsd.port.pre.mk>
do-configure:
@ -86,6 +88,7 @@ do-configure:
-e "s|%%JAR_FILE%%|${JAR_FILE}|g;" \
-e "s|%%LOG_DIR%%|${LOG_DIR}|g;" \
-e "s|%%PID_FILE%%|${PID_FILE}|g;" \
-e "s|%%PKGNAME%%|${PKGNAME}|g;" \
-e "s|%%PORTNAME%%|${PORTNAME}|g;" \
-e "s|%%PORTVERSION%%|${PORTVERSION}|g;" \
-e "s|%%PREFIX%%|${PREFIX}|g;" \
@ -94,6 +97,7 @@ do-configure:
-e "s|%%STDOUT_LOG%%|${STDOUT_LOG}|g;" \
-e "s|%%STOP_TIMEOUT%%|${STOP_TIMEOUT}|g;" \
-e "s|%%USER%%|${USER}|g;" ${DAEMONCTL_FILES})
@${FMT} -s 80 ${WRKDIR}/pkg-message >${PKGMESSAGE}
post-configure:
@${ECHO_MSG} "Installation settings:"
@ -141,11 +145,11 @@ post-install:
${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}
@${ECHO_MSG} "${PKGNAME} has been installed in ${APP_HOME}."
@${ECHO_MSG} "If a user should be able to use ${CONTROL_SCRIPT_NAME}, put it in the group ${GROUP}."
@${ECHO_MSG} "Use 'man ${CONTROL_SCRIPT_NAME}' for information about starting and stopping ${PORTNAME}."
.if ${AUTO_START} == "YES"
@${CONTROL_SCRIPT} start || true
.endif
.if !defined(BATCH)
@${CAT} ${PKGMESSAGE}
.endif
.include <bsd.port.post.mk>

View File

@ -7,7 +7,7 @@
* Original by Ernst de Haan <znerd@freebsd.org>
* www/jakarta-tomcat4/files/daemonctl.c
*
* $FreeBSD: /tmp/pcvs/ports/java/jboss5/files/Attic/daemonctl.c,v 1.2 2004-12-18 02:11:35 hq Exp $
* $FreeBSD: /tmp/pcvs/ports/java/jboss5/files/Attic/daemonctl.c,v 1.3 2004-12-22 20:44:23 hq Exp $
*/
#include <assert.h>
@ -27,17 +27,12 @@
#define TRUE 1
#define FALSE 0
/* The maximum size of the PID file, in bytes */
#define MAX_FILE_SIZE 32
/* 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_PID_FILE_TOO_LARGE 3
#define ERR_PID_FILE_CONTAINS_ILLEGAL_CHAR 4
#define ERR_KILL_FAILED 5
#define ERR_ALREADY_RUNNING 6
#define ERR_NOT_RUNNING 7
@ -56,18 +51,20 @@
Function declarations.
*/
static void printUsage (void);
static int openPIDFile (void);
static int readPID (int);
static void writePID (int file, int pid);
static void start (int optcount, char * opts []);
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 optcount, char * opts []);
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.
@ -84,10 +81,9 @@ main (
int argc,
char *argv [])
{
/* Declare variables, like all other good ANSI C programs do :) */
int i, jopt;
char *argument, **jargs;
int i, javaOpt, jbossOpt;
char *argument, **javaArgs, **jbossArgs;
/* Parse the arguments */
if (argc < 2)
@ -101,26 +97,58 @@ main (
setgid (getegid ());
/*
Build up java-option block.
Build up java and jboss option blocks.
*/
jopt = 0;
javaOpt = jbossOpt = 0;
for (i = 1; i < argc; i++)
{
if (strcmp (argv [i], "-q") == 0)
if (strcmp (argv [i], optQuiet) == 0)
{
isQuiet = TRUE;
else if (*argv [i] == '-')
jopt++;
} else if (strcmp (argv [i], optConfig) == 0)
{
jbossOpt += 2;
if (++i >= argc)
{
printUsage ();
return ERR_ILLEGAL_ARGUMENT;
}
} else if (*argv [i] == '-')
{
javaOpt++;
}
}
if (jopt == 0)
jargs = NULL;
if (javaOpt == 0)
javaArgs = NULL;
else
{
int j = 0;
jargs = malloc (sizeof (char *) * jopt);
javaArgs = malloc (sizeof (char *) * javaOpt);
for (i = 0; i < argc; i++)
{
if (strcmp (argv [i], "-q") && *argv [i] == '-')
jargs [j++] = argv [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];
}
}
}
@ -130,14 +158,15 @@ main (
argument = argv [argc - 1];
if (strcmp ("start", argument) == 0)
{
start (jopt, jargs);
start (javaOpt, javaArgs, jbossOpt, jbossArgs);
} else if (strcmp ("stop", argument) == 0)
{
stop ();
} else if (strcmp ("restart", argument) == 0)
{
restart (jopt, jargs);
restart (javaOpt, javaArgs, jbossOpt, jbossArgs);
} else {
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Illegal argument \"%s\".\n", argument);
@ -145,134 +174,85 @@ main (
exit (ERR_ILLEGAL_ARGUMENT);
}
return 0;
return EXIT_SUCCESS;
}
/**
* Prints usage information to stdout.
*/
static void
printUsage (void)
{
printf ("Usage: %%CONTROL_SCRIPT_NAME%% [java-options] {start|stop|restart}\n");
printf ("Usage: %%CONTROL_SCRIPT_NAME%% [java-options] [-config jbossconfig] {start|stop|restart}\n");
}
/**
* Attempts to open the PID file. If that file is successfully opened, then
* the file handle (an int) will be returned.
*
* @return
* the file handle.
*/
static int
openPIDFile (void)
{
int file;
/* Attempt to open the PID file */
file = open ("%%PID_FILE%%", O_RDWR);
if (file < 0) {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to open %%PID_FILE%% for reading and writing: ");
perror (NULL);
exit (ERR_PID_FILE_NOT_FOUND);
}
return file;
}
/**
* Reads a PID from the specified file. The file is identified by a file
* handle.
*
* @param file
* the file handle.
* Reads a PID from the PID file.
*
* @return
* the PID, or -1 if the file was empty.
*/
static int
readPID (
int file)
readPID (void)
{
char *buffer;
int hadNewline = 0;
unsigned int count;
unsigned int i;
FILE * file;
int pid;
/* Read the PID file contents */
buffer = (char *) malloc ((MAX_FILE_SIZE + 1) * sizeof (char));
count = read (file, buffer, MAX_FILE_SIZE + 1);
if (count > MAX_FILE_SIZE) {
logOutput (">> Reading PID file (%%PID_FILE%%)...");
file = fopen ("%%PID_FILE%%", "r");
if (!file)
{
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: The file %%PID_FILE%% contains more than %d bytes.\n", MAX_FILE_SIZE);
exit (ERR_PID_FILE_TOO_LARGE);
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);
/* Convert the bytes to a number */
pid = 0;
for (i=0; i<count; i++) {
char c = buffer[i];
if (c >= '0' && c <= '9') {
char digit = c - '0';
pid *= 10;
pid += digit;
} else if (i == (count - 1) && c == '\n') {
/* XXX: Ignore a newline at the end of the file */
hadNewline = 1;
} else {
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: The file %%PID_FILE%% contains an illegal character (%d) at position %d.\n", c, i);
exit (ERR_PID_FILE_CONTAINS_ILLEGAL_CHAR);
}
}
logOutput (" [ DONE ]\n");
if (count == 0 || (count == 1 && hadNewline == 1)) {
return -1;
}
return pid;
}
/**
* Writes a process ID to the specified file. The file is identified by a file
* handle.
*
* @param file
* the file handle, always greater than 0.
*
* @param pid
* the PID to store, always greater than 0.
*/
static void
writePID (
int file,
int pid)
{
char *buffer;
int nbytes;
/* Check preconditions */
assert (file > 0);
assert (pid > 0);
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);
lseek (file, (off_t) 0, SEEK_SET);
ftruncate (file, (off_t) 0);
nbytes = asprintf (&buffer, "%d\n", pid);
write (file, buffer, nbytes);
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.
@ -287,7 +267,6 @@ static int
existsProcess (
int pid)
{
int result;
/* Check preconditions */
@ -297,14 +276,9 @@ existsProcess (
result = kill (pid, 0);
/* If the result is 0, then the process exists */
if (result == 0) {
return 1;
} else {
return 0;
}
return result == 0;
}
/**
* Kills the process identified by the specified ID.
*
@ -315,7 +289,6 @@ static void
killProcess (
int pid)
{
int result;
unsigned int waited;
unsigned int forced;
@ -347,13 +320,13 @@ killProcess (
/* If the process still exists, then have no mercy and kill it */
forced = 0;
if (result == 1) {
if (result == 1)
{
/* Force the process to die */
result = kill (pid, SIGKILL);
if (result == 0) {
forced = 1;
logOutput (" [ DONE ]\n");
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");
@ -373,27 +346,28 @@ killProcess (
*/
static void
start (
int optcount,
char * opts [])
int javaOpt,
char * javaArgs [],
int jbossOpt,
char * jbossArgs [])
{
int file;
int i, argc;
char ** argv;
int pid;
int result;
int stdoutLogFile;
int stderrLogFile;
struct stat sb;
/* Open and read the PID file */
logOutput (">> Reading PID file (%%PID_FILE%%)...");
file = openPIDFile ();
pid = readPID (file);
pid = readPID ();
logOutput (">> Starting %%APP_TITLE%% %%PORTVERSION%%...");
if (pid != -1) {
if (pid != -1)
{
/* Check if the process actually exists */
result = existsProcess (pid);
if (result == 1) {
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);
@ -474,19 +448,16 @@ start (
lseek (stderrLogFile, (off_t) 0, SEEK_END);
/* Split this process in two */
pid = fork ();
if (pid == -1) {
switch (pid = fork ())
{
case -1:
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to fork: ");
perror (NULL);
exit (ERR_FORK_FAILED);
}
if (pid == 0)
{
int i, argc;
char **argv;
break;
case 0:
/* Redirect stdout to log file */
dup2 (stdoutLogFile, STDOUT_FILENO);
@ -494,29 +465,31 @@ start (
dup2 (stderrLogFile, STDERR_FILENO);
/* TODO: Support redirection of both stdout and stderr to the same
file using pipe (2) */
file using pipe (2) */
/*
Build the argument vector, with the java-options if any.
Build the argument vector, with the java/jboss options if any.
*/
argv = malloc (sizeof (char *) * (optcount + 5));
argv = malloc (sizeof (char *) * (javaOpt + jbossOpt + 5));
argc = 0;
argv [argc++] = "%%JAVA%%";
for (i = 0; i < optcount; i++)
argv [argc++] = opts [i];
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);
} else
{
break;
default:
logOutput (" [ DONE ]\n");
writePID (file, pid);
writePID (pid);
}
}
@ -526,28 +499,26 @@ start (
static void
stop (void)
{
int file;
int pid;
/* Open and read the PID file */
logOutput (">> Reading PID file (%%PID_FILE%%)...");
file = openPIDFile ();
pid = readPID (file);
pid = readPID ();
logOutput (">> Checking if %%APP_TITLE%% %%PORTVERSION%% is running...");
/* If there is a PID, see if the process still exists */
if (pid != -1) {
if (pid != -1)
{
int result = kill (pid, 0);
if (result != 0 && errno == ESRCH) {
ftruncate (file, (off_t) 0);
if (result != 0 && errno == ESRCH)
{
clearPID ();
pid = -1;
}
}
/* If there is no running process, produce an error */
if (pid == -1) {
if (pid == -1)
{
logOutput (" [ FAILED ]\n");
fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% %%PORTVERSION%% is currently not running.\n");
exit (ERR_NOT_RUNNING);
@ -556,9 +527,7 @@ stop (void)
/* Terminate the process */
killProcess (pid);
/* Clear the PID file */
ftruncate (file, (off_t) 0);
clearPID ();
}
@ -567,11 +536,13 @@ stop (void)
*/
static void
restart (
int optcount,
char * opts [])
int javaOpt,
char * javaArgs [],
int jbossOpt,
char * jbossArgs [])
{
stop ();
start (optcount, opts);
start (javaOpt, javaArgs, jbossOpt, jbossArgs);
}
/**

View File

@ -0,0 +1,7 @@
%%PKGNAME%% has been installed in %%APP_HOME%%.
If a user should be able to use %%CONTROL_SCRIPT_NAME%%, put it in the group '%%GROUP%%'.
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.

View File

@ -1,10 +1,8 @@
#!/bin/sh
# -*- mode: Fundamental; tab-width: 4; -*-
# ex:ts=4
#
# %%APP_TITLE%% startup script.
#
# $FreeBSD: /tmp/pcvs/ports/java/jboss5/files/Attic/startup.sh,v 1.2 2004-12-18 02:11:35 hq Exp $
# $FreeBSD: /tmp/pcvs/ports/java/jboss5/files/Attic/startup.sh,v 1.3 2004-12-22 20:44:23 hq Exp $
#
# PROVIDE: %%APP_SHORTNAME%%
@ -15,6 +13,8 @@
# 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}
#
. %%RC_SUBR%%
@ -28,19 +28,31 @@ procname="%%JAVA%%"
[ -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%%_start ()
{
checkyesno %%APP_SHORTNAME%%_enable &&
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} start &&
{
if [ ! -f ${pidfile} ]
then
touch ${pidfile}
chown %%USER%%:%%GROUP%% ${pidfile}
fi
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} ${%%APP_SHORTNAME%%_configflag} ${%%APP_SHORTNAME%%_config} start &&
echo -n " %%APP_SHORTNAME%%"
}
}
%%APP_SHORTNAME%%_restart ()
{
checkyesno %%APP_SHORTNAME%%_enable &&
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} restart
%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} ${%%APP_SHORTNAME%%_configflag} ${%%APP_SHORTNAME%%_config} restart
}
load_rc_config $name
[ -n "${%%APP_SHORTNAME%%_config}" ] && %%APP_SHORTNAME%%_configflag="-config"
run_rc_command "$1"