# Optional arguments passed to lsvcgssd.
-LSVCGSSDARGS=''
+
+#LSVCGSSDARGS=''
. /etc/init.d/functions
LOCKFILE="/var/lock/subsys/lsvcgssd"
+
+# If service is not configured, launch with all mechs
# -k -- Enable kerberos support
# -s -- Enable shared key support
-LSVCGSSDARGS="-k -s"
+# -z -- Enable gssnull support
+LSVCGSSDARGS="-k -s -z"
# Check for and source configuration file
[ -f /etc/sysconfig/lsvcgss ] && . /etc/sysconfig/lsvcgss
test_5() {
local file1=$DIR/$tdir/$tfile-1
local file2=$DIR/$tdir/$tfile-2
+ local file3=$DIR/$tdir/$tfile-3
local wait_time=$((TIMEOUT + TIMEOUT / 2))
mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
[ -f $file1 ] || error "$file1 not found"
# flush context
- $RUNAS $LFS flushctx $MOUNT || error "can't flush context"
+ $RUNAS $LFS flushctx $MOUNT || error "can't flush context (1)"
# stop lsvcgssd
send_sigint $(comma_list $(mdts_nodes)) $LSVCGSSD
sleep 5
check_gss_daemon_nodes $(comma_list $(mdts_nodes)) $LSVCGSSD &&
- error "$LSVCGSSD still running"
+ error "$LSVCGSSD still running (1)"
+
+ # daemon should restart automatically, at least on newer servers
+ $RUNAS touch $file2
+ if [ $? -ne 0 ]; then
+ echo "$RUNAS touch $file2 failed"
+ (( MDS1_VERSION < $(version_code 2.15.61) )) ||
+ error "$LSVCGSSD should restart automatically"
+ else
+ echo "$RUNAS touch $file2 succeeded"
+ fi
+
+ # flush context
+ if (( MDS1_VERSION >= $(version_code 2.15.61) )); then
+ $RUNAS $LFS flushctx $MOUNT || error "can't flush context (2)"
+ fi
- $RUNAS touch $file2 && error "should fail without $LSVCGSSD"
+ # stop lsvcgssd
+ send_sigint $(comma_list $(mdts_nodes)) $LSVCGSSD
+ sleep 5
+ check_gss_daemon_nodes $(comma_list $(mdts_nodes)) $LSVCGSSD &&
+ error "$LSVCGSSD still running (2)"
# restart lsvcgssd, expect touch succeed
echo "restart $LSVCGSSD and recovering"
start_gss_daemons $(comma_list $(mdts_nodes)) $LSVCGSSD "-vvv"
sleep 5
check_gss_daemon_nodes $(comma_list $(mdts_nodes)) $LSVCGSSD
- $RUNAS touch $file2 || error "should not fail now"
- [ -f $file2 ] || error "$file2 not found"
+ $RUNAS touch $file3 || error "should not fail now"
+ [ -f $file3 ] || error "$file3 not found"
}
-run_test 5 "lsvcgssd dead, operations fail"
+run_test 5 "lsvcgssd dead, operations pass"
test_6() {
local nfile=10
#include "lsupport.h"
#include "err_util.h"
+static int start_daemon(char *auth_req)
+{
+ int rc;
+
+ rc = system("/usr/bin/systemctl restart lsvcgss");
+ if (rc < 0 || (errno = WEXITSTATUS(rc))) {
+ printerr(LL_ERR, "systemctl restart lsvcgss service failed: %s\n",
+ strerror(errno));
+ rc = -errno;
+ } else {
+ printerr(LL_INFO, "lsvcgss service automatically restarted\n");
+ rc = 0;
+ }
+
+ return rc;
+}
+
int main(int argc, char **argv)
{
int local_socket;
ssize_t bytes_sent;
char *auth_req = NULL, *cachename = NULL;
ssize_t req_len;
- int opt, debug = 0, rc = 0;
+ int opt, debug = 0, tried_daemon = 0, rc = 0;
/* Parameters received from kernel (see rsi_do_upcall()):
* -c <cache name> -r <auth request> -d
break;
case 'd':
debug = 1;
- goto connect;
+ goto socket;
case 'r':
auth_req = optarg;
break;
req_len = strlen(auth_req);
-connect:
+socket:
/* Send auth request to lsvcgssd via a socket. */
local_socket = socket(AF_UNIX, SOCK_STREAM, 0);
if (local_socket == -1) {
- rc = -errno;
- printerr(LL_ERR, "cannot create socket: %d\n", rc);
- return rc;
+ printerr(LL_ERR, "cannot create socket: %d\n", -errno);
+ return EXIT_FAILURE;
}
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, GSS_SOCKET_PATH, sizeof(addr.sun_path) - 1);
+connect:
if (connect(local_socket, (struct sockaddr *)&addr,
sizeof(addr)) == -1) {
rc = -errno;
printerr(LL_ERR, "cannot connect to socket: %d\n", rc);
- goto out;
+ if (debug || tried_daemon == 5)
+ goto out;
+ if (!tried_daemon) {
+ rc = start_daemon(auth_req);
+ if (rc) {
+ rc = -1;
+ goto out;
+ }
+ sleep(2);
+ }
+ tried_daemon++;
+ goto connect;
}
if (debug)
out:
close(local_socket);
- return rc;
+ return rc < 0 ? EXIT_FAILURE : 0;
}