--- /dev/null
+#
+# Copyright (C) 2006 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+# $Id$
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=osiris
+PKG_VERSION:=4.2.1
+PKG_RELEASE:=1
+PKG_MD5SUM:=11445f7d8dec737f0be89357f5c5bcae
+
+PKG_SOURCE_URL:=http://www.hostintegrity.com/osiris/data/
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_CAT:=zcat
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/osirisd
+ SECTION:=admin
+ CATEGORY:=Administration
+ DEPENDS:=+libopenssl
+ TITLE:=Host integrity monitoring system (scanning agent)
+ DESCRIPTION:=an Host Integrity Monitoring System (scanning agent)
+ URL:=http://www.hostintegrity.com/osiris
+endef
+
+define Build/Configure
+$(call Build/Configure/Default,--with-osiris-user=root \
+ --with-root-dir=/var/lib/osiris \
+ --with-readline=no, ac_cv_openssldir="$(STAGING_DIR)/usr" \
+ ac_cv_have_accrights_in_msghdr=no \
+ ac_cv_have_control_in_msghdr=yes)
+endef
+
+define Build/Compile
+ rm -rf $(PKG_INSTALL_DIR)
+ mkdir -p $(PKG_INSTALL_DIR)
+ $(MAKE) -C $(PKG_BUILD_DIR) \
+ $(TARGET_CONFIGURE_OPTS) \
+ ar=$(TARGET_CROSS)ar \
+ DESTDIR="$(PKG_INSTALL_DIR)" \
+ INTERACTIVE=0 \
+ all install
+endef
+
+define Package/osirisd/install
+ install -d -m0755 $(1)/etc/init.d
+ install -m0755 ./files/osirisd.init $(1)/etc/init.d/osirisd
+ install -d -m0755 $(1)/usr/sbin
+ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/osirisd $(1)/usr/sbin/
+endef
+
+$(eval $(call BuildPackage,osirisd))
--- /dev/null
+#!/bin/sh
+
+BIN=osirisd
+DEFAULT=/etc/default/$BIN
+LIB_D=/var/lib/osiris
+RUN_D=/var/run
+PID_F=$RUN_D/$BIN.pid
+[ -f $DEFAULT ] && . $DEFAULT
+
+case $1 in
+ start)
+ mkdir -p $LIB_D
+ mkdir -p $RUN_D
+ $BIN $OPTIONS
+ ;;
+ stop)
+ [ -f $PID_F ] && kill $(cat $PID_F)
+ ;;
+ *)
+ echo "usage: $0 (start|stop)"
+ exit 1
+esac
+exit $?
--- /dev/null
+--- osiris-4.1.8-orig/configure 2005-04-13 15:22:13.000000000 +0200
++++ osiris-4.1.8-1/configure 2005-04-22 23:11:32.000000000 +0200
+@@ -3606,7 +3606,7 @@
+ esac
+
+
+-DB_CONFIG_ARGS="--enable-shared=no --enable-static=yes"
++DB_CONFIG_ARGS="--target=${target_alias} --host=${host_alias} --build=${build_alias} --enable-shared=no --enable-static=yes"
+
+ case "${OS_NAME}" in
+ MINGW32*)
+--- osiris-4.1.8-orig/configure.ac 2005-04-13 15:22:13.000000000 +0200
++++ osiris-4.1.8-1/configure.ac 2005-04-22 23:11:32.000000000 +0200
+@@ -270,7 +270,7 @@
+
+ dnl configure local copy of Berkely DB:
+
+-DB_CONFIG_ARGS="--enable-shared=no --enable-static=yes"
++DB_CONFIG_ARGS="--target=${target_alias} --host=${host_alias} --build=${build_alias} --enable-shared=no --enable-static=yes"
+
+ case "${OS_NAME}" in
+ MINGW32*)
--- /dev/null
+--- osiris-4.1.8-orig/src/osirisd/osirisd.c 2005-04-14 01:00:55.000000000 +0200
++++ osiris-4.1.8-1/src/osirisd/osirisd.c 2005-04-22 23:11:32.000000000 +0200
+@@ -218,6 +218,8 @@
+
+ #ifdef USE_PRIVSEP
+ rootpriv_setup_pidfile();
++#else
++ setup_pidfile();
+ #endif
+
+ process();
+--- osiris-4.1.8-orig/src/osirisd/rootpriv.c 2005-04-14 00:55:59.000000000 +0200
++++ osiris-4.1.8-1/src/osirisd/rootpriv.c 2005-04-22 23:25:10.000000000 +0200
+@@ -35,6 +35,10 @@
+ #include "logging.h"
+ #include "rootpriv.h"
+
++#ifndef WIN32
++extern char pid_file[MAX_PATH_LENGTH];
++#endif
++
+ #ifdef USE_PRIVSEP
+
+ /* this is defined in regex, and sometimes conflicts with stuff */
+@@ -80,10 +84,6 @@
+ extern pid_t child_pid;
+ extern int rootpriv_pipe[2]; /* socketpair used for rootpriv comm. */
+
+-#ifndef WIN32
+-extern char pid_file[MAX_PATH_LENGTH];
+-#endif
+-
+ #define INCOMING_ROOT_REQUEST() ( FD_ISSET( rootpriv_pipe[1], &root_read_set ) )
+
+
+@@ -292,17 +292,6 @@
+ #endif
+ }
+
+-void setup_pidfile()
+-{
+- FILE *pidfile = fopen( pid_file, "wb" );
+-
+- if( pidfile != NULL )
+- {
+- fprintf( pidfile, "%ld\n", (long)getpid() );
+- fclose( pidfile );
+- }
+-}
+-
+ void handle_signals()
+ {
+ pid_t pid;
+@@ -789,3 +778,14 @@
+
+ #endif /* USE_PRIVSEP */
+
++void setup_pidfile()
++{
++ FILE *pidfile = fopen( pid_file, "wb" );
++
++ if( pidfile != NULL )
++ {
++ fprintf( pidfile, "%ld\n", (long)getpid() );
++ fclose( pidfile );
++ }
++}
++
--- /dev/null
+diff -ruN osiris-4.1.9-old/src/osirismd/md_control.c osiris-4.1.9-new/src/osirismd/md_control.c
+--- osiris-4.1.9-old/src/osirismd/md_control.c 2005-03-24 16:36:07.000000000 +0100
++++ osiris-4.1.9-new/src/osirismd/md_control.c 2006-03-28 01:32:32.000000000 +0200
+@@ -3262,9 +3262,9 @@
+ int index;
+ char checksum[41];
+
+- SHA_Init( &context );
+- SHA_Update( &context, key, (unsigned long)keysize );
+- SHA_Final( &( digest[0] ), &context );
++ SHA1_Init( &context );
++ SHA1_Update( &context, key, (unsigned long)keysize );
++ SHA1_Final( &( digest[0] ), &context );
+
+ for ( index = 0; index < SHA_DIGEST_LENGTH; index++ )
+ {
--- /dev/null
+Description: The mod_if module monitors various aspects of network
+ interfaces for change, including IP, Hardware Address,
+ broadcast, MTU, metric, and promiscuous mode.
+Version: 0.2
+
+diff -ruN osiris-4.1.9-old/src/osirisd/modules/mod_if/Makefile osiris-4.1.9-new/src/osirisd/modules/mod_if/Makefile
+--- osiris-4.1.9-old/src/osirisd/modules/mod_if/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.9-new/src/osirisd/modules/mod_if/Makefile 2005-10-07 02:19:17.000000000 +0200
+@@ -0,0 +1,16 @@
++
++include ../Makefile
++
++SRCS=mod_if.c
++OBJS=$(SRCS:.c=.o)
++
++module: ${SRCS} ${OBJS}
++
++INCS=-I../.. -I../../../libosiris -I../../../libfileapi -I../../../..
++
++# meta-rule for compiling any "C" source file.
++$(OBJS): $(SRCS)
++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) ${INCLUDES} ${INCS} $(AM_CPPFLAGS) \
++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $(SRCS)
++ cp $@ ..
++
+diff -ruN osiris-4.1.9-old/src/osirisd/modules/mod_if/README osiris-4.1.9-new/src/osirisd/modules/mod_if/README
+--- osiris-4.1.9-old/src/osirisd/modules/mod_if/README 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.9-new/src/osirisd/modules/mod_if/README 2005-10-07 02:19:17.000000000 +0200
+@@ -0,0 +1,42 @@
++
++Module: mod_if
++Author: Brian Wotring (brian@hostintegrity.com)
++
++
++
++DESCRIPTION:
++
++The mod_if module is designed originally to monitor the promisc flag
++on network interfaces, but quickly turned into being able to monitor
++various aspects of network interfaces including hardware address,
++IP address, broadcast, MTU, and metric.
++
++This module is somewhat different in that each record is an element
++about a network interface as opposed to one record per interface. This
++will make it easier to add more elements to be monitored, easier to
++filter, and easier to understand alerts.
++
++USE:
++
++To use this module, all that is needed is to include it in the Modules
++block of a scan configuration, e.g.:
++
++ <Modules>
++ ...
++ Include mod_if
++ ...
++ </Modules>
++
++
++PARAMETERS:
++
++There are no parameters for this module.
++
++PLATFORMS:
++
++Currently, this module is only implemented for Linux.
++
++NOTES:
++
++
++
+diff -ruN osiris-4.1.9-old/src/osirisd/modules/mod_if/mod_if.c osiris-4.1.9-new/src/osirisd/modules/mod_if/mod_if.c
+--- osiris-4.1.9-old/src/osirisd/modules/mod_if/mod_if.c 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.9-new/src/osirisd/modules/mod_if/mod_if.c 2005-10-07 02:19:17.000000000 +0200
+@@ -0,0 +1,317 @@
++\r
++/******************************************************************************\r
++**\r
++** Copyright (C) 2005 Brian Wotring.\r
++**\r
++** This program is free software; you can redistribute it and/or\r
++** modify it, however, you cannot sell it.\r
++**\r
++** This program is distributed in the hope that it will be useful,\r
++** but WITHOUT ANY WARRANTY; without even the implied warranty of\r
++** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
++**\r
++** You should have received a copy of the license attached to the\r
++** use of this software. If not, view a current copy of the license\r
++** file here:\r
++**\r
++** http://www.hostintegrity.com/osiris/LICENSE\r
++**\r
++******************************************************************************/\r
++\r
++/*****************************************************************************\r
++**\r
++** File: mod_if.c\r
++** Date: September 23, 2005\r
++**\r
++** Author: Brian Wotring\r
++** Purpose: platform specific methods for monitoring network devices.\r
++**\r
++******************************************************************************/\r
++\r
++\r
++/* CODE USED IN THIS MODULE WAS ORIGINALLY TAKEN FROM: \r
++*\r
++* http://mail.nl.linux.org/kernelnewbies/2003-05/msg00090.html\r
++*/\r
++\r
++static const char *MODULE_NAME = "mod_if";\r
++\r
++\r
++#ifndef WIN32\r
++#include "config.h"\r
++#endif\r
++\r
++#include <stdio.h>\r
++#include <stdlib.h>\r
++\r
++#ifndef WIN32\r
++#include <unistd.h>\r
++#include <string.h>\r
++#include <errno.h>\r
++\r
++#include <sys/socket.h>\r
++#include <sys/types.h>\r
++#include <net/if.h>\r
++#endif\r
++\r
++#include <sys/ioctl.h>\r
++#include <net/if_arp.h>\r
++#include <arpa/inet.h>\r
++\r
++\r
++#include "libosiris.h"\r
++#include "libfileapi.h"\r
++#include "rootpriv.h"\r
++#include "common.h"\r
++#include "version.h"\r
++\r
++#include "scanner.h"\r
++#include "logging.h"\r
++\r
++\r
++#define inaddrr(x) (*(struct in_addr *) &ifr->x[sizeof sa.sin_port])\r
++#define IFRSIZE ((int)(size * sizeof (struct ifreq)))\r
++\r
++void process_if_unix( SCANNER *scanner )\r
++{\r
++ unsigned char*u;\r
++ int sockfd, size = 1;\r
++ struct ifreq *ifr;\r
++ struct ifconf ifc;\r
++ struct sockaddr_in sa;\r
++\r
++ SCAN_RECORD_TEXT_1 record;\r
++\r
++ /* Make sure we are able to create sockets */\r
++ \r
++ if ( (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0 )\r
++ {\r
++ log_error( "mod_if unable to create socket!" );\r
++ return;\r
++ }\r
++\r
++ ifc.ifc_len = IFRSIZE;\r
++ ifc.ifc_req = NULL;\r
++\r
++ do\r
++ {\r
++ ++size;\r
++\r
++ /* realloc buffer size until no overflow occurs */\r
++ \r
++ if ((ifc.ifc_req = realloc(ifc.ifc_req, IFRSIZE)) == NULL )\r
++ {\r
++ log_error( "out of memory!!!" );\r
++ return;\r
++ }\r
++\r
++ ifc.ifc_len = IFRSIZE;\r
++\r
++ if (ioctl(sockfd, SIOCGIFCONF, &ifc))\r
++ {\r
++ log_error("ioctl failure: SIOCFIFCONF");\r
++ return;\r
++ }\r
++\r
++ } while (IFRSIZE <= ifc.ifc_len);\r
++\r
++ ifr = ifc.ifc_req;\r
++\r
++ for (;(char *) ifr < (char *) ifc.ifc_req + ifc.ifc_len; ++ifr)\r
++ {\r
++ if (ifr->ifr_addr.sa_data == (ifr+1)->ifr_addr.sa_data)\r
++ {\r
++ continue; /* duplicate, skip it */\r
++ }\r
++\r
++ if (ioctl(sockfd, SIOCGIFFLAGS, ifr))\r
++ {\r
++ continue; /* failed to get flags, skip it */\r
++ }\r
++\r
++ initialize_scan_record( (SCAN_RECORD *)&record,\r
++ SCAN_RECORD_TYPE_TEXT_1 );\r
++\r
++ osi_strlcpy( record.module_name, MODULE_NAME,\r
++ sizeof( record.module_name ) );\r
++\r
++ osi_snprintf( record.name, sizeof( record.name ),\r
++ "if:%s:IP", ifr->ifr_name );\r
++\r
++ osi_snprintf( record.data, sizeof( record.data ),\r
++ "%s", inet_ntoa(inaddrr(ifr_addr.sa_data)));\r
++\r
++ send_scan_data( scanner, (SCAN_RECORD *)&record );\r
++\r
++ /*\r
++ * This won't work on HP-UX 10.20 as there's no SIOCGIFHWADDR ioctl. You'll\r
++ * need to use DLPI or the NETSTAT ioctl on /dev/lan0, etc (and you'll need\r
++ * to be root to use the NETSTAT ioctl. Also this is deprecated and doesn't\r
++ * work on 11.00).\r
++ *\r
++ * On Digital Unix you can use the SIOCRPHYSADDR ioctl according to an old\r
++ * utility I have. Also on SGI I think you need to use a raw socket, e.g. s\r
++ * = socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP)\r
++ *\r
++ * Dave\r
++ *\r
++ * From: David Peter <dave.peter@eu.citrix.com>\r
++ **/\r
++\r
++ if ( ioctl(sockfd, SIOCGIFHWADDR, ifr) == 0 )\r
++ {\r
++ /* Select which hardware types to process.\r
++ **\r
++ ** See list in system include file included from\r
++ ** /usr/include/net/if_arp.h (For example, on\r
++ ** Linux see file /usr/include/linux/if_arp.h to\r
++ ** get the list.)\r
++ **/\r
++\r
++ switch (ifr->ifr_hwaddr.sa_family)\r
++ {\r
++ default:\r
++ continue;\r
++\r
++ case ARPHRD_NETROM:\r
++ case ARPHRD_ETHER:\r
++ case ARPHRD_PPP:\r
++ case ARPHRD_EETHER:\r
++ case ARPHRD_IEEE802:\r
++ break;\r
++ }\r
++\r
++ u = (unsigned char *) &ifr->ifr_addr.sa_data;\r
++\r
++ /* send record for MAC for this interface */\r
++\r
++ if (u[0] + u[1] + u[2] + u[3] + u[4] + u[5])\r
++ {\r
++ initialize_scan_record( (SCAN_RECORD *)&record,\r
++ SCAN_RECORD_TYPE_TEXT_1 );\r
++\r
++ osi_strlcpy( record.module_name, MODULE_NAME,\r
++ sizeof( record.module_name ) );\r
++\r
++ osi_snprintf( record.name, sizeof( record.name ),\r
++ "if:%s:MAC", ifr->ifr_name );\r
++\r
++ osi_snprintf( record.data, sizeof( record.data ),\r
++ "%2.2x.%2.2x.%2.2x.%2.2x.%2.2x.%2.2x",\r
++ u[0], u[1], u[2], u[3], u[4], u[5]);\r
++\r
++ send_scan_data( scanner, (SCAN_RECORD *)&record );\r
++ }\r
++ }\r
++\r
++ if ( ioctl(sockfd, SIOCGIFNETMASK, ifr) == 0 &&\r
++ strcmp("255.255.255.255", inet_ntoa(inaddrr(ifr_addr.sa_data))))\r
++ {\r
++ initialize_scan_record( (SCAN_RECORD *)&record,\r
++ SCAN_RECORD_TYPE_TEXT_1 );\r
++\r
++ osi_strlcpy( record.module_name, MODULE_NAME,\r
++ sizeof( record.module_name ) );\r
++\r
++ osi_snprintf( record.name, sizeof( record.name ),\r
++ "if:%s:NETMASK", ifr->ifr_name );\r
++\r
++ osi_snprintf( record.data, sizeof( record.data ),\r
++ "%s", inet_ntoa(inaddrr(ifr_addr.sa_data)));\r
++\r
++ send_scan_data( scanner, (SCAN_RECORD *)&record );\r
++ }\r
++\r
++ if (ifr->ifr_flags & IFF_BROADCAST)\r
++ {\r
++ if ( ioctl(sockfd, SIOCGIFBRDADDR, ifr) == 0 &&\r
++ strcmp("0.0.0.0", inet_ntoa(inaddrr(ifr_addr.sa_data))))\r
++ {\r
++\r
++ initialize_scan_record( (SCAN_RECORD *)&record,\r
++ SCAN_RECORD_TYPE_TEXT_1 );\r
++\r
++ osi_strlcpy( record.module_name, MODULE_NAME,\r
++ sizeof( record.module_name ) );\r
++\r
++ osi_snprintf( record.name, sizeof( record.name ),\r
++ "if:%s:BROADCAST", ifr->ifr_name );\r
++\r
++ osi_snprintf( record.data, sizeof( record.data ),\r
++ "%s",inet_ntoa(inaddrr(ifr_addr.sa_data)));\r
++\r
++ send_scan_data( scanner, (SCAN_RECORD *)&record );\r
++ }\r
++ }\r
++\r
++ /* Added by David Vasil to check for Promiscuous mode */\r
++\r
++ initialize_scan_record( (SCAN_RECORD *)&record,\r
++ SCAN_RECORD_TYPE_TEXT_1 );\r
++\r
++ osi_strlcpy( record.module_name, MODULE_NAME,\r
++ sizeof( record.module_name ) );\r
++\r
++\r
++ osi_snprintf( record.name, sizeof( record.name ),\r
++ "if:%s:PROMISC", ifr->ifr_name );\r
++\r
++ if ( ioctl(sockfd, SIOCGIFFLAGS, ifr) == 0 &&\r
++ ifr->ifr_flags & IFF_PROMISC)\r
++ {\r
++ osi_strlcpy( record.data, "ENABLED", sizeof( record.data ) );\r
++ }\r
++\r
++ else\r
++ {\r
++ osi_strlcpy( record.data, "DISABLED", sizeof( record.data ) );\r
++ }\r
++\r
++ send_scan_data( scanner, (SCAN_RECORD *)&record );\r
++\r
++\r
++ if ( ioctl(sockfd, SIOCGIFMTU, ifr) == 0 )\r
++ {\r
++ initialize_scan_record( (SCAN_RECORD *)&record,\r
++ SCAN_RECORD_TYPE_TEXT_1 );\r
++\r
++ osi_strlcpy( record.module_name, MODULE_NAME,\r
++ sizeof( record.module_name ) );\r
++\r
++ osi_snprintf( record.name, sizeof( record.name ),\r
++ "if:%s:MTU", ifr->ifr_name );\r
++\r
++ osi_snprintf( record.data, sizeof( record.data ),\r
++ "%u", ifr->ifr_mtu );\r
++\r
++ send_scan_data( scanner, (SCAN_RECORD *)&record );\r
++ }\r
++\r
++ if ( ioctl(sockfd, SIOCGIFMETRIC, ifr) == 0 )\r
++ {\r
++ initialize_scan_record( (SCAN_RECORD *)&record,\r
++ SCAN_RECORD_TYPE_TEXT_1 );\r
++\r
++ osi_strlcpy( record.module_name, MODULE_NAME,\r
++ sizeof( record.module_name ) );\r
++\r
++ osi_snprintf( record.name, sizeof( record.name ),\r
++ "if:%s:METRIC", ifr->ifr_name );\r
++\r
++ osi_snprintf( record.data, sizeof( record.data ),\r
++ "%u", ifr->ifr_metric );\r
++\r
++ send_scan_data( scanner, (SCAN_RECORD *)&record );\r
++ }\r
++ }\r
++\r
++ close(sockfd);\r
++}\r
++\r
++void mod_if( SCANNER *scanner )\r
++{\r
++#if defined(SYSTEM_LINUX)\r
++ process_if_unix( scanner );\r
++#endif\r
++\r
++}\r
--- /dev/null
+Description: The mod_nvram module was developed specifically to monitor
+ configuration settings stored in nvram on Linksys devices.
+ In the future, this module could be used to monitor other
+ attributes of similar devices.
+Version: 0.1
+
+--- osiris-4.1.8-orig/src/osirisd/modules/mod_nvram/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.8-1/src/osirisd/modules/mod_nvram/Makefile 2005-04-22 23:11:32.000000000 +0200
+@@ -0,0 +1,16 @@
++
++include ../Makefile
++
++SRCS=mod_nvram.c
++OBJS=$(SRCS:.c=.o)
++
++module: ${SRCS} ${OBJS}
++
++INCS=-I../.. -I../../../libosiris -I../../../libfileapi -I../../../..
++
++# meta-rule for compiling any "C" source file.
++$(OBJS): $(SRCS)
++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) ${INCLUDES} ${INCS} $(AM_CPPFLAGS) \
++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $(SRCS)
++ cp $@ ..
++
+--- osiris-4.1.8-orig/src/osirisd/modules/mod_nvram/README 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.8-1/src/osirisd/modules/mod_nvram/README 2005-04-22 23:11:32.000000000 +0200
+@@ -0,0 +1,40 @@
++
++Module: mod_nvram
++Author: Brian Wotring (brian@shmoo.com)
++
++
++
++DESCRIPTION:
++
++The mod_nvram module reads the key=value pairs stored in nvram. This
++is primarily for Linksys routers, but could be modified to run on
++other systems if necessary. On the routers like the WRT54G, the
++nvram settings hold sensitive information that needs to be monitored.
++The format for the record structure is as follows:
++
++ name:value
++
++USE:
++
++To use this module, all that is needed is to include it in the System
++block of a scan configuration, e.g.:
++
++ <System>
++ ...
++ Include mod_nvram
++ ...
++ </System>
++
++
++PARAMETERS:
++
++There are no parameters for this module.
++
++PLATFORMS:
++
++Currently, only for the Linksys WRT54G and WRT54GS devices.
++
++NOTES:
++
++
++
+--- osiris-4.1.8-orig/src/osirisd/modules/mod_nvram/mod_nvram.c 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.8-1/src/osirisd/modules/mod_nvram/mod_nvram.c 2005-04-22 23:11:32.000000000 +0200
+@@ -0,0 +1,142 @@
++
++/******************************************************************************
++**
++** This program is free software; you can redistribute it and/or
++** modify it, however, you cannot sell it.
++**
++** 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.
++**
++** You should have received a copy of the license attached to the
++** use of this software. If not, visit www.shmoo.com/osiris for
++** details.
++**
++******************************************************************************/
++
++/*****************************************************************************
++**
++** File: mod_users.c
++** Date: January 1, 2004
++**
++** Author: Brian Wotring
++** Purpose: platform specific methods for reading user file information.
++**
++******************************************************************************/
++
++#include "libosiris.h"
++#include "libfileapi.h"
++#include "rootpriv.h"
++#include "common.h"
++#include "version.h"
++
++#include "scanner.h"
++#include "logging.h"
++
++
++#define NVRAM_PATH "/usr/sbin/nvram"
++#define NVRAM_ARG "show"
++
++static const char *MODULE_NAME = "mod_nvram";
++
++
++void mod_nvram( SCANNER *scanner )
++{
++ int pid;
++ int pc[2];
++ int cp[2];
++ char temp_line[4096];
++ FILE *file;
++ SCAN_RECORD_TEXT_1 record;
++
++ if( pipe(pc) < 0)
++ {
++ log_error( "mod_nvram: error creating pipe!" );
++ return;
++ }
++
++ if( pipe(cp) < 0)
++ {
++ log_error( "mod_nvram: error creating pipe!" );
++ return;
++ }
++
++ /* Create a child to run nvram command. */
++
++ switch( pid = fork() )
++ {
++ case -1:
++ log_error( "nvram: fork error!" );
++ return;
++
++ case 0:
++
++ /* child */
++
++ close(1);
++ dup( cp[1]);
++ close(0);
++ close( pc[1]);
++ close( cp[0]);
++ execl( NVRAM_PATH, NVRAM_PATH, NVRAM_ARG, NULL );
++ exit(0);
++
++ default:
++
++ /* parent */
++
++ close(pc[1]);
++ close(cp[1]);
++
++ file = fdopen( cp[0], "r" );
++
++ for(;;)
++ {
++ char *line;
++ char *key_end;
++
++ line = fgets( temp_line, sizeof( temp_line ), file );
++
++ if( line == NULL)
++ {
++ break;
++ }
++
++ line = trim_white_space( line );
++
++ /* skip commented and empty lines. */
++
++ if( ( line == NULL ) || ( line[0] == '#' ) )
++ {
++ continue;
++ }
++
++ /* locate the username, this is the first item in the colon list. */
++
++ if( ( key_end = strchr( line, '=' ) ) == NULL )
++ {
++ continue;
++ }
++
++ initialize_scan_record( (SCAN_RECORD *)&record,
++ SCAN_RECORD_TYPE_TEXT_1 );
++
++ osi_strlcpy( record.module_name, MODULE_NAME,
++ sizeof( record.module_name ) );
++
++ /* user the key as a key/path for this record. */
++
++ (*key_end) = '\0';
++ key_end++;
++ osi_strlcpy( record.name, "nvram:", sizeof( record.name ) );
++ osi_strlcat( record.name, line, sizeof( record.name ) );
++
++ /* now copy in the value into the data portion. */
++ /* and send this record on its way. */
++
++ osi_strlcpy( record.data, key_end, sizeof( record.data ) );
++ send_scan_data( scanner, (SCAN_RECORD *)&record );
++ }
++ }
++}
++
--- /dev/null
+Description: The mod_uptime module obtains the system boot time value
+ for comparison with scans.
+Version: 0.2
+
+--- osiris-4.1.8-orig/src/osirisd/modules/mod_uptime/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.8-1/src/osirisd/modules/mod_uptime/Makefile 2005-04-22 23:11:32.000000000 +0200
+@@ -0,0 +1,16 @@
++
++include ../Makefile
++
++SRCS=mod_uptime.c
++OBJS=$(SRCS:.c=.o)
++
++module: ${SRCS} ${OBJS}
++
++INCS=-I../.. -I../../../libosiris -I../../../libfileapi -I../../../..
++
++# meta-rule for compiling any "C" source file.
++$(OBJS): $(SRCS)
++ $(CC) $(DEFS) $(DEFAULT_INCLUDES) ${INCLUDES} ${INCS} $(AM_CPPFLAGS) \
++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $(SRCS)
++ cp $@ ..
++
+--- osiris-4.1.8-orig/src/osirisd/modules/mod_uptime/README 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.8-1/src/osirisd/modules/mod_uptime/README 2005-04-22 23:11:32.000000000 +0200
+@@ -0,0 +1,36 @@
++
++Module: mod_uptime
++Author: Brian Wotring (brian@shmoo.com)
++
++
++
++DESCRIPTION:
++
++The mod_uptime module obtains the system boot time value for comparison
++with scans.
++
++USE:
++
++To use this module, all that is needed is to include it in the System
++block of a scan configuration, e.g.:
++
++ <System>
++ ...
++ Include mod_uptime
++ ...
++ </System>
++
++
++PARAMETERS:
++
++There are no parameters for this module.
++
++PLATFORMS:
++
++Currently, this module is implemented for FreeBSD, OpenBSD,
++Linux, Solaris, and Mac OS X.
++
++NOTES:
++
++
++
+--- osiris-4.1.8-orig/src/osirisd/modules/mod_uptime/mod_uptime.c 1970-01-01 01:00:00.000000000 +0100
++++ osiris-4.1.8-1/src/osirisd/modules/mod_uptime/mod_uptime.c 2005-04-22 23:11:32.000000000 +0200
+@@ -0,0 +1,178 @@
++
++/******************************************************************************
++**
++** This program is free software; you can redistribute it and/or
++** modify it, however, you cannot sell it.
++**
++** 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.
++**
++** You should have received a copy of the license attached to the
++** use of this software. If not, visit www.shmoo.com/osiris for
++** details.
++**
++******************************************************************************/
++
++/*****************************************************************************
++**
++** File: mod_uptime.c
++** Date: March 22, 2004
++**
++** Author: Brian Wotring
++** Purpose: platform specific methods for obtaining the system boot time.
++**
++******************************************************************************/
++
++#include "libosiris.h"
++#include "libfileapi.h"
++#include "rootpriv.h"
++#include "common.h"
++#include "version.h"
++
++#include "scanner.h"
++#include "logging.h"
++#include "config.h"
++
++#ifdef HAVE_SYS_SYSCTL_H
++#include <sys/sysctl.h>
++#endif
++
++#ifdef SYSTEM_SUNOS
++#include <utmpx.h>
++#endif
++
++#ifdef SYSTEM_LINUX
++#include <utmp.h>
++#endif
++
++#define PROC_FILE "/proc/uptime"
++#define OSI_WTMP_FILE "/var/log/wtmp"
++
++static const char *MODULE_NAME = "mod_uptime";
++
++
++void mod_uptime( SCANNER *scanner )
++{
++ SCAN_RECORD_TEXT_1 record;
++ char *time = NULL;
++ char *temp;
++
++ initialize_scan_record( (SCAN_RECORD *)&record,
++ SCAN_RECORD_TYPE_TEXT_1 );
++
++ osi_strlcpy( record.module_name, MODULE_NAME,
++ sizeof( record.module_name ) );
++
++#if defined(SYSTEM_FREEBSD) || defined(SYSTEM_OPENBSD) || defined(SYSTEM_DARWIN)
++ {
++ time_t t;
++ struct timeval result;
++
++ int request[2] = { CTL_KERN, KERN_BOOTTIME };
++ size_t result_len = sizeof(result);
++
++ if( sysctl( request, 2, &result, &result_len, NULL, 0 ) < 0)
++ {
++ log_error( "unable to obtain uptime value." );
++ return;
++ }
++
++ t = result.tv_sec;
++ time = ctime( &t );
++ }
++
++#elif defined(SYSTEM_SUNOS)
++ {
++ struct utmpx * ent;
++ time_t t;
++
++ while( ( ent = getutxent() ) )
++ {
++ if( !strcmp( "system boot", ent->ut_line ) )
++ {
++ t = ent->ut_tv.tv_sec;
++ time = ctime( &t );
++ }
++ }
++ }
++
++#elif defined(SYSTEM_LINUX)
++ {
++ FILE *fp;
++ time_t t;
++ struct utmp ut;
++
++ char buf[40];
++ char buf2[10];
++ int filecount = 0;
++
++next_file:
++
++ osi_strlcpy( buf, OSI_WTMP_FILE, sizeof( buf ) );
++
++ if( filecount > 0 )
++ {
++ osi_snprintf( buf2, sizeof(buf2), "%d", filecount );
++ osi_strlcat( buf, buf2, sizeof(buf) );
++ }
++
++ fp = osi_fopen( buf, "r", 0 );
++
++ if( fp == NULL )
++ {
++ log_error( "unable to obtain uptime value." );
++ return;
++ }
++
++ while(1)
++ {
++ int rc = fread( &ut, 1, sizeof(ut), fp );
++
++ /* end of file, try next. */
++
++ if( rc == 0 )
++ {
++ filecount++;
++ fclose( fp );
++
++ goto next_file;
++ }
++
++ /* found restart event. */
++
++ if( ( strcmp( ut.ut_name, "reboot" ) == 0 ) ||
++ ( strcmp( ut.ut_name, "shutdown" ) == 0 ) )
++ {
++
++ t = ut.ut_time;
++ time = ctime( &t );
++
++ break;
++ }
++ }
++
++ fclose( fp );
++ }
++#endif
++
++ if( time == NULL )
++ {
++ log_error( "unable to obtain uptime value." );
++ return;
++ }
++
++ /* remove any trailing newline from the ctime() calls. */
++
++ if( ( temp = strchr( time, '\n' ) ) )
++ {
++ (*temp) = '\0';
++ }
++
++ osi_strlcpy( record.name, "uptime", sizeof( record.name ) );
++ osi_strlcpy( record.data, time, sizeof( record.data ) );
++
++ send_scan_data( scanner, (SCAN_RECORD *)&record );
++}
++
++