bash

Updated bash PS1

Made a minor tweak to my .bashrc after browsing dotfiles.org for some ideas. One neat trick I gleaned was detecting when the exit code of the last command ($?) was non-zero and altering the prompt. This will be useful for quickly seeing at a glance if some enormous load of output from make was successful or not.

Note the prompt goes red on failure

Note the prompt goes red on failure

Here are the bits from my updated .bashrc:

  1. # define useful aliases for color codes
  2. sh_norm="\[\033[0m\]"
  3. sh_black="\[\033[0;30m\]"
  4. sh_darkgray="\[\033[1;30m\]"
  5. sh_blue="\[\033[0;34m\]"
  6. sh_light_blue="\[\033[1;34m\]"
  7. sh_green="\[\033[0;32m\]"
  8. sh_light_green="\[\033[1;32m\]"
  9. sh_cyan="\[\033[0;36m\]"
  10. sh_light_cyan="\[\033[1;36m\]"
  11. sh_red="\[\033[0;31m\]"
  12. sh_light_red="\[\033[1;31m\]"
  13. sh_purple="\[\033[0;35m\]"
  14. sh_light_purple="\[\033[1;35m\]"
  15. sh_brown="\[\033[0;33m\]"
  16. sh_yellow="\[\033[1;33m\]"
  17. sh_light_gray="\[\033[0;37m\]"
  18. sh_white="\[\033[1;37m\]"
  19.  
  20. case `hostname` in
  21.     "livehost"|"production_server"|"sauron")
  22.         HOSTCOLOUR=${sh_red}
  23.         ;;
  24.     "staging-node")      HOSTCOLOUR=${sh_yellow} ;;
  25.     *)              HOSTCOLOUR=${sh_green} ;;
  26. esac
  27.  
  28. export PROMPT_COMMAND=‘if [ $? -ne 0 ]; then ERROR_FLAG=1; else ERROR_FLAG=; fi; ‘
  29. export PS1=${sh_white}\u@’${HOSTCOLOUR}\h${sh_norm}\w\n${sh_norm}‘${ERROR_FLAG:+’${sh_light_red}‘}\$${ERROR_FLAG:+’${sh_norm}‘} ‘



I’m also using the hostname to decide what colour the host appears in the prompt. My home directory, and thus .bashrc, is mounted on most hosts I log in to, and this serves as a reminder if I’m logged in to a production host. Green is the default, and it’s overridden for various special hosts.

Tags:

Saturday, October 11th, 2008 hacks 2 Comments

Transcoding HTTP mp3 streaming proxy in bash

Here’s how to make a proxy for streaming mp3s. It transcodes on-the-fly to 64kpbs MP3 using lame. When transcoding is finished, it calls the ./posthandler.sh script, which can either just delete the file, or potentially archive it so you don’t need to transcode it again.

  1. #!/bin/bash
  2. read method url version
  3.  
  4. method="${method%$CR}"
  5. url="${url%$CR}"
  6. version="${version%$CR}"
  7.  
  8. echo -ne "HTTP/1.0 200 OK\r\nContent-type: audio/mpeg\r\n\r\n"
  9.  
  10. BR=64 #birate to transcode to.
  11. PIPE="/tmp/$$.pipe"
  12. mkfifo "$PIPE"
  13.  
  14. OUTFILE="./tmp.$$.$BR.mp3"
  15. rm $OUTFILE
  16. url=`echo "$url" | sed ‘s/\///’`
  17. echo "** GET $url" >&2
  18.  
  19. nohup lynxsource "$url" \
  20.     | (lame –preset cbr $BR –mp3input – - 2>/dev/null \
  21.       && (echo "** Finished transcoding $url" >&2 ; \
  22.           ./posthandler.sh "$OUTFILE"&))\
  23.     | tee -i "$PIPE" > $OUTFILE &
  24.  
  25. cat < $PIPE
  26. rm $PIPE


One interesting limitation seems to be the buffer size of a fifo pipe in linux. Even though the transcoding step is pretty quick, if a client is connected the transcoding only manages to fill the pipe a couple of hundred k ahead of what is being read.

The -i flag to `tee` means it ignores interrupts, and will finish transcoding the file and call the posthandler even if the client disconnects.

Run is like this:

while [ 1 ]; do nc -vlp 8080 -c './transstreamer.sh' ; done

Then hit up a url of your choice using your awesome new proxy:

mpg321 "http://localhost:8080/http://freedownloads.last.fm/download/105468518/Letters%2BFrom%2BThe%2BBoatman.mp3"

Not the most scalable solution, but a mildly amusing quick hack.

Tags: , , ,

Monday, September 29th, 2008 hacks, programming No Comments