source: installer/resources/i2prouter @ e968828

Last change on this file since e968828 was e968828, checked in by kytv <kytv@…>, 6 years ago

i2prouter: add amdfx* as an x64 CPU / move ldd check

  • Property mode set to 100644
File size: 68.3 KB
Line 
1#!/bin/sh
2
3#
4# Copyright (c) 1999, 2011 Tanuki Software, Ltd.
5# http://www.tanukisoftware.com
6# All rights reserved.
7#
8# Make sure that PIDFILE points to the correct location,
9# if you have changed the default location set in the
10# wrapper configuration file.
11#
12# If this script fails to successfully invoke i2psvc on your platform,
13# try the runplain.sh script instead.
14#
15# This software is the proprietary information of Tanuki Software.
16# You shall use it only in accordance with the terms of the
17# license agreement you entered into with Tanuki Software.
18# http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
19#
20# Java Service Wrapper sh script.  Suitable for starting and stopping
21#  wrapped Java applications on UNIX platforms.
22#
23#-----------------------------------------------------------------------------
24# These settings can be modified to fit the needs of your application
25# Optimized for use with version 3.5.22 of the Wrapper.
26
27# Paths
28# Note that (percent)INSTALL_PATH, (percent)USER_HOME,  and (percent)SYSTEM_java_io_tmpdir
29# should have been replaced by the izpack installer.
30# If you did not run the installer, replace them with the appropriate paths.
31I2P="%INSTALL_PATH"
32if [ "`uname -s`" = "Darwin" ]; then
33   if [ -d "%USER_HOME/Library/Application Support" ]; then
34       I2P_CONFIG_DIR="%USER_HOME/Library/Application Support/i2p"
35   else
36       I2P_CONFIG_DIR="%USER_HOME/.i2p"
37   fi
38else
39    I2P_CONFIG_DIR="%USER_HOME/.i2p"
40fi
41I2PTEMP="%SYSTEM_java_io_tmpdir"
42# PORTABLE installation:
43# Use the following instead.
44#I2PTEMP="%INSTALL_PATH"
45
46# Application
47APP_NAME="i2p"
48APP_LONG_NAME="I2P Service"
49
50# gettext - we look for it in the path
51# fallback to echo is below, we can't set it to echo here.
52GETTEXT=$(which gettext > /dev/null 2>&1)
53
54# Where to install the systemd service
55SYSTEMD_SERVICE="/etc/systemd/system/${APP_NAME}.service"
56if grep -q systemd /proc/1/comm > /dev/null 2>&1 ; then
57    USE_SYSTEMD=1
58fi
59
60# If specified, the Wrapper will be run as the specified user.
61# IMPORTANT - Make sure that the user has the required privileges to write
62#  the PID file and wrapper.log files and that the directories exist.
63#  Failure to write the pid file will cause the Wrapper to exit.
64#  Failure to write the log file will cause the Wrapper to use CWD for the log file location.
65#
66# NOTE - This will set the user which is used to run the Wrapper as well as
67#  the JVM and is not useful in situations where a privileged resource or
68#  port needs to be allocated prior to the user being changed.
69#RUN_AS_USER=
70
71# Wrapper
72WRAPPER_CMD="$I2P/i2psvc"
73WRAPPER_CONF="$I2P/wrapper.config"
74
75# Priority at which to run the wrapper.  See "man nice" for valid priorities.
76#  nice is only used if a priority is specified.
77PRIORITY=
78
79# Location of the pid and status files.
80PIDDIR="$I2P_CONFIG_DIR"
81#PIDDIR="$I2PTEMP"
82
83# Location of the wrapper.log file
84LOGDIR="$I2P_CONFIG_DIR"
85#LOGDIR="$I2PTEMP"
86LOGFILE="$LOGDIR/wrapper.log"
87
88# If you'd like to run I2P as root (not recommended), uncomment the
89# following line
90#ALLOW_ROOT=true
91
92# FIXED_COMMAND tells the script to use a hard coded action rather than
93# expecting the first parameter of the command line to be the command.
94# By default the command will will be expected to be the first parameter.
95#FIXED_COMMAND=console
96
97# PASS_THROUGH tells the script to pass all arguments through to the JVM
98#  as is.  If FIXED_COMMAND is specified then all arguments will be passed.
99#  If not set then all arguments starting with the second will be passed.
100#PASS_THROUGH=true
101
102# If uncommented, causes the Wrapper to be shutdown using an anchor file.
103#  When launched with the 'start' command, it will also ignore all INT and
104#  TERM signals.
105#IGNORE_SIGNALS=true
106
107# Wrapper will start the JVM asynchronously. Your application may have some
108#  initialization tasks and it may be desirable to wait a few seconds
109#  before returning.  For example, to delay the invocation of following
110#  startup scripts.  Setting WAIT_AFTER_STARTUP to a positive number will
111#  cause the start command to delay for the indicated period of time
112#  (in seconds).
113#
114WAIT_AFTER_STARTUP=0
115
116# If set, wait for the wrapper to report that the daemon has started
117WAIT_FOR_STARTED_STATUS=true
118WAIT_FOR_STARTED_TIMEOUT=120
119
120# If set, the status, start_msg and stop_msg commands will print out detailed
121#   state information on the Wrapper and Java processes.
122#DETAIL_STATUS=true
123
124# By default we show a detailed usage block.  Uncomment to show brief usage.
125#BRIEF_USAGE=true
126
127# flag for using upstart when installing (rather than init.d rc.d)
128USE_UPSTART=
129
130# Source the environment variables for the locale if $LANG isn't set
131# If you want to set custom locale variables for I2P,
132# you may comment out this block and set them yourself here.
133
134if [ ! -n $LANG ]; then
135        for ENV_FILE in /etc/environment /etc/default/locale; do
136                [ -r "$ENV_FILE" ] || continue
137                [ -s "$ENV_FILE" ] || continue
138
139                for var in LANG LANGUAGE LC_ALL LC_CTYPE; do
140                        value=`egrep "^${var}=" "$ENV_FILE" | tail -n1 | cut -d= -f2`
141                        [ -n "$value" ] && eval export $var=$value
142                done
143        done
144fi
145
146# When installing on On Mac OSX platforms, the following domain will be used to
147#  prefix the plist file name.
148PLIST_DOMAIN=org.tanukisoftware.wrapper
149
150# The following two lines are used by the chkconfig command. Change as is
151#  appropriate for your application.  They should remain commented.
152# chkconfig: 2345 20 80
153# description: I2P Service
154
155# Initialization block for the install_initd and remove_initd scripts used by
156#  SUSE linux distributions.
157### BEGIN INIT INFO
158# Provides: i2p
159# Required-Start: $local_fs $network $syslog
160# Should-Start:
161# Required-Stop:
162# Default-Start: 2 3 4 5
163# Default-Stop: 0 1 6
164# Short-Description: I2P Service
165# Description: I2P is a load-balanced unspoofable packet switching network
166### END INIT INFO
167
168# Do not modify anything beyond this point
169#-----------------------------------------------------------------------------
170if [ ! -e "$WRAPPER_CONF" ]; then
171       echo "Starting I2P Failed: Unable to find $WRAPPER_CONF"
172       exit 1
173fi
174
175# Workaround for Gentoo
176JAVABINARY=$(awk -F'=' '/^ *wrapper\.java\.command/{print $2}' "$WRAPPER_CONF")
177
178if [ -e /etc/gentoo-release ]; then
179    if [ $JAVABINARY = java ]; then
180        if [ -x /etc/java-config-2/current-system-vm/bin/java ]; then
181            JAVABINARY="/etc/java-config-2/current-system-vm/bin/java"
182        else
183            echo "Please set wrapper.java.command in $WRAPPER_CONF"
184            exit 1
185        fi
186    fi
187fi
188
189WRAPPER_URL="http://www.i2p2.de/manualwrapper"
190unsupported() {
191    echo "The most likely reason is that a supported version of the java"
192    echo "wrapper is not available in the I2P installation package for your"
193    echo "platform. It may be possible to manually download and install"
194    echo "a compatible wrapper for your system."
195    echo "See ${WRAPPER_URL} for hints."
196    echo
197    echo "In the meantime, you may start I2P by running the script"
198    echo "${I2P}/runplain.sh"
199    echo
200}
201
202freebsd10() {
203    echo
204    echo "The current version of the Tanuki wrapper does not"
205    echo "support FreeBSD 10."
206    echo
207    echo "See https://trac.i2p2.de/ticket/1118 for more information"
208    echo "and a workaround for this issue."
209    echo
210    echo "In the meantime, you may start I2P by running the script"
211    echo "${I2P}/runplain.sh"
212    echo
213}
214
215failed() {
216    echo "**`gettext 'Failed to load the wrapper'`**"
217    case `uname -s` in
218        FreeBSD)
219            case `uname -r` in
220                10*|11*)
221                    freebsd10
222                    ;;
223                *)
224                    # We should never get here on recent versions of FreeBSD
225                    if ! $(pkg_info -E 'libiconv*' > /dev/null 2>&1); then
226                        echo
227                        echo "The wrapper requires libiconv."
228                        echo
229                        echo "It can be installed with pkg_add -r libiconv"
230                        echo
231                    fi
232                    ;;
233            esac
234            ;;
235
236        *)
237            echo
238            unsupported
239            ;;
240    esac
241    exit 1
242}
243
244if [ -n "$FIXED_COMMAND" ]
245then
246    COMMAND="$FIXED_COMMAND"
247else
248    COMMAND="$1"
249fi
250
251
252# Required for HP-UX Startup
253if [ `uname -s` = "HP-UX" -o `uname -s` = "HP-UX64" ] ; then
254        PATH=$PATH:/usr/bin
255fi
256
257# Get the fully qualified path to the script
258case $0 in
259    /*)
260        SCRIPT="$0"
261        ;;
262    *)
263        PWD=`pwd`
264        SCRIPT="$PWD/$0"
265        ;;
266esac
267
268# Resolve the true real path without any sym links.
269CHANGED=true
270while [ "X$CHANGED" != "X" ]
271do
272    # Change spaces to ":" so the tokens can be parsed.
273    SAFESCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'`
274    # Get the real path to this script, resolving any symbolic links
275    TOKENS=`echo $SAFESCRIPT | sed -e 's;/; ;g'`
276    REALPATH=
277    for C in $TOKENS; do
278        # Change any ":" in the token back to a space.
279        C=`echo $C | sed -e 's;:; ;g'`
280        REALPATH="$REALPATH/$C"
281        # If REALPATH is a sym link, resolve it.  Loop for nested links.
282        while [ -h "$REALPATH" ] ; do
283            LS="`ls -ld "$REALPATH"`"
284            LINK="`expr "$LS" : '.*-> \(.*\)$'`"
285            if expr "$LINK" : '/.*' > /dev/null; then
286                # LINK is absolute.
287                REALPATH="$LINK"
288            else
289                # LINK is relative.
290                REALPATH="`dirname "$REALPATH"`""/$LINK"
291            fi
292        done
293    done
294
295    if [ "$REALPATH" = "$SCRIPT" ]
296    then
297        CHANGED=""
298    else
299        SCRIPT="$REALPATH"
300    fi
301done
302
303# Get the location of the script.
304REALDIR=`dirname "$REALPATH"`
305# Normalize the path
306REALDIR=`cd "${REALDIR}"; pwd`
307
308# If the PIDDIR is relative, set its value relative to the full REALPATH to avoid problems if
309#  the working directory is later changed.
310FIRST_CHAR=`echo $PIDDIR | cut -c1,1`
311if [ "$FIRST_CHAR" != "/" ]
312then
313    PIDDIR=$REALDIR/$PIDDIR
314fi
315# Same test for WRAPPER_CMD
316FIRST_CHAR=`echo $WRAPPER_CMD | cut -c1,1`
317if [ "$FIRST_CHAR" != "/" ]
318then
319    WRAPPER_CMD=$REALDIR/$WRAPPER_CMD
320fi
321# Same test for WRAPPER_CONF
322FIRST_CHAR=`echo $WRAPPER_CONF | cut -c1,1`
323if [ "$FIRST_CHAR" != "/" ]
324then
325    WRAPPER_CONF=$REALDIR/$WRAPPER_CONF
326fi
327
328# Process ID
329ANCHORFILE="$PIDDIR/$APP_NAME.anchor"
330COMMANDFILE="$PIDDIR/$APP_NAME.command"
331STATUSFILE="$PIDDIR/$APP_NAME.status"
332JAVASTATUSFILE="$PIDDIR/$APP_NAME.java.status"
333PIDFILE="$PIDDIR/$APP_NAME.pid"
334LOCKDIR="/var/lock/subsys"
335LOCKFILE="$LOCKDIR/$APP_NAME"
336pid=""
337
338# Resolve the location of the 'ps' command
339PSEXE="/usr/ucb/ps"
340    if [ ! -x "$PSEXE" ]
341    then
342        PSEXE="/usr/bin/ps"
343        if [ ! -x "$PSEXE" ]
344        then
345            PSEXE="/bin/ps"
346            if [ ! -x "$PSEXE" ]
347            then
348                echo 'Unable to locate "ps".'
349                echo 'Please report this message along with the location of the command on your system.'
350                exit 1
351            fi
352        fi
353    fi
354
355TREXE="/usr/bin/tr"
356if [ ! -x "$TREXE" ]
357then
358    TREXE="/bin/tr"
359    if [ ! -x "$TREXE" ]
360    then
361        echo 'Unable to locate "tr".'
362        echo 'Please report this message along with the location of the command on your system.'
363        exit 1
364    fi
365fi
366
367
368# Resolve the os
369DIST_OS=`uname -s | $TREXE "[A-Z]" "[a-z]" | $TREXE -d ' '`
370case "$DIST_OS" in
371    'sunos')
372        DIST_OS="solaris"
373        ;;
374    'hp-ux' | 'hp-ux64')
375        # HP-UX needs the XPG4 version of ps (for -o args)
376        DIST_OS="hpux"
377        UNIX95=""
378        export UNIX95
379        ;;
380    'darwin')
381        DIST_OS="macosx"
382        ;;
383    'unix_sv')
384        DIST_OS="unixware"
385        ;;
386    'gnu/kfreebsd')
387        DIST_OS="kfreebsd"
388        ;;
389    'os/390')
390        DIST_OS="zos"
391        ;;
392esac
393
394# Resolve the architecture
395if [ "$DIST_OS" = "macosx" ]
396then
397    OS_VER=`sw_vers | grep ProductVersion | cut -d: -f2 | sed -e 's/[^0-9]*//'`
398    DIST_ARCH="universal"
399    if [ $(sysctl -n hw.cpu64bit_capable) -eq 1 ]; then
400        DIST_BITS="64"
401    else
402        DIST_BITS="32"
403    fi
404    APP_PLIST_BASE=${PLIST_DOMAIN}.${APP_NAME}
405    APP_PLIST=${APP_PLIST_BASE}.plist
406else
407    DIST_ARCH=
408    DIST_ARCH=`uname -p 2>/dev/null | $TREXE "[A-Z]" "[a-z]" | $TREXE -d ' '`
409    if [ "X$DIST_ARCH" = "X" ]
410    then
411        DIST_ARCH="unknown"
412    fi
413    if [ "$DIST_ARCH" = "unknown" ]
414    then
415        DIST_ARCH=`uname -m 2>/dev/null | $TREXE "[A-Z]" "[a-z]" | $TREXE -d ' '`
416    fi
417    case "$DIST_ARCH" in
418        'athlon' | 'i386' | 'i486' | 'i586' | 'i686')
419            DIST_ARCH="x86"
420            if [ "${DIST_OS}" = "solaris" ] ; then
421                DIST_BITS=`isainfo -b`
422            else
423                DIST_BITS="32"
424            fi
425            ;;
426        amdfx* | 'amd64' | 'x86_64')
427            DIST_ARCH="x86"
428            DIST_BITS="64"
429            ;;
430        'ia32')
431            DIST_ARCH="ia"
432            DIST_BITS="32"
433            ;;
434        'ia64' | 'ia64n' | 'ia64w')
435            DIST_ARCH="ia"
436            DIST_BITS="64"
437            ;;
438        'ip27')
439            DIST_ARCH="mips"
440            DIST_BITS="32"
441            ;;
442        'power' | 'powerpc' | 'power_pc' | 'ppc64')
443            if [ "${DIST_ARCH}" = "ppc64" ] ; then
444                DIST_BITS="64"
445            else
446                DIST_BITS="32"
447            fi
448            DIST_ARCH="ppc"
449            if [ "${DIST_OS}" = "aix" ] ; then
450                if [ `getconf KERNEL_BITMODE` -eq 64 ]; then
451                    DIST_BITS="64"
452                else
453                    DIST_BITS="32"
454                fi
455            fi
456            ;;
457        'pa_risc' | 'pa-risc')
458            DIST_ARCH="parisc"
459            if [ `getconf KERNEL_BITS` -eq 64 ]; then
460                DIST_BITS="64"
461            else
462                DIST_BITS="32"
463            fi
464            ;;
465        'sun4u' | 'sparcv9' | 'sparc')
466            DIST_ARCH="sparc"
467            DIST_BITS=`isainfo -b`
468            ;;
469        '9000/800' | '9000/785')
470            DIST_ARCH="parisc"
471            if [ `getconf KERNEL_BITS` -eq 64 ]; then
472                DIST_BITS="64"
473            else
474                DIST_BITS="32"
475            fi
476            ;;
477        '2064' | '2066' | '2084' | '2086' | '2094' | '2096' | '2097' | '2098' | '2817')
478            DIST_ARCH="390"
479            DIST_BITS="64"
480            ;;
481        armv*)
482            if [ -z "`readelf -A /proc/self/exe | grep Tag_ABI_VFP_args`" ] ; then
483                DIST_ARCH="armel"
484                DIST_BITS="32"
485            else
486                DIST_ARCH="armhf"
487                DIST_BITS="32"
488            fi
489            ;;
490    esac
491fi
492
493# OSX always places Java in the same location so we can reliably set JAVA_HOME
494if [ "$DIST_OS" = "macosx" ]
495then
496    if [ -z "$JAVA_HOME" ]; then
497        JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
498    fi
499fi
500
501# Test Echo
502ECHOTEST=`echo -n "x"`
503if [ "$ECHOTEST" = "x" ]
504then
505    ECHOOPT="-n "
506else
507    ECHOOPT=""
508fi
509
510
511gettext() {
512    # Call external gettext using our own translation files.
513    # Don't attempt to translate via the wrapper,
514    # it probably isn't supported in the community edition.
515    if [ "X${LANG#en}" = "X$LANG" ] && [ $(which $GETTEXT > /dev/null 2>&1) ] ; then
516            TEXTDOMAINDIR=$I2P/locale $GETTEXT -d i2prouter "$1"
517            if [ $? != 0 ] ; then
518                echo "$1"
519            fi
520        else
521            echo "$1"
522        fi
523}
524
525outputFile() {
526    if [ -f "$1" ]
527    then
528        echo "  $1  Found but not executable.";
529    else
530        echo "  $1"
531    fi
532}
533
534# Decide on the wrapper binary to use.
535# If the bits of the OS could be detected, we will try to look for the
536#  binary with the correct bits value.  If it doesn't exist, fall back
537#  and look for the 32-bit binary.  If that doesn't exist either then
538#  look for the default.
539WRAPPER_TEST_CMD=""
540if [ -f "$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-$DIST_BITS" ]
541then
542    WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-$DIST_BITS"
543    if [ ! -x "$WRAPPER_TEST_CMD" ]
544    then
545        chmod +x "$WRAPPER_TEST_CMD" 2>/dev/null
546    fi
547    if [ -x "$WRAPPER_TEST_CMD" ]
548    then
549        WRAPPER_CMD="$WRAPPER_TEST_CMD"
550    else
551        outputFile "$WRAPPER_TEST_CMD"
552        WRAPPER_TEST_CMD=""
553    fi
554fi
555if [ -f "$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32" -a -z "$WRAPPER_TEST_CMD" ]
556then
557    WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32"
558    if [ ! -x "$WRAPPER_TEST_CMD" ]
559    then
560        chmod +x "$WRAPPER_TEST_CMD" 2>/dev/null
561    fi
562    if [ -x "$WRAPPER_TEST_CMD" ]
563    then
564        WRAPPER_CMD="$WRAPPER_TEST_CMD"
565    else
566        outputFile "$WRAPPER_TEST_CMD"
567        WRAPPER_TEST_CMD=""
568    fi
569fi
570if [ -f "$WRAPPER_CMD" -a -z "$WRAPPER_TEST_CMD" ]
571then
572    WRAPPER_TEST_CMD="$WRAPPER_CMD"
573    if [ ! -x "$WRAPPER_TEST_CMD" ]
574    then
575        chmod +x "$WRAPPER_TEST_CMD" 2>/dev/null
576    fi
577    if [ -x "$WRAPPER_TEST_CMD" ]
578    then
579        WRAPPER_CMD="$WRAPPER_TEST_CMD"
580    else
581        outputFile "$WRAPPER_TEST_CMD"
582        WRAPPER_TEST_CMD=""
583    fi
584fi
585if [ -z "$WRAPPER_TEST_CMD" ]
586then
587    echo 'Unable to locate any of the following binaries:'
588    outputFile "$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-$DIST_BITS"
589    if [ ! "$DIST_BITS" = "32" ]
590    then
591        outputFile "$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32"
592    fi
593    outputFile "$WRAPPER_CMD"
594
595    exit 1
596fi
597
598if [ ! -r "${WRAPPER_CMD}" ]; then
599    echo "Unable to locate ${WRAPPER_CMD} in ${I2P}!"
600    echo
601    unsupported
602    echo
603    exit 1
604fi
605
606if $(which ldd > /dev/null 2>&1); then
607    # This should cover every *NIX other than OSX since OSX doesn't have ldd.
608    # OSX has otool. Is otool on every OSX installation? Is otool's output the same as ldd's?
609    # The wrapper we ship for OSX are for PPC and Intel, so maybe we don't need to worry about OSX?
610    if (ldd "$WRAPPER_CMD" |grep -q 'not found') > /dev/null 2>&1 || \
611                         ! (ldd "$WRAPPER_CMD" > /dev/null 2>&1); then
612        failed
613    fi
614fi
615
616
617# Build the nice clause
618if [ "X$PRIORITY" = "X" ]
619then
620    CMDNICE=""
621else
622    CMDNICE="nice -$PRIORITY"
623fi
624
625# Build the anchor file clause.
626if [ "X$IGNORE_SIGNALS" = "X" ]
627then
628   ANCHORPROP=
629   IGNOREPROP=
630else
631   ANCHORPROP=wrapper.anchorfile=\"$ANCHORFILE\"
632   IGNOREPROP=wrapper.ignore_signals=TRUE
633fi
634
635# Build the status file clause.
636if [ "X$DETAIL_STATUS$WAIT_FOR_STARTED_STATUS" = "X" ]
637then
638   STATUSPROP=
639else
640   STATUSPROP="wrapper.statusfile=\"$STATUSFILE\" wrapper.java.statusfile=\"$JAVASTATUSFILE\""
641fi
642
643# Build the command file clause.
644COMMANDPROP=
645
646# Build the log file clause.
647LOGPROP="wrapper.logfile=\"$LOGFILE\""
648
649if [ ! -n "$WAIT_FOR_STARTED_STATUS" ]
650then
651    WAIT_FOR_STARTED_STATUS=true
652fi
653
654if [ $WAIT_FOR_STARTED_STATUS = true ] ; then
655    DETAIL_STATUS=true
656fi
657
658
659# Build the lock file clause.  Only create a lock file if the lock directory exists on this platform.
660LOCKPROP=
661if [ -d $LOCKDIR ]
662then
663    if [ -w $LOCKDIR ]
664    then
665        LOCKPROP=wrapper.lockfile=\"$LOCKFILE\"
666    fi
667fi
668
669prepAdditionalParams() {
670    ADDITIONAL_PARA=""
671    if [ -n "$PASS_THROUGH" ] ; then
672        ADDITIONAL_PARA="--"
673    fi
674    while [ -n "$1" ] ; do
675        ADDITIONAL_PARA="$ADDITIONAL_PARA \"$1\""
676        shift
677    done
678}
679
680checkUser() {
681    # $1 touchLock flag
682    # $2.. [command] args
683
684    # Check the configured user.  If necessary rerun this script as the desired user.
685    if [ "X$RUN_AS_USER" != "X" ]
686    then
687
688        # Resolve the location of the 'id' command
689        IDEXE="/usr/xpg4/bin/id"
690        if [ ! -x "$IDEXE" ]
691        then
692            IDEXE="/usr/bin/id"
693            if [ ! -x "$IDEXE" ]
694            then
695                echo 'Unable to locate "id".'
696                echo 'Please report this message along with the location of the command on your system.'
697                exit 1
698            fi
699        fi
700        if [ "`$IDEXE -u -n "$RUN_AS_USER" 2>/dev/null`" != "$RUN_AS_USER" ]
701        then
702            echo "User $RUN_AS_USER does not exist."
703            exit 1
704        fi
705
706        if [ "`$IDEXE -u -n`" = "$RUN_AS_USER" ]
707        then
708            # Already running as the configured user.  Avoid password prompts by not calling su.
709            RUN_AS_USER=""
710        fi
711    fi
712    if [ "X$RUN_AS_USER" != "X" ]
713    then
714        # If LOCKPROP and $RUN_AS_USER are defined then the new user will most likely not be
715        # able to create the lock file.  The Wrapper will be able to update this file once it
716        # is created but will not be able to delete it on shutdown.  If $1 is set then
717        # the lock file should be created for the current command
718        if [ "X$LOCKPROP" != "X" ]
719        then
720            if [ "X$1" != "X" ]
721            then
722                # Resolve the primary group
723                RUN_AS_GROUP=`groups $RUN_AS_USER | awk '{print $3}' | tail -1`
724                if [ "X$RUN_AS_GROUP" = "X" ]
725                then
726                    RUN_AS_GROUP=$RUN_AS_USER
727                fi
728                touch $LOCKFILE
729                chown $RUN_AS_USER:$RUN_AS_GROUP $LOCKFILE
730            fi
731        fi
732
733        # Still want to change users, recurse.  This means that the user will only be
734        #  prompted for a password once. Variables shifted by 1
735        shift
736
737        # Wrap the parameters so they can be passed.
738        ADDITIONAL_PARA=""
739        while [ -n "$1" ] ; do
740            ADDITIONAL_PARA="$ADDITIONAL_PARA \"$1\""
741            shift
742        done
743
744        # Use "runuser" if this exists.  runuser should be used on RedHat in preference to su.
745        #
746        if test -f "/sbin/runuser"
747        then
748            /sbin/runuser -s /bin/sh - $RUN_AS_USER -c "\"$REALPATH\" $ADDITIONAL_PARA"
749        else
750            su - $RUN_AS_USER -s /bin/sh -c "\"$REALPATH\" $ADDITIONAL_PARA"
751        fi
752        RUN_AS_USER_EXITCODE=$?
753        # Now that we are the original user again, we may need to clean up the lock file.
754        if [ "X$LOCKPROP" != "X" ]
755        then
756            getpid
757            if [ "X$pid" = "X" ]
758            then
759                # Wrapper is not running so make sure the lock file is deleted.
760                if [ -f "$LOCKFILE" ]
761                then
762                    rm "$LOCKFILE"
763                fi
764            fi
765        fi
766
767        exit $RUN_AS_USER_EXITCODE
768    fi
769}
770
771getpid() {
772    pid=""
773    if [ -f "$PIDFILE" ]
774    then
775        if [ -r "$PIDFILE" ]
776        then
777            pid=`cat "$PIDFILE"`
778            if [ "X$pid" != "X" ]
779            then
780                # It is possible that 'a' process with the pid exists but that it is not the
781                #  correct process.  This can happen in a number of cases, but the most
782                #  common is during system startup after an unclean shutdown.
783                # The ps statement below looks for the specific wrapper command running as
784                #  the pid.  If it is not found then the pid file is considered to be stale.
785                case "$DIST_OS" in
786                    'freebsd')
787                        pidtest=`$PSEXE -p $pid -o args | tail -1`
788                        if [ "X$pidtest" = "XCOMMAND" ]
789                        then
790                            pidtest=""
791                        fi
792                        ;;
793                    'macosx')
794                        pidtest=`$PSEXE -ww -p $pid -o command | grep -F "$WRAPPER_CMD" | tail -1`
795                        ;;
796                    'solaris')
797                        if [ -f "/usr/bin/pargs" ]
798                        then
799                            pidtest=`pargs $pid | fgrep "$WRAPPER_CMD" | tail -1`
800                        else
801                            case "$PSEXE" in
802                            '/usr/ucb/ps')
803                                pidtest=`$PSEXE -auxww  $pid | fgrep "$WRAPPER_CMD" | tail -1`
804                                ;;
805                            '/usr/bin/ps')
806                                TRUNCATED_CMD=`$PSEXE -o comm -p $pid | tail -1`
807                                COUNT=`echo $TRUNCATED_CMD | wc -m`
808                                COUNT=`echo ${COUNT}`
809                                COUNT=`expr $COUNT - 1`
810                                TRUNCATED_CMD=`echo $WRAPPER_CMD | cut -c1-$COUNT`
811                                pidtest=`$PSEXE -o comm -p $pid | fgrep "$TRUNCATED_CMD" | tail -1`
812                                ;;
813                            '/bin/ps')
814                                TRUNCATED_CMD=`$PSEXE -o comm -p $pid | tail -1`
815                                COUNT=`echo $TRUNCATED_CMD | wc -m`
816                                COUNT=`echo ${COUNT}`
817                                COUNT=`expr $COUNT - 1`
818                                TRUNCATED_CMD=`echo $WRAPPER_CMD | cut -c1-$COUNT`
819                                pidtest=`$PSEXE -o comm -p $pid | fgrep "$TRUNCATED_CMD" | tail -1`
820                                ;;
821                            *)
822                                echo "Unsupported ps command $PSEXE"
823                                exit 1
824                                ;;
825                            esac
826                        fi
827                        ;;
828                    'hpux')
829                        pidtest=`$PSEXE -p $pid -x -o args | grep -F "$WRAPPER_CMD" | tail -1`
830                        ;;
831                    *)
832                        pidtest=`$PSEXE -p $pid -o args | grep -F "$WRAPPER_CMD" | tail -1`
833                        ;;
834                esac
835
836                if [ "X$pidtest" = "X" ]
837                then
838                    # This is a stale pid file.
839                    rm -f "$PIDFILE"
840                    echo "Removed stale pid file: $PIDFILE"
841                    pid=""
842                fi
843            fi
844        else
845            echo "Cannot read $PIDFILE."
846            exit 1
847        fi
848    fi
849}
850
851getstatus() {
852    STATUS=
853    if [ -f "$STATUSFILE" ]
854    then
855        if [ -r "$STATUSFILE" ]
856        then
857            STATUS=`cat "$STATUSFILE"`
858        fi
859    fi
860    if [ "X$STATUS" = "X" ]
861    then
862        STATUS="Unknown"
863    fi
864
865    JAVASTATUS=
866    if [ -f "$JAVASTATUSFILE" ]
867    then
868        if [ -r "$JAVASTATUSFILE" ]
869        then
870            JAVASTATUS=`cat "$JAVASTATUSFILE"`
871        fi
872    fi
873    if [ "X$JAVASTATUS" = "X" ]
874    then
875        JAVASTATUS="Unknown"
876    fi
877}
878
879testpid() {
880    case "$DIST_OS" in
881     'solaris')
882        case "$PSEXE" in
883        '/usr/ucb/ps')
884            pid=`$PSEXE  $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
885            ;;
886        '/usr/bin/ps')
887            pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
888            ;;
889        '/bin/ps')
890            pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
891            ;;
892        *)
893            echo "Unsupported ps command $PSEXE"
894            exit 1
895            ;;
896        esac
897        ;;
898    *)
899        pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1` 2>/dev/null
900        ;;
901    esac
902    if [ "X$pid" = "X" ]
903    then
904        # Process is gone so remove the pid file.
905        rm -f "$PIDFILE"
906        pid=""
907    fi
908}
909
910launchdtrap() {
911    stopit
912    exit
913}
914
915waitforwrapperstop() {
916    getpid
917    while [ "X$pid" != "X" ] ; do
918        sleep 1
919        getpid
920    done
921}
922
923create_config_dir() {
924    if [ ! -d "$I2P_CONFIG_DIR" ]; then
925        UMASK=$(awk -F'=' '/^ *wrapper\.umask/{print $2}' $WRAPPER_CONF)
926        umask $UMASK
927        if ! mkdir -p "$I2P_CONFIG_DIR"; then
928            echo "Error creating $I2P_CONFIG_DIR! Edit $0 and set I2P_CONFIG_DIR" >&2
929            echo "to the correct location." >&2
930            exit 1
931        fi
932    fi
933}
934
935launchdinternal() {
936    getpid
937    trap launchdtrap TERM
938    if [ "X$pid" = "X" ]
939    then
940        prepAdditionalParams "$@"
941        create_config_dir
942
943        # The string passed to eval must handles spaces in paths correctly.
944        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP $ADDITIONAL_PARA"
945        eval $COMMAND_LINE || failed
946    else
947        eval echo `gettext '$APP_LONG_NAME is already running.'`
948        exit 1
949    fi
950    # launchd expects that this script stay up and running so we need to do our own monitoring of the Wrapper process.
951    if [ $WAIT_FOR_STARTED_STATUS = true ]
952    then
953        waitforwrapperstop
954    fi
955}
956
957console() {
958    eval echo "`gettext 'Running $APP_LONG_NAME'`..."
959    getpid
960    if [ "X$pid" = "X" ]
961    then
962        trap '' 3 2
963
964        prepAdditionalParams "$@"
965        create_config_dir
966
967        # The string passed to eval must handles spaces in paths correctly.
968        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" $ANCHORPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP $ADDITIONAL_PARA"
969        eval $COMMAND_LINE || failed
970    else
971        eval echo `gettext '$APP_LONG_NAME is already running.'`
972        exit 1
973    fi
974}
975
976waitforjavastartup() {
977    getstatus
978    eval echo $ECHOOPT "`gettext 'Waiting for $APP_LONG_NAME'`..."
979
980    # Wait until the timeout or we have something besides Unknown.
981    counter=15
982    while [ "$JAVASTATUS" = "Unknown" -a $counter -gt 0 -a -n "$JAVASTATUS" ] ; do
983        echo $ECHOOPT"."
984        sleep 1
985        getstatus
986        counter=`expr $counter - 1`
987    done
988
989    if [ -n "$WAIT_FOR_STARTED_TIMEOUT" ] ; then
990        counter=$WAIT_FOR_STARTED_TIMEOUT
991    else
992        counter=120
993    fi
994    while [ "$JAVASTATUS" != "STARTED" -a "$JAVASTATUS" != "Unknown" -a $counter -gt 0 -a -n "$JAVASTATUS" ] ; do
995        echo $ECHOOPT"."
996        sleep 1
997        getstatus
998        counter=`expr $counter - 1`
999    done
1000    if [ "X$ECHOOPT" != "X" ] ; then
1001        echo ""
1002    fi
1003}
1004
1005startwait() {
1006    if [ $WAIT_FOR_STARTED_STATUS = true ]
1007    then
1008        waitforjavastartup
1009    fi
1010    # Sleep for a few seconds to allow for intialization if required
1011    #  then test to make sure we're still running.
1012    #
1013    i=0
1014    while [ $i -lt $WAIT_AFTER_STARTUP ]
1015    do
1016        sleep 1
1017        echo $ECHOOPT"."
1018        i=`expr $i + 1`
1019    done
1020    if [ $WAIT_AFTER_STARTUP -gt 0 -o $WAIT_FOR_STARTED_STATUS = true ]
1021    then
1022        getpid
1023        if [ "X$pid" = "X" ]
1024        then
1025            eval echo " `gettext 'WARNING: $APP_LONG_NAME may have failed to start.'`"
1026            failed
1027        else
1028            eval echo ' running: PID:$pid'
1029        fi
1030    else
1031        echo ""
1032    fi
1033}
1034
1035macosxstart() {
1036    # The daemon has been installed.
1037    echo "Starting $APP_LONG_NAME.  Detected Mac OSX and installed launchd daemon."
1038    if [ `id | sed 's/^uid=//;s/(.*$//'` != "0" ] ; then
1039        eval echo `gettext 'Must be root to perform this action.'`
1040        exit 1
1041    fi
1042
1043    getpid
1044    if [ "X$pid" != "X" ] ; then
1045        eval echo `gettext '$APP_LONG_NAME is already running.'`
1046        exit 1
1047    fi
1048
1049    # If the daemon was just installed, it may not be loaded.
1050    LOADED_PLIST=`launchctl list | grep ${APP_PLIST_BASE}`
1051    if [ "X${LOADED_PLIST}" = "X" ] ; then
1052        launchctl load /Library/LaunchDaemons/${APP_PLIST}
1053    fi
1054    # If launchd is set to run the daemon already at Load, we don't need to call start
1055    getpid
1056    if [ "X$pid" = "X" ] ; then
1057        launchctl start ${APP_PLIST_BASE}
1058    fi
1059
1060    startwait
1061}
1062
1063upstartstart() {
1064    # The daemon has been installed.
1065    echo "Starting $APP_LONG_NAME.  Detected Linux and installed upstart."
1066    if [ `id | sed 's/^uid=//;s/(.*$//'` != "0" ] ; then
1067        eval echo `gettext 'Must be root to perform this action.'`
1068        exit 1
1069    fi
1070
1071    getpid
1072    if [ "X$pid" != "X" ] ; then
1073        eval echo `gettext '$APP_LONG_NAME is already running.'`
1074        exit 1
1075    fi
1076
1077    /sbin/start ${APP_NAME}
1078
1079    startwait
1080}
1081
1082start() {
1083    eval echo "`gettext 'Starting $APP_LONG_NAME'`..."
1084    getpid
1085    if [ "X$pid" = "X" ]
1086    then
1087        prepAdditionalParams "$@"
1088        create_config_dir
1089
1090        # The string passed to eval must handles spaces in paths correctly.
1091        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP $ADDITIONAL_PARA"
1092        eval $COMMAND_LINE || failed
1093    else
1094        eval echo `gettext '$APP_LONG_NAME is already running.'`
1095        exit 1
1096    fi
1097
1098    startwait
1099}
1100
1101
1102stopit() {
1103    # $1 exit if down flag
1104
1105    eval echo "`gettext 'Stopping $APP_LONG_NAME'`..."
1106    getpid
1107    if [ "X$pid" = "X" ]
1108    then
1109        eval echo `gettext '$APP_LONG_NAME was not running.'`
1110        if [ "X$1" = "X1" ]
1111        then
1112            exit 1
1113        fi
1114    else
1115        if [ "X$IGNORE_SIGNALS" = "X" ]
1116        then
1117            # Running so try to stop it.
1118            kill -TERM $pid
1119            if [ $? -ne 0 ]
1120            then
1121                # An explanation for the failure should have been given
1122                eval echo `gettext 'Unable to stop $APP_LONG_NAME.'`
1123                exit 1
1124            fi
1125        else
1126            rm -f "$ANCHORFILE"
1127            if [ -f "$ANCHORFILE" ]
1128            then
1129                # An explanation for the failure should have been given
1130                eval echo `gettext 'Unable to stop $APP_LONG_NAME.'`
1131                exit 1
1132            fi
1133        fi
1134
1135        # We can not predict how long it will take for the wrapper to
1136        #  actually stop as it depends on settings in wrapper.conf.
1137        #  Loop until it does.
1138        savepid=$pid
1139        CNT=0
1140        TOTCNT=0
1141        while [ "X$pid" != "X" ]
1142        do
1143            # Show a waiting message every 5 seconds.
1144            if [ "$CNT" -lt "5" ]
1145            then
1146                CNT=`expr $CNT + 1`
1147            else
1148                eval echo "`gettext 'Waiting for $APP_LONG_NAME to exit'`..."
1149                CNT=0
1150            fi
1151            TOTCNT=`expr $TOTCNT + 1`
1152
1153            sleep 1
1154
1155            testpid
1156        done
1157
1158        pid=$savepid
1159        testpid
1160        if [ "X$pid" != "X" ]
1161        then
1162            eval echo `gettext 'Failed to stop $APP_LONG_NAME.'`
1163            exit 1
1164        else
1165            eval echo `gettext 'Stopped $APP_LONG_NAME.'`
1166        fi
1167    fi
1168}
1169
1170graceful() {
1171    # $1 exit if down flag
1172
1173    eval echo "`gettext 'Stopping $APP_LONG_NAME gracefully'`..."
1174    getpid
1175    if [ "X$pid" = "X" ]
1176    then
1177        eval echo `gettext '$APP_LONG_NAME was not running.'`
1178        if [ "X$1" = "X1" ]
1179        then
1180            exit 1
1181        fi
1182    else
1183        if [ "X$IGNORE_SIGNALS" = "X" ]
1184        then
1185            # Running so try to stop it.
1186            # This sends HUP. router.gracefulHUP must be set in router.config,
1187            # or else this will do the same as stop.
1188            kill -HUP $pid
1189            if [ $? -ne 0 ]
1190            then
1191                # An explanation for the failure should have been given
1192                eval echo `gettext 'Unable to stop $APP_LONG_NAME.'`
1193                exit 1
1194            fi
1195        else
1196            rm -f "$ANCHORFILE"
1197            if [ -f "$ANCHORFILE" ]
1198            then
1199                # An explanation for the failure should have been given
1200                eval echo `gettext 'Unable to stop $APP_LONG_NAME.'`
1201                exit 1
1202            fi
1203        fi
1204    fi
1205}
1206
1207pause() {
1208    echo "Pausing $APP_LONG_NAME."
1209}
1210
1211resume() {
1212    echo "Resuming $APP_LONG_NAME."
1213}
1214
1215status() {
1216    getpid
1217    if [ "X$pid" = "X" ]
1218    then
1219        eval echo `gettext '$APP_LONG_NAME is not running.'`
1220        exit 1
1221    else
1222        if [ "X$DETAIL_STATUS" = "X" ]
1223        then
1224            eval echo `gettext '$APP_LONG_NAME is running: PID:$pid'`
1225        else
1226            getstatus
1227            eval echo `gettext '$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS'`
1228        fi
1229        exit 0
1230    fi
1231}
1232
1233installUpstart() {
1234    echo " Installing the $APP_LONG_NAME daemon using upstart.."
1235    if [ -f "${APP_NAME}.conf" ] ; then
1236        echo " a custom upstart conf file ${APP_NAME}.conf found"
1237        cp "${REALDIR}/${APP_NAME}.install" "/etc/init/${APP_NAME}.conf"
1238    else
1239        echo ' creating default upstart conf file..'
1240        echo "# ${APP_NAME} - ${APP_LONG_NAME}" > "/etc/init/${APP_NAME}.conf"
1241        echo "description \"${APP_LONG_NAME}\"" >> "/etc/init/${APP_NAME}.conf"
1242        echo "author \"Tanuki Software Ltd. <info@tanukisoftware.com>\"" >> "/etc/init/${APP_NAME}.conf"
1243        echo "start on runlevel [2345]" >> "/etc/init/${APP_NAME}.conf"
1244        echo "stop on runlevel [!2345]" >> "/etc/init/${APP_NAME}.conf"
1245        echo "env LANG=${LANG}" >> "/etc/init/${APP_NAME}.conf"
1246       echo "exec \"${REALPATH}\" launchdinternal" >> "/etc/init/${APP_NAME}.conf"
1247    fi
1248}
1249
1250installsystemd() {
1251    if [ -d "/etc/systemd/system/" ]; then
1252        cat << EOF >> "$SYSTEMD_SERVICE"
1253[Unit]
1254Description=$APP_LONG_NAME
1255After= local-fs.target network.target
1256
1257[Service]
1258Type=forking
1259ExecStart=$I2P/i2prouter start
1260ExecReload=$I2P/i2prouter restart
1261ExecStop=$I2P/i2prouter stop
1262PIDFile=$I2P_CONFIG_DIR/i2p.pid
1263
1264[Install]
1265WantedBy=multi-user.target
1266EOF
1267    systemctl --system daemon-reload > /dev/null 2>&1
1268    fi
1269}
1270
1271installdaemon() {
1272    if [ `id | sed 's/^uid=//;s/(.*$//'` != "0" ] ; then
1273        eval echo `gettext 'Must be root to perform this action.'`
1274        exit 1
1275    else
1276        APP_NAME_LOWER=`echo "$APP_NAME" | $TREXE "[A-Z]" "[a-z]"`
1277        if [ "$DIST_OS" = "solaris" ] ; then
1278            echo 'Detected Solaris:'
1279            if [ -f /etc/init.d/$APP_NAME ] ; then
1280                eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1281                exit 1
1282            else
1283                eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1284                ln -s "$REALPATH" "/etc/init.d/$APP_NAME"
1285                ln -s "/etc/init.d/$APP_NAME" "/etc/rc3.d/K20$APP_NAME_LOWER"
1286                ln -s "/etc/init.d/$APP_NAME" "/etc/rc3.d/S20$APP_NAME_LOWER"
1287            fi
1288        elif [ "$DIST_OS" = "linux" ] ; then
1289            if [ -f /etc/redhat-release -o -f /etc/redhat_version -o -f /etc/fedora-release ]  ; then
1290                echo 'Detected RHEL or Fedora:'
1291                if [ -f "/etc/init.d/$APP_NAME" -o -f "/etc/init/${APP_NAME}.conf" ] ; then
1292                    eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1293                    exit 1
1294                else
1295                    if [ -n "$USE_UPSTART" -a -d "/etc/init" ] ; then
1296                        installUpstart
1297                    else
1298                        eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1299                        ln -s "$REALPATH" "/etc/init.d/$APP_NAME"
1300                        /sbin/chkconfig --add "$APP_NAME"
1301                        /sbin/chkconfig "$APP_NAME" on
1302                    fi
1303                fi
1304            elif [ -f /etc/slackware-version ]; then
1305                echo 'Detected Slackware Linux:'
1306                if [ -e "/etc/rc.d/rc.i2p" -o -f "/etc/rc.d/rc.i2p.new" ]; then
1307                    echo "Found initscript from I2P Slackpkg. Aborting." >&2
1308                    exit 1
1309                else
1310                    if grep -q ${APP_NAME}router /etc/rc.d/rc.local > /dev/null 2>&1; then
1311                        eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1312                        exit 1
1313                    else
1314                        echo "${REALDIR}/${APP_NAME}router start"  >> /etc/rc.d/rc.local
1315                        if [ ! -e /etc/rc.d/rc.local_shutdown ]; then
1316                            echo "#!/bin/sh" >> /etc/rc.d/rc.local_shutdown
1317                        fi
1318                        echo "${REALDIR}/${APP_NAME}router stop"  >> /etc/rc.d/rc.local_shutdown
1319                        chmod 755 /etc/rc.d/rc.local_shutdown
1320                    fi
1321                fi
1322            elif [ -f /etc/arch-release ]; then
1323            echo 'Detected Arch Linux:'
1324                if [ -f "/etc/rc.d/i2prouter" -o -f "/usr/lib/systemd/system/i2prouter.service" ]; then
1325                    echo 'AUR package found. Refusing to continue.'
1326                    exit 1
1327                elif [ -f /etc/rc.d/i2p -a ! "$USE_SYSTEMD" = "1" ] || [ -f "$SYSTEMD_SERVICE" -a "$USE_SYSTEMD" = "1" ]; then
1328                    eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1329                    exit 1
1330                else
1331                        if [ ! -f "/etc/init.d/i2p" ]; then
1332                            if [ "$USE_SYSTEMD" != "1" ]; then
1333                                echo "#!/bin/bash"  > /etc/rc.d/${APP_NAME}
1334                                echo   >> /etc/rc.d/${APP_NAME}
1335                                echo ". /etc/rc.conf"  >> /etc/rc.d/${APP_NAME}
1336                                echo ". /etc/rc.d/functions"  >> /etc/rc.d/${APP_NAME}
1337                                echo   >> /etc/rc.d/${APP_NAME}
1338                                echo "case "\$1" in"  >> /etc/rc.d/${APP_NAME}
1339                                echo "  start)"  >> /etc/rc.d/${APP_NAME}
1340                                echo "    stat_busy \"Starting i2p-Router\""  >> /etc/rc.d/${APP_NAME}
1341                                echo "    ${REALDIR}/${APP_NAME}router start >/dev/null 2>&1"  >> /etc/rc.d/${APP_NAME}
1342                                echo "    if [ \$? -gt 0 ]; then"  >> /etc/rc.d/${APP_NAME}
1343                                echo "      stat_fail"  >> /etc/rc.d/${APP_NAME}
1344                                echo "    else"  >> /etc/rc.d/${APP_NAME}
1345                                echo "      stat_done"  >> /etc/rc.d/${APP_NAME}
1346                                echo "      add_daemon i2prouter"  >> /etc/rc.d/${APP_NAME}
1347                                echo "    fi"  >> /etc/rc.d/${APP_NAME}
1348                                echo "    ;;"  >> /etc/rc.d/${APP_NAME}
1349                                echo "  stop)"  >> /etc/rc.d/${APP_NAME}
1350                                echo "    stat_busy "Stopping i2p-Router""  >> /etc/rc.d/${APP_NAME}
1351                                echo "    ${REALDIR}/${APP_NAME}router stop > /dev/null 2>&1"  >> /etc/rc.d/${APP_NAME}
1352                                echo "    if [ \$? -gt 0 ]; then"  >> /etc/rc.d/${APP_NAME}
1353                                echo "      stat_fail"  >> /etc/rc.d/${APP_NAME}
1354                                echo "    else"  >> /etc/rc.d/${APP_NAME}
1355                                echo "      stat_done"  >> /etc/rc.d/${APP_NAME}
1356                                echo "      rm_daemon i2prouter"  >> /etc/rc.d/${APP_NAME}
1357                                echo "    fi"  >> /etc/rc.d/${APP_NAME}
1358                                echo "    ;;"  >> /etc/rc.d/${APP_NAME}
1359                                echo "  restart)"  >> /etc/rc.d/${APP_NAME}
1360                                echo "    ${REALDIR}/${APP_NAME}router restart"  >> /etc/rc.d/${APP_NAME}
1361                                echo "    ;;"  >> /etc/rc.d/${APP_NAME}
1362                                echo "  console)"  >> /etc/rc.d/${APP_NAME}
1363                                echo "    ${REALDIR}/${APP_NAME}router console"  >> /etc/rc.d/${APP_NAME}
1364                                echo "    ;;"  >> /etc/rc.d/${APP_NAME}
1365                                echo "  status)"  >> /etc/rc.d/${APP_NAME}
1366                                echo "    ${REALDIR}/${APP_NAME}router status"  >> /etc/rc.d/${APP_NAME}
1367                                echo "    ;;"  >> /etc/rc.d/${APP_NAME}
1368                                echo "  dump)"  >> /etc/rc.d/${APP_NAME}
1369                                echo "    ${REALDIR}/${APP_NAME}router dump"  >> /etc/rc.d/${APP_NAME}
1370                                echo "    ;;"  >> /etc/rc.d/${APP_NAME}
1371                                echo "  graceful)"  >> /etc/rc.d/${APP_NAME}
1372                                echo "    ${REALDIR}/${APP_NAME}router graceful"  >> /etc/rc.d/${APP_NAME}
1373                                echo "    ;;"  >> /etc/rc.d/${APP_NAME}
1374                                echo "  *)"  >> /etc/rc.d/${APP_NAME}
1375                                echo "    echo \"usage: \$0 {start|stop|restart|console|status|dump}\""  >> /etc/rc.d/${APP_NAME}
1376                                echo "    ;;"  >> /etc/rc.d/${APP_NAME}
1377                                echo "esac"  >> /etc/rc.d/${APP_NAME}
1378                                chmod 755 /etc/rc.d/${APP_NAME}
1379                                chown root:root /etc/rc.d/${APP_NAME}
1380                                echo " The $APP_LONG_NAME daemon has been installed."
1381                                echo ' Add \"i2p\" to the DAEMONS variable in /etc/rc.conf to enable.'
1382                            else
1383                                # We'll end up here if systemd is enabled.
1384                                # If systemd is enabled we don't need the initscript
1385                                rm -f /etc/rc.d/${APP_NAME}
1386                            fi
1387                        fi
1388                        if [ ! -f "${SYSTEMD_SERVICE}" ]; then
1389                            installsystemd
1390                        fi
1391                fi
1392            elif [ -f /etc/SuSE-release ] ; then
1393                echo 'Detected SuSE or SLES:'
1394                 if [ -f /etc/rc.d/${APP_NAME} -a ! "$USE_SYSTEMD" = "1" ] || [ -f "$SYSTEMD_SERVICE" -a "$USE_SYSTEMD" = "1" ]; then
1395                    eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1396                    exit 1
1397                else
1398                    if [ ! -f "/etc/init.d/$APP_NAME" ]; then
1399                        if [ "$USE_SYSTEMD" != "1" ]; then
1400                            eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1401                            ln -s "$REALPATH" "/etc/init.d/$APP_NAME"
1402                            sed -i "s/Default-Start: 2 3 4 5/Default-Start: 5/" $0
1403                            insserv "/etc/init.d/$APP_NAME"
1404                        else
1405                            rm -f "/etc/init.d/$APP_NAME"
1406                        fi
1407                    fi
1408                    if [ ! -f "${SYSTEMD_SERVICE}" ]; then
1409                        installsystemd
1410                    fi
1411                fi
1412            elif [ -f /etc/lsb-release -o -f /etc/debian_version ] ; then
1413                echo 'Detected Debian-based distribution:'
1414                if [ -f "/etc/init.d/$APP_NAME" -o -f "/etc/init/${APP_NAME}.conf" ] ; then
1415                    eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1416                    exit 1
1417                else
1418                    if [ -n "$USE_UPSTART" -a -d "/etc/init" ] ; then
1419                        installUpstart
1420                    else
1421                        echo " Installing the $APP_LONG_NAME daemon using init.d.."
1422                        ln -s "$REALPATH" "/etc/init.d/$APP_NAME"
1423                        update-rc.d "$APP_NAME" defaults
1424                    fi
1425                fi
1426            else
1427                echo 'Detected Linux:'
1428                if [ -f "/etc/init.d/$APP_NAME" ] ; then
1429                    eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1430                    exit 1
1431                else
1432                    eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1433                    ln -s "$REALPATH" /etc/init.d/$APP_NAME
1434                    ln -s "/etc/init.d/$APP_NAME" "/etc/rc3.d/K20$APP_NAME_LOWER"
1435                    ln -s "/etc/init.d/$APP_NAME" "/etc/rc3.d/S20$APP_NAME_LOWER"
1436                    ln -s "/etc/init.d/$APP_NAME" "/etc/rc5.d/S20$APP_NAME_LOWER"
1437                    ln -s "/etc/init.d/$APP_NAME" "/etc/rc5.d/K20$APP_NAME_LOWER"
1438                fi
1439            fi
1440        elif [ "$DIST_OS" = "hpux" ] ; then
1441            echo 'Detected HP-UX:'
1442            if [ -f "/sbin/init.d/$APP_NAME" ] ; then
1443                eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1444                exit 1
1445            else
1446                eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1447                ln -s "$REALPATH" "/sbin/init.d/$APP_NAME"
1448                ln -s "/sbin/init.d/$APP_NAME" "/sbin/rc3.d/K20$APP_NAME_LOWER"
1449                ln -s "/sbin/init.d/$APP_NAME" "/sbin/rc3.d/S20$APP_NAME_LOWER"
1450            fi
1451        elif [ "$DIST_OS" = "aix" ] ; then
1452            echo 'Detected AIX:'
1453            if [ -f "/etc/rc.d/init.d/$APP_NAME" ] ; then
1454                echo " The $APP_LONG_NAME daemon is already installed as rc.d script."
1455                exit 1
1456            elif [ -n "`/usr/sbin/lsitab $APP_NAME`" -a -n "`/usr/bin/lssrc -S -s $APP_NAME`" ] ; then
1457                echo " The $APP_LONG_NAME daemon is already installed as SRC service."
1458                exit 1
1459            else
1460                eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1461                if [ -n "`/usr/sbin/lsitab install_assist`" ] ; then
1462                    echo ' The task /usr/sbin/install_assist was found in the inittab, this might cause problems for all subsequent tasks to launch at this process is known to block the init task. Please make sure this task is not needed anymore and remove/deactivate it.'
1463                fi
1464                /usr/bin/mkssys -s "$APP_NAME" -p "$REALPATH" -a "launchdinternal" -u 0 -f 9 -n 15 -S
1465                /usr/sbin/mkitab "$APP_NAME":2:once:"/usr/bin/startsrc -s \"${APP_NAME}\" >/dev/console 2>&1"
1466
1467            fi
1468        elif [ "$DIST_OS" = "freebsd" ] ; then
1469            echo 'Detected FreeBSD:'
1470            if [ -f "/etc/rc.d/$APP_NAME" ] ; then
1471                eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1472                exit 1
1473            else
1474                eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1475                sed -i .bak "/${APP_NAME}_enable=\"YES\"/d" /etc/rc.conf
1476                if [ -f "${REALDIR}/${APP_NAME}.install" ] ; then
1477                    ln -s "${REALDIR}/${APP_NAME}.install" "/etc/rc.d/$APP_NAME"
1478                else
1479                    echo '#!/bin/sh' > "/etc/rc.d/$APP_NAME"
1480                    echo "#" >> "/etc/rc.d/$APP_NAME"
1481                    echo "# PROVIDE: $APP_NAME" >> "/etc/rc.d/$APP_NAME"
1482                    echo "# REQUIRE: NETWORKING" >> "/etc/rc.d/$APP_NAME"
1483                    echo "# KEYWORD: shutdown" >> "/etc/rc.d/$APP_NAME"
1484                    echo ". /etc/rc.subr" >> "/etc/rc.d/$APP_NAME"
1485                    echo "name=\"$APP_NAME\"" >> "/etc/rc.d/$APP_NAME"
1486                    echo "rcvar=\`set_rcvar\`" >> "/etc/rc.d/$APP_NAME"
1487                    echo "command=\"${REALDIR}/${APP_NAME}router\"" >> "/etc/rc.d/$APP_NAME"
1488                    echo 'start_cmd="${name}_start"' >> "/etc/rc.d/$APP_NAME"
1489                    echo 'load_rc_config $name' >> "/etc/rc.d/$APP_NAME"
1490                    echo 'status_cmd="${name}_status"' >> "/etc/rc.d/$APP_NAME"
1491                    echo 'stop_cmd="${name}_stop"' >> "/etc/rc.d/$APP_NAME"
1492                    echo "${APP_NAME}_status() {" >> "/etc/rc.d/$APP_NAME"
1493                    echo '${command} status' >> "/etc/rc.d/$APP_NAME"
1494                    echo '}' >> "/etc/rc.d/$APP_NAME"
1495                    echo "${APP_NAME}_stop() {" >> "/etc/rc.d/$APP_NAME"
1496                    echo '${command} stop' >> "/etc/rc.d/$APP_NAME"
1497                    echo '}' >> "/etc/rc.d/$APP_NAME"
1498                    echo "${APP_NAME}_start() {" >> "/etc/rc.d/$APP_NAME"
1499                    echo '${command} start' >> "/etc/rc.d/$APP_NAME"
1500                    echo '}' >> "/etc/rc.d/$APP_NAME"
1501                    echo 'run_rc_command "$1"' >> "/etc/rc.d/$APP_NAME"
1502                fi
1503                echo "${APP_NAME}_enable=\"YES\"" >> /etc/rc.conf
1504                chmod 555 "/etc/rc.d/$APP_NAME"
1505            fi
1506        elif [ "$DIST_OS" = "macosx" ] ; then
1507            echo 'Detected Mac OSX:'
1508            if [ -f "/Library/LaunchDaemons/${APP_PLIST}" ] ; then
1509                eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1510                exit 1
1511            else
1512                eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1513                if [ -f "${REALDIR}/${APP_PLIST}" ] ; then
1514                    ln -s "${REALDIR}/${APP_PLIST}" "/Library/LaunchDaemons/${APP_PLIST}"
1515                else
1516                    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > "/Library/LaunchDaemons/${APP_PLIST}"
1517                    echo "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\"" >> "/Library/LaunchDaemons/${APP_PLIST}"
1518                    echo "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">" >> "/Library/LaunchDaemons/${APP_PLIST}"
1519                    echo "<plist version=\"1.0\">" >> "/Library/LaunchDaemons/${APP_PLIST}"
1520                    echo "    <dict>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1521                    echo "        <key>Label</key>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1522                    echo "        <string>${APP_PLIST_BASE}</string>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1523                    echo "        <key>ProgramArguments</key>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1524                    echo "        <array>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1525                    echo "            <string>${REALDIR}/${APP_NAME}router</string>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1526                    echo "            <string>launchdinternal</string>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1527                    echo "        </array>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1528                    echo "        <key>OnDemand</key>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1529                    echo "        <true/>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1530                    echo "        <key>RunAtLoad</key>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1531                    echo "        <true/>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1532                    if [ "X$RUN_AS_USER" != "X" ] ; then
1533                        echo "        <key>UserName</key>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1534                        echo "        <string>${RUN_AS_USER}</string>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1535                    fi
1536                    echo "    </dict>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1537                    echo "</plist>" >> "/Library/LaunchDaemons/${APP_PLIST}"
1538                fi
1539                chmod 555 "/Library/LaunchDaemons/${APP_PLIST}"
1540            fi
1541        elif [ "$DIST_OS" = "zos" ] ; then
1542            echo 'Detected z/OS:'
1543            if [ -f /etc/rc.bak ] ; then
1544                eval echo " `gettext 'The $APP_LONG_NAME daemon is already installed.'`"
1545                exit 1
1546            else
1547                eval echo " `gettext 'Installing the $APP_LONG_NAME daemon'`.."
1548                cp /etc/rc /etc/rc.bak
1549                sed  "s:echo /etc/rc script executed, \`date\`::g" /etc/rc.bak > /etc/rc
1550                echo "_BPX_JOBNAME='${APP_NAME}' \"${REALDIR}/${APP_NAME}router\" start" >>/etc/rc
1551                echo '/etc/rc script executed, `date`' >>/etc/rc
1552            fi
1553        else
1554            eval echo `gettext 'Install not currently supported for $DIST_OS'`
1555            exit 1
1556        fi
1557    fi
1558}
1559
1560removedaemon() {
1561    if [ `id | sed 's/^uid=//;s/(.*$//'` != "0" ] ; then
1562        eval echo `gettext 'Must be root to perform this action.'`
1563        exit 1
1564    else
1565        stopit "0"
1566        APP_NAME_LOWER=`echo "$APP_NAME" | $TREXE "[A-Z]" "[a-z]"`
1567        if [ "$DIST_OS" = "solaris" ] ; then
1568            echo 'Detected Solaris:'
1569            if [ -f "/etc/init.d/$APP_NAME" ] ; then
1570                eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1571                for i in "/etc/rc3.d/S20$APP_NAME_LOWER" "/etc/rc3.d/K20$APP_NAME_LOWER" "/etc/init.d/$APP_NAME"
1572                do
1573                    rm -f $i
1574                done
1575            else
1576                eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1577                exit 1
1578            fi
1579        elif [ "$DIST_OS" = "linux" ] ; then
1580            if [ -f /etc/redhat-release -o -f /etc/redhat_version -o -f /etc/fedora-release ] ; then
1581                echo 'Detected RHEL or Fedora:'
1582                if [ -f "/etc/init.d/$APP_NAME" ] ; then
1583                    eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1584                    /sbin/chkconfig "$APP_NAME" off
1585                    /sbin/chkconfig --del "$APP_NAME"
1586                    rm -f "/etc/init.d/$APP_NAME"
1587                elif [ -f "/etc/init/${APP_NAME}.conf" ] ; then
1588                    echo " Removing $APP_LONG_NAME daemon from upstart..."
1589                    rm "/etc/init/${APP_NAME}.conf"
1590                else
1591                    eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1592                    exit 1
1593                fi
1594            elif [ -f /etc/slackware-version ] ; then
1595                echo 'Detected Slackware Linux:'
1596                if grep -q ${APP_NAME}router /etc/rc.d/rc.local > /dev/null 2>&1 ; then
1597                    eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1598                    sed -i "/i2prouter/d" /etc/rc.d/rc.local /etc/rc.d/rc.local_shutdown
1599                else
1600                    eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1601                    exit 1
1602                fi
1603            elif [ -f /etc/arch-release ] ; then
1604                echo 'Detected Arch Linux:'
1605                if [ -f "/etc/rc.d/$APP_NAME" -o -f "$SYSTEMD_SERVICE" ] ; then
1606                    eval echo "`gettext 'Removing $APP_LONG_NAME daemon'`..."
1607                    rm -f "/etc/rc.d/$APP_NAME"
1608                    rm -f "$SYSTEMD_SERVICE"
1609                else
1610                    eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1611                    exit 1
1612                fi
1613            elif [ -f /etc/SuSE-release ] ; then
1614                echo 'Detected SuSE or SLES:'
1615                if [ -f "/etc/init.d/$APP_NAME" -o ${SYSTEMD_SERVICE} ] ; then
1616                    eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1617                    insserv -r "/etc/init.d/$APP_NAME"
1618                    rm -f "/etc/init.d/$APP_NAME"
1619                    rm -f "$SYSTEMD_SERVICE"
1620                else
1621                    eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1622                    exit 1
1623                fi
1624            elif [ -f /etc/lsb-release -o -f /etc/debian_version ] ; then
1625                echo 'Detected Debian-based distribution:'
1626                if [ -f "/etc/init.d/$APP_NAME" ] ; then
1627                    echo " Removing $APP_LONG_NAME daemon from init.d..."
1628                    update-rc.d -f "$APP_NAME" remove
1629                    rm -f "/etc/init.d/$APP_NAME"
1630                elif [ -f "/etc/init/${APP_NAME}.conf" ] ; then
1631                    echo " Removing $APP_LONG_NAME daemon from upstart..."
1632                    rm "/etc/init/${APP_NAME}.conf"
1633                else
1634                    eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1635                    exit 1
1636                fi
1637            else
1638                echo 'Detected Linux:'
1639                if [ -f "/etc/init.d/$APP_NAME" ] ; then
1640                    eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1641                    for i in "/etc/rc3.d/K20$APP_NAME_LOWER" "/etc/rc5.d/K20$APP_NAME_LOWER" "/etc/rc3.d/S20$APP_NAME_LOWER" "/etc/init.d/$APP_NAME" "/etc/rc5.d/S20$APP_NAME_LOWER"
1642                    do
1643                        rm -f $i
1644                    done
1645                else
1646                    eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1647                    exit 1
1648                fi
1649            fi
1650        elif [ "$DIST_OS" = "hpux" ] ; then
1651            echo 'Detected HP-UX:'
1652            if [ -f "/sbin/init.d/$APP_NAME" ] ; then
1653                eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1654                for i in "/sbin/rc3.d/K20$APP_NAME_LOWER" "/sbin/rc3.d/S20$APP_NAME_LOWER" "/sbin/init.d/$APP_NAME"
1655                do
1656                    rm -f $i
1657                done
1658            else
1659                eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1660                exit 1
1661            fi
1662        elif [ "$DIST_OS" = "aix" ] ; then
1663            echo 'Detected AIX:'
1664            if [ -f "/etc/rc.d/init.d/$APP_NAME" -o -n "`/usr/sbin/lsitab $APP_NAME`" -o -n "`/usr/bin/lssrc -S -s $APP_NAME`" ] ; then
1665                eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1666                if [ -f "/etc/rc.d/init.d/$APP_NAME" ] ; then
1667                    for i in "/etc/rc.d/rc2.d/S20$APP_NAME_LOWER" "/etc/rc.d/rc2.d/K20$APP_NAME_LOWER" "/etc/rc.d/init.d/$APP_NAME"
1668                    do
1669                        rm -f $i
1670                    done
1671                fi
1672                if [ -n "`/usr/sbin/lsitab $APP_NAME`" -o -n "`/usr/bin/lssrc -S -s $APP_NAME`" ] ; then
1673                    /usr/sbin/rmitab $APP_NAME
1674                    /usr/bin/rmssys -s $APP_NAME
1675                fi
1676            else
1677                eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1678                exit 1
1679            fi
1680        elif [ "$DIST_OS" = "freebsd" ] ; then
1681            echo 'Detected FreeBSD:'
1682            if [ -f "/etc/rc.d/$APP_NAME" ] ; then
1683                eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1684                for i in "/etc/rc.d/$APP_NAME"
1685                do
1686                    rm -f $i
1687                done
1688                sed -i .bak "/${APP_NAME}_enable=\"YES\"/d" /etc/rc.conf
1689            else
1690                eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1691                exit 1
1692            fi
1693        elif [ "$DIST_OS" = "macosx" ] ; then
1694            echo 'Detected Mac OSX:'
1695            if [ -f "/Library/LaunchDaemons/${APP_PLIST}" ] ; then
1696                eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1697                # Make sure the plist is installed
1698                LOADED_PLIST=`launchctl list | grep ${APP_PLIST_BASE}`
1699                if [ "X${LOADED_PLIST}" != "X" ] ; then
1700                    launchctl unload "/Library/LaunchDaemons/${APP_PLIST}"
1701                fi
1702                rm -f "/Library/LaunchDaemons/${APP_PLIST}"
1703            else
1704                eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1705                exit 1
1706            fi
1707        elif [ "$DIST_OS" = "zos" ] ; then
1708            echo 'Detected z/OS:'
1709            if [ -f /etc/rc.bak ] ; then
1710                eval echo " `gettext 'Removing $APP_LONG_NAME daemon'`..."
1711                cp /etc/rc /etc/rc.bak
1712                sed  "s/_BPX_JOBNAME=\'APP_NAME\'.*//g" /etc/rc.bak > /etc/rc
1713                rm /etc/rc.bak
1714            else
1715                eval echo " `gettext 'The $APP_LONG_NAME daemon is not currently installed.'`"
1716                exit 1
1717            fi
1718        else
1719            eval echo `gettext 'Remove not currently supported for $DIST_OS'`
1720            exit 1
1721        fi
1722    fi
1723}
1724
1725dump() {
1726    echo "Dumping $APP_LONG_NAME..."
1727    getpid
1728    if [ "X$pid" = "X" ]
1729    then
1730        eval echo `gettext '$APP_LONG_NAME was not running.'`
1731    else
1732        kill -3 $pid
1733
1734        if [ $? -ne 0 ]
1735        then
1736            echo "Failed to dump $APP_LONG_NAME."
1737            exit 1
1738        else
1739            echo "Dumped $APP_LONG_NAME."
1740        fi
1741    fi
1742}
1743
1744# Used by HP-UX init scripts.
1745startmsg() {
1746    getpid
1747    if [ "X$pid" = "X" ]
1748    then
1749        echo "Starting $APP_LONG_NAME...  Wrapper:Stopped"
1750    else
1751        if [ "X$DETAIL_STATUS" = "X" ]
1752        then
1753            echo "Starting $APP_LONG_NAME...  Wrapper:Running"
1754        else
1755            getstatus
1756            echo "Starting $APP_LONG_NAME...  Wrapper:$STATUS, Java:$JAVASTATUS"
1757        fi
1758    fi
1759}
1760
1761# Used by HP-UX init scripts.
1762stopmsg() {
1763    getpid
1764    if [ "X$pid" = "X" ]
1765    then
1766        echo "Stopping $APP_LONG_NAME...  Wrapper:Stopped"
1767    else
1768        if [ "X$DETAIL_STATUS" = "X" ]
1769        then
1770            echo "Stopping $APP_LONG_NAME...  Wrapper:Running"
1771        else
1772            getstatus
1773            echo "Stopping $APP_LONG_NAME...  Wrapper:$STATUS, Java:$JAVASTATUS"
1774        fi
1775    fi
1776}
1777
1778showUsage() {
1779    # $1 bad command
1780
1781    if [ -n "$1" ]
1782    then
1783        echo "Unexpected command: $1"
1784        echo "";
1785    fi
1786
1787    MSG='Usage: '
1788    if [ -n "$FIXED_COMMAND" ] ; then
1789        if [ -n "$PASS_THROUGH" ] ; then
1790            echo "${MSG} $0 {JavaAppArgs}"
1791        else
1792            echo "${MSG} $0"
1793        fi
1794    else
1795            if [ -n "$PASS_THROUGH" ] ; then
1796                echo "${MSG} $0 [ console {JavaAppArgs} | start {JavaAppArgs} | stop | restart {JavaAppArgs} | condrestart {JavaAppArgs} | status | install | remove | dump ]"
1797            else
1798                echo "${MSG} $0 [ console | start | stop | graceful | restart | condrestart | status | install | remove | dump ]"
1799        fi
1800    fi
1801
1802    if [ ! -n "$BRIEF_USAGE" ]
1803    then
1804        echo "";
1805        if [ ! -n "$FIXED_COMMAND" ] ; then
1806            echo "`gettext 'Commands:'`"
1807            echo "  console      `gettext 'Launch in the current console.'`"
1808            echo "  start        `gettext 'Start in the background as a daemon process.'`"
1809            echo "  stop         `gettext 'Stop if running as a daemon or in another console.'`"
1810            echo "  graceful     `gettext 'Stop gracefully, may take up to 11 minutes.'`"
1811            echo "  restart      `gettext 'Stop if running and then start.'`"
1812            echo "  condrestart  `gettext 'Restart only if already running.'`"
1813            echo "  status       `gettext 'Query the current status.'`"
1814            echo "  install      `gettext 'Install to start automatically when system boots.'`"
1815            echo "  remove       `gettext 'Uninstall.'`"
1816            echo "  dump         `gettext 'Request a Java thread dump if running.'`"
1817            echo "";
1818        fi
1819        if [ -n "$PASS_THROUGH" ] ; then
1820            echo "JavaAppArgs: Zero or more arguments which will be passed to the Java application."
1821            echo "";
1822        fi
1823    fi
1824
1825    exit 1
1826}
1827
1828showsetusermesg()  {
1829    echo "`gettext 'Please edit i2prouter and set the variable RUN_AS_USER'`."
1830}
1831
1832checkifstartingasroot() {
1833    if [ ! `grep ^RUN_AS_USER $0` ] && [ ! `grep ^ALLOW_ROOT $0` ] && [ `id -ur` = '0' ]; then
1834        echo "`gettext 'Running I2P as the root user is *not* recommended.'`"
1835        showsetusermesg
1836        echo
1837        echo "`gettext 'To run as root anyway, edit i2prouter and set ALLOW_ROOT=true.'`"
1838        exit 1
1839    fi
1840}
1841
1842docommand() {
1843    case "$COMMAND" in
1844        'console')
1845            checkifstartingasroot
1846            checkUser touchlock "$@"
1847            if [ ! -n "$FIXED_COMMAND" ] ; then
1848                shift
1849            fi
1850            console "$@"
1851            ;;
1852
1853        'start')
1854            checkifstartingasroot
1855            if [ "$DIST_OS" = "macosx" -a -f "/Library/LaunchDaemons/${APP_PLIST}" ] ; then
1856                macosxstart
1857            elif [ "$DIST_OS" = "linux" -a -f "/etc/init/${APP_NAME}.conf" ] ; then
1858                checkUser touchlock "$@"
1859                upstartstart
1860            else
1861                checkUser touchlock "$@"
1862                if [ ! -n "$FIXED_COMMAND" ] ; then
1863                    shift
1864                fi
1865                start "$@"
1866            fi
1867            ;;
1868
1869        'stop')
1870            checkUser "" "$COMMAND"
1871            stopit "0"
1872            ;;
1873
1874        'graceful')
1875            checkUser "" "$COMMAND"
1876            graceful "0"
1877            ;;
1878
1879        'restart')
1880            checkUser touchlock "$COMMAND"
1881            if [ ! -n "$FIXED_COMMAND" ] ; then
1882                shift
1883            fi
1884            stopit "0"
1885            start "$@"
1886            ;;
1887
1888        'condrestart')
1889            checkUser touchlock "$COMMAND"
1890            if [ ! -n "$FIXED_COMMAND" ] ; then
1891                shift
1892            fi
1893            stopit "1"
1894            start "$@"
1895            ;;
1896
1897        'status')
1898            checkUser "" "$COMMAND"
1899            status
1900            ;;
1901
1902        'install')
1903            installdaemon
1904            if [ ! `grep ^RUN_AS_USER $0` ]; then
1905                 echo
1906                 showsetusermesg
1907            fi
1908            echo
1909            echo "You may want to disable the browser from launching at startup at"
1910            echo "http://127.0.0.1:7657/configclients"
1911            echo
1912            echo "I2P_CONFIG_DIR is currently set to $I2P_CONFIG_DIR."
1913            echo "Change the value in $0 if this is not"
1914            echo "appropriate for your configuration."
1915            ;;
1916
1917        'remove' | 'uninstall')
1918            removedaemon
1919            ;;
1920
1921        'dump')
1922            checkUser "" "$COMMAND"
1923            dump
1924            ;;
1925
1926        'start_msg')
1927            # Internal command called by launchd on HP-UX.
1928            checkUser "" "$COMMAND"
1929            startmsg
1930            ;;
1931
1932        'stop_msg')
1933            # Internal command called by launchd on HP-UX.
1934            checkUser "" "$COMMAND"
1935            stopmsg
1936            ;;
1937
1938        'launchdinternal')
1939            # Internal command called by launchd on Max OSX.
1940            # We do not want to call checkUser here as it is handled in the launchd plist file.  Doing it here would confuse launchd.
1941            if [ ! -n "$FIXED_COMMAND" ] ; then
1942                shift
1943            fi
1944            launchdinternal "$@"
1945            ;;
1946
1947        *)
1948            showUsage "$COMMAND"
1949            ;;
1950    esac
1951}
1952
1953docommand "$@"
1954
1955exit 0
Note: See TracBrowser for help on using the repository browser.