Changing variables in a BASH while loop April 2, 2009
Posted by idimmu in linux.There is an error that I often run in to when working with files and while loops in BASH. Often I have scripts similar to the following, where I cat a file and read it in using a while loop to process variables in the file:
#!/bin/bash
count=0;
cat testfile | while read line
do
count=$(($count+1));
echo $count;
done
echo "Total $count";
and using the following test data in testfile as:
cake
pie
thongs
I would expect an output like:
1
2
3
Total 3
But instead I get:
idimmu@boosh:~$ ./t.sh
1
2
3
Total 0
What is happening is due to the | (pipe) bash is forking and creating a new process so any variables we are altering and changing ($count) are being manipulated in the child process, and then lost when the subprocess finishes!
A lot of people I've spoken to who have seen this either completely change their code structure to accommodate, or worse, change shell completely to something like KSH!
If we tweak our script ever so slightly, and read the file in at the end of the BASH while loop...
#!/bin/bash
count=0;
while read line
do
count=$(($count+1));
echo $count;
done < testfile
echo "Total $count";
everything changes :)
idimmu@boosh:~$ ./t.sh
1
2
3
Total 3
and we get the output we expect! An excellent book on how to actually use BASH can be found here: Learning the bash Shell: Unix Shell Programming (In a Nutshell (O'Reilly))!
Error: Could not stat() command file '/var/lib/nagios3/rw/nagios.cmd'! March 31, 2009
Posted by idimmu in linux, ubuntu.I've been doing a lot of Nagios deployments recently, and this error always bites me, on all Ubuntu versions, including Hardy and Intrepid (haven't quite bit the bullet to try the Jaunty beta yet :) )
Error: Could not stat() command file '/var/lib/nagios3/rw/nagios.cmd'!
The external command file may be missing, Nagios may not be running, and/or Nagios may not be checking external commands.
An error occurred while attempting to commit your command for processing.
This can be quite easily fixed with the following command line fu:
sudo /etc/init.d/nagios3 stop
sudo dpkg-statoverride --update --add nagios www-data 2710 /var/lib/nagios3/rw
sudo dpkg-statoverride --update --add nagios nagios 751 /var/lib/nagios3
sudo /etc/init.d/nagios3 start
Now you should be able to send Nagios remote commands and commands via the web interface to your heart's content!
For other tips like this, and useful techniques such as implementing Nagios redundancy and distributed monitoring, I thoroughly recommend this book:

Nagios: System and Network Monitoring
Burger At The Mash Tun March 20, 2009
Posted by idimmu in food.For lunch today we all decided to go to the Mash Tun pub. I argued blind that they didn't do any food, but it turns out, fortunately, that they did!

I had a most fantastic burger, which was almost the size of my pint glass. The patty was really nicely flavoured, with onions and green bits and all sorts, and not over blown with pepper, which seems to be the norm nowadays. The chips were also really good, a lot of places seem to be mimicking the style of Heston's Thrice Cooked Chips!

My friends opted for the Wild Bore Sausage and Mash, which looked and smelled phenomenal.
I would definitely go back again, my only criticism was the waiting time, and lack of out door seats, but you can't win 'em all!!!
Resize LVM ReiserFS Partition March 13, 2009
Posted by idimmu in linux.Mucking about with LVM and partitions isn't really taxing, it's all well documented. Trusting it however is a different matter. I've resized loads of Ext3 LVM partitions in the past, but was asked to resize a ReiserFS one today, which made me ask the question:
"Is there anything writing to it currently, as I will have to unmount it first .."
Wrong assumption, or so says the guy sat next to me! ReiserFS can be dynamically resized on the fly! Woohoo says I, lets have a look at the resize_reiserfs man page!
DESCRIPTION
The resize_reiserfs tool resizes an unmounted reiserfs file system.
"Are you sure?" I ask .. "Yes", he promises!
anise:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg00-lv_slot_bbocp
10G 6.0G 4.1G 60% /opt/sem/slot/bbocp
anise:~# lvdisplay /dev/vg00/lv_slot_bbocp
--- Logical volume ---
LV Name /dev/vg00/lv_slot_bbocp
VG Name vg00
LV UUID P9nb4N-ED0Q-jSWh-xLbs-zP72-5QXL-DbyHiM
LV Write Access read/write
LV Status available
# open 2
LV Size 10.00 GB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:11
anise:~# vgdisplay vg00
--- Volume group ---
VG Name vg00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 35
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 13
Open LV 12
Max PV 0
Cur PV 1
Act PV 1
VG Size 219.83 GB
PE Size 4.00 MB
Total PE 56276
Alloc PE / Size 53762 / 210.01 GB
Free PE / Size 2514 / 9.82 GB
VG UUID HDU1Dc-5i7l-wyGE-cEdM-YpdG-kskb-nw0JWm
There is 9GB of free space in the volume group, and our partition wants to grow by 5GB so thats Ok! Lets do this!
anise:~# lvextend -L+5G /dev/vg00/lv_slot_bbocp
Extending logical volume lv_slot_bbocp to 15.00 GB
Logical volume lv_slot_bbocp successfully resized
anise:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg00-lv_slot_bbocp
10G 6.0G 4.1G 60% /opt/sem/slot/bbocp
No change yet though! Lets do the resize, with it still mounted!!
anise:~# resize_reiserfs -f /dev/vg00/lv_slot_bbocp
resize_reiserfs 3.6.19 (2003 www.namesys.com)
resize_reiserfs: On-line resizing finished successfully.
anise:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg00-lv_slot_bbocp
15G 6.0G 9.1G 40% /opt/sem/slot/bbocp
Woo hoo! We did it, well it's 15GB in size, and apparently all the data is still there and working and not corrupt. Rejoice. Someone really needs to update that man page!!!
Tomcat HelloWorld Servlet with Eclipse March 11, 2009
Posted by idimmu in linux, java.I'm really trying to get in to this whole Java web development frame of mind, as it's a bit of fun, a bit of a giggle, and it's massive in this area of the world! So obviously my first port of call was dusting off Eclipse and kicking out a HelloWorld style Java servlet!

I grabbed a copy of O'Rielly's Java Servlet Programming to get started and found it really invaluable, and definitely recommend this book to anyone starting out in Java servlet programming.
Eclipse on Ubuntu, even Intrepid is well old, so rather than work with the out of date supplied package, I found it best to download the latest version direct from the site. Also the easiest way to hook Tomcat in to Eclipse is also to download that from the site.
Get the latest Eclipse IDE for Java EE Developers and Tomcat 6
Extract them both to somewhere reasonable, I like ~/local :
idimmu@boosh:~/local$ ls -al
total 173212
drwxr-xr-x 4 idimmu idimmu 4096 2009-03-11 15:01 .
drwxr-xr-x 63 idimmu idimmu 4096 2009-03-11 15:01 ..
drwxr-xr-x 9 idimmu idimmu 4096 2009-03-11 15:01 apache-tomcat-6.0.18
-rw-r--r-- 1 idimmu idimmu 6142197 2009-03-11 11:27 apache-tomcat-6.0.18.tar.gz
drwxr-sr-x 9 idimmu idimmu 4096 2009-02-23 19:36 eclipse
-rw-r--r-- 1 idimmu idimmu 171022452 2009-03-11 10:57 eclipse-jee-ganymede-SR2-linux-gtk.tar.gz
Start Eclipse! The first thing that Eclipse will do is ask you to create a new Workspace. Your home directory isn't a bad choice to put this!

Go to New->Project

Select 'Dynamic Web Project'

Set 'Project Name' to 'helloworld'

Create a 'New' 'Target Runtime'

Select 'Apache Tomcat v6.0'

Select the Tomcat Installation Directory you extracted Tomcat to earlier.

Then click 'Finish' to create the project.
Go to File->New->Servlet

Enter 'HelloWorld' as the 'Class name'
Click 'Finish'

A new 'HelloWorld.java' file will be created with most of the work done for you!

Look at all the shiny code the IDE has already written for you!
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloWorld
*/
public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Default constructor.
*/
public HelloWorld() {
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
This code does nothing on it's own, well, it will generate a completely empty web page if you build it and deploy it to Tomcat, not very exciting .. so ..
Import the following new class:
import java.io.PrintWriter;
Insert the following code in to the doGet function stub:
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head><title>Hello World</title></title>");
pw.println("<body>");
pw.println("<h1>Hello World</h1>");
pw.println("</body></html>");
The complete source code for the class will now look like this:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloWorld
*/
public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloWorld() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head><title>Hello World</title></title>");
pw.println("<body>");
pw.println("<h1>Hello World</h1>");
pw.println("</body></html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
'Save All' using Shift+Ctrl+S or the File menu.
Go to the 'Run' menu and select 'Run' or press Ctrl+F11 to build the servlet, deploy it to Tomcat and run it!

Make sure 'Tomcat v6.0 Server' is selected and click 'Always use this server when running this project' then click 'Finish'

Tada, Hello World! You might have to run it a few times to get Tomcat to sort itself out, as it's a bit wonky, but the very mundane site should now be available on http://localhost:8080/helloworld/HelloWorld!!



