<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://www.marcelpost.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Worklog</id>
	<title>Worklog - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.marcelpost.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Worklog"/>
	<link rel="alternate" type="text/html" href="https://www.marcelpost.com/wiki/index.php?title=Worklog&amp;action=history"/>
	<updated>2026-05-17T04:14:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://www.marcelpost.com/wiki/index.php?title=Worklog&amp;diff=16&amp;oldid=prev</id>
		<title>Admin at 02:02, 30 August 2011</title>
		<link rel="alternate" type="text/html" href="https://www.marcelpost.com/wiki/index.php?title=Worklog&amp;diff=16&amp;oldid=prev"/>
		<updated>2011-08-30T02:02:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Worklog&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
# worklog&lt;br /&gt;
#&lt;br /&gt;
# (C)2010 Marcel Post. All Rights Reserved&lt;br /&gt;
# Last modified: 22 December 2010 (optimised for Bashv4, possibly Dash too)&lt;br /&gt;
#&lt;br /&gt;
# This script tracks changes made to files in a target directory.&lt;br /&gt;
# The way it works is that it will calculate the time between when&lt;br /&gt;
# a file was first edited (poll every 5 minutes) and when the last&lt;br /&gt;
# change was made (assuming that no edits were made for 60 minutes).&lt;br /&gt;
#&lt;br /&gt;
# For permissions, the cron executer must own the &amp;#039;worklog&amp;#039; file&lt;br /&gt;
#&lt;br /&gt;
# Example cron entry:&lt;br /&gt;
#&lt;br /&gt;
#   */5 * * * * /usr/local/bin/worklog /var/www/attendance [path-to-worklog-file]&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# BUGS&lt;br /&gt;
#&lt;br /&gt;
# once had that a file could not be &amp;#039;stat&amp;#039; by worklog, as if it was locked by&lt;br /&gt;
# vi when I was writing back the changes or so..&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# TODO&lt;br /&gt;
# - add a --help switch with version number etc&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# User Variables:&lt;br /&gt;
&lt;br /&gt;
WL=worklog      # name and location of the worklog file&lt;br /&gt;
TMPDIR=/tmp     # a temp directory that we can safely write to&lt;br /&gt;
IDLEMINS=20     # when we should consider an edit to be finished&lt;br /&gt;
DEBUG=0         # turn on for more verbose output&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --- script follows ---&lt;br /&gt;
&lt;br /&gt;
if test $# -lt 1&lt;br /&gt;
then&lt;br /&gt;
&lt;br /&gt;
  # no arguments provided&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Syntax: worklog  [path-to-worklog-file]&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if test $# -lt 2&lt;br /&gt;
then&lt;br /&gt;
  # one argument provided. Can either be:&lt;br /&gt;
  #   -show   to display the worklog file, or&lt;br /&gt;
  #     to find changes in the &amp;#039;path&amp;#039; files and directories and&lt;br /&gt;
  #           write the updates to the worklog file located in &amp;#039;path&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if test $1 = &amp;quot;-show&amp;quot;&lt;br /&gt;
  then&lt;br /&gt;
    # use current directory to find the workdir file&lt;br /&gt;
    DEBUG=2&lt;br /&gt;
&lt;br /&gt;
    # set projectdir&lt;br /&gt;
    PROJECTDIR=`pwd`&lt;br /&gt;
&lt;br /&gt;
    # set worklog file&lt;br /&gt;
    WORKLOG=$PROJECTDIR/$WL&lt;br /&gt;
&lt;br /&gt;
  else&lt;br /&gt;
&lt;br /&gt;
    # using project directory as specified with argument 1&lt;br /&gt;
    # also use the path directory to find the worklog file&lt;br /&gt;
&lt;br /&gt;
    if test -d $1&lt;br /&gt;
    then&lt;br /&gt;
      # project dir exists ok&lt;br /&gt;
      PROJECTDIR=$1&lt;br /&gt;
&lt;br /&gt;
      # set worklog file&lt;br /&gt;
      WORKLOG=$PROJECTDIR/$WL&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;Project directory does not exist&amp;quot;&lt;br /&gt;
      exit 1&lt;br /&gt;
    fi&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
  # at least two arguments provided. Can either be:&lt;br /&gt;
  #   -show    to display the worklog file in the&lt;br /&gt;
  #                     specified &amp;#039;path&amp;#039;&lt;br /&gt;
  #      update worklog in a possibly different&lt;br /&gt;
  #                     location than the &amp;#039;path&amp;#039; specification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if test $1 = &amp;quot;-show&amp;quot;&lt;br /&gt;
  then&lt;br /&gt;
    # use second argument to find the worklog file&lt;br /&gt;
    DEBUG=2&lt;br /&gt;
&lt;br /&gt;
    # set location of worklog file&lt;br /&gt;
&lt;br /&gt;
    if test -f $2&lt;br /&gt;
    then&lt;br /&gt;
      # worklog file exists ok&lt;br /&gt;
      WORKLOG=$2&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;Could not access worklog file at $2&amp;quot;&lt;br /&gt;
      echo &amp;quot;Please create a worklog file by running an update first&amp;quot;&lt;br /&gt;
      echo &amp;quot;Syntax: worklog  [path-to-worklog-file]&amp;quot;&lt;br /&gt;
      exit 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
  else&lt;br /&gt;
    # test if arguments link to an existing directory and a worklogfile&lt;br /&gt;
&lt;br /&gt;
    if test -d $1&lt;br /&gt;
    then&lt;br /&gt;
      # project dir exists ok&lt;br /&gt;
      PROJECTDIR=$1&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;Project directory does not exist&amp;quot;&lt;br /&gt;
      exit 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # just set the name and location of the worklog file to the second argument&lt;br /&gt;
    # testing if it exists happens further in the script&lt;br /&gt;
    WORKLOG=$2&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# uncomment for debugging purposes&lt;br /&gt;
#if test $# -eq 2&lt;br /&gt;
#then&lt;br /&gt;
#  if test $2 = &amp;quot;-d&amp;quot;&lt;br /&gt;
#  then&lt;br /&gt;
#    DEBUG=1&lt;br /&gt;
#    echo&lt;br /&gt;
#  fi&lt;br /&gt;
#  if test $2 = &amp;quot;-show&amp;quot;&lt;br /&gt;
#  then&lt;br /&gt;
#    # show real dates instead of timestamps&lt;br /&gt;
#    DEBUG=2&lt;br /&gt;
#    echo&lt;br /&gt;
#  fi&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# test if project directory exists&lt;br /&gt;
if ! test -d $PROJECTDIR&lt;br /&gt;
then&lt;br /&gt;
  echo &amp;quot;Project directory not found&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test if logfile exists&lt;br /&gt;
if test -f $WORKLOG&lt;br /&gt;
then&lt;br /&gt;
&lt;br /&gt;
  # -- check existing worklog file --&lt;br /&gt;
&lt;br /&gt;
  # check if worklog has a filesize greater than zero&lt;br /&gt;
  if test -s $WORKLOG&lt;br /&gt;
  then&lt;br /&gt;
&lt;br /&gt;
    # check if we can recognise the header of the file&lt;br /&gt;
    WORKLOG_HEADER=`head -n 1 $WORKLOG`&lt;br /&gt;
&lt;br /&gt;
    if test `echo $WORKLOG_HEADER | awk -F : &amp;#039;{print $1}&amp;#039;` = &amp;quot;LAST-CHANGED&amp;quot;  &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
    then&lt;br /&gt;
      NEWFILE=0&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;The worklog file seems corrupt. Please check.&amp;quot;&lt;br /&gt;
      echo &amp;quot;if possible delete $WORKLOG&amp;quot;&lt;br /&gt;
      exit 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
  else&lt;br /&gt;
&lt;br /&gt;
    NEWFILE=1&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # check permissions&lt;br /&gt;
&lt;br /&gt;
  if ! test -O $WORKLOG&lt;br /&gt;
  then&lt;br /&gt;
    if test $DEBUG != 2&lt;br /&gt;
    then&lt;br /&gt;
      echo &amp;quot;File $WORKLOG is not owned by the user running this script! Exiting now.&amp;quot;&lt;br /&gt;
      exit 1&lt;br /&gt;
    fi&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # check if we have write permissions to the worklog file&lt;br /&gt;
&lt;br /&gt;
  # who is running this script&lt;br /&gt;
  RUNUID=`set | grep ^UID | awk -F = &amp;#039;{print $2}&amp;#039;`&lt;br /&gt;
&lt;br /&gt;
  #get stat from logfile&lt;br /&gt;
  LOGFSTAT=`/usr/bin/stat $WORKLOG | grep Uid`&lt;br /&gt;
  #check if Uid is same as the user running this script&lt;br /&gt;
&lt;br /&gt;
  LOGF_PERMS=`echo $LOGFSTAT | awk -F Uid &amp;#039;{print $1}&amp;#039; | awk -F / &amp;#039;{print $2}&amp;#039; | cut -c 3`&lt;br /&gt;
&lt;br /&gt;
  if test &amp;quot;$LOGF_PERMS&amp;quot; != &amp;quot;w&amp;quot;&lt;br /&gt;
  then&lt;br /&gt;
    echo &amp;quot;No write permissions to worklog file! Exiting now.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # Excellent!&lt;br /&gt;
&lt;br /&gt;
  # if we&amp;#039;re still in the running here, we&amp;#039;ve got:&lt;br /&gt;
  #&lt;br /&gt;
  # - an existing worklog file (maybe zero length)&lt;br /&gt;
&lt;br /&gt;
  # - owned by the runner of this script&lt;br /&gt;
  # - with write permissions&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
  # -- create new worklog file --&lt;br /&gt;
&lt;br /&gt;
  if test $DEBUG = 2&lt;br /&gt;
  then&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;Please create a worklog file by running an update first&amp;quot;&lt;br /&gt;
    echo &amp;quot;Syntax: worklog  [path-to-worklog-file]&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
&lt;br /&gt;
  else&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;Worklog at $WORKLOG not found&amp;quot;&lt;br /&gt;
    echo -n &amp;quot;Attempting to create a new worklog file... &amp;quot;&lt;br /&gt;
    if touch $WORKLOG &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
    then&lt;br /&gt;
      echo &amp;quot;ok&amp;quot;&lt;br /&gt;
      if test $DEBUG = 1&lt;br /&gt;
      then&lt;br /&gt;
        echo &amp;quot;new worklog created&amp;quot;&lt;br /&gt;
      fi&lt;br /&gt;
      NEWFILE=1&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;Permission denied!&amp;quot;&lt;br /&gt;
      exit 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -- part 1 b --&lt;br /&gt;
&lt;br /&gt;
# show human readable dates and summarise time spent&lt;br /&gt;
&lt;br /&gt;
# if we were called with the -show argument now is the&lt;br /&gt;
# time to display the worklog file using real date (ymd)&lt;br /&gt;
# instead of timestamps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if test $DEBUG = 2&lt;br /&gt;
then&lt;br /&gt;
  echo &amp;quot;worklog for $1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  TOTALTIME=0&lt;br /&gt;
  TOTALTIME_W=0&lt;br /&gt;
  TOTALTIME_C=0&lt;br /&gt;
  MAXLINES=`grep -c minutes $WORKLOG`&lt;br /&gt;
  MAXLINES=$((MAXLINES + 2))&lt;br /&gt;
  LINENR=3&lt;br /&gt;
  PREVWEEK=0&lt;br /&gt;
  DO_WEEKSUMMARY=0&lt;br /&gt;
  while test $LINENR -le $MAXLINES&lt;br /&gt;
  do&lt;br /&gt;
&lt;br /&gt;
    READLN=`cat $WORKLOG | head -n $LINENR | tail -n 1`&lt;br /&gt;
&lt;br /&gt;
    # only process completed entries..&lt;br /&gt;
    if echo $READLN | grep minutes &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
    then&lt;br /&gt;
&lt;br /&gt;
      DO_PRINT=1&lt;br /&gt;
&lt;br /&gt;
      BEGINTIME=`echo $READLN | awk &amp;#039;{print $1}&amp;#039;`&lt;br /&gt;
      WEEKNR=`date -d @$BEGINTIME +%U`&lt;br /&gt;
      if test $PREVWEEK -eq 0&lt;br /&gt;
      then&lt;br /&gt;
        PREVWEEK=$WEEKNR&lt;br /&gt;
      else&lt;br /&gt;
&lt;br /&gt;
        if test $WEEKNR != $PREVWEEK&lt;br /&gt;
        then&lt;br /&gt;
          DO_WEEKSUMMARY=1&lt;br /&gt;
        fi&lt;br /&gt;
      fi&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      # incomplete line detected. Don&amp;#039;t print anything&lt;br /&gt;
      DO_PRINT=0&lt;br /&gt;
&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # show week summary line&lt;br /&gt;
    if test $DO_WEEKSUMMARY -eq 1&lt;br /&gt;
    then&lt;br /&gt;
&lt;br /&gt;
      if test $TOTALTIME -gt 0&lt;br /&gt;
      then&lt;br /&gt;
&lt;br /&gt;
        # new week detected&lt;br /&gt;
        TOTAL_HOURS_W=$((TOTALTIME_W / 60))&lt;br /&gt;
        TOTAL_HXM_W=$((TOTAL_HOURS_W * 60))&lt;br /&gt;
        TOTAL_MINUTES_W=$((TOTALTIME_W - TOTAL_HXM_W))&lt;br /&gt;
        echo -n &amp;quot;Summary for week $PREVWEEK: $TOTALTIME_W minutes   $TOTAL_HOURS_W h $TOTAL_MINUTES_W m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # cumulative week totals&lt;br /&gt;
        TOTALTIME_C=$((TOTALTIME_C + TOTALTIME_W))&lt;br /&gt;
        TOTAL_HOURS_C=$((TOTALTIME_C / 60))&lt;br /&gt;
        TOTAL_HXM_C=$((TOTAL_HOURS_C * 60))&lt;br /&gt;
        TOTAL_MINUTES_C=$((TOTALTIME_C - TOTAL_HXM_C))&lt;br /&gt;
&lt;br /&gt;
        echo &amp;quot;   ($TOTAL_HOURS_C h $TOTAL_MINUTES_C m)&amp;quot;&lt;br /&gt;
        echo &amp;quot;--&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        PREVWEEK=$WEEKNR&lt;br /&gt;
      fi&lt;br /&gt;
      DO_WEEKSUMMARY=0&lt;br /&gt;
      TOTALTIME_W=0&lt;br /&gt;
&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    BEGINTIME=`date -d @$BEGINTIME`&lt;br /&gt;
    ENDTIME=`echo $READLN | awk &amp;#039;{print $2}&amp;#039;`&lt;br /&gt;
    ENDTIME=`date -d @$ENDTIME`&lt;br /&gt;
&lt;br /&gt;
    DIFFERENCE=`echo $READLN | awk &amp;#039;{print $3}&amp;#039;`&lt;br /&gt;
    TOTALTIME_W=$((TOTALTIME_W + DIFFERENCE))&lt;br /&gt;
    TOTALTIME=$((TOTALTIME + DIFFERENCE))&lt;br /&gt;
&lt;br /&gt;
    # print entry on screen&lt;br /&gt;
    echo &amp;quot;$BEGINTIME to $ENDTIME   = $DIFFERENCE minutes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # show week summary if we&amp;#039;ve reached the last line&lt;br /&gt;
    if test $LINENR -eq $MAXLINES&lt;br /&gt;
    then&lt;br /&gt;
      TOTAL_HOURS_W=$((TOTALTIME_W / 60))&lt;br /&gt;
      TOTAL_HXM_W=$((TOTAL_HOURS_W * 60))&lt;br /&gt;
      TOTAL_MINUTES_W=$((TOTALTIME_W - TOTAL_HXM_W))&lt;br /&gt;
&lt;br /&gt;
      echo -n &amp;quot;Summary for week $PREVWEEK: $TOTALTIME_W minutes   $TOTAL_HOURS_W h $TOTAL_MINUTES_W m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      # cumulative week totals&lt;br /&gt;
      TOTALTIME_C=$((TOTALTIME_C + TOTALTIME_W))&lt;br /&gt;
      TOTAL_HOURS_C=$((TOTALTIME_C / 60))&lt;br /&gt;
      TOTAL_HXM_C=$((TOTAL_HOURS_C * 60))&lt;br /&gt;
      TOTAL_MINUTES_C=$((TOTALTIME_C - TOTAL_HXM_C))&lt;br /&gt;
&lt;br /&gt;
      if test $TOTALTIME_C -eq $TOTALTIME_W&lt;br /&gt;
      then&lt;br /&gt;
        echo&lt;br /&gt;
      else&lt;br /&gt;
&lt;br /&gt;
        echo &amp;quot;   ($TOTAL_HOURS_C h $TOTAL_MINUTES_C m)&amp;quot;&lt;br /&gt;
      fi&lt;br /&gt;
&lt;br /&gt;
      echo &amp;quot;--&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    LINENR=$((LINENR + 1))&lt;br /&gt;
&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;---------------------------&amp;quot;&lt;br /&gt;
  echo -n &amp;quot; $TOTALTIME minutes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  TOTAL_HOURS=$((TOTALTIME / 60))&lt;br /&gt;
  TOTAL_HXM=$((TOTAL_HOURS * 60))&lt;br /&gt;
  TOTAL_MINUTES=$((TOTALTIME - TOTAL_HXM))&lt;br /&gt;
  echo &amp;quot;   $TOTAL_HOURS h $TOTAL_MINUTES m&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -- part 2 --&lt;br /&gt;
# track changes&lt;br /&gt;
&lt;br /&gt;
# find out which file was lastly changed&lt;br /&gt;
# the first line of the worklog file will be used to track changes&lt;br /&gt;
#&lt;br /&gt;
# Example:&lt;br /&gt;
# LAST-CHANGED : 1273572131 left.php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# get just the file name of a regular file that was changed last&lt;br /&gt;
LC_FILENAME=`/bin/ls -tr1 $PROJECTDIR | grep -v $WL | tail -n 1`&lt;br /&gt;
&lt;br /&gt;
# get the timestamp for this file&lt;br /&gt;
LC_TIMESTAMP=`/usr/bin/stat --format=%Y $PROJECTDIR/$LC_FILENAME`&lt;br /&gt;
&lt;br /&gt;
# compare this with what&amp;#039;s in the worklog&lt;br /&gt;
&lt;br /&gt;
# -- create worklog header in case of new file --&lt;br /&gt;
if test $NEWFILE = 1&lt;br /&gt;
then&lt;br /&gt;
  WORKLOG_HEADER=&amp;quot;LAST-CHANGED : $LC_TIMESTAMP $LC_FILENAME&amp;quot;&lt;br /&gt;
  echo $WORKLOG_HEADER &amp;gt; $WORKLOG&lt;br /&gt;
  echo &amp;quot;--&amp;quot; &amp;gt;&amp;gt; $WORKLOG&lt;br /&gt;
&lt;br /&gt;
  if test $DEBUG = 1&lt;br /&gt;
  then&lt;br /&gt;
    echo &amp;quot;created new worklog header for file: $LC_FILENAME&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# update the header if a change has been detected&lt;br /&gt;
if echo $WORKLOG_HEADER | grep -e &amp;quot;$LC_TIMESTAMP $LC_FILENAME&amp;quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
then&lt;br /&gt;
  # no changes detected&lt;br /&gt;
  CHANGES=0&lt;br /&gt;
  if test $DEBUG = 1&lt;br /&gt;
  then&lt;br /&gt;
    echo &amp;quot;no changes detected&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
else&lt;br /&gt;
  CHANGES=1&lt;br /&gt;
  # a recent change has been made&lt;br /&gt;
  if test $DEBUG = 1&lt;br /&gt;
  then&lt;br /&gt;
    echo &amp;quot;changes detected in file: $LC_FILENAME&amp;quot;&lt;br /&gt;
    echo &amp;quot;updating header&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # update the worklog header&lt;br /&gt;
&lt;br /&gt;
  # get the total number of lines in the worklog (minus one)&lt;br /&gt;
  WL_MAXLINES=`wc -l $WORKLOG | awk &amp;#039;{print $1}&amp;#039;`&lt;br /&gt;
  WL_MAXLINES=$((WL_MAXLINES - 1))&lt;br /&gt;
&lt;br /&gt;
  #set the new header&lt;br /&gt;
  WORKLOG_HEADER=&amp;quot;LAST-CHANGED : $LC_TIMESTAMP $LC_FILENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  #rewrite the worklog file&lt;br /&gt;
  cat $WORKLOG | tail -n $WL_MAXLINES &amp;gt; $TMPDIR/tmpfil_worklog.001&lt;br /&gt;
  echo $WORKLOG_HEADER &amp;gt; $WORKLOG&lt;br /&gt;
  cat $TMPDIR/tmpfil_worklog.001 &amp;gt;&amp;gt; $WORKLOG&lt;br /&gt;
  rm $TMPDIR/tmpfil_worklog.001&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -- lastline updating --&lt;br /&gt;
&lt;br /&gt;
# get the last line of the worklog&lt;br /&gt;
WL_LASTLINE=`tail -n 1 $WORKLOG`&lt;br /&gt;
WL_LL_LENGTH=${#WL_LASTLINE}&lt;br /&gt;
&lt;br /&gt;
# the length of the line is an indication as to what&amp;#039;s written in it&lt;br /&gt;
# length up to 18 chars = unknown&lt;br /&gt;
# length is greater than 30 chars = minutes have been calculated&lt;br /&gt;
&lt;br /&gt;
if test $CHANGES = 1&lt;br /&gt;
then&lt;br /&gt;
  if test $WL_LL_LENGTH = 2  || test $WL_LL_LENGTH -gt 18&lt;br /&gt;
  then&lt;br /&gt;
    # open new lastline&lt;br /&gt;
    WL_LASTLINE=&amp;quot;$LC_TIMESTAMP unknown&amp;quot;&lt;br /&gt;
    echo $WL_LASTLINE &amp;gt;&amp;gt; $WORKLOG&lt;br /&gt;
&lt;br /&gt;
    if test $DEBUG = 1&lt;br /&gt;
    then&lt;br /&gt;
      echo &amp;quot;opening new tracker line&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -- timestamp updating --&lt;br /&gt;
&lt;br /&gt;
# are we checking after the idle time?&lt;br /&gt;
&lt;br /&gt;
# get timestamp for right now&lt;br /&gt;
TIME_NOW=`date +%s`&lt;br /&gt;
&lt;br /&gt;
# create timestamp for LC_TIMESTAMP + ( N x 60 )&lt;br /&gt;
IDLESECS=$((IDLEMINS * 60))&lt;br /&gt;
TIMESTAMP_IDLE=$((LC_TIMESTAMP + IDLESECS))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test if our present time is the IDLE time past the Last Changed time&lt;br /&gt;
if test $TIME_NOW -gt $TIMESTAMP_IDLE&lt;br /&gt;
then&lt;br /&gt;
&lt;br /&gt;
    # we&amp;#039;re past our idle time&lt;br /&gt;
&lt;br /&gt;
    # update &amp;#039;unknown&amp;#039; with the last known time from the header&lt;br /&gt;
    # and calculate the difference&lt;br /&gt;
    #&lt;br /&gt;
    # just exit if unkown is not the last keyword&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if test $WL_LL_LENGTH = 18&lt;br /&gt;
    then&lt;br /&gt;
&lt;br /&gt;
      # line has not been closed yet, do so now&lt;br /&gt;
&lt;br /&gt;
      if test $DEBUG = 1&lt;br /&gt;
      then&lt;br /&gt;
        echo &amp;quot;past idle time, closing tracker line&amp;quot;&lt;br /&gt;
      fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      # get the last known change time from the header&lt;br /&gt;
      WL_TS=`head -n 1 $WORKLOG | awk &amp;#039;{print $3}&amp;#039;`&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      #rewrite the last line of the logfile&lt;br /&gt;
      # get the total number of lines in the worklog (minus one)&lt;br /&gt;
      WL_MAXLINES=`wc -l $WORKLOG | awk &amp;#039;{print $1}&amp;#039;`&lt;br /&gt;
      WL_MAXLINES=$((WL_MAXLINES - 1))&lt;br /&gt;
&lt;br /&gt;
      #set the lastline with an updated timestamp&lt;br /&gt;
      WL_LASTLINE_PRE=`echo &amp;quot;$WL_LASTLINE&amp;quot; | awk &amp;#039;{print $1}&amp;#039;`&lt;br /&gt;
&lt;br /&gt;
      #calculate the time between start and finish&lt;br /&gt;
      WL_STARTTIME=`tail -n 1 $WORKLOG | awk &amp;#039;{print $1}&amp;#039;`&lt;br /&gt;
      TIMESPAN=$((WL_TS - WL_STARTTIME))&lt;br /&gt;
      TIMESPAN=$((TIMESPAN / 60))&lt;br /&gt;
&lt;br /&gt;
      WL_LASTLINE=&amp;quot;$WL_LASTLINE_PRE $WL_TS $TIMESPAN minutes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      #rewrite the worklog file&lt;br /&gt;
      cat $WORKLOG | head -n $WL_MAXLINES &amp;gt; $TMPDIR/tmpfil_worklog.001&lt;br /&gt;
      cat $TMPDIR/tmpfil_worklog.001 &amp;gt; $WORKLOG&lt;br /&gt;
&lt;br /&gt;
      if [ $TIMESPAN -le 0 ] || [ $TIMESPAN -gt 720 ]&lt;br /&gt;
      then&lt;br /&gt;
        # ignore updating the last line, it was probably faulty anyway&lt;br /&gt;
        echo &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
        if test $DEBUG = 1&lt;br /&gt;
        then&lt;br /&gt;
          echo &amp;quot;timespan zero, negative or too big, not writing tracker line&amp;quot;&lt;br /&gt;
          echo &amp;quot;details:&amp;quot;&lt;br /&gt;
          echo &amp;quot;original starttime: $WL_STARTTIME&amp;quot;&lt;br /&gt;
          echo &amp;quot;last changed time:  $WL_TS&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
&lt;br /&gt;
      else&lt;br /&gt;
        echo $WL_LASTLINE &amp;gt;&amp;gt; $WORKLOG&lt;br /&gt;
&lt;br /&gt;
        if test $DEBUG = 1&lt;br /&gt;
        then&lt;br /&gt;
          echo &amp;quot;updating tracker line with timespan&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
&lt;br /&gt;
      fi&lt;br /&gt;
&lt;br /&gt;
      rm $TMPDIR/tmpfil_worklog.001&lt;br /&gt;
&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if test $DEBUG = 1&lt;br /&gt;
then&lt;br /&gt;
  echo &amp;quot;Timestamp now: `date +%s` `date`&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# That&amp;#039;s all folks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>