Hi folks !

Along with this mail i send you two little pieces of code which i found
extremely useful. The first is a patch to the install program. Since
install is used by many source-packages to install themselves, i thought
it would be nice if install keeps track of the installed programs. The
patch attached does this. It takes some information from install-time
and spills them to a log file.
The second program is a little bash-script which utilizies this log.
Ahh, please note that these are quick & dirty hacks. If you like them I
think it would be great if you implement their functionality in a one of
the next fileutils-releases.

Best regards

Joern Merkel

-- 
Murphy is watching you !


--- src/install.orig.c  Mon Dec 25 12:07:36 2000
+++ src/install.c       Fri Sep 28 17:12:47 2001
@@ -23,6 +23,9 @@
 
 #include <config.h>
 #include <stdio.h>
+#include <fcntl.h>
+#include <time.h>
+#include <sys/time.h>
 #include <getopt.h>
 #include <sys/types.h>
 #include <pwd.h>
@@ -141,6 +144,58 @@
   {NULL, 0, NULL, 0}
 };
 
+int installlog (const char *file0,const char *file1)
+{
+/* The enviroment variable ILOGFILE specifies where to put the logfile.
+   i.e. /var/log/ilog */
+  char *ilogfile = (char *) getenv("ILOGFILE");
+/* if ILOGFILE is set -> continue, else forget everything... */
+  if (ilogfile != NULL) {
+    int fd = open (ilogfile, O_CREAT|O_APPEND|O_WRONLY, 0644);
+    if (fd<0) {
+      fprintf (stderr,"%s :",ilogfile);
+      perror ("open");
+      return (1);
+    }
+    struct timeval tv;
+    struct timezone tz;
+    gettimeofday (&tv, &tz);
+
+    char datestring[255];
+/* this forges the first part of the logstring, the date */
+    strftime (datestring, 255, "%Y-%m-%d-%H:%M:%S ", localtime (&tv.tv_sec));
+/* and this tries to extract the packagename from PWD. Assume you installed the
+   sources to /usr/src/fileutils-4.1 then the extracted packagename will be
+   PWD minus /usr/src/ = fileutils-4.1 .Any following tree will be cutted away
+   also. */
+    char *pathstring= (char *) getenv("PWD");
+    int matches = strspn(pathstring,"/usr/src/");
+    if (matches != 9) {
+      fprintf (stderr,"if you want loging, you have to install from /usr/src/* !\n");
+      return (1);
+    }
+    char *startptr = &pathstring[matches];
+    char *endptr = strchr(startptr, '/');
+    char packstring[255];
+    if (endptr != NULL)
+      strncpy (packstring, startptr, endptr-startptr);
+    else
+      strcpy (packstring, startptr);
+/* this one forges the complete logstring, */
+    strcat (datestring, packstring);
+    strcat (datestring, ": ");
+    strcat (datestring, file0);
+    strcat (datestring, " -> ");
+    strcat (datestring, file1);
+    strcat (datestring, "\n");
+/* which is finally written... */
+    write(fd, datestring, strlen(datestring));
+
+    close (fd);
+  }
+  return (0);
+}
+
 static void
 cp_option_init (struct cp_options *x)
 {
@@ -326,6 +381,8 @@
            errors = install_file_in_file (file[0], file[1], &x);
          else
            errors = install_file_in_dir (file[0], file[1], &x);
+          if (errors == 0)
+            installlog (file[0], file[1]);
        }
       else
        {
@@ -342,6 +399,8 @@
          for (i = 0; i < n_files - 1; i++)
            {
              errors |= install_file_in_dir (file[i], dest, &x);
+              if (errors == 0)
+                installlog (file[i], dest);
            }
        }
     }
#!/bin/bash
# 
# this is a little tool to handle to information provided by the install-patch
# written in 2001 by Joern Merkel.
#
# Yeah, this is all GPL, of course...
#
# some parameters :
#
# -l 		: list (all) installed packs
# -d packname 	: delete
# -g pattern    : grep
# -t packname   : make a tar of the installed files

function dolistfiles {
# -d -> delete
# -t -> tar
LIST="$(grep ".* $OPTARG:" $LOGPLACE | cut -d " " -f 3-5)"
[ ! "$LIST" ] && echo "Nothing to do with $OPTARG" && exit 0
oldIFS="$IFS"
IFS=$'\n'
for LINE in $LIST; do
  FILE="$(echo "$LINE" | cut -d " " -f 3)"
  [ -d $FILE ] && FILE="${FILE%/}/$(echo "$LINE" | cut -d " " -f 1)"
  if [ -f $FILE ]; then
    [ "$1" == "-d" ] && rm $FILE && echo "$FILE removed"
    [ "$1" == "-t" ] && tar -r $FILE -f $HOME/$OPTARG-$HOSTNAME.tar 2>/dev/null
  fi
done
IFS="$oldIFS"
}

OPTERR=0
LOGPLACE=$ILOGFILE

if [ $# -eq 0 ]; then
  echo "sorting $LOGPLACE..."
  (sort -r -k 2 $LOGPLACE | uniq -f 1 | sort > $LOGPLACE.2) && mv $LOGPLACE.2 $LOGPLACE
  echo "for a list of options use -h"
  [ "$DIALOG" ] || exit 0
fi

while : ; do

getopts "hld:g:t:" OPTNAME || exit 0
case "$OPTNAME" in
  h)
    echo "-l            : list (all) installed packs"
    echo "-d packname   : delete"
    echo "-g pattern    : grep"
    echo "-t packname   : make a tar of the installed files"
  ;;
  l)
    grep ":" $LOGPLACE | sort -k 2 | cut -d " " -f 2 | uniq
  ;;
  d) 
    grep "$OPTARG:" $LOGPLACE
    echo "Maybe you want to tar this files first ? (Do packtool -t $OPTARG)"
    echo "Warning ! Removing those files !"
    echo -n "Are you absolutely sure (y/n) ? "; read INPUT
    [ "$INPUT" != "y" ] && exit 0
    dolistfiles -d
    (grep -v ".* $OPTARG:" $LOGPLACE > $LOGPLACE.2) && mv $LOGPLACE.2 $LOGPLACE
  ;;
  g)
    grep "$OPTARG" $LOGPLACE
  ;;
  t)
    dolistfiles -t
    gzip $HOME/$OPTARG-$HOSTNAME.tar && echo "$OPTARG tarred to $HOME/$OPTARG-$HOSTNAME.tar.gz"
  ;;
esac

done

Reply via email to