LCDproc development and user support list

Text archives Help


[Lcdproc] lcdproc cfgfile and netlcdclient screens


Chronological Thread 
  • From: a.foss AT f5.com (Andrew Foss)
  • Subject: [Lcdproc] lcdproc cfgfile and netlcdclient screens
  • Date: Thu Mar 30 16:16:01 2006

transfer screen's broke...

Andrew Foss wrote:
> Volunteers?
>
> here it is w/ the makefiles this time so it should just configure and
> build, also reconciles, what's set in the config file vs the
> commandline w/ commandline taking precedence and it incorporates
> Markus's two line lcd mod's, looks really good!
>
> thanks,
> andrew
> ------------------------------------------------------------------------
>
> diff --exclude='*.wanjet' --exclude='.??*' --exclude=Makefile
> --exclude=config.h --exclude='*.orig' --exclude='*.o' --exclude=Doxyfile
> --exclude='*.a' --exclude=config.log --exclude=config.status
> --exclude='init-*' --exclude=lcdproc -Nuarp lcdproc/iface.c
> lcdproc-cfgfile/iface.c
> --- lcdproc/iface.c 1969-12-31 16:00:00.000000000 -0800
> +++ lcdproc-cfgfile/iface.c 2006-03-30 07:31:36.000000000 -0800
> @@ -0,0 +1,1025 @@
> +/*
> + netlcdclient - Client for LCDproc which shows networks statistics
> +
> + Copyright (C) 2002 Luis Llorente Campo
> <luisllorente AT luisllorente.com>
>
> + Multiinterface Extension by Stephan Skrodzki
> <skrodzki AT stevekist.de>
> +
> + 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, 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.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program; if not, write to the Free Software Foundation,
> + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
> +
> +*/
> +
> +#include <stdio.h>
> +#include <getopt.h>
> +#include <signal.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <time.h>
> +
> +#include "iface.h"
> +#ifdef NETLCDCLIENT
> +#include "sockets.h"
> +#else
> +#include "shared/sockets.h"
> +#include "shared/debug.h"
> +#include "shared/report.h"
> +#include "shared/configfile.h"
> +#include "main.h"
> +#define UNSET_INT -1
> +#define UNSET_STR "\01"
> +#endif //NETLCDCLIENT
> +
> +
> +#ifdef NETLCDCLIENT
> +/* Option flags and global variables */
> +
> +char *program_name; /* the name the program was run with */
> +int port = 13666; /* default port */
> +char server[100] = "localhost"; /* default server */
> +int daemon_mode = 0; /* by default, no daemon mode */
> +#endif //NETLCDCLIENT
> +/* interface name passed as parameter */
> +char iface_parameter[MAX_INTERFACES][MAX_PARAM_LEN] = { "\0" , "\0" , "\0"
> };
> +/* alias name for the interface */
> +char iface_alias[MAX_INTERFACES][MAX_PARAM_LEN] = { "\0" , "\0" , "\0" };
> +int iface_count = 0; /* number of interfaces */
> +char unit_label[MAX_INTERFACES] = "B"; /* default unit label is Bytes */
> +int transfer_screen = 0; /* by default, transfer screen is not shown */
> +int sock = 0; /* socket handler */
> +
> +/* command line parameters, used by getopt_long() */
> +static struct option const long_options[] =
> +{
> + {"interface", required_argument, 0, 'i'},
> + {"alias", required_argument, 0, 'a'},
> + {"server", required_argument, 0, 's'},
> + {"port", required_argument, 0, 'p'},
> + {"unit", required_argument, 0, 'u'},
> + {"transfer", no_argument, 0, 't'},
> + {"daemon", no_argument, 0, 'd'},
> + {"help", no_argument, 0, 'h'},
> + {"version", no_argument, 0, 'V'},
> + {NULL, 0, NULL, 0}
> +};
> +
> +#ifdef NETLCDCLIENT
> +/*************************************************************************
> + * MAIN PROGRAM FUNCTION
> + *************************************************************************
> + */
> +
> +int
> +main (int argc, char **argv)
> +{
> +
> + struct iface_info iface[MAX_INTERFACES]; /* interface info */
> +
> + int len; /* bytes read from server */
> +
> + char readbuff[MAXMSG]; /* read buffer from server */
> +
> + unsigned int sleep_time = 1; /* interval between updates (1 second)
> */
> +
> + int pid; /* child process identificator for daemon mode */
> +
> + int iface_nmbr; /* loop variable for the interface */
> +
> + /* Capture signals to exit program cleanly */
> + /* Ctrl-C */
> + signal(SIGINT, exit_program);
> + /* kill */
> + signal(SIGTERM, exit_program);
> + /* kill -HUP */
> + signal(SIGHUP, exit_program);
> + /* kill -KILL */
> + signal(SIGKILL, exit_program);
> +
> + /* get program name from command line */
> + program_name = argv[0];
> +
> + /* parse command line parameters */
> + decode_switches (argc, argv);
> +
> + /* check if any interface name has been introduced */
> +
> + if (iface_count == 0) {
> + /* no one has been introduced, so exit the program showing
> help */
> + printf("No interface selected, please, use --interface
> option\n");
> + usage (1);
> + }
> +
> + /* check if we go to daemon mode */
> + if (daemon_mode) {
> + signal(SIGTTOU, SIG_IGN);
> + signal(SIGTTIN, SIG_IGN);
> + signal(SIGTSTP, SIG_IGN);
> + /* create child process */
> + pid = fork();
> + /* create new session */
> + setsid();
> + signal(SIGHUP, SIG_IGN);
> + if (pid != 0) { /* we are the parent process and exit */
> + exit(0);
> + }
> + /* from here, we are the child process */
> + }
> +
> + /* Try to connect to server */
> + sock = sock_connect(server, port);
> +
> + if (sock <= 0) { /* there was some error and exit */
> + fprintf(stderr, "Error: Could not connect to %s:%d\n", server, port);
> + exit(0);
> + }
> +
> + /* Say "hello" to server */
> + sock_send_string(sock, "hello\n");
> +
> + /* Wait the server to be prepared */
> + usleep(500000);
> +
> + /* Read server response */
> + len = sock_recv(sock, readbuff, MAXMSG);
> +
> + /* Now we are ready to send commands to server */
> +
> + /* set initial speed screen with widgets */
> + initialize_speed_screen();
> +
> + /* set initial transfer screen if needed */
> + if (transfer_screen) {
> + initialize_transfer_screen();
> + }
> +
> + /* initialize all interface structs */
> + for (iface_nmbr = 0; iface_nmbr < iface_count; iface_nmbr++) {
> + iface[iface_nmbr].last_online = 0;
> + iface[iface_nmbr].status = down;
> + }
> +
> +
> + /* main loop */
> + while (1) {
> + /* read server responses */
> + len = sock_recv(sock, readbuff, MAXMSG);
> +
> + /* for each interface do */
> + for (iface_nmbr = 0; iface_nmbr < iface_count; iface_nmbr++) {
> + /*read iface_parameter stats */
> + if (!get_iface_stats(iface_parameter[iface_nmbr], \
> +
> &iface[iface_nmbr])) {
> + /* there was an error, so we exit the loop */
> + break;
> + }
> +
> + /* actualize speed values in display */
> + actualize_speed_screen(&iface[iface_nmbr], sleep_time, \
> +
> (iface_count == 1) ? 0 : iface_nmbr + 1);
> +
> + /* if needed, actualize transfer values in display */
> + if (transfer_screen) {
> + actualize_transfer_screen(&iface[iface_nmbr], \
> +
> (iface_count == 1) ? 0 : iface_nmbr + 1);
> + }
> +
> + /* Actual values are the old ones in the next loop */
> + iface[iface_nmbr].rc_byte_old = iface[iface_nmbr].rc_byte;
> + iface[iface_nmbr].tr_byte_old = iface[iface_nmbr].tr_byte;
> + iface[iface_nmbr].rc_pkt_old = iface[iface_nmbr].rc_pkt;
> + iface[iface_nmbr].tr_pkt_old = iface[iface_nmbr].tr_pkt;
> +
> + } /* for */
> +
> + /* Wait some time to do the main loop again */
> + sleep(sleep_time);
> +
> + } /* while (1) */
> +
> + /* Before exit the program, close the socket */
> + sock_close(sock);
> +
> + exit (0);
> +
> +} /* main() */
> +
> +/*************************************************************************
> + * END MAIN PROGRAM FUNCTION
> +
> **************************************************************************/
> +
> +/*************************************************************************
> + * Set all the option flags according to the switches specified.
> + * Return the index of the first non-option argument.
> + *************************************************************************
> + */
> +
> +static int
> +decode_switches (int argc, char **argv)
> +{
> + int c;
> +
> + while ((c = getopt_long (argc, argv, "i:a:s:p:u:tdhV", \
> + long_options,
> (int *) 0)) != EOF) {
> +
> + switch (c) {
> +
> + case 'i':
> + /* Check number of interfaces introduced */
> + if (iface_count >= MAX_INTERFACES) {
> + fprintf(stderr, "Too many interfaces
> introduced. " \
> + "Only %d are
> supported.\n", MAX_INTERFACES);
> + exit(0);
> + }
> + strncpy(iface_parameter[iface_count], optarg,
> MAX_PARAM_LEN);
> + strncpy(iface_alias[iface_count], optarg,
> MAX_PARAM_LEN);
> + iface_count++;
> + break;
> +
> + case 'a':
> + strncpy(iface_alias[iface_count-1], optarg,
> MAX_PARAM_LEN);
> + break;
> +
> + case 's':
> + strncpy(server, optarg, sizeof(server));
> + break;
> +
> + case 'p':
> + port = atoi(optarg);
> + break;
> +
> + case 'u':
> + /* check for valid values */
> + if (strstr(optarg, "byte"))
> strncpy(unit_label, "B", \
> +
> sizeof(unit_label));
> + else if (strstr(optarg, "bit"))
> strncpy(unit_label, "b", \
> +
> sizeof(unit_label));
> + else if (strstr(optarg, "packet"))
> strncpy(unit_label, "pkt", \
> +
> sizeof(unit_label));
> + else {
> + fprintf(stderr, "netlcdclient:
> argument '%s' for -u parameter is not valid\n", optarg);
> + usage(0);
> + }
> + break;
> +
> + case 't':
> + transfer_screen = 1; /* show transfer screen
> */
> + break;
> +
> + case 'd':
> + daemon_mode = 1; /* go to daemon mode */
> + break;
> +
> + case 'V': /* show version */
> + printf("netlcdclient v%s\n", VERSION);
> + exit (0);
> +
> + case 'h': /* show help */
> + usage (0);
> + exit(0);
> +
> + } /* switch */
> + } /* while */
> +
> + return optind;
> +
> +} /* decode_switches() */
> +
> +
> +/*************************************************************************
> + * Show program help and exit.
> + *************************************************************************
> + */
> +
> +static void
> +usage (int status)
> +{
> + printf ("\n"
> +"netlcdclient v%s for LCDproc, by Luis Llorente\n", VERSION);
> + printf ("\n"
> +"Usage: %s -i <interface> [-a alias] [ -tdhV ] [ -s server ] [ -p port ]
> [-u unit]\n", program_name);
> + printf ("\n"
> +"Options in []'s are optional.\n"
> +" -i ... -i , --interface=INTERFACE show INTERFACE statistics\n"
> +" -a , --alias=ALIAS alias name for the interface (-a has
> to \n"
> +" follow -i)\n"
> +" -s, --server=SERVER connect to SERVER (default is
> localhost)\n"
> +" -p, --port=NUMBER connect to specified port number
> (default\n"
> +" is 13666)\n"
> +" -u, --unit=TYPE speed measure unit. Available units
> are:\n"
> +" byte (default)\n"
> +" bit\n"
> +" packet\n"
> +" -t, --transfer add screen with transferred
> traffic\n"
> +" -d, --daemon run in the background\n"
> +" -h, --help display this help and exit\n"
> +" -V, --version output version information and
> exit\n"
> +);
> + printf("\n"
> +"Example:\n"
> +" %s -s my.server.org -p 2300 -u bit -i eth0 -a LAN\n", program_name);
> +
> + exit (status);
> +
> +} /* usage() */
> +
> +#else
> +/* reads and parses configuration file */
> +static int
> +iface_process_configfile(char *configfile)
> +{
> + char iface_label[12];
> +
> + debug( RPT_DEBUG, "%s()", __FUNCTION__ );
> +
> + /* Read server settings*/
> +
> + if( strcmp( configfile, UNSET_STR ) == 0 || config_read_file(
> configfile ) != 0 ) {
> + report( RPT_CRIT, "Could not read config file: %s",
> configfile );
> + return -1;
> + printf( "Could not read config file: %s", configfile );
> + //report( RPT_WARNING, "Could not read config file: %s",
> configfile );
> + }
> +
> + for (iface_count = 0; iface_count < MAX_INTERFACES; iface_count++) {
> + sprintf(iface_label, "interface%i", iface_count);
> + printf("Label %s count %i\n", iface_label, iface_count);
> + strncpy(iface_parameter[iface_count], config_get_string(
> "Iface", iface_label, 0, "" ),sizeof(iface_parameter[iface_count]));
> + sprintf(iface_label, "alias%i", iface_count);
> + strncpy(iface_alias[iface_count], config_get_string( "Iface",
> iface_label, 0, "" ),sizeof(iface_alias[iface_count]));
> + printf("Interface %s alias %s count %i\n",
> iface_parameter[iface_count], iface_alias[iface_count], iface_count);
> + if ( !strlen(iface_parameter[iface_count] )) {
> + iface_count++;
> + break;
> + }
> + }
> + strncpy(unit_label, config_get_string( "Iface", "unit", 0, "bit"),
> sizeof(unit_label));
> + transfer_screen = config_get_bool( "Iface", "transfer", 0, 0 );
> +
> + return 0;
> +}
> +//////////////////////////////////////////////////////////////////////////
> +// IFace screen shows info about percentage of the CPU being used
> +//
> +// +--------------------+ +--------------------+
> +// |## CPU 51.9%: myh #@| |CPU [---- ]48.1%@|
> +// |Usr 46.0% Nice 0.0%| |U-- S- N I--- |
> +// |Sys 5.9% Idle 48.1%| +--------------------+
> +// |0%-------- 100%|
> +// +--------------------+
> +//
> +int
> +iface_screen(int rep, int display, int *flags_ptr)
> +{
> + //ALF TODO need to make this actual time since last run
> + unsigned int interval = difftime(time(NULL),iface[0].last_online);
> /* interval since last update */
> + if (!interval) return 0; /* need at least 1 second, no divide by 0 */
> +
> + if ((*flags_ptr & INITIALIZED) == 0) {
> + *flags_ptr |= INITIALIZED;
> +
> + /* get configuration options */
> + iface_process_configfile(configfile);
> +
> + /* set initial speed screen with widgets */
> + initialize_speed_screen();
> +
> + /* set initial transfer screen if needed */
> + if (transfer_screen) {
> + initialize_transfer_screen();
> + }
> +
> + /* initialize all interface structs */
> + for (iface_nmbr = 0; iface_nmbr < iface_count; iface_nmbr++) {
> + iface[iface_nmbr].last_online = 0;
> + iface[iface_nmbr].status = down;
> + }
> + return(0);
> + }
> + /* for each interface do */
> + for (iface_nmbr = 0; iface_nmbr < iface_count; iface_nmbr++) {
> + /*read iface_parameter stats */
> + if (!get_iface_stats(iface_parameter[iface_nmbr], \
> +
> &iface[iface_nmbr])) {
> + /* there was an error, so we exit the loop */
> + break;
> + }
> +
> + /* actualize speed values in display */
> + actualize_speed_screen(&iface[iface_nmbr], interval, \
> + (iface_count
> == 1) ? 0 : iface_nmbr + 1);
> +
> + /* if needed, actualize transfer values in display */
> + if (transfer_screen) {
> + actualize_transfer_screen(&iface[iface_nmbr], \
> + (iface_count
> == 1) ? 0 : iface_nmbr + 1);
> + }
> +
> + /* Actual values are the old ones in the next loop */
> + iface[iface_nmbr].rc_byte_old = iface[iface_nmbr].rc_byte;
> + iface[iface_nmbr].tr_byte_old = iface[iface_nmbr].tr_byte;
> + iface[iface_nmbr].rc_pkt_old = iface[iface_nmbr].rc_pkt;
> + iface[iface_nmbr].tr_pkt_old = iface[iface_nmbr].tr_pkt;
> +
> + } /* for */
> +
> + return(0);
> +} // End iface_screen()
> +#endif //NETLCDCLIENT
> +
> +/*************************************************************************
> + * Read iface_name values from /proc/net/dev and store in the struct
> + * passed as a pointer. If there are no errors, it returns 1. If errors,
> + * returns 0.
> + *************************************************************************
> + */
> +
> +int
> +get_iface_stats (char *iface_name, struct iface_info *interface)
> +{
> +
> + FILE *file; /* file handler */
> + char buffer[1024]; /* buffer to work with the file */
> + static int first_time = 1; /* is it first time we call this
> function? */
> + char *ch_pointer = NULL; /* pointer to where interface values are in
> file */
> +
> + /* Open the file in read-only mode and parse */
> +
> + if ((file = fopen(DEVFILE, "r")) != NULL) {
> + /* Skip first 2 header lines of file */
> + fgets(buffer, sizeof(buffer), file);
> + fgets(buffer, sizeof(buffer), file);
> + /* By default, think interface is down */
> + interface->status = down;
> + /* Search iface_name and scan values */
> + while ((fgets(buffer, sizeof(buffer), file) != NULL)) {
> + if (strstr(buffer, iface_name)) {
> + /* interface exists */
> + interface->status = up; /* is up */
> + interface->last_online = time(NULL); /* save
> actual time */
> + /* copy the name in the interface struct */
> + strcpy(interface->name, iface_name);
> + /* search ':' */
> + ch_pointer = strchr(buffer, ':');
> + /* skip ':' */
> + ch_pointer ++;
> + /* Now ch_pointer points to values of
> iface_name */
> + /* Scan values from here */
> + sscanf(ch_pointer, "%lf %lf %*s %*s %*s %*s
> %*s %*s %lf %lf", \
> + &interface->rc_byte,\
> + &interface->rc_pkt, \
> + &interface->tr_byte, \
> + &interface->tr_pkt);
> +
> + /* if is the first time we call this
> function,
> + * old values are the same as new so we don't
> + * get big speeds when calculating
> + */
> + if (first_time) {
> + interface->rc_byte_old =
> interface->rc_byte;
> + interface->tr_byte_old =
> interface->tr_byte;
> + interface->rc_pkt_old =
> interface->rc_pkt;
> + interface->tr_pkt_old =
> interface->tr_pkt;
> + first_time = 0; /* now it isn't
> first time */
> + }
> + }
> + } /* while */
> +
> + fclose(file); /* close file */
> + return(1); /* everything went OK */
> +
> + }
> + else { /* error when opening the file */
> + fprintf(stderr,"Error: Could not open %s\n", DEVFILE);
> + return(0); /* something went wrong */
> + }
> +
> +} /* get_iface_stats() */
> +
> +/*************************************************************************
> + * Send commands to server to add speed screen with all required widgets
> + *************************************************************************
> + */
> +void
> +initialize_speed_screen(void)
> +{
> +
> + char buffer[45];
> + int iface_nmbr; /* interface number */
> +
> + /* Add screen */
> + sock_send_string(sock, "screen_add I\n");
> +
> + /* Set screen name */
> + sock_send_string(sock, "screen_set I name {Load}\n");
> +
> + /* Add title to screen */
> + sock_send_string(sock, "widget_add I title title\n");
> +
> + if (iface_count == 1 && (lcd_hgt >= 4 )) { /* Single interface mode */
> + /* Set title */
> + sprintf(buffer, "widget_set I title {Load: %s}\n",
> iface_alias[0]);
> + sock_send_string(sock, buffer);
> +
> + /* Add and set download, upload and total string widgets */
> + sock_send_string(sock, "widget_add I dl string\n");
> + sock_send_string(sock, "widget_set I dl 1 2 {DL:}\n");
> + sock_send_string(sock, "widget_add I ul string\n");
> + sock_send_string(sock, "widget_set I ul 1 3 {UL:}\n");
> + sock_send_string(sock, "widget_add I total string\n");
> + sock_send_string(sock, "widget_set I total 1 4 {Total:}\n");
> + }
> + else { /* multi-interfaces mode: one line per interface */
> + /* Set title */
> + if (strstr(unit_label, "B")) {
> + sprintf(buffer, "widget_set I title {Net Load
> (bytes)}\n");
> + }
> + else {
> + if (strstr(unit_label, "b")) {
> + sprintf(buffer, "widget_set I title {Net Load
> (bits)}\n");
> + }
> + else {
> + sprintf(buffer, "widget_set I title {Net Load
> (packets)}\n");
> + }
> + }
> +
> + sock_send_string(sock, buffer);
> + sock_send_string (sock, "widget_add I f frame\n");
> + if (lcd_hgt >= 4)
> + /* Frame is scrolled 1 line per second */
> + sprintf(buffer, "widget_set I f 1 2 20 4 20 %d v
> 8\n", iface_count);
> + else
> + /* Frame is scrolles 1 line every two seconds */
> + sprintf(buffer, "widget_set I f 1 2 20 2 20 %d v
> 16\n", iface_count);
> + sock_send_string(sock, buffer);
> +
> + for (iface_nmbr = 0; iface_nmbr < iface_count; iface_nmbr++) {
> + sprintf(buffer, "widget_add I i%1d string -in f\n",
> iface_nmbr);
> + sock_send_string(sock, buffer);
> + sprintf(buffer, "widget_set I i%1d 1 %1d
> {%5.5s NA (never)}\n",\
> + iface_nmbr,
> iface_nmbr+1, iface_alias[iface_nmbr]);
> + sock_send_string(sock, buffer);
> + }
> + } /* else */
> +
> +} /* initialize_speed_screen() */
> +
> +/*************************************************************************
> + * Format the value (in bytes) passed as parameter according to its scale,
> + * adding the proper suffix. Store the formatted value string in the
> + * variable 'buff' passed as pointer.
> + *************************************************************************
> + */
> +void
> +format_value (char *buff, double value, char *unit)
> +{
> +
> + float formated_value;
> +
> + /* if the measure unit is in 'b' (bits), the value passed must
> + * be converted to bits (from bytes)
> + */
> + if (strstr(unit, "b")) {
> + value *= 8;
> + }
> +
> + /* bytes, bits or packets */
> + if (value < 1024) {
> + sprintf(buff, "%8ld %s",(long)value, unit);
> + return;
> + }
> +
> + /* Kilobytes, Kilobits of Kilopackets */
> + if (value < 1000000.0f) {
> + if (strstr(unit, "B")) { /* 1 KB = 1024 */
> + formated_value = (float) value / 1024.0f;
> + }
> + else { /* 1 K = 1000 */
> + formated_value = (float) value / 1000.0f;
> + }
> +
> + sprintf(buff, "%8.3f K%s", formated_value, unit);
> + return;
> + }
> +
> + /* Megabytes, Megabits or Megapackets */
> + if (value < 1000000000.0f) {
> + if (strstr(unit, "B")) { /* 1 MB = 1024 KB */
> + formated_value = (float) value / 1048576.0f; /* 1024
> ^ 2 */
> + }
> + else { /* 1 M = 1000 K */
> + formated_value = (float) value / 1000000.0f; /* 1000
> ^ 2 */
> + }
> +
> + sprintf(buff, "%8.3f M%s", formated_value, unit);
> + return;
> + }
> +
> + /* Gigabytes, Gigabits or Gigapackets */
> + if (value < 1000000000000.0f) {
> + if (strstr(unit, "B")) { /* 1 GB = 1024 MB */
> + formated_value = (float) value / 1073741824.0f; /*
> 1024 ^ 3 */
> + }
> + else { /* 1 G = 1000 M */
> + formated_value = (float) value / 1000000000.0f; /*
> 1000 ^ 3 */
> + }
> +
> + sprintf(buff, "%8.3f G%s", formated_value, unit);
> + return;
> + }
> +
> + /* Terabytes, Terabits or Terapackets */
> + if (value >= 1000000000000.0f) {
> + if (strstr(unit, "B")) { /* 1 TB = 1024 GB */
> + formated_value = (float) value / 1099511627776.0f; /*
> 1024 ^ 4 */
> + }
> + else { /* 1 T = 1000 G */
> + formated_value = (float) value / 1000000000000.0f; /*
> 1000 ^ 4 */
> + }
> +
> + sprintf(buff, "%8.3f T%s", formated_value, unit);
> + return;
> + }
> +
> +} /* format_value() */
> +
> +/*************************************************************************
> + * Format the value (in bytes) passed as parameter according to its scale,
> + * adding the proper suffix. Store the formatted value string in the
> + * variable 'buff' passed as pointer. Version for multi-interfaces mode
> + *************************************************************************
> + */
> +void
> +format_value_multi_interface (char *buff, double value, char *unit)
> +{
> +
> + char mybuff[20]; /* temp buffer */
> + float formated_value;
> +
> + /* if the measure unit is in 'b' (bits), the value passed must
> + * be converted to bits (from bytes)
> + */
> + if (strstr(unit, "b")) {
> + value *= 8;
> + }
> +
> + /* bytes, bits or packets */
> + if (value < 1000) {
> + sprintf(buff, "%3ld ", (long)value);
> + return;
> + }
> +
> + /* Kilobytes, Kilobits of Kilopackets */
> + if (value < 1000000) {
> + if (strstr(unit, "B")) { /* 1 KB = 1024 */
> + formated_value = (float) value / 1024.0f;
> + }
> + else { /* 1 K = 1000 */
> + formated_value = (float) value / 1000.0f;
> + }
> +
> + sprintf(mybuff, "%3.1f", formated_value);
> + if (mybuff[2] != '.') {
> + sprintf(buff, "%.3sK", mybuff);
> + }
> + else {
> + sprintf(buff, " %.2sK", mybuff);
> + }
> + return;
> + } /* if */
> +
> + /* Megabytes, Megabits or Megapackets */
> + if (value < 1000000000.0f) {
> + if (strstr(unit, "B")) { /* 1 MB = 1024 KB */
> + formated_value = (float) value / 1048576.0f; /* 1024
> ^ 2 */
> + }
> + else { /* 1 M = 1000 K */
> + formated_value = (float) value / 1000000.0f; /* 1000
> ^ 2 */
> + }
> +
> + sprintf(mybuff, "%3.1f", formated_value);
> + if (mybuff[2] != '.') {
> + sprintf(buff, "%.3sM", mybuff);
> + }
> + else {
> + sprintf(buff, " %.2sM", mybuff);
> + }
> + return;
> + } /* if */
> +
> + /* Gigabytes, Gigabits or Gigapackets */
> + if (value < 1000000000000.0f) {
> + if (strstr(unit, "B")) { /* 1 GB = 1024 MB */
> + formated_value = (float) value / 1073741824.0f; /*
> 1024 ^ 3 */
> + }
> + else { /* 1 G = 1000 M */
> + formated_value = (float) value / 1000000000.0f; /*
> 1000 ^ 3 */
> + }
> +
> + sprintf(mybuff, "%3.1f", formated_value);
> + if (mybuff[2] != '.') {
> + sprintf(buff, "%.3sG", mybuff);
> + }
> + else {
> + sprintf(buff, " %.2sG", mybuff);
> + }
> + return;
> + } /* if */
> +
> + /* Terabytes, Terabits or Terapackets */
> + if (value >= 1000000000000.0f) {
> + if (strstr(unit, "B")) { /* 1 TB = 1024 GB */
> + formated_value = (float) value / 1099511627776.0f; /*
> 1024 ^ 4 */
> + }
> + else { /* 1 T = 1000 G */
> + formated_value = (float) value / 1000000000000.0f; /*
> 1000 ^ 4 */
> + }
> +
> + sprintf(mybuff, "%3.1f", formated_value);
> + if (mybuff[2] != '.') {
> + sprintf(buff, "%.3sT", mybuff);
> + }
> + else {
> + sprintf(buff, " %.2sT", mybuff);
> + }
> + return;
> + } /* if */
> +
> +} /* format_value_multi_interface() */
> +
> +/*************************************************************************
> + * Format the time in ASCII, depending on the elapsed time
> + *************************************************************************
> + */
> +void
> +get_time_string (char *buff, time_t last_online)
> +{
> +
> + time_t act_time; /* actual time */
> + char timebuff[30];
> +
> + act_time = time(NULL);
> +
> + if (last_online == 0) { /* never was online */
> + sprintf(buff, "never");
> + return;
> + }
> +
> + /* Transform Unix time format to UTC time format */
> + strcpy(timebuff, ctime(&last_online));
> +
> + if ((act_time - last_online) > 86400 ) { /* 86400 = 24 * 60 * 60. Is
> it
> +
> more than 24 hours? */
> + timebuff[10] = '\0';
> + sprintf(buff, "%s", &timebuff[4]);
> + return;
> + }
> + else {
> + timebuff[19] = '\0';
> + sprintf(buff, "%s", &timebuff[11]);
> + return;
> + }
> +
> +} /* get_time_string() */
> +
> +/*************************************************************************
> + * Actualize values in display, calculating speeds in the defined interval
> + * of time and sending proper commands to server. If measure unit is
> + * 'pkt', we don't format this speed. Is always XXXX pkt/s
> + *************************************************************************
> + */
> +void
> +actualize_speed_screen(struct iface_info *iface, unsigned int interval,
> int line)
> +{
> + char speed[20]; /* buffer to store the formated speed string in
> single
> + interface mode, and
> download speed string in
> + multi-interfaces
> mode) */
> + char speed1[20]; /* buffer to store the formated upload speed
> string in
> + multi-interfaces
> mode*/
> + char send_buff[50]; /* buffer to send to server */
> +
> + double rc_speed;
> + double tr_speed;
> +
> + if (iface_count == 1 && ( lcd_hgt >= 4 )) { /* single interface mode
> */
> + if (iface->status == up) {
> + /* Calculate Download speed */
> + if (strstr(unit_label, "pkt")) { /* don't format this
> value */
> + rc_speed = (iface->rc_pkt -
> iface->rc_pkt_old) / interval;
> + sprintf(speed, "%8ld %s", (long)rc_speed,
> unit_label);
> + }
> + else {
> + rc_speed = (iface->rc_byte -
> iface->rc_byte_old) / interval;
> + format_value(speed, rc_speed, unit_label);
> + }
> +
> + /* Actualize Download speed */
> + sprintf(send_buff, "widget_set I dl 1 2 {DL:
> %s/s}\n", speed);
> + sock_send_string(sock, send_buff);
> +
> + /* Calculate Upload speed */
> + if (strstr(unit_label, "pkt")) { /* don't format this
> value */
> + tr_speed = (iface->tr_pkt -
> iface->tr_pkt_old) / interval;
> + sprintf(speed, "%8ld %s", (long)tr_speed,
> unit_label);
> + }
> + else {
> + tr_speed = (iface->tr_byte -
> iface->tr_byte_old) / interval;
> + format_value(speed, tr_speed, unit_label);
> + }
> +
> + /* Actualize Upload speed */
> + sprintf(send_buff, "widget_set I ul 1 3 {UL:
> %s/s}\n", speed);
> + sock_send_string(sock, send_buff);
> +
> + /* Calculate Total speed */
> + if (strstr(unit_label, "pkt")) { /* don't format this
> value */
> + sprintf(speed, "%7ld %s", (long)(rc_speed +
> tr_speed), unit_label);
> + }
> + else {
> + format_value(speed, rc_speed + tr_speed,
> unit_label);
> + }
> +
> + /* Actualize Total speed */
> + sprintf(send_buff, "widget_set I total 1 4 {Total:
> %s/s}\n", speed);
> + sock_send_string(sock, send_buff);
> + }
> + else { /* Interface is down */
> + get_time_string(speed, iface->last_online);
> + sprintf(send_buff, "widget_set I dl 1 2 {NA (%s)}\n",
> speed);
> + sock_send_string(sock, send_buff);
> + sock_send_string(sock, "widget_set I ul 1 3 {}\n");
> + sock_send_string(sock, "widget_set I total 1 4 {}\n");
> + }
> + }
> + else { /* multi-interfaces mode: 1 line per interface */
> + if (iface->status == up) {
> + if (strstr(unit_label, "pkt")) {
> + rc_speed = (iface->rc_pkt -
> iface->rc_pkt_old) / interval;
> + tr_speed = (iface->tr_pkt -
> iface->tr_pkt_old) / interval;
> + }
> + else {
> + rc_speed = (iface->rc_byte -
> iface->rc_byte_old) / interval;
> + tr_speed = (iface->tr_byte -
> iface->tr_byte_old) / interval;
> + }
> + format_value_multi_interface(speed, rc_speed,
> unit_label);
> + format_value_multi_interface(speed1, tr_speed,
> unit_label);
> + sprintf(send_buff, "widget_set I i%1d 1 %1d {%5.5s
> U:%.4s D:%.4s}\n", line, line+1, iface_alias[line-1], speed1, speed);
> + }
> + else { /* Interface is down */
> + get_time_string(speed, iface->last_online);
> + sprintf(send_buff, "widget_set I i%1d 1 %1d {%5.5s NA
> (%s)}\n", line, line+1, iface_alias[line-1], speed);
> + }
> + sock_send_string(sock, send_buff);
> + }
> +
> +} /* actualize_speed_screen() */
> +
> +/*************************************************************************
> + * Send commands to server to add transfer screen with all required widgets
> + *************************************************************************
> + */
> +void
> +initialize_transfer_screen(void)
> +{
> +
> + char buffer[50];
> + int iface_nmbr; /* interface number */
> +
> + /* Add screen */
> + sock_send_string(sock, "screen_add NT\n");
> +
> + /* Set screen name */
> + sock_send_string(sock, "screen_setN NT name {Transfer}\n");
> +
> + /* Add title to screen */
> + sock_send_string(sock, "widget_add NT title title\n");
> +
> + if ( (iface_count == 1) && (lcd_hgt >= 4)) { /* single interface mode
> */
> + /* Set title */
> + sprintf(buffer, "widget_set NT title {Transfer: %s}\n",
> iface_alias[0]);
> + sock_send_string(sock, buffer);
> +
> + /* Add and set download, upload and total string widgets */
> + sock_send_string(sock, "widget_add NT dl string\n");
> + sock_send_string(sock, "widget_set NT dl 1 2 {DL:}\n");
> + sock_send_string(sock, "widget_add NT ul string\n");
> + sock_send_string(sock, "widget_set NT ul 1 3 {UL:}\n");
> + sock_send_string(sock, "widget_add NT total string\n");
> + sock_send_string(sock, "widget_set NT total 1 4 {Total:}\n");
> +
> + }
> + else { /* multi-interfaces mode: one line per interface */
> + /* Set title (transfer screen is always in "bytes") */
> + sock_send_string(sock, "widget_set NT title {Net Transfer
> (bytes)}\n");
> +
> + if (lcd_hgt >= 4)
> + /* Frame is scrolled 1 line per second */
> + sprintf(buffer, "widget_set NT f 1 2 20 4 20 %d v 8\n",
> iface_count);
> + else
> + /* Frame is scrolles 1 line every two seconds */
> + sprintf(buffer, "widget_set NT f 1 2 20 2 20 %d v 16\n",
> iface_count);
> + sock_send_string(sock, buffer);
> +
> + for (iface_nmbr = 0; iface_nmbr < iface_count; iface_nmbr++) {
> + sprintf(buffer, "widget_add NT i%1d string -in f\n",
> iface_nmbr);
> + sock_send_string(sock, buffer);
> + sprintf(buffer, "widget_set NT i%1d 1 %1d {%5.5s NA
> (never)}\n", iface_nmbr, iface_nmbr+1, iface_alias[iface_nmbr]);
> +
> + sock_send_string(sock, buffer);
> + }
> + }
> +
> +} /* initialize_transfer_screen() */
> +
> +/*************************************************************************
> + * Actualize values in display, formatting transfer measures and sending
> + * proper commands to server. Traffic is shown in "bytes" unit
> + *************************************************************************
> + */
> +void
> +actualize_transfer_screen(struct iface_info *iface, int line)
> +{
> + char transfer[20]; /* buffer to store the formated traffic string
> in
> + single interface
> mode, and download transfer
> + string in
> multi-interfaces mode */
> + char transfer1[20]; /* buffer to store the formated upload traffic
> + string in
> multi-interfaces mode*/
> + char send_buff[50]; /* buffer to send to server */
> +
> + if ((iface_count == 1) && (lcd_hgt >= 4)) { /* single interface mode
> */
> + if (iface->status == up) {
> + /* Format download traffic */
> + format_value(transfer, iface->rc_byte, "B");
> + /* Prepare command to send */
> + sprintf(send_buff, "widget_set NT dl 1 2 {DL:
> %s}\n", transfer);
> + /* Send command to server */
> + sock_send_string(sock, send_buff);
> +
> + /* Format upload traffic */
> + format_value(transfer, iface->tr_byte, "B");
> + /* Prepare command to send */
> + sprintf(send_buff, "widget_set NT ul 1 3 {UL:
> %s}\n", transfer);
> + /* Send command to server */
> + sock_send_string(sock, send_buff);
> +
> + /* Format total traffic */
> + format_value(transfer, iface->rc_byte +
> iface->tr_byte, "B");
> + /* Prepare command to send */
> + sprintf(send_buff, "widget_set NT total 1 4 {Total:
> %s}\n", transfer);
> + /* Send command to server */
> + sock_send_string(sock, send_buff);
> + }
> + else { /* Interface is down */
> + get_time_string(transfer, iface->last_online);
> + sprintf(send_buff, "widget_set NT dl 1 2 {NA
> (%s)}\n", transfer);
> + sock_send_string(sock, send_buff);
> + sock_send_string(sock, "widget_set NT ul 1 3 {}\n");
> + sock_send_string(sock, "widget_set NT total 1 4
> {}\n");
> + }
> + }
> + else { /* multi-interfaces mode: one line per interface */
> + if (iface->status == up) {
> + format_value_multi_interface(transfer,
> iface->rc_byte, "B");
> + format_value_multi_interface(transfer1,
> iface->tr_byte, "B");
> + sprintf(send_buff, "widget_set NT i%1d 1 %1d {%5.5s
> U:%.4s D:%.4s}\n", line, line+1, iface_alias[line-1], transfer1, transfer);
> + }
> + else { /* Interface is down */
> + get_time_string(transfer, iface->last_online);
> + sprintf(send_buff, "widget_set NT i%1d 1 %1d {%5.5s
> NA (%s)}\n", line, line+1, iface_alias[line-1], transfer);
> + }
> +
> + /* Send command to server */
> + sock_send_string(sock, send_buff);
> + }
> +
> +} /* actualize_transfer_screen() */
> +
> +#ifdef NETLCDCLIENT
> +/*************************************************************************
> + * Exit the program in a clean way
> + *************************************************************************
> + */
> +void
> +exit_program (int val)
> +{
> + /* check if socket is open and close it */
> + if (sock != 0) {
> + sock_close(sock);
> + }
> +
> + fprintf(stderr, "\nExiting netlcdclient....\n");
> +
> + exit(0);
> +
> +} /* exit_program() */
> +#endif //NETLCDCLIENT
> diff --exclude='*.wanjet' --exclude='.??*' --exclude=Makefile
> --exclude=config.h --exclude='*.orig' --exclude='*.o' --exclude=Doxyfile
> --exclude='*.a' --exclude=config.log --exclude=config.status
> --exclude='init-*' --exclude=lcdproc -Nuarp lcdproc/iface.h
> lcdproc-cfgfile/iface.h
> --- lcdproc/iface.h 1969-12-31 16:00:00.000000000 -0800
> +++ lcdproc-cfgfile/iface.h 2006-03-26 12:10:20.000000000 -0800
> @@ -0,0 +1,100 @@
> +#ifndef IFACE_H
> +#define IFACE_H
> +/* netlcdclient.h - definitions and function prototipes
> + *
> + * Copyright (C) 2002 Luis Llorente Campo
> + *
> + * 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, or (at your option)
> + * any later version.
> + */
> +
> +
> +#include <time.h>
> +
> +#define DEVFILE "/proc/net/dev" /* file to read statistics from */
> +
> +/* status definitions */
> +
> +#define up 1
> +#define down 0
> +#define MAX_PARAM_LEN 10 /* max interface_parameter or alias length */
> +
> +#define MAX_INTERFACES 3 /* max number of interfaces in multi-interface
> mode */
> +
> +#ifndef ALF
> +int iface_screen (int rep, int display, int *flags_ptr);
> +struct iface_info iface[MAX_INTERFACES]; /* interface info */
> +int iface_nmbr; /* loop variable for the interface */
> +#endif //ALF
> +
> +/* Struct for interface values (transmision, reception, etc..) */
> +
> +struct iface_info
> +{
> + /* interface name */
> + char name[20];
> +
> + int status;
> +
> + time_t last_online;
> +
> + /* received bytes */
> + double rc_byte;
> + double rc_byte_old;
> +
> + /* transmited bytes */
> + double tr_byte;
> + double tr_byte_old;
> +
> + /* received packets */
> + double rc_pkt;
> + double rc_pkt_old;
> +
> + /* transmited packets */
> + double tr_pkt;
> + double tr_pkt_old;
> +
> +}; /* struct iface_info */
> +
> +/************************/
> +/* Functions prototipes */
> +/************************/
> +
> +/* show usage options */
> +static void usage (int status);
> +
> +/* parse command line parameters */
> +static int decode_switches (int argc, char **argv);
> +
> +/* read interface stats from /proc/net/dev */
> +int get_iface_stats (char *iface_name, struct iface_info *interface);
> +
> +/* send initial commands to server to add the speed screen */
> +void initialize_speed_screen (void);
> +
> +/* send initial commands to server to add the transfer screen */
> +void initialize_transfer_screen(void);
> +
> +/* format the time in ASCII */
> +void get_time_string (char *buff, time_t last_online);
> +
> +/* format value, scaling value and adding proper suffixes */
> +void format_value (char *buff, double value, char *unit);
> +
> +/* format value, scaling value and adding proper suffixes (for
> multi-interface
> + * mode) */
> +void format_value_multi_interface(char *buff, double value, char *unit);
> +
> +/* actualize widgets values in speed screen */
> +void actualize_speed_screen (struct iface_info *iface, unsigned int
> interval, int line);
> +
> +/* actualize widgets values in transfer screen */
> +void actualize_transfer_screen (struct iface_info *iface, int line);
> +
> +#ifdef NETLCDCLIENT
> +/* exit the program cleanly */
> +void exit_program (int val);
> +#endif //NETLCDCLIENT
> +#endif
> diff --exclude='*.wanjet' --exclude='.??*' --exclude=Makefile
> --exclude=config.h --exclude='*.orig' --exclude='*.o' --exclude=Doxyfile
> --exclude='*.a' --exclude=config.log --exclude=config.status
> --exclude='init-*' --exclude=lcdproc -Nuarp lcdproc/lcdproc.conf
> lcdproc-cfgfile/lcdproc.conf
> --- lcdproc/lcdproc.conf 1969-12-31 16:00:00.000000000 -0800
> +++ lcdproc-cfgfile/lcdproc.conf 2006-03-27 15:52:20.000000000 -0800
> @@ -0,0 +1,93 @@
> +# LCDproc client configuration file
> +
> +## Options for lcdproc ##
> +[lcdproc]
> +# address of the LCDd server to connect to
> +Server=localhost
> +
> +# Port of the server to connect to
> +Port=13666
> +
> +# set reporting level
> +ReportLevel=2
> +
> +# report to to syslog ?
> +ReportToSyslog=false
> +
> +# stay in foreground ?
> +Daemonize=false
> +
> +# slow down initial announcement of modes (in 1/100s)
> +#delay=2
> +
> +# screen specific configuration options
> +[CPU]
> +# Show screen
> +Active=True
> +OnTime=1
> +OffTime=2
> +ShowInvisible=false
> +[Iface]
> +# Show screen
> +Active=True
> +# Show stats for Interface0
> +#interface0=eth0
> +# Interface0 alias name to display
> +#alias0=LAN
> +
> +# Show stats for Interface1
> +#interface1=eth1
> +# Interface1 alias name to display
> +#alias1=WAN
> +
> +# Show stats for Interface2 /* more interfaces change iface.h and rebuild
> */
> +#interface2=eth2
> +# Interface2 alias name to display
> +#alias2=MGMT
> +
> +# Units to display byte, bit or packet
> +unit=bit
> +
> +# add screen with transferred traffic\n"
> +#transfer=TRUE
> +
> +[Memory]
> +# Show screen
> +Active=True
> +[Load]
> +# Show screen
> +Active=True
> +[TimeDate]
> +# Show screen
> +Active=True
> +[About]
> +# Show screen
> +Active=false
> +[SMP-CPU]
> +# Show screen
> +Active=false
> +[OldTime]
> +# Show screen
> +Active=false
> +[BigClock]
> +# Show screen
> +Active=false
> +[Uptime]
> +# Show screen
> +Active=false
> +[Battery]
> +# Show screen
> +Active=false
> +[CPUGraph]
> +# Show screen
> +Active=false
> +[ProcSize]
> +# Show screen
> +Active=false
> +[Disk]
> +# Show screen
> +Active=false
> +[MiniClock]
> +# Show screen
> +Active=True
> +# EOF
> diff --exclude='*.wanjet' --exclude='.??*' --exclude=Makefile
> --exclude=config.h --exclude='*.orig' --exclude='*.o' --exclude=Doxyfile
> --exclude='*.a' --exclude=config.log --exclude=config.status
> --exclude='init-*' --exclude=lcdproc -Nuarp lcdproc/main.c
> lcdproc-cfgfile/main.c
> --- lcdproc/main.c 2006-03-04 00:00:09.000000000 -0800
> +++ lcdproc-cfgfile/main.c 2006-03-30 07:08:00.000000000 -0800
> @@ -22,6 +22,7 @@
> #include "shared/sockets.h"
> #include "shared/debug.h"
> #include "shared/report.h"
> +#include "shared/configfile.h"
>
> #include "batt.h"
> #include "chrono.h"
> @@ -31,6 +32,7 @@
> #include "load.h"
> #include "mem.h"
> #include "machine.h"
> +#include "iface.h"
>
> // TODO: Commenting... Everything!
>
> @@ -54,6 +56,10 @@ static struct utsname unamebuf;
> static void HelpScreen(int exit_state);
> static void exit_program(int val);
> static void main_loop();
> +static int process_command_line(int argc, char **argv);
> +static int process_configfile(char *cfgfile);
> +#define CHAIN(e,f) { if( e>=0 ) { e=(f); }}
> +#define CHAIN_END(e,msg) { if( e<0 ) { report( RPT_CRIT,(msg)); exit(e); }}
>
> static int islow = -1;
>
> @@ -65,26 +71,38 @@ mode sequence[] =
> {
> // flags default ACTIVE will run by default
> // longname which on off inv timer flags
> - { "CPU", 'C', 1, 2, 0, 0xffff, ACTIVE, cpu_screen }, //
> [C]PU
> - { "Memory", 'M', 4, 16, 0, 0xffff, ACTIVE, mem_screen }, //
> [M]emory
> - { "Load", 'L', 64, 128, 1, 0xffff, ACTIVE, xload_screen }, //
> [L]oad (load histogram)
> - { "TimeDate", 'T', 4, 64, 0, 0xffff, ACTIVE, time_screen }, //
> [T]ime/Date
> - { "About", 'A', 999, 9999, 0, 0xffff, ACTIVE, credit_screen }, //
> [A]bout (credits)
> - { "SMP-CPU", 'P', 1, 2, 0, 0xffff, 0, cpu_smp_screen }, //
> CPU_SM[P]
> - { "OldTime", 'O', 4, 64, 0, 0xffff, 0, clock_screen }, //
> [O]ld Timescreen
> - { "BigClock", 'K', 4, 64, 0, 0xffff, 0, big_clock_screen }, //
> big cloc[K]
> - { "Uptime", 'U', 4, 128, 0, 0xffff, 0, uptime_screen }, //
> Old [U]ptime Screen
> - { "Battery", 'B', 32, 256, 1, 0xffff, 0, battery_screen }, //
> [B]attery Status
> - { "CPUGraph", 'G', 1, 2, 0, 0xffff, 0, cpu_graph_screen }, //
> CPU histogram [G]raph
> - { "ProcSize", 'S', 16, 256, 1, 0xffff, 0, mem_top_screen }, //
> [S]ize of biggest processes
> - { "Disk", 'D', 256, 256, 1, 0xffff, 0, disk_screen }, //
> [D]isk stats
> - { "MiniClock", 'N', 4, 64, 0, 0xffff, 0, mini_clock_screen }, //
> Mi[n]i clock
> - { NULL, 0, 0, 0, 0, 0,}, // No more.. all done.
> + { "CPU", 'C', 1, 2, 0, 0xffff, ACTIVE, cpu_screen },
> // [C]PU
> + { "Iface", 'I', 1, 2, 0, 0xffff, 0, iface_screen
> }, // [I]face
> + { "Memory", 'M', 4, 16, 0, 0xffff, ACTIVE, mem_screen },
> // [M]emory
> + { "Load", 'L', 64, 128, 1, 0xffff, ACTIVE, xload_screen
> }, // [L]oad (load histogram)
> + { "TimeDate", 'T', 4, 64, 0, 0xffff, ACTIVE, time_screen
> }, // [T]ime/Date
> + { "About", 'A', 999, 9999, 0, 0xffff, ACTIVE, credit_screen
> }, // [A]bout (credits)
> + { "SMP-CPU", 'P', 1, 2, 0, 0xffff, 0,
> cpu_smp_screen }, // CPU_SM[P]
> + { "OldTime", 'O', 4, 64, 0, 0xffff, 0, clock_screen
> }, // [O]ld Timescreen
> + { "BigClock", 'K', 4, 64, 0, 0xffff, 0,
> big_clock_screen }, // big cloc[K]
> + { "Uptime", 'U', 4, 128, 0, 0xffff, 0, uptime_screen
> }, // Old [U]ptime Screen
> + { "Battery", 'B', 32, 256, 1, 0xffff, 0,
> battery_screen }, // [B]attery Status
> + { "CPUGraph", 'G', 1, 2, 0, 0xffff, 0,
> cpu_graph_screen }, // CPU histogram [G]raph
> + { "ProcSize", 'S', 16, 256, 1, 0xffff, 0,
> mem_top_screen }, // [S]ize of biggest processes
> + { "Disk", 'D', 256, 256, 1, 0xffff, 0, disk_screen
> }, // [D]isk stats
> + { "MiniClock", 'N', 4, 64, 0, 0xffff, 0,
> mini_clock_screen },// Mi[n]i clock
> + { NULL, 0, 0, 0, 0, 0, 0, 0},
> // No more.. all done.
> };
>
>
>
> // TODO: Config file; not just command line
> +/* All variables are set to 'unset' values*/
> +#define UNSET_INT -1
> +#define UNSET_STR "\01"
> +#define DEFAULT_SERVER "127.0.0.1"
> +char * progname = "lcdproc";
> +char * server = NULL;
> +int port = UNSET_INT;
> +int daemonize = FALSE;
> +static int report_level = UNSET_INT;
> +static int report_dest = UNSET_INT;
> +
>
> const char *get_hostname()
> {
> @@ -135,11 +153,7 @@ void clear_modes()
> int
> main(int argc, char **argv)
> {
> - int i;
> - int c;
> - char *server = NULL;
> - int port = LCDPORT;
> - int daemonize = FALSE;
> + int error=0;
>
> /* get uname information */
> if (uname(&unamebuf) == -1) {
> @@ -153,12 +167,79 @@ main(int argc, char **argv)
> signal(SIGHUP, exit_program); // kill -HUP
> signal(SIGKILL, exit_program); // kill -9 [cannot be trapped; but
> ...]
>
> + /* Set default config file, command line may overwrite */
> + strncpy(configfile, DEFAULT_CONFIGFILE, sizeof(configfile));
> +
> + /* Read command line*/
> + CHAIN( error, process_command_line(argc, argv) );
> +
> + /* Read config file*/
> + if (strcmp(configfile, UNSET_STR)!=0)
> + CHAIN( error, process_configfile(configfile) );
> +
> + CHAIN_END( error, "Error in config file or command line\n" );
> +
> + if (server == NULL)
> + server = DEFAULT_SERVER;
> + if (port == UNSET_INT)
> + server = LCDPORT;
> +
> + // Connect to the server...
> + usleep(500000); // wait for the server to start up
> + sock = sock_connect(server, port);
> + if (sock <= 0) {
> + fprintf(stderr, "Error connecting to LCD server %s on port
> %d.\n"
> + "Check to see that the server is running and
> operating normally.\n",
> + server, port);
> + return(EXIT_FAILURE);
> + }
> +
> + sock_send_string(sock, "hello\n");
> + usleep(500000); // wait for the server to say hi.
> +
> + // We grab the real values below, from the "connect" line.
> + lcd_wid = 20;
> + lcd_hgt = 4;
> + lcd_cellwid = 5;
> + lcd_cellhgt = 8;
> +
> + if (daemonize) {
> + if (daemon(1,0) != 0) {
> + fprintf(stderr, "Error: daemonize failed");
> + return(EXIT_FAILURE);
> + }
> + }
> +
> + // Init the status gatherers...
> + mode_init();
> +
> + // And spew stuff!
> + main_loop();
> +
> + // Clean up
> + exit_program(EXIT_SUCCESS);
> +
> + return(0);
> +}
> +
> +/* parses arguments given on command line */
> +static int
> +process_command_line(int argc, char **argv)
> +{
> + int i;
> + int c;
> +
> /* No error output from getopt */
> opterr = 0;
>
> /* get options */
> - while ((c = getopt( argc, argv, "s:p:e:dhv")) > 0) {
> + while ((c = getopt( argc, argv, "s:p:e:c:dhv")) > 0) {
> switch (c) {
> + // c is for config file
> + case 'c':
> + strncpy(configfile, optarg,
> sizeof(configfile));
> + configfile[sizeof(configfile)-1] = 0; /*
> Terminate string */
> + break;
> // s is for server
> case 's':
> if (server == NULL)
> @@ -204,50 +285,75 @@ main(int argc, char **argv)
> int found = set_mode(shortname, argv[i], 1);
>
> if (!found) {
> - fprintf(stderr, "Invalid Mode: %c, ignoring\n",
> argv[i][0]);
> + fprintf(stderr, "Invalid Mode: %c\n", argv[i][0]);
> return(EXIT_FAILURE);
> }
> }
> + return 0;
> +}
>
> - if (server == NULL)
> - server = "localhost";
> +/* reads and parses configuration file */
> +static int
> +process_configfile(char *configfile)
> +{
> + int k;
>
> - // Connect to the server...
> - usleep(500000); // wait for the server to start up
> - sock = sock_connect(server, port);
> - if (sock <= 0) {
> - fprintf(stderr, "Error connecting to LCD server %s on port
> %d.\n"
> - "Check to see that the server is running and
> operating normally.\n",
> - server, port);
> - return(EXIT_FAILURE);
> - }
> + debug( RPT_DEBUG, "%s()", __FUNCTION__ );
>
> - sock_send_string(sock, "hello\n");
> - usleep(500000); // wait for the server to say hi.
> + /* Read server settings*/
>
> - // We grab the real values below, from the "connect" line.
> - lcd_wid = 20;
> - lcd_hgt = 4;
> - lcd_cellwid = 5;
> - lcd_cellhgt = 8;
> + if( strcmp( configfile, UNSET_STR ) == 0 ) {
> + configfile = DEFAULT_CONFIGFILE;
> + }
> + if( config_read_file( configfile ) != 0 ) {
> + report( RPT_CRIT, "Could not read config file: %s",
> configfile );
> + return -1;
> + //report( RPT_WARNING, "Could not read config file: %s",
> configfile );
> + }
>
> - if (daemonize) {
> - if (daemon(1,0) != 0) {
> - fprintf(stderr, "Error: daemonize failed");
> - return(EXIT_FAILURE);
> + if( server == NULL ) {
> + server = strdup( config_get_string( progname, "Server", 0,
> DEFAULT_SERVER ));
> + printf("Server %s\n",server);
> + }
> + if( port == UNSET_INT ) {
> + port = config_get_int( progname, "Port", 0, LCDPORT );
> + }
> + if( report_level == UNSET_INT ) {
> + report_level = config_get_int( progname, "ReportLevel", 0,
> RPT_WARNING );
> + }
> + if( report_dest == UNSET_INT ) {
> + if( config_get_bool( progname, "ReportToSyslog", 0, 0 )) {
> + report_dest = RPT_DEST_SYSLOG;
> + } else {
> + report_dest = RPT_DEST_STDERR;
> }
> - }
> + }
>
> - // Init the status gatherers...
> - mode_init();
> + if ( !daemonize ) daemonize = config_get_bool( progname, "Daemonize",
> 0, 0 );
>
> - // And spew stuff!
> - main_loop();
> + if( islow < 0 ) {
> + islow = config_get_int( progname, "delay", 0, -1 );
> + }
>
> - // Clean up
> - exit_program(EXIT_SUCCESS);
> + /*
> + * check for config file variables to override all the sequence
> defaults
> + */
> + for ( k = 0; sequence[k].which ; k++) {
> + if (sequence[k].longname) {
> + sequence[k].on_time = config_get_int(
> sequence[k].longname, "OnTime", 0, sequence[k].on_time );
> + sequence[k].off_time = config_get_int(
> sequence[k].longname, "OffTime", 0, sequence[k].off_time );
> + sequence[k].show_invisible = config_get_bool(
> sequence[k].longname, "ShowInvisible", 0, sequence[k].show_invisible );
> + if ( config_get_bool( sequence[k].longname, "Active",
> 0, sequence[k].flags & ACTIVE ) ) {
> + sequence[k].flags |= ACTIVE;
> + printf("Active %s\n", sequence[k].longname);
> + } else {
> + sequence[k].flags &= (~ACTIVE);
> + printf("Inactive %s\n", sequence[k].longname);
> + }
> + }
> + }
>
> - return(0);
> + return 0;
> }
>
> void
> @@ -260,6 +366,7 @@ HelpScreen (int exit_state)
> " -p <port> connect to LCDd daemon using
> <port>\n"
> " -d daemonize\n"
> " -e <delay> slow down initial announcement
> of modes (in 1/100s)\n"
> + " -c <config> Use a configuration file
> other than %s\n"
> " -h show this help screen\n"
> " -v display program version\n"
> " and <modes> are\n"
> @@ -273,14 +380,14 @@ HelpScreen (int exit_state)
> " B Battery battery status\n"
> " T TimeDate time & date information\n"
> " O OldTime old time screen\n"
> - " U Uptime old uptime screen\n"
> + " U Uptime uptime screen\n"
> " K BigClock big clock\n"
> " N MiniClock minimal clock\n"
> " A About credits page\n"
> "\n"
> "Example:\n"
> " lcdproc -s my.lcdproc.server.com p 13666 C M X\n"
> - );
> + , DEFAULT_CONFIGFILE);
>
> exit(exit_state);
> }
> @@ -298,6 +405,7 @@ exit_program(int val)
> exit(val);
> }
>
> +#define LCDPROC_MENUS
> #ifdef LCDPROC_MENUS
> int
> menus_init ()
> diff --exclude='*.wanjet' --exclude='.??*' --exclude=Makefile
> --exclude=config.h --exclude='*.orig' --exclude='*.o' --exclude=Doxyfile
> --exclude='*.a' --exclude=config.log --exclude=config.status
> --exclude='init-*' --exclude=lcdproc -Nuarp lcdproc/main.h
> lcdproc-cfgfile/main.h
> --- lcdproc/main.h 2006-02-28 00:00:09.000000000 -0800
> +++ lcdproc-cfgfile/main.h 2006-03-26 13:01:36.000000000 -0800
> @@ -20,6 +20,9 @@
> #define LCDP_AC_BACKUP 0x02
> #define LCDP_AC_UNKNOWN 0xFF
>
> +#define DEFAULT_CONFIGFILE "/usr/local/etc/lcdproc.conf"
> +char configfile[256]; /* a lot of space in the executable.
> */
> +
> extern int Quit;
> extern int sock;
> extern char *version;
> diff --exclude='*.wanjet' --exclude='.??*' --exclude=Makefile
> --exclude=config.h --exclude='*.orig' --exclude='*.o' --exclude=Doxyfile
> --exclude='*.a' --exclude=config.log --exclude=config.status
> --exclude='init-*' --exclude=lcdproc -Nuarp lcdproc/Makefile.am
> lcdproc-cfgfile/Makefile.am
> --- lcdproc/Makefile.am 2006-02-05 00:00:38.000000000 -0800
> +++ lcdproc-cfgfile/Makefile.am 2006-03-27 16:52:17.000000000 -0800
> @@ -2,7 +2,7 @@
>
> bin_PROGRAMS = lcdproc
>
> -lcdproc_SOURCES = main.c main.h mode.c mode.h batt.c batt.h chrono.c
> chrono.h cpu.c cpu.h cpu_smp.c cpu_smp.h disk.c disk.h load.c load.h mem.c
> mem.h machine.h machine_Linux.c machine_OpenBSD.c machine_FreeBSD.c
> machine_NetBSD.c machine_Darwin.c machine_SunOS.c util.c util.h
> +lcdproc_SOURCES = main.c main.h mode.c mode.h batt.c batt.h chrono.c
> chrono.h cpu.c cpu.h cpu_smp.c cpu_smp.h disk.c disk.h load.c load.h mem.c
> mem.h machine.h machine_Linux.c machine_OpenBSD.c machine_FreeBSD.c
> machine_NetBSD.c machine_Darwin.c machine_SunOS.c util.c util.h iface.c
> iface.h
>
> lcdproc_LDADD = @ldap_libs@ ../../shared/libLCDstuff.a
>
> diff --exclude='*.wanjet' --exclude='.??*' --exclude=Makefile
> --exclude=config.h --exclude='*.orig' --exclude='*.o' --exclude=Doxyfile
> --exclude='*.a' --exclude=config.log --exclude=config.status
> --exclude='init-*' --exclude=lcdproc -Nuarp lcdproc/Makefile.in
> lcdproc-cfgfile/Makefile.in
> --- lcdproc/Makefile.in 2006-03-26 00:00:12.000000000 -0800
> +++ lcdproc-cfgfile/Makefile.in 2006-03-27 16:53:55.000000000 -0800
> @@ -144,7 +144,7 @@ target_alias = @target_alias@
>
> bin_PROGRAMS = lcdproc
>
> -lcdproc_SOURCES = main.c main.h mode.c mode.h batt.c batt.h chrono.c
> chrono.h cpu.c cpu.h cpu_smp.c cpu_smp.h disk.c disk.h load.c load.h mem.c
> mem.h machine.h machine_Linux.c machine_OpenBSD.c machine_FreeBSD.c
> machine_NetBSD.c machine_Darwin.c machine_SunOS.c util.c util.h
> +lcdproc_SOURCES = main.c main.h mode.c mode.h batt.c batt.h chrono.c
> chrono.h cpu.c cpu.h cpu_smp.c cpu_smp.h disk.c disk.h load.c load.h mem.c
> mem.h machine.h machine_Linux.c machine_OpenBSD.c machine_FreeBSD.c
> machine_NetBSD.c machine_Darwin.c machine_SunOS.c util.c util.h iface.c
> iface.h
>
> lcdproc_LDADD = @ldap_libs@ ../../shared/libLCDstuff.a
>
> @@ -164,7 +164,7 @@ am_lcdproc_OBJECTS = main.$(OBJEXT) mode
> load.$(OBJEXT) mem.$(OBJEXT) machine_Linux.$(OBJEXT) \
> machine_OpenBSD.$(OBJEXT) machine_FreeBSD.$(OBJEXT) \
> machine_NetBSD.$(OBJEXT) machine_Darwin.$(OBJEXT) \
> - machine_SunOS.$(OBJEXT) util.$(OBJEXT)
> + machine_SunOS.$(OBJEXT) util.$(OBJEXT) iface.$(OBJEXT)
> lcdproc_OBJECTS = $(am_lcdproc_OBJECTS)
> lcdproc_DEPENDENCIES = ../../shared/libLCDstuff.a
> lcdproc_LDFLAGS =
> @@ -182,7 +182,7 @@ am__depfiles_maybe = depfiles
> @AMDEP_TRUE@ ./$(DEPDIR)/machine_OpenBSD.Po \
> @AMDEP_TRUE@ ./$(DEPDIR)/machine_SunOS.Po ./$(DEPDIR)/main.Po \
> @AMDEP_TRUE@ ./$(DEPDIR)/mem.Po ./$(DEPDIR)/mode.Po \
> -@AMDEP_TRUE@ ./$(DEPDIR)/util.Po
> +@AMDEP_TRUE@ ./$(DEPDIR)/util.Po ./$(DEPDIR)/iface.Po
> COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
> $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
> CCLD = $(CC)
> @@ -250,6 +250,7 @@ distclean-compile:
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mode.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@
> +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iface.Po@am__quote@
>
> .c.o:
> @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
>




Archive powered by MHonArc 2.6.18.

Top of page