commit c885ca37c52ecbb8fd5f40b96d5f161540d7df60 Author: Trey Blancher Date: Fri Dec 8 16:16:19 2017 -0500 Initial timetracker commit diff --git a/chug b/chug new file mode 100755 index 0000000..d8d7bce --- /dev/null +++ b/chug @@ -0,0 +1,23 @@ +#!/bin/bash + +WK_OFFSET=$1 +[[ -z ${WK_OFFSET} ]] && WK_OFFSET=0 +DATE=$(gdate -d "last Monday - ${WK_OFFSET} weeks") +for date in $(gdate +%F -d "${DATE}") \ + $(gdate +%F -d "${DATE} + 1 day") \ + $(gdate +%F -d "${DATE} + 2 day") \ + $(gdate +%F -d "${DATE} + 3 day") \ + $(gdate +%F -d "${DATE} + 4 day") \ + $(gdate +%F -d "${DATE} + 5 day") \ + $(gdate +%F -d "${DATE} + 6 day"); do + + echo $date + + ./do_process $date + + echo + echo -n Press ENTER for ${date}... + + read + +done diff --git a/do_process b/do_process new file mode 100755 index 0000000..190485e --- /dev/null +++ b/do_process @@ -0,0 +1,58 @@ +#!/bin/bash + +ORGS=() + +if [[ "x${1}" == "x" ]]; then + DATE=$(date +%F) +else + DATE=$1 +fi + +if [[ -f ${DATE}.log ]]; then + get_list_of_orgs () { + orgs=$( grep -Po "\s+\[.*\]" | tr -d '[][]' ) + for org in ${orgs}; do + org="${org##*( )}" # trim leading whitespace + org="${org%%*( )}" # trim trailing whitespace + [[ "${ORGS[@]}" =~ "${org}" ]] || ORGS+=("${org}") + done + } + + get_list_of_orgs < ${DATE}.log + + for (( i=0; i < ${#ORGS[@]}; i++ )); do + echo "ORGS[$i]=${ORGS[$i]}" + done + + #for org in "${ORGS[@]}"; do + # echo ${org} + #done + + echo "--" + echo ${DATE} + echo + echo + echo + WHOLE="" + for pattern in "${ORGS[@]}" meeting; do + #echo "pattern=${pattern}" >&2 + if [[ "${pattern}" == "meeting" ]]; then + grep "${pattern}" ${DATE}.log | grep -Ev "${WHOLE}" | timetracker + else + grep "${pattern}" ${DATE}.log | timetracker + fi + echo + if [[ "${WHOLE}x" == "x" ]]; then + WHOLE="${pattern}" + else + WHOLE="${WHOLE}|${pattern}" + fi + echo + done + grep -Ev "${WHOLE}" ${DATE}.log | timetracker + echo + timetracker ${DATE}.log | grep "Section" | sed 's/Section/Grand/' + +else + echo "${DATE}.log does not exist" >&2 +fi diff --git a/month-pack.sh b/month-pack.sh new file mode 100755 index 0000000..ae03e56 --- /dev/null +++ b/month-pack.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +if [ "x$1" == "x" ]; then + MONTH=$(( $(date +%-m) - 1 )) +else + MONTH=$1 + shift +fi + +if [ "x$1" == "x" ]; then + YEAR=$(date +%Y) + CURR=1 +else + YEAR=$1 + shift + CURR=0 +fi + + +if [ $MONTH -eq 0 ]; +then + MONTH=12 +fi + +if [ ${CURR} -eq 1 ] && [ $(( $(date +%-m) - $MONTH )) -le 0 ]; then + YEAR=$(( $YEAR - 1)) +fi + +if [ $MONTH -lt 10 ]; +then + MONTH=0$MONTH +fi +tar -cvJf $YEAR-$MONTH.tar.xz $YEAR-$MONTH-*.log --remove-files + diff --git a/timetracker.py b/timetracker.py new file mode 100755 index 0000000..32d8b88 --- /dev/null +++ b/timetracker.py @@ -0,0 +1,104 @@ +#!/usr/bin/python + +import fileinput +import math +import re +import sys +import time + +# Variables +start = {} # Data structure for storing the beginning of a time frame +finish = {} # Data structure for storing the end of a time frame +ind = {} # Data structure for storing individual timecards +misc = {} # Data structure for storing miscellaneous timecards + +empty = re.compile("^\s*$") # regex for finding empty lines (and skipping them) +comment = re.compile("^\s*#") # regex for finding empty lines (and skipping them) +delim = re.compile(":\s{2}") # regex for splitting timestamp entry +begin = re.compile("^Begin\s+(?P.*)\s*$") +end = re.compile("^End\s+(?P.*)\s*$") +incident = re.compile("^(PDROP|CHG)-?\d+") + +for line in fileinput.input(): + if empty.match(line) or comment.match(line): # if the current line is empty + continue # skip to the next line + + (datetime,entry) = delim.split(line.strip()) + timestamp = time.mktime(time.strptime(datetime,"%Y-%m-%d %H:%M:%S")) + + if begin.match(entry): + action = begin.sub("\g",entry) + + if action not in start: + start[action] = [] + + start[action].append(timestamp) + + if end.match(entry): + action = end.sub("\g",entry) + + if action not in finish: + finish[action] = [] + + finish[action].append(timestamp) + +# We're here, we've captured all of the data + +gtot = 0 +for act in sorted(start.keys()): + if act in start: + bc = len(start[act]) + else: bc = 0 + if act in finish: + ec = len(finish[act]) + else: ec = 0 + + if bc - ec > 1: + print >> sys.stderr, "ERROR: Missing more than one End" + sys.exit(2) + elif bc > ec: # bc should be exactly one greater + start[act].pop() + elif ec > bc: + print >> sys.stderr, "ERROR: Missing a Begin" + sys.exit(1) + + sigma = 0 + while (len(start[act]) > 0 and len(start[act]) > 0): + beg = start[act].pop(0) + en = finish[act].pop(0) + sigma += en - beg + + ind[act] = sigma + gtot += sigma + +ttot = 0 +utot = 0 + +table = "{a:<50} {s:>10} {h:>10} {m:>10} {f:>10}" + +for act in sorted(ind.keys()): + minutes = "{:d}min".format(int(ind[act]%3600/60)) + hrs = "{:d}hrs".format(int(ind[act]/3600)) + fhrs = "{:.2f}hrs".format(ind[act]/3600) + sec = "{:d}s".format(int(ind[act])) + + print table.format(a=act, s=sec, h=hrs, m=minutes, f=fhrs) + if incident.match(act): + ttot += ind[act] + else: + utot += ind[act] + +total = "{t:<20} {s:>10} {h:>10}" + +ttots = "{:d}s".format(int(ttot)) +utots = "{:d}s".format(int(utot)) +ttoth = "{:3.2f}hrs".format(ttot / 3600) +utoth = "{:3.2f}hrs".format(utot / 3600) +gtots = "{:d}s".format(int(gtot)) +gtoth = "{:3.2f}hrs".format(gtot / 3600) + +print +print total.format(t="Incident total:", s=ttots, h=ttoth) +print total.format(t="Unnumbered total:", s=utots, h=utoth) +print total.format(t="Section total:", s=gtots, h=gtoth) + diff --git a/year-pack b/year-pack new file mode 100755 index 0000000..d7a55f9 --- /dev/null +++ b/year-pack @@ -0,0 +1,18 @@ +#!/bin/bash + +MONTH=$(( $(date +%m) - 1 )) +if [ "x$1" == "x" ] +then + YEAR=$(( $(date +%Y) - 1)) +else + YEAR=$1 +fi + +if [ $MONTH -eq 0 ]; +then + MONTH=12 + YEAR=$(( $YEAR - 1)) +fi + +tar -cvJf $YEAR.tar.xz $YEAR-*.tar.xz && rm -v $YEAR-*.tar.xz +