2011/09/14

Pretty lights

In a fit of weakness, I bought 2 silly USB mail lights. This are basically a PIC that talks USB on one side, and turns coloured leds on and off. They come with software that is supposed to check if you have mail and change colour depending on what's going on. Of course, the supplied software is Windows only and doesn't even work it seems.

Not that I care about a light that tells me if I have e-mail pending. But controling pretty lights from the computer? I'm all over that. Someone had already written a script in Python to control these things. I ported it to Perl because, well because I like Perl.

To use it, you must have Device::USB installed. And perl, of course.

http://pied.nu/Perl/setcolour

Doing setcolour will show you all devices installed

Doing setcolour 1294:1320 1 will set all mail devices to colour 1, which is blue on one of my devices, green on the other.

Doing setcolour 2-7 2 will set one mail device to colour 2, which is red on both my devices.

2011/09/12

UPS and power conditioning

If you have a server or any computer that is important, it needs an UPS. Something large enough for 5-10 minutes of power outage. But it is not enough to just plug the power into the UPS. You must also plug into UPS data port. And set up the software that will allow the computer to detect the power outage and shutdown before the battery runs out.

This is non-negotiable.

Not doing this risks you showing up Monday morning and not getting any work down while an admin drives 100 km to fix a problem.

And if you have any piece of important electronic equipment, you'll want a filter. And no the fuse on your power bar doesn't count.

2011/08/22

SSH tunneling for a small VPN

Here is a simple script that sets up a simple VPN between two networks using SSH tunneling. You must have root access to a computer on both networks. You must have 2 IP addresses for the remote network. The remote network is assumed to be /24. The script assumes that tun0 is available on both computers. If you don't understand this or you don't have this, you can't use this script.
#!/bin/bash


HOST=$1
LOCAL_IP=$2
REMOTE_IP=$3

eval $(ipcalc --network $LOCAL_IP/24)
if [[ "NETWORK=$NETWORK" != $(ipcalc --network $REMOTE_IP/24) ]] ; then
echo "Local IP ($LOCAL_IP) and remote IP ($REMOTE_IP) must be on the same network" >&2
exit 3
fi

ip route del $NETWORK/24 dev eth0 2>/dev/null
set -e

set -x
ssh -w 0:0 $HOST "
ip link set tun0 up
ip addr add $LOCAL_IP peer $REMOTE_IP/32 dev tun0
arp -sD $REMOTE_IP eth0 pub
echo 1 >/proc/sys/NETWORK/ipv4/ip_forward
echo OK
while true ; do sleep 3600 ; done
" | (
set +x
read OK;
echo "Connected to $HOST: $OK"
ip link set tun0 up
ip addr add $REMOTE_IP peer $LOCAL_IP/32 dev tun0
ip route add $NETWORK/24 via $REMOTE_IP dev tun0

iptables --append FORWARD --in-interface eth0 -j ACCEPT
iptables --table nat --append POSTROUTING --out-interface tun0 -j MASQUERADE
set +e
read -e -p 'Connected' K iptables --delete FORWARD --in-interface eth0 -j ACCEPT
iptables --table nat --delete POSTROUTING --out-interface tun0 -j MASQUERADE
echo "Use ^C to stop background ssh"
)

Note that the script has very little error checking beyond verifying that REMOTE_IP and LOCAL_IP are on the same /24.

The script is executed as vpn-ssh remote-host local-ip remote-ip. For example:
ssh my-client 192.168.100.130 192.168.100.205
192.168.100.130 is now an IP for the local computer. It may be connected to from the remote computer and anything on the remote network. If you set up your routing properly, other computers on the local network may also connect to the remote network also.

To create a tunnel ssh must run as root and must connect as root on the remote side. You should use have public/private keys set up, as allowing password login for root over ssh is a bad idea. Tunneling and root login are often deactivated by default, so you'll have to turn them on.

2011/08/19

Arduino on CentOS 5

So I bit the bullet and bought an Arduino UNO. The packaging should have a label on it "WARNING: BY OPENING THIS PACKAGE YOU RECOGNISE YOU WILL GET NO USEFUL WORK DONE TODAY."



All I wanted was to get one LED to flash. But that requires a avr-cpp-g++, which isn't available for CentOS 5. GRRRR!



So I wasted to much time getting the CentOS 6 SRPMs and getting them to compile. But you may fetch them from my psuedo-repo.

While time was a wasting, a kind soul on IRC sent me a hex file for bitlash which I managed to upload to the board. This allowed me to flash a few LEDs and get on with my work.

Writing code for the Arduino Uno in CentOS 5


RPMs will need from the psuedo-repo
avr-libc-1.7.0-1.noarch.rpm

avr-libc-docs-1.7.0-1.noarch.rpm
avr-binutils-2.20-2.x86_64.rpm
avrdude-5.10-1.x86_64.rpm
avr-gcc-4.5.0-2.x86_64.rpm
avr-gcc-c++-4.5.0-2.x86_64.rpm
gmp-4.3.1-7.x86_64.rpm
gmp-devel-4.3.1-7.x86_64.rpm
gmp-static-4.3.1-7.x86_64.rpm
libmpc-0.8-3.x86_64.rpm
libmpc-devel-0.8-3.x86_64.rpm
mpfr-2.4.1-6.x86_64.rpm
mpfr-devel-2.4.1-6.x86_64.rpm

You will also need arduino-0022.tar.gz, which I installed in /opt/arduino.

Now the IDE works, but it's in Java. Which hates me, hates Linux and I hate Java just as much, just for good measure I also hate IDEs. Working from two tutorials and with some slamming my head into the table, I got it working. The trick was massaging Johan's Makefile into something that worked. I also had to patch /opt/arduino/hardware/arduino/cores/arduino/wiring_private.h.

To start a new project, lets say "blink2"
mkdir blink2

cd blink2
wget http://awale.qc.ca/CentOS/rhel5/Makefile.arduino -O Makefile
wget http://awale.qc.ca/CentOS/rhel5/resetArduino.pl
touch blink2.pde

Now add your code to blink2.pde.

And here is my first Arduino program. It's a 6 LED chaser. It would be more, but I can only find 6 LEDs right now. Pins 13-9 are red, pin 8 is green. The green light stays on twice as long as the others.
#define DELAY 100


int state;
void setup(void) {
int pin;
state = 1;
for(pin=13; pin >=8; pin-- )
pinMode(pin, OUTPUT);
}

void set_state(void) {
int pin;
int mask = 1;
for(pin=13; pin >=8; pin-- ) {
digitalWrite( pin, (state & mask) );
mask <<= 1;
}

}

void loop(void) {

if( state == 1 ) {
state = 3;
}
else {
state = state << 1;
}
/* 0001 1000 = 18 */
/* 0011 0000 = 30 */
if( state == 0x60 ) { /* 0110 0000 = 60 */
state = 0x20;
set_state();
delay( DELAY*4 );
state = 1;
}
/* 0100 0010 = 42 */
else if( state == 0x42 ) {
state = 3;
}
set_state();

delay(DELAY);
}


Now compile and upload it:
make && sudo make upload

2011/07/21

Not Garbage Yet!

The three phases of things:
  1. Shiny and new and desirable;
  2. Garbage (very little survives);
  3. Old and desirable (aka Retro or Antique).

An example: the Pullman car was something a president wanted; North America reworked its railroads to accommodate it (and him). By now, most are destroyed. However, The New Brunswick Railway Museum has two. They also have a small shunting yard full of train cars, engines and cabooses that have survived the Garbage phase (in some cases just barely) and are moving into the Old and Desirable phase.

I ended up at the museum by accident; driving back to Shediac from the Hopewell Rocks, I saw a jet fighter plane parked by the side of the road. On a lark I turned the van around and drove pack to take pictures of it. My 14-year-old self wouldn't have forgiven me. But then Désirée claimed she wanted to see the trains. In fact she wanted to enter the trains. And so we did. And this brought back my 8 year old self and memories of the few train trips I made from Toronto to Montreal. There were no VIA Rail cars from the 70s, which I assume are still in the Garbage Phase, but some of the car seats from the 60s looked I bit like what I remember.

The real joy (for me) was in the large shed, where they had a Caboose we could enter. As a kid in North Hatley we used to watch the trains go by and wave at the man in the caboose. Cabooses (cabeese?) are now only a thing of memory (I had to explain to Dominique what a caboose was), but my inner 8-year-old-train-geek got a kick waving from the caboose at the passing kids. Or rather, my wife.

The next best thing was clambering around 3 locomotives, 2 diesel-electrics from the late 50s and a steam locomotive beast from 1912. And this is what is so awesome about this museum. I was afraid it would be all staring at immaculate restorations through plexiglass. Quite the contrary: we got to clamber on and around the locomotives and into the engineering rooms, sit on the beat-up seats, admire the different levels of tech in the controls from large brass levers all the way to 80s era scram switches and digital speedometers. Désirée could have shimmied into the boiler's furnace if her mother would have allowed her and her father could have cajoled her to do so. We pushed on the huge levers, pull the ropes, opened up the panels to see the turbines.

Were we supposed to do all this? No one was around to tell us not to; these are huge machines made to withstand years of hard work. We would have been hard pressed to break anything the engineers hadn't already.

Conclusion: Worth the price, worth a detour, would go again.

2011/07/20

Weighing the border

Years ago Susan used some mapping software to plot a route from North Hatley to (I think) New Brunswick. This was back when software came from a CD-ROM, not a web server. The software routed her through the USA. She added (I suspect) Rimouski to her itinerary as a way of by-passing the USA. It still routed her through Maine. As I remember, she then contacted tech support, who said they'd fix it in the next release. Remember, this was back when software was burned on CD-ROMs so they couldn't just tweak something and have it available next morning.

Because really, what you want is to give a border crossing a very high weight, so the AI will give it a low priority. CD-ROMs might also make you think of a time when crossing a border consisted of answering "yes, $DESTINATION, no, no" to a surly border guard. Nowadays it requires passports, finger printing and the possibility that you get shot when you go to reach for your glove compartment. So whatever the weight used to be, multiply it by 5. Or you could have a user configuration "USA border guards scare the hell out of me."

All this makes me wonder if there's someone at Google Maps who's job is to evaluate the relative difficulty of crossing various borders, updating the system as foreign policy deteriorates.

What brought this back to mind is that I'm currently IN Shediac, New Brunswick.

In semi-related news: I've finally mastered wireless connection setup in CentOS. Delete ifcfg-eth1 (in both /etc/sysconfig/network-scripts AND /etc/sysconfig/networking/devices), run nm-connection-editor, let the wizard to its work. NetworkManager stores its config in ~/.gconf/system/networking/connections. The WEP key is stored somewhere else. Yes, the place I'm staying uses WEP, which takes less then a minute to crack but more then a minute for the owner to write down for you.

2011/07/15

Pain

Something you don't see everyday:

# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb2[3](S) sdc2[2] sda2[4](F)
312367616 blocks level 5, 256k chunk, algorithm 2 [3/1] [__U]

unused devices:
Of course, this happens the day before I leave on a 2 week vacation.