         Technical notes on my code submission of 15 Nov 99
                        Kern Sibbald

General:
- Riccardo, again, you will notice some differences due solely
  to the addition of a tab that replaces spaces.
- I've completed my first pass at making the cgi programs
  robust. In most error conditions they now behave reasonably.
  More testing needed by other developers.
- I put the cgi build in the configuration on --enable-cgi
  as suggested by Riccardo.
- There were previously four copies of the STATUS output
  command code, and with my new code, it increased to
  six copies. I have reduced it to one by creating a 
  new file -- apcstatus.c
- I've integrated the apcnetd code into apcupsd.  The
  new code resides in apcserver.c
- I've modified the apcnetd to be capable of being started
  either on a command line or directly from inetd.
- I added more documentation to the internal variable
  names, and changed LinUp to be OnBatt to be more
  readable.
- I still seem to be getting a number of "Cannot increment
  read count" errors that are being logged, but I cannot
  figure out what is doing it. Help.

Changes submitted this submission:
- Completed the integration of the cgi program with
  configure.in and Makefile.in
- To get the cgi directory to build, you add the
  new configure option --enable-cgi as in:

      ./configure --enable-cgi

  You will probably also want to specify an installation
  directory as in:

      ./configure --enable-cgi -datadir=<your cgi bin>

  So to do a cgi build:

   ./configure --enable-cgi -datadir=...
   make
   make install

   Restart your apcupsd daemon by default with                    
   the new apcupsd.config file, the networking
   will be turned on. There is no extra daemon
   to start.
   

   Edit /etc/apcupsd/hosts.conf to add your hosts to be
   monitored. You must do this.

   Optionally edit /etc/apcupsd/multimon.conf to change the default
   multimon display. The list of available keywords can be found
   in cgi/upsfetch.c and multimon.h.

   Execute the multimon program from your browser with something like:

   http://127.0.0.1/cgi-bin/multimon.cgi

- There were 6 copies of the STATUS output code, so I reduced
  it to one copy. In order to give the flexibility that we
  need, the new output_status() routine is called with 
  function pointers to its open, write, and close routines.
  This permits processing the data differently, and either
  writing it to a file, logging it, printing it, printing
  it to stderr, or sending it over the network. I'll document
  the code more later.
- I removed the check for superuser from apcaccess.  If the
  user attempts to do something that requires root, the 
  program will tell him (i.e. error). If you don't want the
  average Joe Blow to execute it, I recommend using file 
  permissions.
- I changed the name LineUp to OnBatt because to me LineUp
  implies that the Line Voltage is up, when in fact, it means
  the opposite. The name came from the old UPSes where serial
  port lines were either up or down to indicate the state of
  the UPS. 
- I deleted the logging of the change of facility because it
  was more annoying than useful.
- I deleted the httpport variable as it is no longer used.
- I moved a number of variables around in the shared memory
  area in an attempt to bring a bit of order.  More work needed
  here. 
- I moved the test for sanity in the shared memory area versions
  to the attach routine, so it is only done once rather than
  on every read.
- Cleaned up apcnetlib.c so that it never error_aborts() but always
  returns a status and leaves a pointer to an error message.
  Added more documentation to the subroutines.
- I modified how the apcupsd.conf file is installed. Instead of
  going in apcupsd.conf.new if the file already exists, I 
  rename the old file to apcupsd.conf.old and then install the
  new one. The reason is that I believe that most times, the user
  will have an old config file that MUST be replaced. For us
  developers, it is a bit of an annoyance to have our config
  file replaced by the default one -- tant pis. 
- I did a lot of cleanup of the cgi directory to ensure that
  it is robust and can handle the fact that machines are down
  or that certain data may not be available. In general
  all of the lower level routines now return a status rather
  than calling error_abort(). They also leave a pointer to
  an error message, permitting the higher level routines to
  print a reasonable error message. To do this right, we
  should add our own errno codes.   
- I changed the location of where the apccontrol script goes.
  It now goes in the @sysconfdir@/apcupsd.  I've also modified
  apccontrol so that the script files that it calls are expected
  to be in the same directory (normally /etc/apcupsd).
   

To do:
- Fix error_aborts in apcnetd
- Documentation.
- Automatic conversion of old apcupsd.config files
  to the new format?
- Eliminate the rest of the printfs().
- Examine all configuration messages, and eliminate all
 "Someone will have to explain this to me" messages.
- Check and double check killpwr changes.
- Correct problems pointed out by Riccardo in integrating
  my submission.
- Complete writing of status logging.
- Add the full status display to the cgi program (same
  as currently printed by "apcaccess status"
- Possibly retab new cgi/net server code
- Put in new capabilities code.
- Start capabilities codes from 0 instead of 1.
- Add additional STATUS output.
- Create new line for status bits but in English
- Fix name of unknown() and change comments in subroutine
  save_dumb_status() ...
- Make non-available STATUS information print N/A
- Expand Last UPS Self Test field in cgi program
- Produce a RPM for RedHat
- Remember date and time when apcupsd started.
- Accumlate time on batteries and number of transfers
  to batteries. Perhaps save history in file so that the
  info can be recovered if apcupsd restarts.
- Save last 5 major events and pass them in STATUS file.
- Eliminate duplicate copies of apcnetlib.c and apcnetlib.h
- Fix "celsius" flag in cgi routines.

To do MUCH later:
- Add more commands (individual variables) to apcnetd

Done:
- Change translo and transhi to be use new mnemonics
  lowxfer and highxfer.
- Make fetch_data() be called automatically from 
  getvardata().
- Cleanup error_abort/printf inconsistencies in cgi code.
- Put date/time in shared memory buffer in UPSfill()
- Probably apcnetd should be started at the same time
  as apcupsd. Or perhaps a configuration parameter should
  be added to have apcupsd start it.
- The TCP port for apcnetd should be configurable.
- Update CGI programs to understand N/A
- Remove remaining traces of old log file. 
- Delete apcnetd on make clean
- Make apcnetd capable of being called from inetd
- Fix STATUS code so that there is only ONE copy.
- Fix configure.in to add AC_ARG_ENABLE() for cgi directory.
