|  | #!/bin/sh | 
        
          |  | ### BEGIN INIT INFO | 
        
          |  | # Provides:          shadowsocks-local | 
        
          |  | # Required-Start:    $network $local_fs $remote_fs | 
        
          |  | # Required-Stop:     $remote_fs | 
        
          |  | # Default-Start:     2 3 4 5 | 
        
          |  | # Default-Stop:      0 1 6 | 
        
          |  | # Short-Description: lightweight secured scoks5 proxy | 
        
          |  | # Description:       Shadowsocks-local is a lightweight secured | 
        
          |  | #                    socks5 proxy for embedded devices and low end boxes. | 
        
          |  |  | 
        
          |  | ### END INIT INFO | 
        
          |  |  | 
        
          |  | # Author: Max Lv <[email protected]> | 
        
          |  |  | 
        
          |  | # PATH should only include /usr/ if it runs after the mountnfs.sh script | 
        
          |  | PATH=/sbin:/usr/sbin:/bin:/usr/bin | 
        
          |  | DESC=shadowsocks-local       # Introduce a short description here | 
        
          |  | NAME=shadowsocks-local       # Introduce the short server's name here | 
        
          |  | DAEMON=/usr/bin/ss-local     # Introduce the server's location here | 
        
          |  | DAEMON_ARGS=""               # Arguments to run the daemon with | 
        
          |  | PIDFILE=/var/run/$NAME/$NAME.pid | 
        
          |  | SCRIPTNAME=/etc/init.d/$NAME | 
        
          |  |  | 
        
          |  | # Exit if the package is not installed | 
        
          |  | [ -x $DAEMON ] || exit 0 | 
        
          |  |  | 
        
          |  | # Read configuration variable file if it is present | 
        
          |  | [ -r /etc/default/$NAME ] && . /etc/default/$NAME | 
        
          |  |  | 
        
          |  | [ "$START" = "yes" ] || exit 0 | 
        
          |  |  | 
        
          |  | : ${USER:="root"} | 
        
          |  | : ${GROUP:="root"} | 
        
          |  |  | 
        
          |  | # Load the VERBOSE setting and other rcS variables | 
        
          |  | . /lib/init/vars.sh | 
        
          |  |  | 
        
          |  | # Define LSB log_* functions. | 
        
          |  | # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. | 
        
          |  | . /lib/lsb/init-functions | 
        
          |  |  | 
        
          |  | # | 
        
          |  | # Function that starts the daemon/service | 
        
          |  | # | 
        
          |  | do_start() | 
        
          |  | { | 
        
          |  | # Modify the file descriptor limit | 
        
          |  | ulimit -n ${MAXFD} | 
        
          |  |  | 
        
          |  | # Take care of pidfile permissions | 
        
          |  | mkdir /var/run/$NAME 2>/dev/null || true | 
        
          |  | chown "$USER:$GROUP" /var/run/$NAME | 
        
          |  |  | 
        
          |  | # Return | 
        
          |  | #   0 if daemon has been started | 
        
          |  | #   1 if daemon was already running | 
        
          |  | #   2 if daemon could not be started | 
        
          |  | start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid root:$GROUP --exec $DAEMON --test > /dev/null \ | 
        
          |  | || return 1 | 
        
          |  | start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid root:$GROUP --exec $DAEMON -- \ | 
        
          |  | -c "$CONFFILE" -a "$USER" -u -f $PIDFILE $DAEMON_ARGS \ | 
        
          |  | || return 2 | 
        
          |  | } | 
        
          |  |  | 
        
          |  | # | 
        
          |  | # Function that stops the daemon/service | 
        
          |  | # | 
        
          |  | do_stop() | 
        
          |  | { | 
        
          |  | # Return | 
        
          |  | #   0 if daemon has been stopped | 
        
          |  | #   1 if daemon was already stopped | 
        
          |  | #   2 if daemon could not be stopped | 
        
          |  | #   other if a failure occurred | 
        
          |  | start-stop-daemon --stop --quiet --retry=KILL/5 --pidfile $PIDFILE --exec $DAEMON | 
        
          |  | RETVAL="$?" | 
        
          |  | [ "$RETVAL" = 2 ] && return 2 | 
        
          |  | # Wait for children to finish too if this is a daemon that forks | 
        
          |  | # and if the daemon is only ever run from this initscript. | 
        
          |  | # If the above conditions are not satisfied then add some other code | 
        
          |  | # that waits for the process to drop all resources that could be | 
        
          |  | # needed by services started subsequently.  A last resort is to | 
        
          |  | # sleep for some time. | 
        
          |  | start-stop-daemon --stop --quiet --oknodo --retry=KILL/5 --exec $DAEMON | 
        
          |  | [ "$?" = 2 ] && return 2 | 
        
          |  | # Many daemons don't delete their pidfiles when they exit. | 
        
          |  | rm -f $PIDFILE | 
        
          |  | return "$RETVAL" | 
        
          |  | } | 
        
          |  |  | 
        
          |  |  | 
        
          |  | case "$1" in | 
        
          |  | start) | 
        
          |  | [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME" | 
        
          |  | do_start | 
        
          |  | case "$?" in | 
        
          |  | 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; | 
        
          |  | 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; | 
        
          |  | esac | 
        
          |  | ;; | 
        
          |  | stop) | 
        
          |  | [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" | 
        
          |  | do_stop | 
        
          |  | case "$?" in | 
        
          |  | 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; | 
        
          |  | 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; | 
        
          |  | esac | 
        
          |  | ;; | 
        
          |  | status) | 
        
          |  | status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? | 
        
          |  | ;; | 
        
          |  | restart|force-reload) | 
        
          |  | log_daemon_msg "Restarting $DESC" "$NAME" | 
        
          |  | do_stop | 
        
          |  | case "$?" in | 
        
          |  | 0|1) | 
        
          |  | do_start | 
        
          |  | case "$?" in | 
        
          |  | 0) log_end_msg 0 ;; | 
        
          |  | 1) log_end_msg 1 ;; # Old process is still running | 
        
          |  | *) log_end_msg 1 ;; # Failed to start | 
        
          |  | esac | 
        
          |  | ;; | 
        
          |  | *) | 
        
          |  | # Failed to stop | 
        
          |  | log_end_msg 1 | 
        
          |  | ;; | 
        
          |  | esac | 
        
          |  | ;; | 
        
          |  | *) | 
        
          |  | echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 | 
        
          |  | exit 3 | 
        
          |  | ;; | 
        
          |  | esac | 
        
          |  |  | 
        
          |  | : |