Checking Free Disk Space on Linux

Long time ago, there was a utility on Gentoo that was able to check and report free disk space left in case the free disk space reached some treshold. Recently I tried to find the tool again but failed. Maybe it was diskfree which is hosted at sourceforge.net, but that application is not maintained anymore. In the end, I decided to write my own script that will report to me information about filesystems that have reached some usage treshold and need my attention. Here is the script:

#!/bin/bash

# Copyright 2010 Miroslav Šulc
#
# You can always find the latest version at http://www.fordfrog.name/posts/checking-free-disk-space-on-linux/
#
# This script is licensed under GPLv3 or newer.

# Percentage of disk usage from which to issue alerts
ALERT_USAGE=90
# You can pass extra switches to 'df' command if you want. Here are those that might be useful:
# -h     = outputs the information about filesystem usage in human readable form
# -l     = performs check only on local filesystems (so ignores filesystems connected via network)
# --sync = performs sync operation which makes the output more up to date, mainly on SunOS systems
#          (for more information see 'df' man page)
DF_EXTRA_SWITCHES="-h -l"

LC_ALL="C" df -P $DF_EXTRA_SWITCHES | grep -vE "(^Filesystem|cdrom)" \
                | awk '{ print $1 " " $5 " " $2 " " $4 }' | while read output
do
        usage=`echo $output | awk '{ print $2 }' | cut -d'%' -f1`

        if [ $usage -ge $ALERT_USAGE ]; then
                part=`echo $output | awk '{ print $1 }'`
                total=`echo $output | awk '{ print $3 }'`
                left=`echo $output | awk '{ print $4 }'`
                echo "$part usage $usage% (left $left out of $total)"
        fi
done

The scripts needs df, grep, awk and cut utilities present on your system, but these are already installed on most of the Linux systems so you should not have to install them manually.

The script has two configuration variables. ALERT_USAGE specifies usage percentage that if reached on single filesystem, it will trigger output of alert about the filesystem usage. The other configuration variable is DF_EXTRA_SWITCHES which you can use to finetune the output, like to ignore mounted network filesystems, output information about disk usage in more readable form, sync disk information before getting information from disk etc. You can see man page of df for all the possible switches.

So, with the default configuration, if you run the script and none of your filesystems has 90%+ usage, no output will be displayed. But if some of your filesystems will use 90% or more of its space, it will appear in the output. Then the output will look like this:

/dev/mapper/vg-var usage 96% (left 1.1G out of 25G)

The output says that device /dev/mapper/vg-var (which is LVM filesystem in this case) has 96% disk usage and there is 1.1GB of data left out of total 25GB which is the filesystem size.

You sure do not want to run the script manually, so put it in your cron configuration so it will be triggered automatically:

0 * * * * root bash /path/to/the/script.sh

This line will trigger the script each hour. Set it up so that it meets your needs. Also, make sure you have correctly set up your email address for cron and that your mailing system works on the box. As the script produces output only if there are any filesystems with usage over the treshold, you will receive emails only in these cases.

Here you can download the script: diskcheck-0.1.zip.

Generating Random Words

Long time ago I coded web application that generates random words. It supported generating of random words by template. Over this weekend, I rewrote the application completely to offer much wider range of generating possibilities, and also improved overall look of the website. If you wanna see how it ended up, you can click at StartNet Word Generator. If you’d have any useful comments on the website and/or application, just leave it below in comments. I hope you’ll find the application useful, be it for your business or personal needs, or just for fun 🙂

Mercurial: displaying diff for moved/renamed/copied file

Often it happens to me that I move/rename some file and while doing that, I also change content of the file. When you issue regular hg diff, the output diff contains whole file with all lines added, which is not very useful in this case.

I wondered whether there is a way to display useful diff for moved/renamed/copied files in Mercurial. The solution was not that obvious (at least for me), but Mercurial really can do this. The command to see the diff for these files is hg diff --git. This way you will get diff against the last committed original file (the parent) which is more useful in this case than the default output.

In case you want to use git diff format by default, put following either in your global Mercurial configuration file or in your repository .hgrc file:

[diff]
git=1

If you then want to use non-git diff for single run, issue following command instead, which overrides diff.git configuration from configuration file:

hg diff --config diff.git=0

Tags:

Java And Final Keyword

I must admit I am addict to using final keyword. Today I came across Renaud Waldura’s The Final Word On the final Keyword which nicely explains why final keyword should not be ignored.

Tags:

Modifying NetBeans Generated Getters And Setters

For quite a long time I was thinking about automatically adding Javadoc to getters and setters generated by NetBeans, and also automatically adding final modifier to setter parameter. NetBeans does not have this feature yet. So what exactly I wanted?

package com.mycompany.mavenproject1;

public class App {

    /**
     * Contains exciting values.
     */
    private String test;

    /**
     * Getter for {@link #test}.
     *
     * @return {@link #test}
     */
    public String getTest() {
        return test;
    }

    /**
     * Setter for {@link #test}.
     *
     * @param test {@link #test}
     */
    public void setTest(final String test) {
        this.test = test;
    }
}

With some guidance from Petr Pišl from NetBeans team, I was able to do this patch: netbeans-getter-setter.patch. You can patch your NetBeans with it, adjust the generated Javadocs to your needs, compile NetBeans and your generated getters and setters should contain exactly what you need without pressing any extra key on your keyboard.

If you want to achieve the same for php, look at org.netbeans.modules.php.editor.codegen.CGSGenerator at GETTER_TEMPLATE and SETTER_TEMPLATE declarations. it’s even easier to modify these to get the comments added.

Sure it would be better if this would be done using templates, but atm this is better than nothing.

Also I updated NetBeans ebuild in Gentoo so that you can emerge NetBeans including your patches. You can find more info at NetBeans article at Gentoo Wiki.

Tags:

Xfce, Keychain And Two ssh-agents

While trying to find out how to make NetBeans work with keychain, I noticed that after I start Xfce and then keychain is run from my .bashrc, I end up with two ssh-agents running instead of one. I did not find out why it works this way, only thing I found out is that SSH_AGENT_PID is empty when running .bashrc, and I was not willing to dig deeper to find the cause. Anyway, I made a small patch that makes Xfce work with keychain:

--- /etc/xdg/xfce4/xinitrc.orig	2010-07-17 18:43:00.025468585 +0200
+++ /etc/xdg/xfce4/xinitrc	2010-07-17 18:54:10.045657796 +0200
@@ -113,7 +113,11 @@
 sshagent=`which ssh-agent`
 kill_sshagent=0
 if test -z "$SSH_AGENT_PID" -a "$sshagent" -a "x$sshagent" != "xno"; then
-	eval `$sshagent -s`
+	if test ! -e $HOME/.keychain; then
+		mkdir $HOME/.keychain
+	fi
+	$sshagent -s | grep -v "echo Agent pid" > $HOME/.keychain/$HOSTNAME-sh
+	. $HOME/.keychain/$HOSTNAME-sh
 	kill_sshagent=1
 fi
 

The patch saves output of ssh-agent into file that keychain uses so keychain then reuses the current data and does not have to spawn new ssh-agent. just to make the info complete, this is what i have in my .bashrc:

keychain -q
. ~/.keychain/$HOSTNAME-sh
. ~/.keychain/$HOSTNAME-sh-gpg

bug report at xfce: bug 6558

Tags: , ,

NetBeans And ssh-agent

I am using SSH and DSA key for access to my company repositories. But NetBeans always failed to connect to the server because it did not find app which it could use to ask me for password. After I installed x11-ssh-askpass, the situation improved in a way that NetBeans asked me for my DSA key password each time I issued some command that communicates with the repo. As I use keychain, other way that makes the things work flawlessly is running NetBeans from terminal window, but it has one drawback – it’s pretty annoying to run NetBeans from terminal.

Finally I found a way to make it all work in (for me) ideal way. I modified NetBeans script so that it:

  • runs keychain
  • sources keychain file that exports all needed variables
  • adds keys that I want to the ssh-agent and prompts me for keys password if ssh-agent does not handle the keys yet

Here is the patch for NetBeans script:

--- /usr/share/netbeans-6.9/bin/netbeans.orig	2010-07-17 04:35:11.777217529 +0200
+++ /usr/share/netbeans-6.9/bin/netbeans	2010-07-17 05:25:38.895871679 +0200
@@ -169,6 +169,19 @@
     then
         sh=/bin/bash
     fi
+    keychain -q
+    if [ -e "$HOME/.keychain/$HOSTNAME-sh" ]; then
+        . $HOME/.keychain/$HOSTNAME-sh
+    fi
+    if [ -e $userdir/keychain-keys.txt ]; then
+        for key in `cat $userdir/keychain-keys.txt`; do
+            SSH_ASKPASS=`which x11-ssh-askpass`
+            export SSH_ASKPASS
+            if [ -n "$key" ]; then
+                keychain $key
+            fi
+	done
+    fi
     if [ "${founduserdir}" = "yes" ]; then
         exec $sh "$nbexec" "$@"
     else

So if you have password protected SSH keys, all that you need to do to make them work in NetBeans without being annoyed is:

  • install keychain and x11-ssh-askpass
  • apply the patch above to NetBeans executable script
  • if you want to be prompted for SSH key passwords on NetBeans startup, create file $userdir/keychain-keys.txt and put there name of the files with the keys

Just minor update, I added this support to Gentoo ebuild for NetBeans, so since netbeans-6.9-r3 this feature can be activated by enabling ‘keychain’ use flag.

Tags: ,

Upgrading PostgreSQL Database Schemas

If you are developing applications that work with PostgreSQL or database generally, you often do changes in the development database that you need to transfer to production server one day. Tracking these changes is not that trivial and you cannot use tools like diff on schema dumps. That’s why I created tool that I named Another PostgreSQL Diff Tool, hosted at sourceforge.net (sf.net claims the project was founded 2006-03-23).

How does it work? You generate schema dump of production and development databases, and then let apgdiff to generate for you DDL SQL statements that you can use to upgrade your production schema to the latest development schema. You can find more detail description at project website.

Here is little bit larger picture how the tool fits in my development process. For the projects I code I created Hibernate like library that generates schema in database when application runs for the first time. If I change some objects after the first release, I direct my app to different database that is clean, let app generate new schema, then dump old and new schema, run apgdiff to get the update commands, check them to see everything looks ok, and put the update file to my app’s automated update procedure. Then I run the app on my development database, see if schema upgrade was performed without issues, and then continue with development. Before I release my code on production server, I can repeat this cycle several times. Then, when I put the app on production server, all updates are performed while the app is being deployed.

There is a chance that apgdiff will work even for other database servers (and “servers”). Recently somebody posted info that he was able to get apgdiff output even from SQLite dumps. Maybe it’s time to move the app to more general design so developers using other database servers could benefit from this free app too.

This app can be directly installed in Gentoo, Debian, Ubuntu, and probably in some other distros too, though the packages in those distros do not have to be necessarilly the latest ones.

Tags: ,

NetBeans And System Tomcat

At this moment, NetBeans and Tomcat does not work together with each other in Gentoo out of the box. You need to do minor tweak to make it work, but it’s really easy:

# adds user to tomcat group
gpasswd -a user tomcat
# NetBeans expects conf directory in Catalina home
ln -s /etc/tomcat-6/ /usr/share/tomcat-6/conf
# if you want NetBeans to create manager account, you need this
chmod g+w /etc/tomcat-6/tomcat-users.xml

You might need to relogin/restart after gpasswd to get the new user group applied to your user in your desktop environment.

Tags: , ,

NetBeans, IcedTea And Fonts

I bought new laptop and while installing Gentoo on it, I decided to try IcedTea instead of Sun-JDK. But when running NetBeans using IcedTea, the fonts were of serif type which on my resolution was not much readable. Anyway, the solution is easy. Just create symlink to fontconfig.properties in the IcedTea installation:

cd /opt/icedtea6-bin-1.8.0/jre/lib/
ln -s fontconfig.Fedora.properties.src fontconfig.properties

When you start NetBeans after this change, the used font will be of sans serif type which is much more readable. More info about this issue can be found at Gentoo Bugzilla.

Tags: ,