diff options
Diffstat (limited to 'src/pmview/launch.cpp')
-rw-r--r-- | src/pmview/launch.cpp | 421 |
1 files changed, 421 insertions, 0 deletions
diff --git a/src/pmview/launch.cpp b/src/pmview/launch.cpp new file mode 100644 index 0000000..3e2d2f6 --- /dev/null +++ b/src/pmview/launch.cpp @@ -0,0 +1,421 @@ +/* + * Copyright (c) 1997-2002 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2009 Aconex. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ +#include "main.h" +#include "launch.h" +#include "colorscale.h" +#include "metriclist.h" + +#include <iostream> +using namespace std; + +#define PM_LAUNCH_VERSION1 1 +#define PM_LAUNCH_VERSION2 2 + +const QString Launch::theVersion1Str = "pmlaunch Version 1.0\n"; +const QString Launch::theVersion2Str = "pmlaunch Version 2.0\n"; + +Launch::~Launch() +{ +} + +Launch::Launch(const QString &version) +: _strings(), + _groupMetric(-1), + _groupCount(0), + _groupHint(), + _metricCount(0) +{ + if (version == "1.0") + _version = PM_LAUNCH_VERSION1; + else + _version = PM_LAUNCH_VERSION2; +} + +Launch::Launch(const Launch &rhs) +: _strings(rhs._strings), + _groupMetric(rhs._groupMetric), + _groupCount(rhs._groupCount), + _groupHint(rhs._groupHint), + _metricCount(rhs._metricCount), + _version(rhs._version) +{ +} + +const Launch & +Launch::operator=(const Launch &rhs) +{ + if (this != &rhs) { + _strings = rhs._strings; + _groupMetric = rhs._groupMetric; + _groupCount = rhs._groupCount; + _groupHint = rhs._groupHint; + _metricCount = rhs._metricCount; + } + return *this; +} + +void +Launch::setDefaultOptions(int interval, + int debug, + const char *timeport, + const char *starttime, + const char *endtime, + const char *offset, + const char *timezone, + const char *defsourcetype, + const char *defsourcename, + bool selected) +{ + addOption("interval", (interval < 0 ? -interval : interval)); + addOption("debug", debug); + + if (timeport != NULL) + addOption("timeport", timeport); + if (starttime != NULL) + addOption("starttime", starttime); + if (endtime != NULL) + addOption("endtime", endtime); + if (offset != NULL) + addOption("offset", offset); + if (timezone != NULL) + addOption("timezone", timezone); + if (defsourcetype != NULL) + addOption("defsourcetype", defsourcetype); + if (defsourcename != NULL) + addOption("defsourcename", defsourcename); + if (pmProgname != NULL) + addOption("progname", pmProgname); + addOption("pid", (int)getpid()); + + if (selected) + addOption("selected", "true"); + else + addOption("selected", "false"); +} + +void +Launch::addOption(const char *name, const char *value) +{ + QString str = "option "; + + if (name == NULL) + return; + + if (value == NULL) { + str.append(name).append("=\n"); + } + else { + str.append(name).append('=').append(value).append('\n'); + str.append('\n'); + } + _strings.append(str); +} + +void +Launch::addOption(const char *name, int value) +{ + QString str = "option "; + + if (name == NULL) + return; + + str.append(name).append('=').setNum(value).append('\n'); + _strings.append(str); +} + +void +Launch::addMetric(const QmcMetric &metric, + const SbColor &color, + int instance, + bool useSocks) +{ +#ifdef PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL1) { + cerr << "Launch::addMetric(1): Adding "; + metric.dump(cerr, true, instance); + cerr << " (" << _metricCount << ')' << endl; + } +#endif + + QmcSource source = metric.context()->source(); + QByteArray ba; + ba = metric.instName(instance).toLocal8Bit(); + + addMetric(metric.context()->handle(), source.source(), source.host(), metric.name(), + metric.hasInstances() == 0 ? NULL : ba.data(), + metric.desc(), color, metric.scale(), useSocks); +} + +void +Launch::addMetric(const QmcMetric &metric, + const ColorScale &scale, + int instance, + bool useSocks) +{ +#ifdef PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL1) { + cerr << "Launch::addMetric(2): Adding "; + metric.dump(cerr, true, instance); + cerr << " (" << _metricCount << ')' << endl; + } +#endif + + QmcSource source = metric.context()->source(); + QByteArray ba; + ba = metric.instName(instance).toLocal8Bit(); + + addMetric(metric.context()->handle(), source.source(), source.host(), metric.name(), + metric.hasInstances() == 0 ? NULL : ba.data(), + metric.desc(), scale, useSocks); +} + +void +Launch::addMetric(int context, + const QString &source, + const QString &host, + const QString &metric, + const char *instance, + const QmcDesc &desc, + const SbColor &color, + double scale, + bool useSocks) +{ + QString str(256); + QString col; + + if (_groupMetric == -1) { +#ifdef PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL1) + cerr << "Launch::addMetric: Called before startGroup." + << " Adding a group." << endl; +#endif + startGroup(); + } + + preColor(context, source, host, metric, useSocks, str); + + str.append(" S "); + MetricList::toString(color, col); + str.append(col).append(',').setNum(scale).append(' '); + + postColor(desc, instance, str); + _strings.append(str); +} + +void +Launch::addMetric(int context, + const QString &source, + const QString &host, + const QString &metric, + const char *instance, + const QmcDesc &desc, + const ColorScale &scale, + bool useSocks) +{ + int i; + QString str(128); + QString col; + + if (_groupMetric == -1) { +#ifdef PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL1) + cerr << "Launch::addMetric: Called before startGroup." + << " Adding a group." << endl; +#endif + startGroup(); + } + + preColor(context, source, host, metric, useSocks, str); + str.append(" D "); + + MetricList::toString(scale[0].color(), col); + str.append(col).append(',').setNum(scale[0].min()); + for (i = 1; i < scale.numSteps(); i++) { + MetricList::toString(scale[i].color(), col); + str.append(',').append(col).append(','); + str.setNum(scale[i].min()); + } + str.append(' '); + + postColor(desc, instance, str); + _strings.append(str); +} + +void +Launch::preColor(int context, + const QString &source, + const QString &host, + const QString &metric, + bool useSocks, + QString &str) +{ + str.append("metric ").setNum(_metricCount++).append(' '); + str.setNum(_groupCount).append(' ').append(_groupHint); + + switch(context) { + case PM_CONTEXT_LOCAL: + str.append(" l "); + break; + case PM_CONTEXT_HOST: + str.append(" h "); + break; + case PM_CONTEXT_ARCHIVE: + str.append(" a "); + break; + } + + str.append(source).append(' '); + + if (context == PM_CONTEXT_ARCHIVE) + str.append(host); + else if (useSocks) + str.append("true"); + else + str.append("false"); + + str.append(' ').append(metric); +} + +void +Launch::postColor(const QmcDesc &desc, + const char *instance, + QString &str) +{ + const pmDesc d = desc.desc(); + + if (_version == PM_LAUNCH_VERSION2) { + str.setNum(d.type).append(' '); + str.setNum(d.sem).append(' '); + str.setNum(d.units.scaleSpace).append(' '); + str.setNum(d.units.scaleTime).append(' '); + str.setNum(d.units.scaleCount).append(' '); + } + + str.setNum(d.units.dimSpace).append(' '); + str.setNum(d.units.dimTime).append(' '); + str.setNum(d.units.dimCount).append(' '); + str.setNum((int)(d.indom)).append(" ["); + if (instance != NULL) + str.append(instance); + str.append("]\n"); +} + +void +Launch::startGroup(const char *hint) +{ + + if (_groupMetric != -1) + cerr << "Launch::startGroup: Two groups started at once!" << endl; + else { +#ifdef PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL1) + cerr << "Launch::startGroup: Starting group " << _groupCount + << endl; +#endif + + _groupMetric = _metricCount; + _groupHint = hint; + } +} + +void +Launch::endGroup() +{ + if (_groupMetric == -1) + cerr << "Launch::endGroup: No group to end!" << endl; + else if (_groupMetric == _metricCount) { + cerr << "Launch::endGroup: No metrics added to group " + << _groupCount << endl; + _groupMetric = -1; + } else { +#ifdef PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL1) + cerr << "Launch::endGroup: ending group " << _groupCount + << endl; +#endif + + _groupMetric = -1; + _groupCount++; + } +} + +void +Launch::append(Launch const &rhs) +{ + if (rhs._groupMetric != -1) { +#ifdef PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL1) + cerr << "Launch::append: Group not finished in appended object." + << " Completing group" << endl; +#endif + + // Cast away const, yuk. + ((Launch *)(&rhs))->endGroup(); + } + _strings.append(rhs._strings); +} + +QTextStream& +operator<<(QTextStream& os, Launch const& rhs) +{ + int i; + for (i = 0; i < rhs._strings.size(); i++) + os << rhs._strings[i]; + return os; +} + +const char * +Launch::launchPath() +{ + char *env; + static char launch_path[MAXPATHLEN]; + + if ((env = getenv("PM_LAUNCH_PATH")) != NULL) + strncpy(launch_path, env, sizeof(launch_path)); + else + snprintf(launch_path, sizeof(launch_path), "%s/config/pmlaunch", pmGetConfig("PCP_VAR_DIR")); + return launch_path; +} + +#include <iostream> + +void +Launch::output(int fd) const +{ + QByteArray ba; + int sts; + const char *str; + + if (_version == PM_LAUNCH_VERSION2) + ba = theVersion2Str.toLocal8Bit(); + else + ba = theVersion1Str.toLocal8Bit(); + + str = ba.data(); + if ((sts = write(fd, str, strlen(str))) != (int)strlen(str)) { + cerr << "Launch::output: version write->" << sts + << " not " << strlen(str) << endl; + } + + for (int i = 0; i < _strings.length(); i++) { + ba = _strings[i].toLocal8Bit(); + str = ba.data(); + if ((sts = write(fd, str, strlen(str))) != (int)strlen(str)) { + cerr << "Launch::output: string write->" << sts + << " not " << strlen(str) + << " for " << str << endl; + } + } +} |