#!/usr/bin/haserl --shell=/bin/bash <% VERSION=0.4 BASE="/tears" HOST="zanthia.radionova.no" path=$(pdecode <<<"${PATH_INFO#/}") error() { echo -e "Content-Type: text/plain; charset=utf-8\n" echo "$1" exit 1 } irc() { /opt/bin/birk -c radionova "$1" } byline() { echo "skrevet av $(ls -ld $1 | awk '{print $3}')" } info() { stat -c '%n: %U %G %a %Y' $1 } link() { local raw=${REQUEST_URI%\?*} local clean="/${raw%/}" local rawt="$BASE/$2" local cleant="/${rawt%/}" [ $cleant = $clean ] && echo "$1" || echo "<a href='$BASE/$2'>$1</a>" } qlink() { text="$1" && url="$BASE/$2" && shift 2 local IFS=\& && echo -ne "<a href='$url?$*'>$text</a>\n" } redirect() { echo -e "Content-Type: text/html; charset=utf-8" echo -e "Location: https://$HOST$1\n" echo "٩(͡๏̯͡๏)۶>" } stikkordsøk() { [ "$action" = index.html -o "$action" = ditt -o "$action" = gruppe ] || return echo "<form method=get>" echo "<p><b>stikkordsøk</b>" echo "<br><input type=text size=10 name=stikkord value='$GET_stikkord'>" echo "<input type=hidden name=dato value='$GET_dato'>" echo "</form>" } kalender() { [ "$action" = index.html -o "$action" = ditt -o "$action" = gruppe ] || return echo "<p><b>for mye? reis i tid…</b>" IFS=- read y m d <<<"$GET_dato" n=0 [ -n "$GET_stikkord" ] && n=1 if [ -z "$y" ]; then for directory in $(cut -d / -f $((n + 2)) | sort | uniq); do year=$(basename $directory) qlink "$year" "$action/$path" "dato=$year" "stikkord=$GET_stikkord" done elif [ -z "$m" ]; then echo "<b>" qlink "$y" "$action/$path" "stikkord=$GET_stikkord" echo "</b><br>" for directory in $(cut -d / -f $((n + 3)) | sort | uniq); do month=$(basename $directory) qlink "$month" "$action/$path" "dato=$y-$month" "stikkord=$GET_stikkord" done elif [ -z "$d" ]; then echo "<b>" qlink "$y" "$action/$path" "stikkord=$GET_stikkord" echo "/" qlink "$m" "$action/$path" "dato=$y" "stikkord=$GET_stikkord" echo "</b><br>" for directory in $(cut -d / -f $((n + 4)) | sort | uniq); do day=$(basename $directory) qlink "$day" "$action/$path" "dato=$y-$m-$day" "stikkord=$GET_stikkord" done else echo "<b>" qlink "$y" "$action/$path" "stikkord=$GET_stikkord" echo "/" qlink "$m" "$action/$path" "dato=$y" "stikkord=$GET_stikkord" echo "/" qlink "$d" "$action/$path" "dato=$y-$m" "stikkord=$GET_stikkord" echo "</b><br>" fi } meny() { echo -e "Content-Type: text/html; charset=utf-8\n" echo "<!doctype html>" echo "<title>tears</title>" echo "<link href=$BASE/tears.css rel=stylesheet>" echo "<script src=$BASE/tears.js></script>" echo "<div id='meny'>" link "<pre>$(figlet -f threepoint tears)</pre>" "" echo "<p><b>hei, $(whoami) ♥</b><br>" link 'skriv en artikkel' 'skriv' echo "<p><b>du har tilgang til…</b><br>" link 'dine artikler' 'ditt' && echo "<br>" for group in $available; do link "$group" "gruppe/$group" done kalender stikkordsøk echo "<p><b>kos deg! ٩(͡๏̯͡๏)۶</b>" echo "<p class=footer><b>tears $VERSION</b><br>" link 'todo' 'todo' && echo '|' && link 'teatime' 'teatime' echo "</div>" } liste() { n=$((${GET_n:-0} + 7)) $finder -printf '%h\t%TT\t%f\n' | sort -r | head -$n | tail -7 | while read do d=$(cut -f 1 <<<"$REPLY") f=$(cut -f 3 <<<"$REPLY") kort $d/$f done echo "<hr><p>" qlink "eldre artikler…" "$action/$path" "dato=$GET_dato" "n=$n" } stikkord() { find -L stikkord -samefile "$1" | while read file; do local imp=${file#stikkord/} local ord=${imp%%/*} [ -z "$first" ] || echo -n " " echo -n "$ord" first=1 done } stikk() { find -L stikkord -samefile "$1" -delete for ord in $2; do local path="stikkord/$ord/${1#artikler/}" mkdir -p "$(dirname $path)" ln -s "../../../../../$1" "$path" done } skjema() { [ ! -f "$1" ] && echo "<p>finner ikke $1: <pre>$(xxd <<<$1)</pre>" && exit [ ! -w "$1" ] && echo "<p>du har ikke skrivetilgang" && exit echo "<form method='post' action='$BASE/oppdater/$1'>" lupin -f <$1 echo "<p><label>Stikkord:</label>" echo "<input type='text' name='stikkord' value='$(stikkord $1)'>" echo "<p><input type='submit' value='Lagre'>" echo "</form>" echo "<p><b>$(info $1)</b>" } vis() { [ ! -f "$1" ] && echo "<p>finner ikke $1: <pre>$(xxd <<<$1)</pre>" && exit [ ! -r "$1" ] && echo "<p>du har ikke lesetilgang" && exit lupin -h <$1 } lagre() { path=$(date +%Y/%m/%d -d $POST_publisert) slug=$(sed -e 's|[ /]|-|g' -e 's|[?:]||g' <<<$POST_title) [ -z "$slug" ] && error "Ugyldig overskrift" [ -f "artikler/$path/$slug.txt" ] && error "Artikkelen finnes allerede" mkdir -m 777 -p "artikler/$path" [ -z "$POST_privat" ] && umask 0002 lupin -l -e >"artikler/$path/$slug.txt" chgrp $POST_gruppe "artikler/$path/$slug.txt" irc "$(whoami) skriver ny artikkel: $POST_title" redirect "$BASE/rediger/artikler/$path/$slug.txt" } oppdater() { [ ! -f "$1" ] && error "finner ikke $1" [ ! -w "$1" ] && error "ikke skrivetilgang til $1" [ -z "$POST_title" ] && error "ingen overskrift" [ -z "$POST_stikkord" ] && error "ingen stikkord" stikk "$1" "$POST_stikkord" lupin -l -e >$1 irc "$(whoami) redigerte $POST_title" redirect "$BASE/rediger/$path" } kort() { IFS=/. read -r type y m d hhmm slug ext <<< "$1" lupin -t -h <$1 echo "<p class='x'>$(byline $1), $y/$m/$d" [ -r "$1" ] && echo "·" && link "vis" $(pencode / <<<"vis/$1") [ -w "$1" ] && echo "·" && link "rediger" $(pencode / <<<"rediger/$1") lupin -s -h <$1 } forbered() { echo "<form method=post action='$BASE/lagre/$path'>" echo "<p><label>Overskrift:</label>" echo "<input type=text name=title size=24>" echo "<p><label>Dato:</label>" echo "<input type=date name=publisert value=$(date +%Y-%m-%d) size=10>" echo "<p><label>*</label>" echo "<select name='type'>" for type in lupin/*; do id=$(basename $type .lua) echo "<option value='$id'>$(sed 's|.|\U&|' <<<$id)</option>" done echo "</select>" echo "for" echo "<select name=gruppe>" for group in $available; do echo "<option>$group</option>" done echo "</select>" echo "(<input type=checkbox name=privat>privat artikkel?)" echo "<p><label>*</label><input type=submit value='Forbered artikkel...'>" echo "</form>" } [ -f tears.rc ] && . tears.rc umask 0022 groups=$(groups | tr " " "\n" | sort) available=$(comm -12 - <(ls redaksjoner | sort) <<<"$groups") action=$(basename $SCRIPT_FILENAME) if [[ "$action" == rediger && $path == stikkord/* ]]; then redirect "$BASE/rediger/artikler/${path#stikkord/*/}" fi mappe="artikler" [ -n "$GET_stikkord" ] && mappe="stikkord/$GET_stikkord" kilde="$mappe/$(sed 's|-|/|g' <<<$GET_dato)" finder="find -L $kilde -type f" [ "$action" = gruppe ] && finder="$finder -group $path" [ "$action" = ditt ] && finder="$finder -user $REMOTE_USER" [ "$REQUEST_METHOD" = GET ] && $finder | meny case $action in index.html|ditt|gruppe) liste;; skriv) forbered;; rediger) skjema $path;; vis) vis $path;; lagre) lagre;; oppdater) oppdater $path;; teatime) irc "$(whoami) <3 teatime"; echo "<p><img src='http://kyber.io/orz/src/1352063360909860.jpg'><br>";; spökvåningen) echo "<p><img src='http://kyber.io/orz/src/1360086359591352.jpg'>";; todo) echo "<pre>$(cat TODO)</pre>";; esac %>