d75e6a5d480f559280524b60d52730c76a25524ftn/*
d75e6a5d480f559280524b60d52730c76a25524ftn * CDDL HEADER START
d75e6a5d480f559280524b60d52730c76a25524ftn *
d75e6a5d480f559280524b60d52730c76a25524ftn * The contents of this file are subject to the terms of the
d75e6a5d480f559280524b60d52730c76a25524ftn * Common Development and Distribution License (the "License").
d75e6a5d480f559280524b60d52730c76a25524ftn * You may not use this file except in compliance with the License.
d75e6a5d480f559280524b60d52730c76a25524ftn *
d75e6a5d480f559280524b60d52730c76a25524ftn * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d75e6a5d480f559280524b60d52730c76a25524ftn * or http://www.opensolaris.org/os/licensing.
d75e6a5d480f559280524b60d52730c76a25524ftn * See the License for the specific language governing permissions
d75e6a5d480f559280524b60d52730c76a25524ftn * and limitations under the License.
d75e6a5d480f559280524b60d52730c76a25524ftn *
d75e6a5d480f559280524b60d52730c76a25524ftn * When distributing Covered Code, include this CDDL HEADER in each
d75e6a5d480f559280524b60d52730c76a25524ftn * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d75e6a5d480f559280524b60d52730c76a25524ftn * If applicable, add the following below this CDDL HEADER, with the
d75e6a5d480f559280524b60d52730c76a25524ftn * fields enclosed by brackets "[]" replaced with your own identifying
d75e6a5d480f559280524b60d52730c76a25524ftn * information: Portions Copyright [yyyy] [name of copyright owner]
d75e6a5d480f559280524b60d52730c76a25524ftn *
d75e6a5d480f559280524b60d52730c76a25524ftn * CDDL HEADER END
d75e6a5d480f559280524b60d52730c76a25524ftn *
d75e6a5d480f559280524b60d52730c76a25524ftn * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
d75e6a5d480f559280524b60d52730c76a25524ftn * Use is subject to license terms.
d75e6a5d480f559280524b60d52730c76a25524ftn */
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn#pragma ident "%Z%%M% %I% %E% SMI"
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn#include <sys/types.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <sys/stat.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <stdio.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <stdlib.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <errno.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <strings.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <fcntl.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <unistd.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <libscf.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <libscf_priv.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include <libuutil.h>
d75e6a5d480f559280524b60d52730c76a25524ftn#include "rcapd.h"
d75e6a5d480f559280524b60d52730c76a25524ftn#include "rcapd_conf.h"
d75e6a5d480f559280524b60d52730c76a25524ftn#include "rcapd_stat.h"
d75e6a5d480f559280524b60d52730c76a25524ftn#include "utils.h"
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn/*
d75e6a5d480f559280524b60d52730c76a25524ftn * Read configuration and set the fields of an rcfg_t correspondingly.
d75e6a5d480f559280524b60d52730c76a25524ftn * Verify that the statistics file is writable, with the optional
d75e6a5d480f559280524b60d52730c76a25524ftn * verify_stat_file_creation() callback.
d75e6a5d480f559280524b60d52730c76a25524ftn */
d75e6a5d480f559280524b60d52730c76a25524ftnint
d75e6a5d480f559280524b60d52730c76a25524ftnrcfg_read(rcfg_t *_rcfg, int(*verify_stat_file_creation)(void))
d75e6a5d480f559280524b60d52730c76a25524ftn{
d75e6a5d480f559280524b60d52730c76a25524ftn scf_simple_handle_t *simple_h;
d75e6a5d480f559280524b60d52730c76a25524ftn uint64_t count_val;
d75e6a5d480f559280524b60d52730c76a25524ftn int ret = E_ERROR;
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn rcfg_init(_rcfg);
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if ((simple_h = scf_general_pg_setup(RCAP_FMRI, CONFIG_PG))
d75e6a5d480f559280524b60d52730c76a25524ftn == NULL) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("SMF initialization problem: %s\n"),
d75e6a5d480f559280524b60d52730c76a25524ftn scf_strerror(scf_error()));
d75e6a5d480f559280524b60d52730c76a25524ftn goto err;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_read_count_property(simple_h, PRESSURE, &count_val)
d75e6a5d480f559280524b60d52730c76a25524ftn == SCF_FAILED) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Configuration property '%s' "
d75e6a5d480f559280524b60d52730c76a25524ftn "not found. \n"), PRESSURE);
d75e6a5d480f559280524b60d52730c76a25524ftn goto err;
d75e6a5d480f559280524b60d52730c76a25524ftn } else {
d75e6a5d480f559280524b60d52730c76a25524ftn if (count_val > 100)
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_memory_cap_enforcement_pressure = 100;
d75e6a5d480f559280524b60d52730c76a25524ftn else
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_memory_cap_enforcement_pressure
d75e6a5d480f559280524b60d52730c76a25524ftn = count_val;
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn debug("cap max pressure: %d%%\n",
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_memory_cap_enforcement_pressure);
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_read_count_property(simple_h, RECONFIG_INT, &count_val)
d75e6a5d480f559280524b60d52730c76a25524ftn == SCF_FAILED) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Configuration property '%s' "
d75e6a5d480f559280524b60d52730c76a25524ftn "not found. \n"), RECONFIG_INT);
d75e6a5d480f559280524b60d52730c76a25524ftn goto err;
d75e6a5d480f559280524b60d52730c76a25524ftn } else {
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_reconfiguration_interval = count_val;
d75e6a5d480f559280524b60d52730c76a25524ftn debug("reconfiguration interval: %d seconds\n",
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_reconfiguration_interval);
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_read_count_property(simple_h, REPORT_INT, &count_val)
d75e6a5d480f559280524b60d52730c76a25524ftn == SCF_FAILED) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Configuration property '%s' "
d75e6a5d480f559280524b60d52730c76a25524ftn "not found. \n"), REPORT_INT);
d75e6a5d480f559280524b60d52730c76a25524ftn goto err;
d75e6a5d480f559280524b60d52730c76a25524ftn } else {
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_report_interval = count_val;
d75e6a5d480f559280524b60d52730c76a25524ftn debug("report interval: %d seconds\n",
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_report_interval);
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_read_count_property(simple_h, RSS_SAMPLE_INT, &count_val)
d75e6a5d480f559280524b60d52730c76a25524ftn == SCF_FAILED) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Configuration property '%s' "
d75e6a5d480f559280524b60d52730c76a25524ftn "not found. \n"), RSS_SAMPLE_INT);
d75e6a5d480f559280524b60d52730c76a25524ftn goto err;
d75e6a5d480f559280524b60d52730c76a25524ftn } else {
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_rss_sample_interval = count_val;
d75e6a5d480f559280524b60d52730c76a25524ftn debug("RSS sample interval: %d seconds\n",
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_rss_sample_interval);
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_read_count_property(simple_h, WALK_INT, &count_val)
d75e6a5d480f559280524b60d52730c76a25524ftn == SCF_FAILED) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Configuration property '%s' "
d75e6a5d480f559280524b60d52730c76a25524ftn "not found. \n"), WALK_INT);
d75e6a5d480f559280524b60d52730c76a25524ftn goto err;
d75e6a5d480f559280524b60d52730c76a25524ftn } else {
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_proc_walk_interval = count_val;
d75e6a5d480f559280524b60d52730c76a25524ftn debug("proc_walk interval: %d seconds\n",
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_proc_walk_interval);
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (_rcfg->rcfg_mode_name == NULL) {
d75e6a5d480f559280524b60d52730c76a25524ftn /*
d75e6a5d480f559280524b60d52730c76a25524ftn * Set project mode, by default.
d75e6a5d480f559280524b60d52730c76a25524ftn */
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_mode = rctype_project;
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_mode_name = "project";
d75e6a5d480f559280524b60d52730c76a25524ftn debug("mode: %s\n", _rcfg->rcfg_mode_name);
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (verify_stat_file_creation != 0 && verify_stat_file_creation()
d75e6a5d480f559280524b60d52730c76a25524ftn != 0) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("cannot create statistics file, " "%s"),
d75e6a5d480f559280524b60d52730c76a25524ftn _rcfg->rcfg_stat_file);
d75e6a5d480f559280524b60d52730c76a25524ftn goto err;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn debug("done parsing\n");
d75e6a5d480f559280524b60d52730c76a25524ftn ret = E_SUCCESS;
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftnerr:
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_error() != SCF_ERROR_NONE) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Unexpected libscf error: %s. \n"),
d75e6a5d480f559280524b60d52730c76a25524ftn scf_strerror(scf_error()));
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftnout:
d75e6a5d480f559280524b60d52730c76a25524ftn scf_simple_handle_destroy(simple_h);
d75e6a5d480f559280524b60d52730c76a25524ftn return (ret);
d75e6a5d480f559280524b60d52730c76a25524ftn}
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftnvoid
d75e6a5d480f559280524b60d52730c76a25524ftnrcfg_init(rcfg_t *rcfg)
d75e6a5d480f559280524b60d52730c76a25524ftn{
d75e6a5d480f559280524b60d52730c76a25524ftn bzero(rcfg, sizeof (*rcfg));
d75e6a5d480f559280524b60d52730c76a25524ftn (void) strcpy(rcfg->rcfg_stat_file, STAT_FILE_DEFAULT);
d75e6a5d480f559280524b60d52730c76a25524ftn}
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn/*
d75e6a5d480f559280524b60d52730c76a25524ftn * Modify configuration in repository given the rcfg_t structure.
d75e6a5d480f559280524b60d52730c76a25524ftn */
d75e6a5d480f559280524b60d52730c76a25524ftnint
d75e6a5d480f559280524b60d52730c76a25524ftnmodify_config(rcfg_t *conf)
d75e6a5d480f559280524b60d52730c76a25524ftn{
d75e6a5d480f559280524b60d52730c76a25524ftn scf_simple_handle_t *simple_h;
d75e6a5d480f559280524b60d52730c76a25524ftn scf_transaction_t *tx = NULL;
d75e6a5d480f559280524b60d52730c76a25524ftn int rval, ret = E_ERROR;
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if ((simple_h = scf_general_pg_setup(RCAP_FMRI, CONFIG_PG))
d75e6a5d480f559280524b60d52730c76a25524ftn == NULL) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("SMF initialization problem: %s\n"),
d75e6a5d480f559280524b60d52730c76a25524ftn scf_strerror(scf_error()));
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if ((tx = scf_transaction_setup(simple_h)) == NULL) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("SMF initialization problem: %s\n"),
d75e6a5d480f559280524b60d52730c76a25524ftn scf_strerror(scf_error()));
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn do {
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_set_count_property(tx, PRESSURE,
d75e6a5d480f559280524b60d52730c76a25524ftn conf->rcfg_memory_cap_enforcement_pressure, 0)
d75e6a5d480f559280524b60d52730c76a25524ftn != SCF_SUCCESS) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Couldn't set '%s' property. \n"),
d75e6a5d480f559280524b60d52730c76a25524ftn PRESSURE);
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_set_count_property(tx, RECONFIG_INT,
d75e6a5d480f559280524b60d52730c76a25524ftn conf->rcfg_reconfiguration_interval, 0) != SCF_SUCCESS) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Couldn't set '%s' property. \n"),
d75e6a5d480f559280524b60d52730c76a25524ftn RECONFIG_INT);
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_set_count_property(tx, RSS_SAMPLE_INT,
d75e6a5d480f559280524b60d52730c76a25524ftn conf->rcfg_rss_sample_interval, 0) != SCF_SUCCESS) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Couldn't set '%s' property. \n"),
d75e6a5d480f559280524b60d52730c76a25524ftn RSS_SAMPLE_INT);
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_set_count_property(tx, REPORT_INT,
d75e6a5d480f559280524b60d52730c76a25524ftn conf->rcfg_report_interval, 0) != SCF_SUCCESS) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Couldn't set '%s' property. \n"),
d75e6a5d480f559280524b60d52730c76a25524ftn REPORT_INT);
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_set_count_property(tx, WALK_INT,
d75e6a5d480f559280524b60d52730c76a25524ftn conf->rcfg_proc_walk_interval, 0) != SCF_SUCCESS) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("Couldn't set '%s' property. \n"),
d75e6a5d480f559280524b60d52730c76a25524ftn WALK_INT);
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if ((rval = scf_transaction_commit(tx)) == -1)
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn if (rval == 0) {
d75e6a5d480f559280524b60d52730c76a25524ftn if (scf_transaction_restart(simple_h, tx)
d75e6a5d480f559280524b60d52730c76a25524ftn != SCF_SUCCESS) {
d75e6a5d480f559280524b60d52730c76a25524ftn warn(gettext("SMF initialization problem: "
d75e6a5d480f559280524b60d52730c76a25524ftn "%s\n"), scf_strerror(scf_error()));
d75e6a5d480f559280524b60d52730c76a25524ftn goto out;
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn } while (rval == 0);
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftn ret = E_SUCCESS;
d75e6a5d480f559280524b60d52730c76a25524ftn
d75e6a5d480f559280524b60d52730c76a25524ftnout:
d75e6a5d480f559280524b60d52730c76a25524ftn if (tx != NULL) {
d75e6a5d480f559280524b60d52730c76a25524ftn scf_transaction_destroy_children(tx);
d75e6a5d480f559280524b60d52730c76a25524ftn scf_transaction_destroy(tx);
d75e6a5d480f559280524b60d52730c76a25524ftn }
d75e6a5d480f559280524b60d52730c76a25524ftn scf_simple_handle_destroy(simple_h);
d75e6a5d480f559280524b60d52730c76a25524ftn return (ret);
d75e6a5d480f559280524b60d52730c76a25524ftn}