My blog has moved!

You should be automatically redirected in 6 seconds. If not, visit
http://taylor.braun-jones.com/blog/
and update your bookmarks.

Showing posts with label linux. Show all posts
Showing posts with label linux. Show all posts

Synergy for HTPC control

Synergy. Great app.
Synergy for HTPC control. Great application.

Setup is pretty simple, but the Synergy HOWTO on the Ubuntu Community Documentation was pretty horrendous. I decided I'd give back a little and did a major clean up/rewrite of it and now it is actually usable.

The one technical contribution I made was to speed up the X/GDM scripts slightly. Instead of:
/usr/bin/killall synergys
sleep 1
/usr/bin/synergys
It is now:
/usr/bin/killall synergys
while [ $(pgrep -x synergys) ]; do sleep 0.1; done
/usr/bin/synergys
You could say it saves less than a second. Or, you could say it's about a 10x speedup :-)

Now if someone would just write a synergy client for the Android platform I could get rid of Gmote and all it's quirks.

Easy, automated backups with rdiff-backup

Let me start by saying rdiff-backup is exactly the tool I set out to find when looking for a backup solution. It makes use of librsync so you get all the goodness of the rsync remote-delta optimization algorithm, plus incremental backups. To top it off, your most recent backup is stored as a simple mirror so recovering your most recent backup of a given file is just a matter of (s)cp'ing it.

To setup automated, unattended backups (the holy grail of data backups) I used a good HOWTO guide for setting up unattended backups. so I won't duplicate that; I'll just summarize and detail the parts that are unique to Debian or ARM/embedded systems (I'm running Debian squeeze on a SheevaPlug). For simplicity, I'll use the same machine names as were used in the original HOWTO – kitty for the backup server and fishie for the machine to be backed up. I'm only backing up one home directory on fishie for a hypothetical user we'll call nemo.

  1. First, install rdiff-backup on kittie and fishie:
    sudo apt-get install rdiff-backup
  2. Create an account for your backup bot:
    adduser --system --group --disabled-login --disabled-password --home /var/backupbot backupbot
    My 1 TB USB hard drive is mounted at /var so that is where I place the home directory. This also follows the FHS guidelines.
  3. Create a public/private key pair for backupbot, copy it to the authorized_keys file of nemo@fishie, then test it:
    sudo -s -u backupbot
    ssh-keygen -f ~backupbot/.ssh/id_fishie
    ssh-copy-id -i ~backupbot/.ssh/id_fishie.pub nemo@fishie
    ssh nemo@fishie
  4. Assuming the above commands worked, you should now be logged in as nemo@fishie. Open an editor and prepend the following to the long line of gibberish that was just added to ~nemo/.ssh/authorized_keys
    command="rdiff-backup --server --restrict-read-only /home",from="kittie",no-port-forwarding,no-X11-forwarding,no-pty 
    Now any SSH session that is authenticated using this key will (1) automatically launch rdiff-backup in server mode and (2) have several SSH features disabled (for extra security).
  5. As backupbot, open ~backupbot/.ssh/config (sudo -u backupbot emacs ~backupbot/.ssh/config) and enter the following:
    host nemo-backup
        hostname fishie
        user nemo
        identityfile /backup/.ssh/id_fishie
        compression no
        protocol 2
    Some notes about these options:
    • I don't use root to log into the remote machines because I'm only backing up home directories. This means you should take care to not to create files within your home directory that you do not have read access to (or at least keep them confined to one subdirectory so that rdiff-backup can skip them with a simple --exclude option). To find and fix any files that you may have already created while (e.g.) running as root use the following command:
      sudo find ~nemo -not -user nemo -exec chown nemo:nemo {} +
    • The first time I ran a backup I used 'compression yes'. I promise never to do that to you again, poor little SheevaPlug. If you have a slower link speed or a faster CPU then compression may make sense. For more optimization you may want to experiment with 'cipher blowfish' option. It can supposedly run at 88% of the speed of 'cipher none' but I haven't had a chance to play with it myself.
  6. The last step is to automate the backup. Run sudo -u backupbot EDITOR=emacs crontab -e. Add the following crontab line:
    30 0 * * * rdiff-backup nemo-backup::/home/nemo /var/backupbot/nemo && rdiff-backup --remove-older-than 3M /var/backupbot/nemo && echo "Backup successful"
    This will run a backup every night at 12:30 AM and delete any incremental backups older than 3 months.

I'll do a follow up post on how I setup postfix with Gmail's SMTP servers. So that each user gets an email each morning with the status of the backup.

Ugh... Why the paranoia, Transmission!?

Just wasted an hour because of the janky configuration setup for an otherwise great BitTorrent daemon, Transmission. Basically, the default configuration for Transmission that ships with Debian has RPC authentication turned on in two places. Finally discovered this by reading the README in /etc/transmission-daemon (*blush*). This pointed me to Message #24 of bug 539936 which explained things nicely. Solution summary:
  1. Stop transmission-daemon
  2. Turn off RPC authentication in
    /etc/transmission-daemon/settings.json
  3. Turn off --auth parameter in
    /etc/default/transmission-daemon
  4. Restart transmission-daemon
Sheesh.

Kink the video, not your neck

If you're anything like me when shooting short video clips with your camera, you regularly find that you've captured a great little clip with one exception – the video is turn on its side. Here is a little script to get you out of that dilemma, since I've found that it's not as easy as it should be with most video editors for Linux.

#!/usr/bin/env perl
#
# Naulilus (or command line) script to rotate one or more videos, renaming
# each one from, e.g., 'dir/input.avi' to 'dir/output (rotated).avi'
#
# Author: Taylor Braun-Jones
#
use File::Basename;

my ($input, $output);
my ($filebase, $dir, $suffix);

if ($ENV{NAUTILUS_SCRIPT_SELECTED_FILE_PATHS}) {
@videos = split "\n", $ENV{NAUTILUS_SCRIPT_SELECTED_FILE_PATHS};
# open DBG, ">/tmp/rotate_video_debug" and select DBG;
} else {
@videos = @ARGV;
}

foreach $input ( @videos ) {
chomp $input;
($filebase, $dir, $suffix) = fileparse("$input", '\..*$') or die "Failed
to parse filename: $input";
$output = "$dir$filebase (rotated)$suffix";
print "Rotating: '$input' -> '$output'\n";
system "mencoder -vf rotate=1 -o \"$output\" -oac copy -ovc lavc \"$inpu
t\"";
}
close DBG if DBG;

Just drop this script into $HOME/.gnome2/nautilus-scripts/ and give it execute permsions
chmod +x SCRIPTNAME
Also, make sure you have mencoder installed. On Debian-based systems (like Ubuntu) it's as simple as:
sudo apt-get install mencoder

Gmail Contacts... Almost Accessible

Google has provided interfaces to most of its services through standard protocols, which is great. I can access my Google Calendar events via a private iCal address (one-way only, Google to my local client). I can access my Gmail messages through POP or IMAP. I can import my OpenDocument files to Google Docs (even keep them synchronized as I work on them with the help of OpenOffice.org2GoogleDocs extension).

One gripe I've had since the beginning of Gmail is that I cannot access my Gmail contacts from any LDAP-supported address book — until GCALDaemon. It's a daemon that, among other things, translates LDAP requests from a local client (e.g. Mozilla Thunderbird) to gmail.com HTTP requests. A bonus feature for me (though this seems to actually be the main feature of GCALDaemon) is that I get two-way synchronization with my Google Calendar now too. GCALDaemon is available for Linux, OS X, and Windows, though the developers are obviously Windows centric — the Linux release comes as a zip file (no .deb, .rpm, or even tarball) and then you are instructed to add execute permissions the the shell scrips as part of the manual installation process! It also lacks an init script, so I wrote a simple one to get the job done (Assumes you unpacked the zip file to /opt):
#! /bin/sh
# /etc/init.d/GCALDaemon
#

# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting GCALDaemon ..."
start-stop-daemon --start --pidfile /var/run/GCALDaemon.pid \
--chuid nobody:nogroup --background --make-pidfile \
--exec /opt/GCALDaemon/bin/standalone-start.sh
;;
stop)
echo "Stopping GCALDaemon ..."
start-stop-daemon --stop --pidfile /var/run/GCALDaemon.pid --user nobody
;;
*)
echo "Usage: /etc/init.d/blah {start|stop}"
exit 1
;;
esac
for getting up and running quickly. So why are Gmail contacts only almost accessible? Only email addresses and phone numbers seem to supported by GCALDaemon, not postal addresses.

See also:
UPDATE (2008-11-14): I discovered Zindus and have been using it for a few weeks now. It's a more elegant solution, though they still need to figure out out a better solution for syncing postal addresses. The best solution is to simply standardize the way postal addresses are stored, IMO. Currently the Thunderbird address book keeps sepearate fields for Street, City, etc., whereas Google (and many others) store addressses as one big free-form field.

FInally, A Solid DVD-to-MPEG Converter

For some reason I never came across HandBrake until reading about it by chance on diveintomark.org. It's a CLI application that makes great use of two cores. With my dual-core opteron, top reports close to 200 percent CPU utilization. I don't think I've ever seen that from a single application before. It runs on Mac OS and Windows and there is even a Mono-based GUI for Linux called RippedWire, which I have yet to try out.

Debian RC Script Control

As a former Gentoo user, I had to learn the Ubuntu/Debian way to add service to a system runlevel. For my desktop, I never had to worry about it because, as usual with Ubuntu, a nice GUI is provided to manage startup services (System -> Administration -> Services). However when installing pyscrabble-server on my closet server I had to lookup the CLI tool for the job. (Note that I could have just used X11 forwarding to run the GUI tool, but that is just not nearly as cool and would have required lots of unnecessary GUI packages) It its simplest form, the comand to automatically start and stop /etc/init.d/SERVICE at startup and shutdown is simply:

sudo update-rc.d SERVICE defaults

From the man page:

If defaults is used then update-rc.d will make links to start the service in runlevels 2345 and to stop the service in runlevels 016.
For anything more complex, see the man page. Note that Debian has good bash completion support for the update-rc.d command.

If you're adding your own home-brew service, you can always just add commands to /etc/rc.local and make that file executable.

MythStream: Please help me ditch my cable TV

So I've been wondering when someone would finally get around to writing a plugin like this for MythTV. I can't wait to get a setup that uses this plugin so that I can ditch cable TV altogether. Especially with the writer's strike that is sure to lead to an increase in reality TV... Ow, my eyes; they bleed...

Creating Fillable PDF Forms

From what I can tell, creating fillable PDF forms can't be done for free in Windows. However, I came across this great guide for creating a fillable PDF on a Linux box using Scribus. Haven't tried it yet, but I will keep it in mind for the next time I have a need.