Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/envstat Allow to select raw output for a single dev...
details: https://anonhg.NetBSD.org/src/rev/d1635fbb71fe
branches: trunk
changeset: 946020:d1635fbb71fe
user: mlelstv <mlelstv%NetBSD.org@localhost>
date: Sat Nov 14 12:36:49 2020 +0000
description:
Allow to select raw output for a single device or a list of sensors.
diffstat:
usr.sbin/envstat/envstat.8 | 28 +++++++-
usr.sbin/envstat/envstat.c | 153 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 174 insertions(+), 7 deletions(-)
diffs (261 lines):
diff -r 5ce50137c7cc -r d1635fbb71fe usr.sbin/envstat/envstat.8
--- a/usr.sbin/envstat/envstat.8 Sat Nov 14 11:51:58 2020 +0000
+++ b/usr.sbin/envstat/envstat.8 Sat Nov 14 12:36:49 2020 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: envstat.8,v 1.63 2020/11/14 09:11:55 mlelstv Exp $
+.\" $NetBSD: envstat.8,v 1.64 2020/11/14 12:36:49 mlelstv Exp $
.\"
.\" Copyright (c) 2000, 2007, 2008, 2009, 2014 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -35,12 +35,16 @@
.Nd utility to handle environmental sensors
.Sh SYNOPSIS
.Nm
-.Op Fl DfIklSTWx
+.Op Fl DfIklSTW
.Op Fl c Ar file
.Op Fl d Ar device
.Op Fl i Ar interval
.Op Fl s Ar "device:sensor,..."
.Op Fl w Ar width
+.Nm
+.Fl x
+.Op Fl d Ar device
+.Op Fl s Ar "device:sensor,..."
.Op Ar property...
.Sh DESCRIPTION
.Nm
@@ -143,6 +147,12 @@
If
.Ar property
is specified, the value of that property is printed.
+The property list can be filtered with the
+.Fl d or
+.Fl s
+options. If
+.Fl s is used with only a single sensor, only the properties
+of this sensor are returned, not a list of sensors.
.El
.Sh UNITS
The display mode may show some values with abbreviated units;
@@ -205,10 +215,22 @@
invalid states every second:
.Pp
.Dl $ envstat -ITi1
+.Pp
+To return a single temperature value:
+.Pp
+.Dl $ envstat -s vcmbox0:temperature -x /cur-value
+.Pp
+To return values of multiple temperature sensors from a single device
+.Pp
+.Dl $ envstat -s 'thinkpad0:temperature 0,thinkpad0:temperature 1' -x /thinkpad0/0/cur-value /thinkpad0/1/cur-value
+.Pp
+To return values of temperature sensors from multiple devices:
+.Pp
+.Dl $ envstat -s 'coretemp0:cpu0 temperature,coretemp1:cpu 2 temperature' -x /coretemp0/0/cur-value /coretemp1/0/cur-value
.Sh SEE ALSO
.Xr units 1 ,
.Xr proplib 3 ,
-.Xr acpiacad 4 ,
+.r acpiacad 4 ,
.Xr acpibat 4 ,
.Xr acpitz 4 ,
.Xr admtemp 4 ,
diff -r 5ce50137c7cc -r d1635fbb71fe usr.sbin/envstat/envstat.c
--- a/usr.sbin/envstat/envstat.c Sat Nov 14 11:51:58 2020 +0000
+++ b/usr.sbin/envstat/envstat.c Sat Nov 14 12:36:49 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: envstat.c,v 1.98 2020/11/14 09:11:55 mlelstv Exp $ */
+/* $NetBSD: envstat.c,v 1.99 2020/11/14 12:36:49 mlelstv Exp $ */
/*-
* Copyright (c) 2007, 2008 Juan Romero Pardines.
@@ -27,7 +27,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: envstat.c,v 1.98 2020/11/14 09:11:55 mlelstv Exp $");
+__RCSID("$NetBSD: envstat.c,v 1.99 2020/11/14 12:36:49 mlelstv Exp $");
#endif /* not lint */
#include <stdio.h>
@@ -109,6 +109,7 @@
static u_int header_passes;
static int parse_dictionary(int);
+static int add_sensors(prop_dictionary_t, prop_dictionary_t, const char *, const char *);
static int send_dictionary(FILE *);
static int find_sensors(prop_array_t, const char *, dvprops_t);
static void print_sensors(void);
@@ -219,6 +220,61 @@
if (rval)
errx(EXIT_FAILURE, "%s", strerror(rval));
+ if (mydevname || sensors) {
+ prop_dictionary_t ndict;
+
+ ndict = prop_dictionary_create();
+ if (ndict == NULL)
+ err(EXIT_FAILURE, "prop_dictionary_create");
+
+ if (mydevname) {
+ if (add_sensors(ndict, dict, mydevname, NULL))
+ err(EXIT_FAILURE, "add_sensors");
+ }
+ if (sensors) {
+ char *dvstring, *sstring, *p, *last, *s;
+ unsigned count = 0;
+
+ s = strdup(sensors);
+ if (s == NULL)
+ err(EXIT_FAILURE, "strdup");
+
+ for ((p = strtok_r(s, ",", &last)); p;
+ (p = strtok_r(NULL, ",", &last))) {
+ /* get device name */
+ dvstring = strtok(p, ":");
+ if (dvstring == NULL)
+ errx(EXIT_FAILURE, "missing device name");
+
+ /* get sensor description */
+ sstring = strtok(NULL, ":");
+ if (sstring == NULL)
+ errx(EXIT_FAILURE, "missing sensor description");
+
+ if (add_sensors(ndict, dict, dvstring, sstring))
+ err(EXIT_FAILURE, "add_sensors");
+
+ ++count;
+ }
+ free(s);
+
+ /* in case we asked for a single sensor
+ * show only the sensor dictionary
+ */
+ if (count == 1) {
+ prop_object_t obj, obj2;
+
+ obj = prop_dictionary_get(ndict, dvstring);
+ obj2 = prop_array_get(obj, 0);
+ prop_object_release(ndict);
+ ndict = obj2;
+ }
+ }
+
+ prop_object_release(dict);
+ dict = ndict;
+ }
+
if (argc > 0) {
for (; argc > 0; ++argv, --argc)
config_dict_extract(dict, *argv, true);
@@ -350,6 +406,92 @@
}
static int
+add_sensors(prop_dictionary_t ndict, prop_dictionary_t dict, const char *dev, const char *sensor)
+{
+ prop_object_iterator_t iter, iter2;
+ prop_object_t obj, obj2, desc;
+ prop_array_t array, narray;
+ prop_dictionary_t sdict;
+ const char *dnp;
+ unsigned int capacity = 1;
+ uint64_t dummy;
+ bool found = false;
+
+ if (prop_dictionary_count(dict) == 0)
+ return 0;
+
+ narray = prop_dictionary_get(ndict, dev);
+ if (narray)
+ found = true;
+ else {
+ narray = prop_array_create_with_capacity(capacity);
+ if (!narray)
+ return -1;
+ if (!prop_dictionary_set(ndict, dev, narray)) {
+ prop_object_release(narray);
+ return -1;
+ }
+ }
+
+ iter = prop_dictionary_iterator(dict);
+ if (iter == NULL)
+ goto fail;
+ while ((obj = prop_object_iterator_next(iter)) != NULL) {
+ array = prop_dictionary_get_keysym(dict, obj);
+ if (prop_object_type(array) != PROP_TYPE_ARRAY)
+ break;
+
+ dnp = prop_dictionary_keysym_value(obj);
+ if (strcmp(dev, dnp))
+ continue;
+ found = true;
+
+ iter2 = prop_array_iterator(array);
+ while ((obj = prop_object_iterator_next(iter2)) != NULL) {
+ obj2 = prop_dictionary_get(obj, "device-properties");
+ if (obj2) {
+ if (!prop_dictionary_get_uint64(obj2,
+ "refresh-timeout", &dummy))
+ continue;
+ }
+
+ if (sensor) {
+ desc = prop_dictionary_get(obj, "description");
+ if (desc == NULL)
+ continue;
+
+ if (!prop_string_equals_string(desc, sensor))
+ continue;
+ }
+
+ if (!prop_array_ensure_capacity(narray, capacity))
+ goto fail;
+
+ sdict = prop_dictionary_copy(obj);
+ if (sdict == NULL)
+ goto fail;
+ prop_array_add(narray, sdict);
+ ++capacity;
+ }
+ prop_object_iterator_release(iter2);
+ }
+ prop_object_iterator_release(iter);
+
+ /* drop key and array when device wasn't found */
+ if (!found) {
+ prop_dictionary_remove(ndict, dev);
+ prop_object_release(narray);
+ }
+
+ return 0;
+
+fail:
+ prop_dictionary_remove(ndict, dev);
+ prop_object_release(narray);
+ return -1;
+}
+
+static int
parse_dictionary(int fd)
{
sensor_t sensor = NULL;
@@ -1099,10 +1241,13 @@
static int
usage(void)
{
- (void)fprintf(stderr, "Usage: %s [-DfIklrSTx] ", getprogname());
+ (void)fprintf(stderr, "Usage: %s [-DfIklrST] ", getprogname());
(void)fprintf(stderr, "[-c file] [-d device] [-i interval] ");
(void)fprintf(stderr, "[-s device:sensor,...] [-w width]\n");
- (void)fprintf(stderr, " %s -x [property]", getprogname());
+ (void)fprintf(stderr, " %s ", getprogname());
+ (void)fprintf(stderr, "[-d device] ");
+ (void)fprintf(stderr, "[-s device:sensor,...] ");
+ (void)fprintf(stderr, "-x [property]\n");
exit(EXIT_FAILURE);
/* NOTREACHED */
}
Home |
Main Index |
Thread Index |
Old Index