diff options
| author | Tuncer Ayaz <tuncer.ayaz@gmail.com> | 2013-06-12 16:57:26 +0200 | 
|---|---|---|
| committer | Tuncer Ayaz <tuncer.ayaz@gmail.com> | 2013-06-12 17:01:57 +0200 | 
| commit | 500b62a890db84b233e8277e63a634bf2b157523 (patch) | |
| tree | 6eca77e494842088c3e601f6ebd0d21d73438582 | |
| parent | ef0fd4089fd2efd4ba8941de73ce6932e47e3a7e (diff) | |
Sync test/upgrade_project/rel/files with priv/templates
| -rwxr-xr-x | test/upgrade_project/rel/files/dummy | 185 | ||||
| -rwxr-xr-x | test/upgrade_project/rel/files/erl | 24 | ||||
| -rw-r--r-- | test/upgrade_project/rel/files/nodetool | 58 | ||||
| -rw-r--r-- | test/upgrade_project/rel/files/sys.config | 1 | ||||
| -rw-r--r-- | test/upgrade_project/rel/files/vm.args | 8 | 
5 files changed, 210 insertions, 66 deletions
| diff --git a/test/upgrade_project/rel/files/dummy b/test/upgrade_project/rel/files/dummy index 83f29ba..c2ef258 100755 --- a/test/upgrade_project/rel/files/dummy +++ b/test/upgrade_project/rel/files/dummy @@ -2,25 +2,41 @@  # -*- tab-width:4;indent-tabs-mode:nil -*-  # ex: ts=4 sw=4 et +# /bin/sh on Solaris is not a POSIX compatible shell, but /usr/bin/ksh is. +if [ `uname -s` = 'SunOS' -a "${POSIX_SHELL}" != "true" ]; then +    POSIX_SHELL="true" +    export POSIX_SHELL +    # To support 'whoami' add /usr/ucb to path +    PATH=/usr/ucb:$PATH +    export PATH +    exec /usr/bin/ksh $0 "$@" +fi + +# clear it so if we invoke other scripts, they run as ksh +unset POSIX_SHELL +  RUNNER_SCRIPT_DIR=$(cd ${0%/*} && pwd -P) +CALLER_DIR=$PWD +  RUNNER_BASE_DIR=${RUNNER_SCRIPT_DIR%/*}  RUNNER_ETC_DIR=$RUNNER_BASE_DIR/etc -RUNNER_LOG_DIR=$RUNNER_BASE_DIR/log  # Note the trailing slash on $PIPE_DIR/  PIPE_DIR=/tmp/$RUNNER_BASE_DIR/  RUNNER_USER= +WHOAMI=$(whoami)  # Make sure this script is running as the appropriate user -if [ ! -z "$RUNNER_USER" ] && [ `whoami` != "$RUNNER_USER" ]; then -    exec sudo -u $RUNNER_USER -i $0 $@ +if ([ "$RUNNER_USER" ] && [ "x$WHOAMI" != "x$RUNNER_USER" ]); then +    type sudo > /dev/null 2>&1 +    if [ $? -ne 0 ]; then +        echo "sudo doesn't appear to be installed and your EUID isn't $RUNNER_USER" 1>&2 +        exit 1 +    fi +    echo "Attempting to restart script through sudo -H -u $RUNNER_USER" >&2 +    exec sudo -H -u $RUNNER_USER -i $RUNNER_SCRIPT_DIR/$RUNNER_SCRIPT $@  fi -# Make sure CWD is set to runner base dir -cd $RUNNER_BASE_DIR - -# Make sure log directory exists -mkdir -p $RUNNER_LOG_DIR  # Identify the script name  SCRIPT=`basename $0` @@ -29,22 +45,37 @@ START_ERL=`cat $RUNNER_BASE_DIR/releases/start_erl.data`  ERTS_VSN=${START_ERL% *}  APP_VSN=${START_ERL#* } -# Use releases/VSN/vm.args if it exists otherwise use etc/vm.args -if [ -e "$RUNNER_BASE_DIR/releases/$APP_VSN/vm.args" ]; then -    VMARGS_PATH="$RUNNER_BASE_DIR/releases/$APP_VSN/vm.args" +# Use $CWD/vm.args if exists, otherwise releases/APP_VSN/vm.args, or +# else etc/vm.args +if [ -e "$CALLER_DIR/vm.args" ]; then +    VMARGS_PATH=$CALLER_DIR/vm.args +    USE_DIR=$CALLER_DIR  else -    VMARGS_PATH="$RUNNER_ETC_DIR/vm.args" +    USE_DIR=$RUNNER_BASE_DIR +    if [ -e "$RUNNER_BASE_DIR/releases/$APP_VSN/vm.args" ]; then +        VMARGS_PATH="$RUNNER_BASE_DIR/releases/$APP_VSN/vm.args" +    else +        VMARGS_PATH="$RUNNER_ETC_DIR/vm.args" +    fi  fi +RUNNER_LOG_DIR=$USE_DIR/log +# Make sure log directory exists +mkdir -p $RUNNER_LOG_DIR +  # Use releases/VSN/sys.config if it exists otherwise use etc/app.config -if [ -e "$RUNNER_BASE_DIR/releases/$APP_VSN/sys.config" ]; then -    CONFIG_PATH="$RUNNER_BASE_DIR/releases/$APP_VSN/sys.config" +if [ -e "$USE_DIR/sys.config" ]; then +    CONFIG_PATH="$USE_DIR/sys.config"  else -    CONFIG_PATH="$RUNNER_ETC_DIR/app.config" +    if [ -e "$RUNNER_BASE_DIR/releases/$APP_VSN/sys.config" ]; then +        CONFIG_PATH="$RUNNER_BASE_DIR/releases/$APP_VSN/sys.config" +    else +        CONFIG_PATH="$RUNNER_ETC_DIR/app.config" +    fi  fi  # Extract the target node name from node.args -NAME_ARG=`egrep '^-s?name' $VMARGS_PATH` +NAME_ARG=`egrep '^\-s?name' $VMARGS_PATH`  if [ -z "$NAME_ARG" ]; then      echo "vm.args needs to have either -name or -sname parameter."      exit 1 @@ -54,17 +85,24 @@ fi  REMSH_TYPE=`echo $NAME_ARG | awk '{print $1}'`  REMSH_NAME=`echo $NAME_ARG | awk '{print $2}'` -# Note the `date +%s`, used to allow multiple remsh to the same node transparently -REMSH_NAME_ARG="$REMSH_TYPE attach`date +%s`@`echo $REMSH_NAME | awk -F@ '{print $2}'`" +# Note the `date +%s`, used to allow multiple remsh to the same node +# transparently +REMSH_NAME_ARG="$REMSH_TYPE remsh`date +%s`@`echo $REMSH_NAME | awk -F@ '{print $2}'`"  REMSH_REMSH_ARG="-remsh $REMSH_NAME"  # Extract the target cookie -COOKIE_ARG=`grep '^-setcookie' $VMARGS_PATH` +COOKIE_ARG=`grep '^\-setcookie' $VMARGS_PATH`  if [ -z "$COOKIE_ARG" ]; then      echo "vm.args needs to have a -setcookie parameter."      exit 1  fi +# Make sure CWD is set to the right dir +cd $USE_DIR + +# Make sure log directory exists +mkdir -p $USE_DIR/log +  # Add ERTS bin dir to our path  ERTS_PATH=$RUNNER_BASE_DIR/erts-$ERTS_VSN/bin @@ -74,47 +112,83 @@ NODETOOL="$ERTS_PATH/escript $ERTS_PATH/nodetool $NAME_ARG $COOKIE_ARG"  # Setup remote shell command to control node  REMSH="$ERTS_PATH/erl $REMSH_NAME_ARG $REMSH_REMSH_ARG $COOKIE_ARG" +# Common functions + +# Ping node without allowing nodetool to take stdin +ping_node() { +    $NODETOOL ping < /dev/null +} + +# Set the PID global variable, return 1 on error +get_pid() { +    PID=`$NODETOOL getpid < /dev/null` +    ES=$? +    if [ "$ES" -ne 0 ]; then +        echo "Node is not running!" +        return 1 +    fi + +    # don't allow empty or init pid's +    if [ -z $PID ] || [ "$PID" -le 1 ]; then +        return 1 +    fi + +    return 0 +} +  # Check the first argument for instructions  case "$1" in -    start) +    start|start_boot)          # Make sure there is not already a node running -        RES=`$NODETOOL ping` +        RES=`ping_node`          if [ "$RES" = "pong" ]; then              echo "Node is already running!"              exit 1          fi -        shift # remove $1 +        case "$1" in +            start) +                shift +                START_OPTION="console" +                HEART_OPTION="start" +                ;; +            start_boot) +                shift +                START_OPTION="console_boot" +                HEART_OPTION="start_boot" +                ;; +        esac          RUN_PARAM=$(printf "\'%s\' " "$@") -        HEART_COMMAND="$RUNNER_BASE_DIR/bin/$SCRIPT start $RUN_PARAM" +        HEART_COMMAND="$RUNNER_BASE_DIR/bin/$SCRIPT $HEART_OPTION $RUN_PARAM"          export HEART_COMMAND          mkdir -p $PIPE_DIR -        $ERTS_PATH/run_erl -daemon $PIPE_DIR $RUNNER_LOG_DIR "exec $RUNNER_BASE_DIR/bin/$SCRIPT console $RUN_PARAM" 2>&1 +        $ERTS_PATH/run_erl -daemon $PIPE_DIR $RUNNER_LOG_DIR "exec $RUNNER_BASE_DIR/bin/$SCRIPT $START_OPTION $RUN_PARAM" 2>&1          ;;      stop)          # Wait for the node to completely stop...          case `uname -s` in -            Linux|Darwin|FreeBSD|DragonFly|NetBSD|OpenBSD) -                # PID COMMAND -                PID=`ps ax -o pid= -o command=|\ -                    grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $1}'` -                ;; -            SunOS) -                # PID COMMAND -                PID=`ps -ef -o pid= -o args=|\ -                    grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $1}'` -                ;; -            CYGWIN*) -                # UID PID PPID TTY STIME COMMAND -                PID=`ps -efW|grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $2}'` -                ;; +            Darwin) +                # Make sure we explicitly set this because iTerm.app doesn't for +                # some reason. +                COMMAND_MODE=unix2003          esac + +        # Get the PID from nodetool +        get_pid +        GPR=$? +        if [ "$GPR" -ne 0 ] || [ -z $PID ]; then +            exit $GPR +        fi + +        # Tell nodetool to initiate a stop          $NODETOOL stop          ES=$?          if [ "$ES" -ne 0 ]; then              exit $ES          fi -        while `kill -0 $PID 2>/dev/null`; + +        # Wait for the node to completely stop... +        while `kill -s 0 $PID 2>/dev/null`          do              sleep 1          done @@ -140,7 +214,7 @@ case "$1" in      ping)          ## See if the VM is alive -        $NODETOOL ping +        ping_node          ES=$?          if [ "$ES" -ne 0 ]; then              exit $ES @@ -148,8 +222,8 @@ case "$1" in          ;;      attach) -        # Make sure a node IS running -        RES=`$NODETOOL ping` +        # Make sure a node is running +        ping_node          ES=$?          if [ "$ES" -ne 0 ]; then              echo "Node is not running!" @@ -161,8 +235,8 @@ case "$1" in          ;;      remote_console) -        # Make sure a node IS running -        RES=`$NODETOOL ping` +        # Make sure a node is running +        ping_node          ES=$?          if [ "$ES" -ne 0 ]; then              echo "Node is not running!" @@ -182,7 +256,7 @@ case "$1" in          fi          # Make sure a node IS running -        RES=`$NODETOOL ping` +        ping_node          ES=$?          if [ "$ES" -ne 0 ]; then              echo "Node is not running!" @@ -195,12 +269,18 @@ case "$1" in          $ERTS_PATH/escript $RUNNER_BASE_DIR/bin/install_upgrade.escript $node_name $erlang_cookie $2          ;; -    console|console_clean) +    console|console_clean|console_boot)          # .boot file typically just $SCRIPT (ie, the app name) -        # however, for debugging, sometimes start_clean.boot is useful: +        # however, for debugging, sometimes start_clean.boot is useful. +        # For e.g. 'setup', one may even want to name another boot script.          case "$1" in              console)        BOOTFILE=$SCRIPT ;;              console_clean)  BOOTFILE=start_clean ;; +            console_boot) +                shift +                BOOTFILE="$1" +                shift +                ;;          esac          # Setup beam-required vars          ROOTDIR=$RUNNER_BASE_DIR @@ -249,8 +329,17 @@ case "$1" in          # Start the VM          exec $CMD -- ${1+"$@"}          ;; +    getpid) +        # Get the PID from nodetool +        get_pid +        ES=$? +        if [ "$ES" -ne 0 ] || [ -z $PID ]; then +            exit $ES +        fi +        echo $PID +        ;;      *) -        echo "Usage: $SCRIPT {start|foreground|stop|restart|reboot|ping|console|console_clean|attach|remote_console|upgrade}" +        echo "Usage: $SCRIPT {start|start_boot <file>|foreground|stop|restart|reboot|ping|console|getpid|console_clean|console_boot <file>|attach|remote_console|upgrade}"          exit 1          ;;  esac diff --git a/test/upgrade_project/rel/files/erl b/test/upgrade_project/rel/files/erl index 4c1a4f7..f4c63af 100755 --- a/test/upgrade_project/rel/files/erl +++ b/test/upgrade_project/rel/files/erl @@ -1,13 +1,23 @@  #!/bin/sh -## This script replaces the default "erl" in erts-VSN/bin. This is necessary -## as escript depends on erl and in turn, erl depends on having access to a -## bootscript (start.boot). Note that this script is ONLY invoked as a side-effect -## of running escript -- the embedded node bypasses erl and uses erlexec directly -## (as it should). +# /bin/sh on Solaris is not a POSIX compatible shell, but /usr/bin/ksh is. +if [ `uname -s` = 'SunOS' -a "${POSIX_SHELL}" != "true" ]; then +    POSIX_SHELL="true" +    export POSIX_SHELL +    exec /usr/bin/ksh $0 "$@" +fi + +# clear it so if we invoke other scripts, they run as ksh as well +unset POSIX_SHELL + +## This script replaces the default "erl" in erts-VSN/bin. This is +## necessary as escript depends on erl and in turn, erl depends on +## having access to a bootscript (start.boot). Note that this script +## is ONLY invoked as a side-effect of running escript -- the embedded +## node bypasses erl and uses erlexec directly (as it should).  ## -## Note that this script makes the assumption that there is a start_clean.boot -## file available in $ROOTDIR/release/VSN. +## Note that this script makes the assumption that there is a +## start_clean.boot file available in $ROOTDIR/release/VSN.  # Determine the abspath of where this script is executing from.  ERTS_BIN_DIR=$(cd ${0%/*} && pwd -P) diff --git a/test/upgrade_project/rel/files/nodetool b/test/upgrade_project/rel/files/nodetool index eb08fa4..ce06c6a 100644 --- a/test/upgrade_project/rel/files/nodetool +++ b/test/upgrade_project/rel/files/nodetool @@ -1,3 +1,4 @@ +#!/usr/bin/env escript  %% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-  %% ex: ft=erlang ts=4 sw=4 et  %% ------------------------------------------------------------------- @@ -5,25 +6,51 @@  %% nodetool: Helper Script for interacting with live nodes  %%  %% ------------------------------------------------------------------- -  main(Args) ->      ok = start_epmd(),      %% Extract the args      {RestArgs, TargetNode} = process_args(Args, [], undefined), +    %% any commands that don't need a running node +    case RestArgs of +        ["chkconfig", File] -> +            case file:consult(File) of +                {ok, _} -> +                    io:format("ok\n"), +                    halt(0); +                {error, {Line, Mod, Term}} -> +                    io:format(standard_error, ["Error on line ", +                              file:format_error({Line, Mod, Term}), "\n"], []), +                    halt(1); +                {error, R} -> +                    io:format(standard_error, ["Error reading config file: ", +                              file:format_error(R), "\n"], []), +                    halt(1) +            end; +        _ -> +            ok +    end, +      %% See if the node is currently running  -- if it's not, we'll bail -    case {net_kernel:hidden_connect_node(TargetNode), net_adm:ping(TargetNode)} of +    case {net_kernel:hidden_connect_node(TargetNode), +          net_adm:ping(TargetNode)} of          {true, pong} ->              ok; +        {false,pong} -> +            io:format("Failed to connect to node ~p .\n", [TargetNode]), +            halt(1);          {_, pang} ->              io:format("Node ~p not responding to pings.\n", [TargetNode]),              halt(1)      end,      case RestArgs of +        ["getpid"] -> +            io:format("~p\n", +                      [list_to_integer(rpc:call(TargetNode, os, getpid, []))]);          ["ping"] -> -            %% If we got this far, the node already responsed to a ping, so just dump -            %% a "pong" +            %% If we got this far, the node already responsed to a +            %% ping, so just dump a "pong"              io:format("pong\n");          ["stop"] ->              io:format("~p\n", [rpc:call(TargetNode, init, stop, [], 60000)]); @@ -32,7 +59,9 @@ main(Args) ->          ["reboot"] ->              io:format("~p\n", [rpc:call(TargetNode, init, reboot, [], 60000)]);          ["rpc", Module, Function | RpcArgs] -> -            case rpc:call(TargetNode, list_to_atom(Module), list_to_atom(Function), +            case rpc:call(TargetNode, +                          list_to_atom(Module), +                          list_to_atom(Function),                            [RpcArgs], 60000) of                  ok ->                      ok; @@ -42,8 +71,23 @@ main(Args) ->                  _ ->                      halt(1)              end; +        ["rpc_infinity", Module, Function | RpcArgs] -> +            case rpc:call(TargetNode, +                          list_to_atom(Module), +                          list_to_atom(Function), +                          [RpcArgs], infinity) of +                ok -> +                    ok; +                {badrpc, Reason} -> +                    io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]), +                    halt(1); +                _ -> +                    halt(1) +            end;          ["rpcterms", Module, Function, ArgsAsString] -> -            case rpc:call(TargetNode, list_to_atom(Module), list_to_atom(Function), +            case rpc:call(TargetNode, +                          list_to_atom(Module), +                          list_to_atom(Function),                            consult(ArgsAsString), 60000) of                  {badrpc, Reason} ->                      io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]), @@ -53,7 +97,7 @@ main(Args) ->              end;          Other ->              io:format("Other: ~p\n", [Other]), -            io:format("Usage: nodetool {ping|stop|restart|reboot}\n") +            io:format("Usage: nodetool {chkconfig|getpid|ping|stop|restart|reboot|rpc|rpc_infinity|rpcterms}\n")      end,      net_kernel:stop(). diff --git a/test/upgrade_project/rel/files/sys.config b/test/upgrade_project/rel/files/sys.config index d7677e7..3b7f6bd 100644 --- a/test/upgrade_project/rel/files/sys.config +++ b/test/upgrade_project/rel/files/sys.config @@ -8,3 +8,4 @@           {error_logger_mf_maxfiles, 5}           % 5 files max          ]}  ]. + diff --git a/test/upgrade_project/rel/files/vm.args b/test/upgrade_project/rel/files/vm.args index 2d64e25..a9aeb64 100644 --- a/test/upgrade_project/rel/files/vm.args +++ b/test/upgrade_project/rel/files/vm.args @@ -9,11 +9,11 @@  ##-heart  ## Enable kernel poll and a few async threads -+K true -+A 5 +##+K true +##+A 5  ## Increase number of concurrent ports/sockets --env ERL_MAX_PORTS 4096 +##-env ERL_MAX_PORTS 4096  ## Tweak GC to run more often --env ERL_FULLSWEEP_AFTER 10 +##-env ERL_FULLSWEEP_AFTER 10 | 
