enm.c revision 874067a014d3e133de4f0636e5a615038cbca9b8
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Use is subject to license terms.
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. Maskeyenm_create_init_fini_event(nwam_enm_handle_t enmh, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_name(enmh, &name) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "enm_init_fini: could not get ENM name");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_EVENT_TYPE_OBJECT_INIT : NWAM_EVENT_TYPE_OBJECT_FINI,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Walk all ENMs, creating init events for each.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwam_walk_enms(enm_create_init_fini_event, &init, 0, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Walk all ENMs, creating fini events for each.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwam_walk_enms(enm_create_init_fini_event, &init, 0, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ENABLED,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* It's legal for a conditional ENM to not specify "enabled" */
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. Maskeyenm_get_activation_mode(nwam_enm_handle_t enmh)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_ACTIVATION_MODE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "enm_get_activation_mode: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "activation mode value");
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. Maskeynwamd_enm_activate_deactivate_thread(void *arg)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t going_online, disable_succeeded = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate_deactivate_thread: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (object->nwamd_object_state == NWAM_STATE_OFFLINE_TO_ONLINE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * We're starting if current state is offline* and stopping otherwise.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey going_online ? NWAM_ENM_PROP_START : NWAM_ENM_PROP_STOP,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_get_string(scriptval, &script) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If we're stopping, it's not an error for no script to
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * be specified.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwamd_enm_activate_deactivate_thread: "
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey "no script specified for enm %s", object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_activate_deactivate_thread: "
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey "running script %s for ENM %s", script, object_name);
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 (argv = calloc(strlen(script), sizeof (char *))) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (; (argv[i] = strtok_r(NULL, " ", &lasts)) != NULL; i++) {}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey newargv = realloc(argv, (i + 1) * sizeof (char *));
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey /* Store the current time as the time the script began */
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey * Release the object so that it is not blocked while the
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey * script is running.
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 object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM, object_name);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate_deactivate_thread: "
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey "could not find ENM %s after running script",
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: "
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey "ENM %s has been refreshed, nothing to do",
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey (void) gettimeofday(&object->nwamd_script_time, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If script execution fails and we're not destroying the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * object, go to maintenance.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate_deactivate_thread: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "execution of '%s' failed for ENM %s",
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 aux_state = NWAM_AUX_STATE_CONDITIONS_NOT_MET;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If state/aux state are uninitialized/unintialized, destroy the ENM */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state == NWAM_AUX_STATE_UNINITIALIZED) {
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 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);
874067a014d3e133de4f0636e5a615038cbca9b8Anurag S. Maskey /* object_name was malloc() before this thread was created, free() it */
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 * Launch separate thread to wait for execution of script
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * to complete. Do not hold object lock across threads.
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 nwamd_enm_activate_deactivate_thread, name) != 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_run_method: could not create "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* "name" will be freed by the newly-created thread. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* detach thread so that it doesn't become a zombie */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Activate the ENM, either in response to an enable event or conditions
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * being satisfied.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate: could not find ENM %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = object->nwamd_object_aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_activate: activating ENM %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_FMRI, &fmrival);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_string(fmrival, &fmri) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "FMRI string for ENM %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((smf_state = smf_get_state(fmri)) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_activate: invalid FMRI %s "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "for ENM %s", fmri, object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_activate: activating %s for ENM %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(smf_state, SCF_STATE_STRING_ONLINE) == 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey else if (strcmp(smf_state, SCF_STATE_STRING_OFFLINE) == 0)
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 nlog(LOG_ERR, "nwamd_enm_activate: failed to enable "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Must be a method-based ENM with start (and stop) script(s).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Could not launch method execution thread */
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 * 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/* Deactivates the ENM. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_deactivate(const char *object_name)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM, object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_deactivate: could not find ENM %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state = object->nwamd_object_aux_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 nlog(LOG_DEBUG, "nwamd_enm_deactivate: deactivating enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_enm_get_prop_value(enmh, NWAM_ENM_PROP_FMRI, &fmrival)
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 /* Could not launch method execution thread */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_string(fmrival, &fmri) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwamd_enm_deactivate: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "FMRI string for ENM %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((smf_state = smf_get_state(fmri)) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_deactivate: invalid "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_deactivate: deactivating %s "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "for ENM %s", fmri, object->nwamd_object_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = smf_disable_instance(fmri, SMF_TEMPORARY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "smf_disable_instance(%s) failed for "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state == object->nwamd_object_aux_state) {
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 aux_state = NWAM_AUX_STATE_CONDITIONS_NOT_MET;
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 /* If state/aux state are uninitialized/unintialized, destroy the ENM */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey aux_state == NWAM_AUX_STATE_UNINITIALIZED) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_object_release_and_destroy(object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Determine whether an ENM should be (de)activated.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* ARGSUSED1 */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_check(nwamd_object_t object, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey eactivation = enm_get_activation_mode(enmh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_check: %s is enabled",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Do nothing */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwamd_enm_action(object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "nwamd_enm_check: enable failed "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "for enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_check: %s is disabled",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwamd_enm_action(object->nwamd_object_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "disable failed for enm %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Do nothing */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Do nothing */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
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 if (nwam_value_get_string_array(conditionval,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_check: could not retrieve "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "condition value");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey satisfied = nwamd_check_conditions((uint64_t)eactivation,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_check: conditions for enm %s "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state != NWAM_STATE_ONLINE && satisfied) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (state == NWAM_STATE_ONLINE && !satisfied) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_walk_objects(NWAM_OBJECT_TYPE_ENM, nwamd_enm_check, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_action(const char *enm, nwam_action_t action)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t event = nwamd_event_init_object_action
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Event handling functions.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Handle ENM initialization/refresh event */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_handle_init_event(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_enm_read(event->event_object, 0, &enmh))
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 if ((object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_enm_free(object->nwamd_object_handle);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_init(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_state = NWAM_STATE_OFFLINE;
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);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey manual_disabled = (enm_get_activation_mode(enmh) ==
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_ACTIVATION_MODE_MANUAL && !enm_is_enabled(enmh));
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 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/* Handle ENM finish event */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_handle_fini_event(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "nwamd_enm_handle_fini_event(%s)", event->event_object);
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 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 * 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. Maskeynwamd_enm_handle_action_event(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (event->event_msg->nwe_data.nwe_object_action.nwe_action) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM,
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 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 nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object, NWAM_STATE_OFFLINE_TO_ONLINE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM,
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 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 nwamd_object_set_state(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_object, NWAM_STATE_ONLINE_TO_OFFLINE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_INFO, "nwam_enm_handle_action_event: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "unexpected action");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_enm_handle_state_event(nwamd_event_t event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((object = nwamd_object_find(NWAM_OBJECT_TYPE_ENM,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "nwamd_enm_handle_state_event: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "state event for nonexistent ENM %s", event->event_object);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_state = event->event_msg->nwe_data.nwe_object_state.nwe_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey event->event_msg->nwe_data.nwe_object_state.nwe_aux_state;
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: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "ENM %s already in state (%s , %s)",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_name, nwam_state_to_string(new_state),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey object->nwamd_object_aux_state = new_aux_state;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 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 * State machine for ENMs.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* do nothing */