6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * CDDL HEADER START
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The contents of this file are subject to the terms of the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Common Development and Distribution License (the "License").
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * You may not use this file except in compliance with the License.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * or http://www.opensolaris.org/os/licensing.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * See the License for the specific language governing permissions
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * and limitations under the License.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * When distributing Covered Code, include this CDDL HEADER in each
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If applicable, add the following below this CDDL HEADER, with the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * fields enclosed by brackets "[]" replaced with your own identifying
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * information: Portions Copyright [yyyy] [name of copyright owner]
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * CDDL HEADER END
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <arpa/inet.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <errno.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <inet/ip.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libdladm.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libdllink.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libdlwlan.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libscf.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <netinet/in.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <netdb.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <stdio.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <stdlib.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <string.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/socket.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/types.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libnwam.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "conditions.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "events.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "objects.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "util.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * enm.c - contains routines which handle ENM (external network modifier)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * abstraction. ENMs represent scripts or services that can be activated either
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * manually or in response to network conditions.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#define CTRUN "/usr/bin/ctrun"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyenm_create_init_fini_event(nwam_enm_handle_t enmh, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t *init = data;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t enm_event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_name(enmh, &name) != NWAM_SUCCESS) {
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_ERR, "enm_init_fini: could not get enm name");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey enm_event = nwamd_event_init(*init ?
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_EVENT_TYPE_OBJECT_INIT : NWAM_EVENT_TYPE_OBJECT_FINI,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_OBJECT_TYPE_ENM, 0, name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (enm_event != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_enqueue(enm_event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Walk all ENMs, creating init events for each.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_init_enms(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t init = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwam_walk_enms(enm_create_init_fini_event, &init, 0, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Walk all ENMs, creating fini events for each.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_fini_enms(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t init = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwam_walk_enms(enm_create_init_fini_event, &init, 0, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic boolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyenm_is_enabled(nwam_enm_handle_t enmh)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t enabledval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t enabled = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ENABLED,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &enabledval) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* It's legal for a conditional ENM to not specify "enabled" */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_boolean(enabledval, &enabled) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "enm_is_enabled: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "enabled value");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(enabledval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (enabled);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int64_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyenm_get_activation_mode(nwam_enm_handle_t enmh)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t activation;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int64_t ret;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t activationval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ACTIVATION_MODE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &activationval) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "enm_get_activation_mode: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "activation mode value");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (-1);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64(activationval, &activation) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "enm_get_activation_mode: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "activation mode value");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = -1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = activation;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(activationval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (ret);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic void *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_activate_deactivate_thread(void *arg)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *object_name = arg;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_t object;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_enm_handle_t enmh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t scriptval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_state_t state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_aux_state_t aux_state;
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey char *script, *copy = NULL;
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey const char **argv = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t going_online, disable_succeeded = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int ret;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate_deactivate_thread: "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "could not find enm %s", object_name);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey goto done;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey enmh = object->nwamd_object_handle;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey going_online =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (object->nwamd_object_state == NWAM_STATE_OFFLINE_TO_ONLINE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * We're starting if current state is offline* and stopping otherwise.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_prop_value(enmh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey going_online ? NWAM_ENM_PROP_START : NWAM_ENM_PROP_STOP,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &scriptval) != NWAM_SUCCESS ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_get_string(scriptval, &script) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If we're stopping, it's not an error for no script to
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * be specified.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(going_online ? LOG_ERR : LOG_DEBUG,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwamd_enm_activate_deactivate_thread: "
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey "no script specified for enm %s", object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (going_online) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_METHOD_MISSING;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey disable_succeeded = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey char *lasts;
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey const char **newargv;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int i = 0;
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey struct timeval now;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_activate_deactivate_thread: "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "running script %s for enm %s", script, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The script may take a number of arguments. We need to
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * create a string array consisting of the wrapper command
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * (ctrun), ENM script name, arguments and NULL array
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * terminator. Start with an array of size equal to the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * string length (since the number of arguments will always
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * be less than this) and shrink array to the actual number
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * of arguments when we have parsed the string.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((copy = strdup(script)) == NULL ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (argv = calloc(strlen(script), sizeof (char *))) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = 1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey argv[i++] = CTRUN;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey argv[i++] = strtok_r(copy, " ", &lasts);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (argv[1] == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = 1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (; (argv[i] = strtok_r(NULL, " ", &lasts)) != NULL; i++) {}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey newargv = realloc(argv, (i + 1) * sizeof (char *));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey argv = newargv;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey /* Store the current time as the time the script began */
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey (void) gettimeofday(&now, NULL);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey object->nwamd_script_time = now;
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey /*
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey * Release the object so that it is not blocked while the
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey * script is running.
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey */
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey nwamd_object_release(object);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = nwamd_start_childv(CTRUN, argv);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey /*
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey * Find the object again, now that the script has finished
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey * running. Check if this ENM was re-read during that time by
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey * comparing the object's script time with the one from above.
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey */
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM, object_name);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey if (object == NULL) {
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate_deactivate_thread: "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "could not find enm %s after running script",
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey object_name);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey goto done;
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey }
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey if (object->nwamd_script_time.tv_sec != now.tv_sec ||
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey object->nwamd_script_time.tv_usec != now.tv_usec) {
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey nlog(LOG_INFO, "nwamd_enm_activate_deactivate_thread: "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "enm %s has been refreshed, nothing to do",
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey object_name);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey nwamd_object_release(object);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey goto done;
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey }
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey (void) gettimeofday(&object->nwamd_script_time, NULL);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyerr:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If script execution fails and we're not destroying the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * object, go to maintenance.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ret != 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate_deactivate_thread: "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "execution of '%s' failed for enm %s",
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey script, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object->nwamd_object_aux_state !=
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_UNINITIALIZED) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_METHOD_FAILED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_UNINITIALIZED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_UNINITIALIZED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (going_online) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_ONLINE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_ACTIVE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey disable_succeeded = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (disable_succeeded) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If aux state is "manual disable", we know
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * this was a disable request, otherwise it was
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * _fini request or a condition satisfaction
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * failure.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (object->nwamd_object_aux_state) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_AUX_STATE_MANUAL_DISABLE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_DISABLED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_MANUAL_DISABLE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_AUX_STATE_UNINITIALIZED:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_UNINITIALIZED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_UNINITIALIZED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_OFFLINE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_CONDITIONS_NOT_MET;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If state/aux state are uninitialized/unintialized, destroy the ENM */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state == NWAM_STATE_UNINITIALIZED &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state == NWAM_AUX_STATE_UNINITIALIZED) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_state = state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_aux_state = aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_object_release_and_destroy_after_preserve(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name, state, aux_state);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_object_release_after_preserve(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskeydone:
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey /* object_name was malloc() before this thread was created, free() it */
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey free(object_name);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey free(argv);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey free(copy);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey nwam_value_free(scriptval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Run start/stop method for ENM in a separate thread. The object lock is not
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * held across threads, so we duplicate the object name for the method
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * execution thread. Returns true if thread is successfully launched.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyboolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_run_method(nwamd_object_t object)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey pthread_t script;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Launch separate thread to wait for execution of script
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * to complete. Do not hold object lock across threads.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((name = strdup(object->nwamd_object_name)) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_run_method: %s: out of memory",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (pthread_create(&script, NULL,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_enm_activate_deactivate_thread, name) != 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_run_method: could not create "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "enm script thread for %s", name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* "name" will be freed by the newly-created thread. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* detach thread so that it doesn't become a zombie */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) pthread_detach(script);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_TRUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Activate the ENM, either in response to an enable event or conditions
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * being satisfied.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic void
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_activate(const char *object_name)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_t object;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t fmrival;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *fmri, *smf_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int ret;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_enm_handle_t enmh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_state_t state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_aux_state_t aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t ran_method = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object == NULL) {
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_ERR, "nwamd_enm_activate: could not find enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = object->nwamd_object_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = object->nwamd_object_aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey enmh = object->nwamd_object_handle;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_DEBUG, "nwamd_enm_activate: activating enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_FMRI, &fmrival);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (err) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_SUCCESS:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_string(fmrival, &fmri) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate: could not retrieve "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "fmri string for enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(fmrival);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_INVALID_CONFIG;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((smf_state = smf_get_state(fmri)) == NULL) {
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_ERR, "nwamd_enm_activate: invalid fmri %s "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "for enm %s", fmri, object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(fmrival);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_INVALID_CONFIG;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_DEBUG, "nwamd_enm_activate: activating %s for enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey fmri, object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(smf_state, SCF_STATE_STRING_ONLINE) == 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = smf_restart_instance(fmri);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey else if (strcmp(smf_state, SCF_STATE_STRING_OFFLINE) == 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = smf_restart_instance(fmri);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey else if (strcmp(smf_state, SCF_STATE_STRING_DISABLED) == 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = smf_enable_instance(fmri, SMF_TEMPORARY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey else
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = smf_restore_instance(fmri);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ret == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_ONLINE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_ACTIVE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate: failed to enable "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "fmri %s for enm %s", fmri,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_METHOD_FAILED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(smf_state);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(fmrival);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Must be a method-based ENM with start (and stop) script(s).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!nwamd_enm_run_method(object)) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Could not launch method execution thread */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_METHOD_FAILED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ran_method = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state != object->nwamd_object_state ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state != object->nwamd_object_aux_state) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name, state, aux_state);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If the method thread was created, we drop the lock to the ENM
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * object without decreasing the reference count, ensuring it will not
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * be destroyed until method execution has completed.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ran_method) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release_and_preserve(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Deactivates the ENM. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic void
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_deactivate(const char *object_name)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_t object;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_enm_handle_t enmh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t fmrival;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *fmri, *smf_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int ret;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_state_t state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_aux_state_t aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t destroying = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object == NULL) {
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_ERR, "nwamd_enm_deactivate: could not find enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = object->nwamd_object_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = object->nwamd_object_aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey enmh = object->nwamd_object_handle;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = object->nwamd_object_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If destroying, we don't care about method failure/config err */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey destroying = (aux_state == NWAM_AUX_STATE_UNINITIALIZED);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_deactivate: deactivating enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_FMRI, &fmrival)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Must be a method-based ENM with start (and stop) script(s).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Script execution thread will take care of the rest.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If the method thread was created, we drop the lock to the ENM
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * object without decreasing the reference count, ensuring it
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * will not be destroyed until method execution has completed.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwamd_enm_run_method(object)) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release_and_preserve(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Could not launch method execution thread */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!destroying) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_METHOD_FAILED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_string(fmrival, &fmri) != NWAM_SUCCESS) {
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_ERR, "nwamd_enm_deactivate: could not "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "retrieve fmri string for enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!destroying) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_INVALID_CONFIG;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((smf_state = smf_get_state(fmri)) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_deactivate: invalid "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "fmri %s for enm %s", fmri,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(fmrival);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!destroying) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_INVALID_CONFIG;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto done;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(smf_state);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_deactivate: deactivating %s "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "for enm %s", fmri, object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = smf_disable_instance(fmri, SMF_TEMPORARY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ret != 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_deactivate: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "smf_disable_instance(%s) failed for "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "enm %s: %s", fmri,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey scf_strerror(scf_error()));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!destroying) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_MAINTENANCE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_METHOD_FAILED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(fmrival);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeydone:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state == object->nwamd_object_state &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state == object->nwamd_object_aux_state) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If aux state is "manual disable", we know
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * this was a disable request, otherwise it was
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * a _fini request or a condition satisfaction
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * failure.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (object->nwamd_object_aux_state) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_AUX_STATE_MANUAL_DISABLE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_DISABLED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_MANUAL_DISABLE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_AUX_STATE_UNINITIALIZED:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_UNINITIALIZED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_UNINITIALIZED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = NWAM_STATE_OFFLINE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = NWAM_AUX_STATE_CONDITIONS_NOT_MET;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Only change state if we aren't destroying the ENM */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!destroying && (state != object->nwamd_object_state ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state != object->nwamd_object_aux_state)) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name, state, aux_state);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If state/aux state are uninitialized/unintialized, destroy the ENM */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state == NWAM_STATE_UNINITIALIZED &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state == NWAM_AUX_STATE_UNINITIALIZED) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_object_release_and_destroy(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Determine whether an ENM should be (de)activated.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* ARGSUSED1 */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_check(nwamd_object_t object, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_enm_handle_t enmh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t conditionval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int64_t eactivation;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t enabled, satisfied;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char **conditions;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_state_t state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t nelem;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state = object->nwamd_object_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey enmh = object->nwamd_object_handle;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey eactivation = enm_get_activation_mode(enmh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (eactivation == -1)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (eactivation) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_MANUAL:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey enabled = enm_is_enabled(enmh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (enabled) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_check: %s is enabled",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (state) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_ONLINE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_MAINTENANCE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Do nothing */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwamd_enm_action(object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_ACTION_ENABLE) != 0) {
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_ERR, "nwamd_enm_check: "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "enable failed for enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_check: %s is disabled",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (state) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_ONLINE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwamd_enm_action(object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_ACTION_DISABLE) != 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_check: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "disable failed for enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_MAINTENANCE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Do nothing */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_DISABLED:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Do nothing */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_STATE_DISABLED,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_MANUAL_DISABLE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_CONDITIONAL_ANY:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTIVATION_MODE_CONDITIONAL_ALL:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_prop_value(enmh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_ENM_PROP_CONDITIONS, &conditionval) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_check: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "condition value");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_string_array(conditionval,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &conditions, &nelem) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_check: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "condition value");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(conditionval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey satisfied = nwamd_check_conditions((uint64_t)eactivation,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey conditions, nelem);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_check: conditions for enm %s "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "%s satisfied", object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey satisfied ? "is" : "is not");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state != NWAM_STATE_ONLINE && satisfied) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_STATE_OFFLINE_TO_ONLINE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_METHOD_RUNNING);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state == NWAM_STATE_ONLINE && !satisfied) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_STATE_ONLINE_TO_OFFLINE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_CONDITIONS_NOT_MET);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(conditionval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_check_conditions(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_walk_objects(NWAM_OBJECT_TYPE_ENM, nwamd_enm_check, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyint
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_action(const char *enm, nwam_action_t action)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event = nwamd_event_init_object_action
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (NWAM_OBJECT_TYPE_ENM, enm, NULL, action);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (1);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_enqueue(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Event handling functions.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Handle ENM initialization/refresh event */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_handle_init_event(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_t object;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_enm_handle_t enmh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t manual_disabled = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_enm_read(event->event_object, 0, &enmh))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_handle_init_event: could not "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "read object '%s': %s", event->event_object,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_do_not_send(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object)) != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_enm_free(object->nwamd_object_handle);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_handle = enmh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_init(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object, enmh, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_state = NWAM_STATE_OFFLINE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_aux_state =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_CONDITIONS_NOT_MET;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey /* (Re)set script time to now as the object has just been (re)read */
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey (void) gettimeofday(&object->nwamd_script_time, NULL);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey manual_disabled = (enm_get_activation_mode(enmh) ==
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_ACTIVATION_MODE_MANUAL && !enm_is_enabled(enmh));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If this ENM is ONLINE, and not manual and disabled (since in
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * that case it was online but we've just set enabled = false as part
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * of a disable action), then it is still active but refreshing.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Change states to re-activate itself.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!manual_disabled &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_state == NWAM_STATE_ONLINE) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object, NWAM_STATE_OFFLINE_TO_ONLINE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_METHOD_RUNNING);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Handle ENM finish event */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_handle_fini_event(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t state_event;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_handle_fini_event(%s)", event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Simulate a state event so that the state machine can correctly
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * deactivate the ENM and free up the handle.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey state_event = nwamd_event_init_object_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object, NWAM_STATE_ONLINE_TO_OFFLINE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_UNINITIALIZED);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state_event == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_do_not_send(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_enm_handle_state_event(state_event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_fini(state_event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Do not free the handle and object.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nwamd_enm_activate_deactivate_thread() and
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * nwamd_enm_deactivate() does this after running the stop script
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * and disabling the FMRI respectively.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_handle_action_event(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_t object;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (event->event_msg->nwe_data.nwe_object_action.nwe_action) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_ENABLE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_handle_action_event: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not find enm %s", event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_do_not_send(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object->nwamd_object_state == NWAM_STATE_ONLINE) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_handle_action_event: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "enm %s already online, nothing to do",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object, NWAM_STATE_OFFLINE_TO_ONLINE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_METHOD_RUNNING);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_DISABLE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_handle_action_event: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not find enm %s", event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_do_not_send(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (object->nwamd_object_state == NWAM_STATE_DISABLED) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_handle_action_event: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "enm %s already disabled, nothing to do",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object, NWAM_STATE_ONLINE_TO_OFFLINE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_AUX_STATE_MANUAL_DISABLE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_ADD:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_REFRESH:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_enm_handle_init_event(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_DESTROY:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_enm_handle_fini_event(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_INFO, "nwam_enm_handle_action_event: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "unexpected action");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_do_not_send(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_handle_state_event(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_t object;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_state_t new_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_aux_state_t new_aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object)) == NULL) {
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_INFO, "nwamd_enm_handle_state_event: "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "state event for nonexistent enm %s", event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_do_not_send(event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_state = event->event_msg->nwe_data.nwe_object_state.nwe_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_aux_state =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_object_state.nwe_aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (new_state == object->nwamd_object_state &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_aux_state == object->nwamd_object_aux_state) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_handle_state_event: "
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld "enm %s already in state (%s , %s)",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name, nwam_state_to_string(new_state),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_aux_state_to_string(new_aux_state));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_state = new_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_aux_state = new_aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
f6904bc3cbac0d84f41b1eb2ed9489a8f221695cRenee Danson Sommerfeld nlog(LOG_DEBUG, "nwamd_enm_handle_state_event: changing state for enm "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "%s to (%s , %s)", object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_state_to_string(object->nwamd_object_state),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_aux_state_to_string(object->nwamd_object_aux_state));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_release(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * State machine for ENMs.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (new_state) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_OFFLINE_TO_ONLINE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_enm_activate(event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_ONLINE_TO_OFFLINE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_enm_deactivate(event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_DISABLED:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_OFFLINE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_UNINITIALIZED:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_MAINTENANCE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_STATE_DEGRADED:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* do nothing */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}