Gnome background changer

Gnome 2.3 on Ubuntu 10.04 LTS (Lucid Lynx) doesn’t appear to have an automatic wallpaper changer built in. While it appears there are many ways to accomplish this, I decided to write my own little script to get some time in with bash… alternative ways I have found include using “Wallpaper-tray” (which doesn’t appear to be in 10.04), Desktop Drapes, or a variation of the script below using things like “gconftool-2“.

To use this script, do the following:

  • Right-click on the desktop and choose “Change Desktop Background
  • Look through the backgrounds, and make sure the ones listed are the ones you want to have the script randomly select
  • Open up a text file using “gedit“, and add the contents of the script:
    #!/bin/bash
    installedDir=~/Pictures/backgrounds/random
    i=0
    while read line; do
       data=`echo "${line}" | grep -i filename`
       if [ "$data" != "" ]; then
          filenameCutLength=$((${#data}-11))
          filename=$(echo $data | cut -b11-$filenameCutLength)
          if [ "$filename" != "(none)" ] || [ "$filename" != 
          "random.img" ]; then
             extension=$(echo ${filename,,} | 
             cut -b$(expr ${#filename} - 2)-${#filename})
             if [ "$extension" == "jpg" ] || [ "$extension" 
             == "png" ] || [ "$extension" == "svg" ]; then
                fileArray[$i]=$(echo $filename)
                i=$(expr $i + 1)
             fi
          fi
       fi
    done << EOF
       $(grep deleted="false -A7 ~/.gnome2/backgrounds.xml)
    EOF
    fileArrayLength=`echo $[ ( $RANDOM % ${#fileArray[@]} ) ]`
    cp "${fileArray[$fileArrayLength]}"
    "$installedDir/random.img"
  • Save the file as “gRandomBackground.sh” in a directory (this example uses: “/home/$USER/Pictures/backgrounds/random”, if you install it elsewhere, be sure to change the $installedDir variable in the script)
  • Open “Terminal” and enter the command: crontab -e If you haven’t used crontab before, stick with the default, “nano
  • Paste the following as one line into the editor: 0 */3 * * * bash ~/Pictures/backgrounds/random/gRandomBackground.sh This will change the background every three hours, on the hour. “Ctrl+O, and then Ctrl+W” should get the crontab saved and also get you exited out of nano. For more information on how to use cron, see Google.
  • Open up the “Appearance Preferences” dialog again, by right-clicking on the desktop and selecting “Change Desktop Background
  • Click the “Add…” button and browse to the directory that gRandomBackground.sh is installed to
  • Select the “random.img” background, click the “Open” button, and then the “Close” button

Your background should change every three hours.

Screensavers in Ubuntu 9.x

I used to do some incredible tweaking for my screensaver in Ubuntu, especially because gnome-screensaver wouldn’t allow for editing the particular screensaver options like xscreensaver would (see: https://wiki.ubuntu.com/ScreenSaver). These days, I don’t want to tweak… I just want the thing to shut off when I am watching fullscreen flash video, so that I don’t have to wiggle the mouse every ten minutes. :-)

So I made a simple toggle script and created a launcher for the script on the desktop. Gonna watch video? Double-click the icon. Done watching video, double-click the icon.

#!/bin/bash
PID=`pidof gnome-screensaver`
 
if [ "$PID" != "" ]; then
	#gnome-screensaver is running shut it down
	killall -9 gnome-screensaver
else
	#gnome-screensaver is not running, start it up
	gnome-screensaver
fi

Recursive find and replace

From time to time I find myself wanting to replace a bit of text, in multiple files, throughout a huge directory tree (particularly in the case of a WordPress migration).

Here’s a method I frequently use (other examples I’ve seen out there make use of perl, xargs, grep, etc.):

user@host:~$ cd Directory_To_Start_From
user@host:~$ find . -type f -exec sed -i 's/Text_To_Find/Replacement_Text/g' {} ;

The find command will return a list of all the files in the directory tree and execute the sed command on each one it locates. In the example below, I added the “-name” option to the find command to allow for working only on files with the .js extension:

user@host:~$ cd website
user@host:~$ find . -type f -name "*.js" -exec sed -i 's/var pageName="example page";/var pageName="Final Page";/g' {} ;

In the next one, the text to find and replace has special characters (in this case the ‘/’ in the URL).

user@host:~$ cd website
user@host:~$ find . -type f -exec sed -i 's/http://www.example.com/old_directory//http://newsubdomain.example.com/new_directory//g' {} ;

See the following links to read more about escaping special characters:

Sloppiness at 1and1

So I have been noticing issues with 1and1 again. Yesterday when trying to get into my hosting control panel at admin.1and1.com, I received a “HTTP Error 503 Service unavailable” error, and thought to myself… really, on the admin panel… really?

Today while checking out my own site, I noticed that all of the PHP files I tried browsing to returned “500 Internal Server Error” errors.

Now this has gone too far… so I called them up. At first the person I talked to explained that I needed to force PHP5 using a .htaccess file, and proceeded to tell me that they could make the change for me. Calmly, I responded by saying that I did not want a change, and that it had been working fine the way it was for months.

She put me on hold, and while I waited… it started working. She told me that the shared hosting server “had a glitch”.

Afterwards, I ssh’ed into my server. Look what I found:

(uiserver):uXXXXXXXX:~ > ls -al
total XX
-rw-r--r--  1 uXXXXXXXX XXXXXXXX   16 Feb  3 14:06 info.php

I thought, “weird, I didn’t put that there”.

(uiserver):uXXXXXXXX:~ > cat info.php 
<? phpinfo(); ?>

Shame on you 1and1, for not cleaning up after yourself. Well, I guess you get what you pay for.

Databases on 1and1

After wanting to test WordPress 3.0 on a 1and1 hosting account, I ran into the following issue… the particular setup I was dealing with had only one database available, and it wasn’t MySQL 5, but instead MySQL 4… furthermore, it was a version lower than 4.1.2, which more recent versions of WordPress require as a minimum.

So after doing a bit of research on what others had done, I went about fixing the problem. Interestingly enough, 1and1 could have made some money in this situation if they would allow customers to simply purchase another database to add to their packages, but no, they want an entire upgrade to be purchased.

The first step was to backup the website and database. I ssh’ed into the web host:

username@localhostname:~$ ssh $username@example.com

Then I backed up the database. The command below will dump all of the databases on the host (in this case, only one MySQL 4.x database) into a dated bzip file, in the home directory.

username@remotehostname:~$ mysqldump -C -A -u $databaseUsername -h $databaseHostName -p$databasePassword | bzip2 -cq9 &gt; ~/`date +%F-%I-%M-%p`-db-backup.sql.bz2

Now to backup the site itself (not only in case disaster struck, but this would get a local copy of the sql dump I just made as well). On a local OS X workstation (or Ubuntu, if that suits your tastes) I ran something similar to the following:

username@localhostname:~$ mkdir ~/website_backups
username@localhostname:~$ rsync -avz --exclude="logs" $username@example.com: ~/website_backups/

From there, I was able to log into the 1and1 control panel and delete the existing database. This allowed me to setup a new one, and in particular, choose MySQL 4 or 5 as the type.

Back to the 1and1 hosting account:

username@localhostname:~$ ssh $username@example.com

I uncompressed the sql dump:

username@remotehostname:~$ bunzip2 2010-01-14-01-59-PM-db-backup.sql.bz2

and was greeted with the raw sql in the file, “2010-01-14-01-59-PM-db-backup.sql”. From here it was only a hop skip and a jump away to restoration. It was necessary to edit the sql file in order to have it restore properly to the newly created database that was just created:

username@remotehostname:~$ nano -w 2010-01-14-01-59-PM-db-backup.sql

And I changed the $oldDatabaseName to $newDatabaseName.

--
-- Current Database: `$oldDatabaseName`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `$oldDatabaseName`;
USE `$oldDatabaseName`;

ctrl+o, enter, and ctrl+x, to save the file and exit nano. The sql dump was now ready to restore to the new database.

username@remotehostname:~$ mysql -u $databaseUsername -h $databaseHostName -p$databasePassword $databaseName &lt; 2010-01-14-01-59-PM-db-backup.sql

The only other things to do were to update any existing applications that needed the new database name, username, hostname, and password.

As a note, if you are updating a WordPress install to point to a new database, this info can be changed in the file, wp-config.php.

Time Machine Size Limits

So I have this new My Book World Edition, and I set it up to allow for Time Machine backups. The problem? On OS X, Time Machine wants to eat up almost the entire amount of free space before it goes about deleting old files… (un)conveniently there is no option to restrict the size of the backups.

Never fear… I google’d a bunch and found that if you run the following command on the Mac doing the backups:

defaults write /Library/Preferences/com.apple.TimeMachine MaxSize 209715200

It doesn’t appear to do anything (or may possibly do something else that isn’t related to what I was after). :-)

So, I went about it in a different manner. If I clicked on the Time Machine icon (rotating clock) in the menu bar, and clicked “Enter Time Machine”… exited the GUI of Time Machine, and then opened terminal, I could do the following:

  1. Become root:
    sudo -s
  2. Goto the /Volumes directory, and look for which folder is mounted for Time Machine backups:
    cd /Volumes &amp;&amp; ls -l
  3. Enter the folder that is mounted for Time Machine backups:
    cd $Mount_Point_For_Backups
  4. Look for the .sparsebundle file that is being used for backing up the workstation:
    ls -l
  5. Resize the sparsebundle file:
    hdiutil resize -size 200g $hostname.sparsebundle

The sparse image is then resized, and Time Machine will report that there is only around 200 gigabytes total available space rather than around a terabyte (which is the original size of the drive). :-)

MBWE SSH access

Just setting up a My Book World Edition (1TB, WDH1NC10000) and would recommend the following steps after purchase for SSH access:

  • Login to the MBWE’s “Network Storage Manager” by typing the unit’s IP address into a web browser and then authenticating with a valid username and password
  • Click the “Advanced Mode” link
  • Click the “Advanced” icon
  • Check the “Enable” checkbox under the “SSH Access” area
  • Click the “Submit” button

Now SSH into the MBWE using the username, “root”, with the default password, “welc0me”. After logging in, be sure to change passwords for the root user by issuing the command, “passwd”.

A few other things I noticed were necessary, if you want ssh access via public key authentication:

  • Copy the contents of the public key file from the client (usually ~/.ssh/id_dsa.pub) to the MBWE on a new line under /root/.ssh/authorized_keys
  • Login as root to the MBWE and issue the following command in the terminal:
    chmod go-w ~/

    This was neccessary as when I tried to authenticate via public key, I was getting the following in /var/log/messages if I didn’t, “Authentication refused: bad ownership or modes for directory /root

Renaming MP3s in Bash

It seems like this comes up every now and again, but I end up forgetting how to do it. So, I will post the example here, where it will live forever on the intarwebs.

While there are a ton of ways to script this, using Bash, cut, ls, find, grep, sed, awk, perl, etc… In this particular instance, I find myself with a directory of about fifty files, each named in the following manner…

  1. 01 Song Title.mp3
  2. 02 Another Song Title.mp3
  3. 02 Same Number Song Title.mp3
  4. 03 Author – Title.mp3

Bash and cut to the rescue. The following code provides for each file in the current directory to have the number stripped off of the front, even it has spaces in the filename.

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "nb")
for f in *; do
    mv "$f" "$(echo $f | cut -c 4-)"
done
IFS=$SAVEIFS

DD Backups over SSH

To perform backups of a local workstation’s hard disk over a network, perform the following procedures (adjusted to your particular situation of course):

  1. Download and boot from a live Linux distro
  2. Become “root” within a shell
  3. Run “fdisk -l” (“mac-fdisk -l” I know works on SystemRescueCD 0.2.0 (PPC) for PPC/Macs (what about Intel Macs?)) and note the internal hard disk partition to backup (ex: ‘/dev/hda’)

The rest assumes that (in short, you will probably have to substitute some numbers or devices and you have ssh access somewhere):

  1. You have network access
  2. You have access to an SSH server
  3. Your network is configured with private addresses and you are not assigning one that conflicts with another local IP address
  4. Your netmask is the same as the one supplied in the following commands

Give an IP address to the workstation you have just booted the live Linux disc on, set the netmask, and bring the network interface up:

ifconfig eth0 192.168.1.50 netmask 255.255.255.0 up

Set the default gateway (if you need to reach outside of the LAN that is… normally this is your router’s IP address):

route add default gw 192.168.1.1

Set a DNS server (if you are in the habit of not strictly using IP addresses):

echo "nameserver 192.168.1.1" > /etc/resolv.conf

Execute the backup command:

dd if=/dev/hda | ssh username@backupserver.fqdn
"dd of=/directory_of_backups_on_ssh_server/backupfile.iso"

Obviously, most of the previous is getting the network up… try running “dhclient” if the live Linux disc has it installed, and your network has DHCP setup. ;-)

UPDATE (2010-02-09): I just thought I would mention, that Clonezilla Live is a fantastic piece of software that makes this all a little more automated. Their site says, “For [supported] file systems, only used blocks in partition are saved and restored. For unsupported file system, sector-to-sector copy is done by dd in Clonezilla.” Essentially, this translates into much smaller image sizes for the majority of files systems that people work with. See a basic how-to at http://www.howtoforge.com/back-up-restore-hard-drives-and-partitions-with-clonezilla-live.

Recovering after an OS X update

After applying Security Update 2008-005 to an OS X laptop this past week, I rebooted the operating system as instructed and received the nice warm gray screen with animated progress circle… however it stuck around for over 5 minutes. Obviously something went wrong.

Sitting at my administrative workstation I:

  • looked at Apple Remote Desktop and noticed that the troubled laptop on the network had an odd status and I could not connect graphically (not that it would help if I could)
  • tried opening a terminal and ping‘ing. It responded.
  • was able to ssh into the laptop. Running ‘top‘ showed that CrashReporter kept running.

I wondered if rebooting it would have any different effect, so I issued a quick “reboot” over ssh and gave it another shot. This boot had the same behavior… So I tried the standard recovery procedures when things act odd:

Still no change. The only other “best idea” I had was to try and install the update again… but since I couldn’t login graphically I had to go through the command line (Mac’s seem so much cooler since being built on top of Unix).

  • Download Security Update 2008-005 (PPC) on the administrative workstation (target was a 700 MHz, PowerPC, iBook).
  • scp SecUpd2008-005PPC.dmg adminUser@host.fqdn:
  • ssh adminUser@host.fqdn
  • hdiutil attach ./SecUpd2008-005PPC.dmg
  • sudo install -pkg “SecUpd2008-005PPC.pkg” -target /
  • sudo reboot

The laptop rebooted, went past the animated progress circle and auto logged in to the user account it had so many times previously. That made me happy. ;-)