From 48b84772715e3ab5608ed7653dc160d2d14b84c7 Mon Sep 17 00:00:00 2001 From: Jiahui Li Date: Sun, 11 May 2025 23:42:24 -0500 Subject: [PATCH] Extend `remsh` to read cookie from various sources We can set cookies using `./dev/run --erlang-cookie=crumbles` or `vm.args`: `-setcookie crumbles`. If neither of them is set or we set the cookie in both places, then the Erlang node will read the cookie from `~/.erlang.cookie`. Add this mechanism to the `remsh` script to extend flexibility. Related PR: https://github.com/apache/couchdb/pull/5531 --- dev/remsh | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/dev/remsh b/dev/remsh index 347a799d088..1ae6ae6f309 100755 --- a/dev/remsh +++ b/dev/remsh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at @@ -11,18 +11,48 @@ # License for the specific language governing permissions and limitations under # the License. -if [ -z $NODE ]; then - if [ -z $1 ]; then - NODE=1 - else - NODE=$1 - fi +# Cookies can be set in 3 different ways: +# - Use `dev/run` script to pass cookies: +# `dev/run --erlang-cookie=crumbles` +# - Use `vm.args` config file in rel/overlay/etc to set cookies: +# `-setcookie crumbles` +# - Use cookies from the `.erlang.cookie` file in the user's home directory. + +# NOTE: If more than 2 cookies are passed to node, node will ignore them +# and use the default cookies from `~/.erlang.cookie`. + +if [ -z "$NODE" ]; then + if [ -z "$1" ]; then + NODE=1 + else + NODE=$1 + fi fi -if [ -z $HOST ]; then - HOST="127.0.0.1" +if [ -z "$HOST" ]; then + HOST="127.0.0.1" fi NAME="remsh$$@$HOST" NODE="node$NODE@$HOST" -erl -name $NAME -remsh $NODE -hidden + +COOKIE_PY=$(ps ax | + grep -E "dev/run .* --erlang-cookie=" | + sed -n "s/.*--erlang-cookie=\([a-zA-Z0-9!@%^&*()_+-=(){}<>,;.:?/|]*\).*/\1/p") + +DIR="$( + cd "${0%/*}" 2>/dev/null || exit + echo "$PWD"/../rel/overlay/etc/ +)" +COOKIE_VM=$(grep "^-setcookie" "$DIR"/vm.args | + sed -n "s/-setcookie *\([a-zA-Z0-9!@%^&*()_+-=(){}<>,;.:?/|]*\).*/\1/p") + +if [[ -n "$COOKIE_PY" && -z "$COOKIE_VM" ]]; then + erl -name "$NAME" -remsh "$NODE" -hidden -setcookie "$COOKIE_PY" +elif [[ -z "$COOKIE_PY" && $(echo "$COOKIE_VM" | wc -l) -eq 1 ]]; then + erl -name "$NAME" -remsh "$NODE" -hidden -setcookie "$COOKIE_VM" +else + erl -name "$NAME" -remsh "$NODE" -hidden +fi + +erl -name "$NAME" -remsh "$NODE" -hidden