#!/bin/bash # Copyright (C) 2009 Andy Spencer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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. See the # GNU General Public License for more details. # Remove url codings from stdin function get_modeline { modeline=$( echo "$QUERY_STRING" | sed -e 's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g; s/[,&]/ /g' | xargs echo -e ) echo "vim: $modeline" } # Extract an uploaded file from standard input # $1 is the boundary delimiter for the file function cut_file { awk -v "bnd=$1" '{ if ($0 == "--"bnd"\r") { st=1; } if ($0 == "--"bnd"--\r") { st=0; } if (st == 2) { print $0; } if ($0 == "\r" && st == 1) { st=2; } }' | head -c -2 | head -c $((128*1024)) # Remove trailing ^M's that come with CGI # Limit size to 128K } # Print out a generic header function header { echo "Content-Type: $1; charset=UTF-8" echo } # List previous pastes function do_cmd { header text/plain case "$1" in head) for i in $(ls -t db/*); do basename $i basename $i | sed 's/./-/g' sed '1,/^$/d; /^\s*$/d' $i | sed -n '1,5s/\(.\{0,60\}\).*/\1/p' echo done ;; ls) ls -t db | column ;; esac } # Format a file for viewing function do_print { if [ -f "./$1" ]; then input="$1" elif [ -f "db/$1" ]; then input="db/$1" trim='1,/^$/d' # sed command to remove cruft else echo "Status: 404 Not Found" header text/plain echo "File '$1' not found" return fi if [[ "$REQUEST_URI" == *'?'* ]]; then # Create a temp file with the provided modeline output="$(mktemp)" tmp="$(mktemp)" sed "1a$(get_modeline)" "$input" > "$tmp" # - I have some plugins in ~/.vim # - Run ex in a pty to trick it into thinking that it # has a real terminal, note that we also have to set # term=xterm-256color in vimrc HOME=/home/andy \ /home/andy/bin/pty ex -nXZ -i NONE -u vimrc \ '+set bexpr= fde= fdt= fex= inde= inex= key= pa= pexpr' \ '+set iconstring= ruf= stl= tal=' \ "+set titlestring=$1\ -\ vpaste.net" \ '+set noml' \ '+2d|'$trim \ '+%s/\r//g' \ '+TOhtml' \ "+sav! $output" \ '+qall!' \ "$tmp" /dev/null 2>&1 header text/html cat "$output" rm "$tmp" "$output" else header text/plain sed "$trim" "$input" fi } # Upload handler function do_upload { text=$(cut_file "$1") if [ -z "$text" ]; then header text/plain echo "No text pasted" exit fi output="$(mktemp db/XXXXX)" uri="$url$(basename "$output")${QUERY_STRING:+"?"}" # Format, spam check, and save message ( get_modeline echo "Date: $(date -R)" echo "From: $REMOTE_ADDR" echo echo "$text" ) | HOME=/home/vpaste spamc -E > "$output" # Test for spam if [ "$?" -ne 0 ]; then # Report spam header text/plain echo "Your post has been marked as spam!" echo "Spam test results are as folllows.. " echo cat "$output" mv "$output" spam else # Redirect user echo "Status: 302 Found" echo "Location: $uri" header text/plain echo "$uri" fi } # Default index page function do_help { filetypes=$( ls /usr/share/vim/vim*/syntax/ /home/andy/.vim/syntax/ | sed -n '/^\(syntax\|manual\|synload\|2html\|colortest\|hitest\).vim$/d; s/.vim$//p' | sort | uniq ) uploads=$(ls -t db | head -n 5) header text/html cat - < vpaste.net - Vim based pastebin

NAME

vpaste: Vim based pastebin

SYNOPSIS

 vpaste file [option=value,..]
 <command> | vpaste [option=value,..]

 <command> | curl -F 'x=<-' $url[?option=value,..]

 :map vp :exec "w !vpaste ft=".&ft<CR>
 :vmap vp <ESC>:exec "'<,'>w !vpaste ft=".&ft<CR>

DESCRIPTION

Add ?[option[=value],..] to make your text a rainbow.

Options specified when uploading are used as defaults.

OPTIONS

ft, filetype={filetype}
A filetype to use for highlighting, see above menu for supported types
bg, background={light|dark}
Background color to use for the page
et, expandtab
Expand tabs to spaces
ts, tabstop=[N]
Number of spaces to use for tabs when et is set
...
See :help modeline for more information

BUGS

SOURCE

LATEST UPLOADS

list all

sample all

EOF } # Main url="http://$HTTP_HOST${REQUEST_URI/\?*}" pathinfo="${REQUEST_URI/*\/}" pathinfo="${pathinfo/\?*}" if [ "$pathinfo" = ls ]; then do_cmd ls elif [ "$pathinfo" = head ]; then do_cmd head elif [ "$pathinfo" ]; then do_print "$pathinfo" elif [ "$CONTENT_TYPE" ]; then do_upload "${CONTENT_TYPE/*boundary\=/}" else do_help fi