Author Archives: Mike Sisk

About Mike Sisk

Principal Engineer in platform services at Cerner. Recovering entrepreneur and startup founder. Previously: Citigroup, ERCOT, Rackspace, Autodesk.

Configuring PTR records using the Rackspace Cloud DNS API

This is an archive originally posted on the Rackspace Developer Blog.

 

This is a guest post by Mike Sisk, a Racker working on DevOps for Rackspace’s new cloud products. You can read his blog at http://mikesisk.com or follow @msisk on Twitter.

I’m going to show you how to setup a PTR record in Rackspace Cloud DNS for a Cloud Load Balancer using the command-line utility cURL.

I’m using a Rackspace Cloud production account below; when you try it with your account change the account number and authentication token to yours.

A few notes about cURL: this is a command line utility found on Mac and most Linux machines. You can also use other tools called “REST Clients”. One popular one is an extension for Firefox and Chrome located here.

Here’s a quick reference to some of the options I’ll be sending with cURL in the examples below:

  • -D

    Dump header to file (- sends to stdout)

  • -H

    Extra header(s) to send

  • -I

    Get header only

  • -s

    silent (no progress bars or errors)

  • -X

    Request method (GET is default)

The first thing we need to do is get an Authentication Token:

$ curl -s -I -H "X-Auth-Key: auth-key-for-account" -H "X-Auth-User: username" https://auth.api.rackspacecloud.com/v1.0

This will return just the header from the request (note the -I option) and the one we need is the value after “X-Auth-Token:”

Let’s list the domain so we can grab its ID (I’ve obscured my Authentication Token below with $TOKEN):

$ curl -s -H "X-Auth-Token: $TOKEN" https://dns.api.rackspacecloud.com/v1.0/636983/domains {"domains":[{"name":"sisk.ws","id":3325158,"created":"2012-07-20T18:04:11.000 0000","accountId":636983,"updated":"2012-07-31T18:40:22.000 0000","emailAddress":"mike.sisk@rackspace.com"},{"name":"wikirr.com","id":3174423,"created":"2012-02-28T19:26:35.000 0000","accountId":636983,"updated":"2012-07-21T21:58:41.000 0000","emailAddress":"ipadmin@stabletransit.com"},{"name":"wikirr.net","id":3314413,"comment":"This is a test domain created via the Cloud DNS API","created":"2012-07-11T14:54:00.000 0000","accountId":636983,"updated":"2012-07-11T14:54:03.000 0000","emailAddress":"mike.sisk@rackspace.com"}],"totalEntries":3}

Ok, that’s a little hard to read. But I can see the domain ID in question I need.

$ curl -s -H "X-Auth-Token: $TOKEN" https://dns.api.rackspacecloud.com/v1.0/636983/domains/3325158 | python -m json.tool
{
 "accountId": 636983,
 "created": "2012-07-20T18:04:11.000 0000",
 "emailAddress": "mike.sisk@rackspace.com",
 "id": 3325158,
 "name": "sisk.ws",
 "nameservers": [],
 "recordsList": {
 "records": [],
 "totalEntries": 4
 },
 "ttl": 300,
 "updated": "2012-07-31T18:40:22.000 0000"
 }

The default output of the API is JSON, but it also supports XML if you send it another header. The little bit of Python on the end just sends the output though a parser to format it for humans. You can see I have already created an A record for the www address. The PTR we’re creating below is essentially the reverse of that to map the IP address to http://www.sisk.ws.

Through the control panel I had already created a Cloud Load Balancer on this account. We need its ID for the PTR record, so let’s list the load balancer though its API:

 $ curl -s -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/636983/loadbalancers/47219 | python -m json.tool
{
 "loadBalancer": {
 "algorithm": "LEAST_CONNECTIONS",
 "cluster": {
 "name": "ztm-n09.dfw1.lbaas.rackspace.net"
 },
 "connectionLogging": {
 "enabled": false
 },
 "contentCaching": {
 "enabled": false
 },
 "created": {
 "time": "2012-07-31T18:36:34Z"
 },
 "id": 47219,
 "name": "Test1",
 "nodes": [],
 "port": 80,
 "protocol": "HTTP",
 "sourceAddresses": {
 "ipv4Public": "64.49.225.5",
 "ipv4Servicenet": "10.183.248.5",
 "ipv6Public": "2001:4800:7901::9/64"
 },
 "status": "ACTIVE",
 "updated": {
 "time": "2012-07-31T18:36:44Z"
 },
 "virtualIps": []
 }
 }

Ok, that returns a lot of stuff. The thing we need from this output is the ID, 114445 and the ipv4 Public IP, 64.49.225.5.

Now that we’ve collected all the required information, the next step is calling the Cloud DNS API with a POST operation to create the PTR record and associate it with the Load Balancer. First thing I did was create the following JSON data in a text editor:

{
"recordsList" : {
"records" : [ {
"name" : "www.sisk.ws",
"type" : "PTR",
"data" : "66.216.68.19",
"ttl" : 56000
}, {
"name" : "www.sisk.ws",
"type" : "PTR",
"data" : "2001:4800:7901:0000:290c:0b6b:0000:0001",
"ttl" : 56000
} ]
},
"link" : {
"content" : "",
"href" : "https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/636983/loadbalancers/47219",
"rel" : "cloudLoadBalancers"
}
}

This lists all the data we need to create the PTR record. In this example I also added the IPV6 address, too. Let’s give it a try:

$ curl -D – -X POST -d '{
"recordsList" : {
"records" : [ {
"name" : "www.sisk.ws",
"type" : "PTR",
"data" : "66.216.68.19",
"ttl" : 56000
}, {
"name" : "www.sisk.ws",
"type" : "PTR",
"data" : "2001:4800:7901:0000:290c:0b6b:0000:0001",
"ttl" : 56000
} ]
},
"link" : {
"content" : "",
"href" : "https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/636983/loadbalancers/47219",
"rel" : "cloudLoadBalancers"
}
}' -H "Content-Type: application/json" -H "X-Auth-Token: $TOKEN" https://dns.api.rackspacecloud.com/v1.0/636983/rdns

I just typed in the commands and pasted in the above JSON file between the single-quote marks after the -d. In the Cloud DNS API commands that create stuff are asynchronous — what we get back is a URL to check to see the status of the job.

This is what we get back from the above POST:

{"request":"{\n "recordsList" : {\n "records" : [ {\n "name" : "www.sisk.ws",\n "type" : "PTR",\n "data" : "66.216.68.19",\n "ttl" : 56000\n }, {\n "name" : "www.sisk.ws",\n "type" : "PTR",\n "data" : "2001:4800:7901:0000:290c:0b6b:0000:0001",\n "ttl" : 56000\n } ]\n },\n "link" : {\n "content" : "",\n "href" : "https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/636983/loadbalancers/47219",\n "rel" : "cloudLoadBalancers"\n }\n}","status":"INITIALIZED","verb":"POST","jobId":"f99c1203-b42a-44c4-885f-c80bd7e3aba0","callbackUrl":"https://dns.api.rackspacecloud.com/v1.0/636983/status/f99c1203-b42a-44c4-885f-c80bd7e3aba0","requestUrl":"http://dns.api.rackspacecloud.com/v1.0/636983/rdns"}

Let’s check the job status:

$ curl -s -H "X-Auth-Token: $TOKEN" https://dns.api.rackspacecloud.com/v1.0/636983/status/f99c1203-b42a-44c4-885f-c80bd7e3aba0 | python -m json.tool
 {
 "callbackUrl": "https://dns.api.rackspacecloud.com/v1.0/636983/status/f99c1203-b42a-44c4-885f-c80bd7e3aba0",
 "jobId": "f99c1203-b42a-44c4-885f-c80bd7e3aba0",
 "status": "COMPLETED"
 }

These jobs complete quickly, so by the time you check it’s usually done. If the system is under a lot of load, or it’s a really big job (like updating hundreds of records) it might take a few minutes.

Ok, let’s see what the PTR record looks like. First, keep in mind the PTR record lives with the device, not the domain record. So doing a list of the domain won’t show us the PTR. We have to list it from the device like this:

$ curl -s -H "X-Auth-Token: $TOKEN" https://dns.api.rackspacecloud.com/v1.0/636983/rdns/cloudLoadBalancers?href=https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/636983/loadbalancers/47219 | python -m json.tool
 {
 "records": []
 }

Ok, looks good. Let’s test it:

$ host www.sisk.ws
www.sisk.ws has address 66.216.68.19
$ host 66.216.68.19
19.68.216.66.in-addr.arpa domain name pointer www.sisk.ws.

Looks good — that’s what we expect to see. To compare, let’s see what it looks like with the root of the domain, which is pointing to a first generation cloud server that doesn’t support PTR records:

$ host sisk.ws
sisk.ws has address 108.166.119.217
$ host 108.166.119.217
217.119.166.108.in-addr.arpa domain name pointer 108-166-119-217.static.cloud-ips.com.

For more information on the Rackspace Cloud DNS API, refer to our API documentation.

s3cmd with Multiple AWS Accounts

Awhile back I was doing a lot of work involving Amazon’s Simple Storage Service (aka Amazon S3).

And while tools like Panic’s Transmit, the Firefox S3Fox extension, or even Amazon’s own S3 Management Console make it easy to use, sometimes you really just want a command-line tool.

There’s a lot of good tools out there, but the one I’ve been using is s3cmd. This tool is written in Python and is well documented. Installation on Linux or OS X is simple as is its configuration. And as a longtime Unix command-line user it’s syntax is simple. Some examples:

To list your buckets:

~ $ s3cmd ls
2010-04-28 23:50 s3://g5-images
2011-01-21 06:42 s3://g5-mongodb-backup
2011-03-21 21:23 s3://g5-mysql-backup
2010-06-03 17:45 s3://g5-west-images
2010-09-02 15:57 s3://g5engineering

List the size of a bucket with “human readable” units:

~ $ s3cmd du -H s3://g5-mongodb-backup
1132G s3://g5-mongodb-backup/

List the contents of a bucket:

~ $ s3cmd ls s3://g5-mongodb-backup
2011-08-08 14:43 3273232889 s3://g5-mongodb-backup/mongodb.2011-08-08-06.tar.gz
2011-08-08 21:12 3290592536 s3://g5-mongodb-backup/mongodb.2011-08-08-12.tar.gz
2011-08-09 03:16 3302734859 s3://g5-mongodb-backup/mongodb.2011-08-08-18.tar.gz
2011-08-09 09:09 3308369423 s3://g5-mongodb-backup/mongodb.2011-08-09-00.tar.gz
2011-08-09 14:51 3285753739 s3://g5-mongodb-backup/mongodb.2011-08-09-06.tar.gz

Show the MD5 hash of an asset:

~ $ s3cmd ls --list-md5 s3://g5-mongodb-backup/mongodb.2011-08-09-06.tar.gz
2011-08-09 14:51 3285753739 07747e3de16138799d9fe1846436a3ce \
s3://g5-mongodb-backup/mongodb.2011-08-09-06.tar.gz

Transferring a file to a bucket uses the get and put commands. And if you
forget an option or need a reminder of usage the very complete s3cmd –help
output will likely be all the help you need.

One problem I have with most tools for AWS is managing multiple accounts. Most
of these tools assume you have just one account, but I work with multiple
accounts and switching between them can be cumbersome.

Here’s how I work with multiple AWS accounts using s3cmd.

By default s3cmd puts its configuration file in ~/.s3cfg, but you can
override this and specify a configuration file with the -c option.

What I do is create a separate config file with the appropriate credentials for
each account I work with and give them unique names:

~ $ ls -1 .s3cfg*
.s3cfg-g5
.s3cfg-tcp

Another option is to keep the credentials for the account you use most often in
the standard ~/.s3cfg file and use the -c option when/if you need another
account. I don’t like this option because it’s too easy to mistakenly use the
wrong account. For example, without a ~/.s3cfg this is what happens when I use
s3cmd without specifying a configuration:

~ $ s3cmd ls
ERROR: /Users/mike/.s3cfg: No such file or directory
ERROR: Configuration file not available.
ERROR: Consider using --configure parameter to create one.

So, what to do? Using the -c all the time is a PITA. Answer: use Bash aliases!

Here’s a subset of the s3cmd aliases I have in my ~/.bashrc file:

# s3cmd aliases for different s3 accounts
alias s3g5='s3cmd -c ~/.s3cfg-g5'
alias s3tcp='s3cmd -c ~/.s3cfg-tcp'

Now, to list the buckets in my personal account I just do:

~ $ s3tcp ls
2011-07-01 06:10 s3://mikesisk-img
2011-07-05 23:16 s3://www.tcpipranch.com
2011-07-01 22:55 s3://www.watch4rocks.com

And I can still pass arguments:

~ $ s3tcp -H --list-md5 ls s3://mikesisk-img/me.jpg
2011-07-01 06:09 5k 13d7c86bccd8915dd93b085985305394 \
s3://mikesisk-img/me.jpg

Just keep in mind that calls to bash aliases from scripts and cronjobs might not work. Plus it’s bad form and will come back to bite you one of these days. Just use the long form with -c in these places and keep the aliases for your own interactive command-line usage.

Cron and Sewing Needles

Sometimes, even after decades of experience, you still screw up.

Consider this cron entry I put in last night:

    # Backup MongoDB every 6 hours, zip it up, and rsync it.
    * */6 * * * ~/bin/backup_mongo.sh

I wanted this to run the backup script for MongoDB every six hours. Instead, I got it running every
minute for an hour every six hours. You’d think I’d know better considering I put the next cron in correctly:

    # Remove MongoDB backups that are more than 24-hours old.
    00 02 * * * find /db/backup -mtime +1 -exec rm -f {} \;

What I meant to do is this:

    # Backup MongoDB every 6 hours, zip it up, and rsync it.
    00 */6 * * * ~/bin/backup_mongo.sh

Luckily we host our infrastructure at Engine Yard and their staff noticed the CPU spike on this server at midnight and fixed the cron.

Which brings up another point: name your scripts appropriately. In this case a quick scan of cron revealed this script was running a backup and doing that every six hours makes sense. If the script was just named mongo, it’s conceivable it could have been a metric collection script that runs every minute for an hour every six hours.

So what do sewing needles have to do with cron? I’m working from home this week and had just finished that MongoDB backup script and was putting it in cron when my daughter came running (Ok, make that hopping) into my office with a large sewing needle in-bedded about 1/4″ deep in the arch of her foot. I quickly saved the cron entry to take care of that problem and didn’t go back to check my work.

Moral of the story: whenever you set up a new cron job it’s a good idea to watch it run and see if it’s doing what you think it is. Especially if you think you know what you’re doing.

Dispatches from Joplin, Part 3

Subject: Where’s Mike, still-in-Joplin edition.
From: Mike Sisk
Date: June 3, 2011
To: engineering

Well, I finally got an electrician out to my folks place. Then the job turned out to be too big for him since he had a bunch of others needing less work. So he brought yet another electrician over who could do the work.

Turns out to be a pretty big job. For the first few days after the tornado the city wasn’t requiring permits for any work. But after a lot of out-of-town contractors showed up doing sub-standard work the city now require a permit and inspection.

In this case we needed to upgrade my parents electrical from the WWII-era 60-amp service with glass fuses to something a bit more modern. 100-amp service is now the minimum and that requires circuit breakers and the panel located in an approved place. This is a bit of a problem with my parents house.

With temperatures in the 90s and the humidity not that far off, the electrician was able to talk the city into just putting up a new meter base, 100-amp main breaker, and weather head and graft it into the existing electrical system in the interests of just getting the power on as quickly as possible. Then, after the initial crunch is done they’ll return and do the other work to get the house up to code.

So, this is now done and we’re just waiting for the utility to come up and string a service line from the pole to the new meter. Of course, we’ve been waiting for the utility for two days now and they still haven’t shown up.

Here’s a crazy story about the storm: Kim has a friend that lives east of town on some rural horse property. Their place was in the tornado’s path, but it died out before it got to their place so they had no damage. After the storm passed they went out to check on their horses when debris starting falling from the sky. Suddenly, two large dogs literally fell from the sky, bounced off the ground, ran around confused and took off for the woods, apparently unhurt.

Another story on the news was about a dog found in Carthage — a town about 20 miles northeast of Joplin. This dog was found wandering around and when they checked its microchip it was from Joplin in the tornado damaged area. Apparently this dog was sucked up by the tornado and ended up, unhurt, 20 miles away.

The official death count and list was released today: 134 dead during the storm, 4 more (so far) afterwards of injuries sustained. It’s a miracle it wasn’t higher. Quite a few of these were older folks in senior living facilities, a lot of which were clustered around the hospital that was hit. But there were also a surprising number of kids in the list, too. And a few deaths were from folks on life support that died when the hospital’s power went out.

I stopped by the one remaining quick oil change place in town today to get the oil in my Jeep changed. Their other three locations were all in different parts of town, but all happen to lie along the path of the tornado and were all destroyed.

I struck up a conversation with a fellow in the waiting area that had a broken arm. He had just quit his job at a local factory on Friday and had a new job lined up with Union Pacific Railroad in St. Joseph, Missouri as a backhoe operator and was suppose to start with that on Monday. But on Sunday while helping to retrieve a body the board he was using as a lever broke and he instinctively shielded his face with his arm as the board flew up and broke his arm. So he now has no medial insurance, an expensive injury, and can’t work for 6 weeks or so until he gets out of the cast. I suggested he head down to the nearby FEMA station and file a claim. He said he hadn’t thought of that and would do that after they got the flat tire on his truck fixed.

The city has been busy trying to get all the traffic lights in town working so traffic moves more easily. Nearly two weeks after the tornado most of the busy intersections in town still had traffic cops directing traffic and that really slows things down and makes cross-town travel very slow.

But progress is being made and as of today most intersections have working lights. Since most of the lights in this part of town were totally destroyed, it’s a rather interesting site — the pole colors are all different and the lights are a mismatch of different styles. And there’s still no power in most of these areas so portable generators are powering these lights. Same with the Kansas City Southern (KCS) railroad mainline that bisects the damaged area — the grade crossings are all being powered with generators.

As soon as my parents have their power restored I’ll be able to head back to Bend and get back to work.

I still have a few things to do — once the power is back on I need to rebuild the engine on the generator so it’ll be ready for the next event. It’s not designed for the kind of continuous running it’s been subjected to these past few weeks. I got all the parts today so I’m ready to do that as soon as I can stop the thing.

And my folks lost all their refrigerated and frozen food so I need to restock them before I leave.

Update on power situation: The local electric utility says they don’t have a record of a permit or an inspection certificate and can’t hook it to the grid without those. City says they do have them. The electrician that did the work says they’re both being stupid and he’ll make some calls to get it straightened out. What a PITA.

Dispatches from Joplin, Part 2

Subject: Where’s Mike this week?
From: Mike Sisk
Date: May 30, 2011
To: engineering

I’m still in Joplin this week.

And my folks still don’t have power.

The problem now is that my parent’s house is old and has the original wiring from the 1940′s with glass fuses and all. Unfortunately, current building codes have a requirement that all buildings must have a minimum electrical rating of 100 amps, and my folk’s house has old 60 amp service. So the local power utility won’t reconnect the house to the grid until the electrical is updated.

After a lot of work, I found 2 electricians to take a look; one claims he can do the job but doesn’t inspire confidence while the other comes highly recommended but is having to consult with the city inspector to see exactly
what he needs to do; building codes after disasters often have some wiggle room so he’s looking into that.

The best case is putting in a new meter box and weatherhead that meets utility standards but graft it into the existing house wiring. Worse case is updating the entire house with new electrical service, and current standards now require wired-in smoke detectors, GFIs, energy-efficent bathroom lighting and arc-fault interrupters. A lot of work and expense.

Adding to the complexity is that State Farm insists they must be consulted before any work is started.

Most of the insurance companies here are doing a good job. Except State Farm — they’ve been slow and hard to deal with. On the 2nd day after I got here I saw an disaster agent setup nearby and stopped in to file a claim for my parents. He couldn’t get his Windows machine to connect to the Internet with his Verizon card so he couldn’t help me. Not sure what he planned to accomplish. He wasn’t there the next day.

This past holiday weekend was a busy with lots of volunteer groups in town helping out. Now, I’m not much for religion but I have to say the religion-based aid groups did an awesome job helping out in town. We had a mormon group cut down the remains of the tree in my folks front yard and afterwards they put a tarp over the broken windows of the next door neighbors house. And the next day they showed up again and picked up all the debris in the backyard.

Lots more groups came by and dropped off more food and water and today a new-age church one block north of my folks cooked burritos for anyone that wanted some. Throughout town there’s lots of hot free food being cooked and handed out for victims of the tornado and those in town helping out.

Aid is coming in from all over. Today I saw a truck from the Denver Humane Society and there’s police and fire departments helping out from all over. I’ve seen police from St. Louis and Kansas City all around town.

But it still looks bad around town. Even a week after the tornado the amount of debris is astounding.

Today the first funerals started. The most heart wrenching was a soldier who was at Home Depot with his wife and two young kids. He was found crushed in the rubble with his kids still in his arms, all dead. His wife survived, but the rest of her family didn’t. I can’t even imagine what she must be going through.

A missing 18-year-old high school student was found in a pond; he was coming back from a graduation party when they drove into the path of the tornado and he was pulled out of his Hummer through the sunroof.

I’m staying with my friend Kim — her house in the northern part of town has power and Internet so I’ll be able to get some work done around coordinating the electrical work on my folks place and helping them out with their needs. I’ve got most everything else taken care of around their house, but this power issue is a big one.

My folks are doing ok, but getting tired of limited power and no air conditioning. It’s been in the 90s with high humidity so it’s not very comfortable. Their generator is still holding out, but it’s using about 5-gallons of fuel a day which is adding up.

Dispatches from Joplin, Part 1

On May 22, 2011 an EF5 tornado struck my hometown of Joplin, Missouri. At the time I was working at a startup in Bend, OR but my folks (and a lot of friends) were – and are – still in Joplin.

My folks live very close to the hospital that took a direct hit and was featured in most of the press coverage. As soon as I heard about the extent of the damage and couldn’t get in touch with my folks I immediately left Oregon driving to Joplin.

The next three posts are emails I sent back to my team in Oregon telling of my experience.

Subject: Where’s Mike?
From: Mike Sisk
Date: May 26, 2011
To: engineering

It’s been a hectic past few days.

This all started for me on Sunday around 4PM when got a call from a friend in Joplin asking if my parents were OK. She said a tornado had just gone through town and there was a lot of damage.

I tried calling my folks but just got a busy signal on both their home phone and their cell phone.

I don’t normally worry much about these things since Joplin gets tornados all the time and my folks house — the house I grew up in — is a very sturdy house made of foot-thick limestone blocks, has a basement, and is located just one block away from a siren.

The local and national news were no help immediately after the storm so I turned to Twitter and Facebook. What I was hearing on there worried me and after seeing the video the weather channel was broadcasting of the damage to the St. John’s Hospital I was very worried. My folks house is not very far from there.

I tuned in to the Joplin emergency services radio through an Internet radio scanner and what I was hearing was very worrisome — not only the location but the scope. This was obviously a major disaster.

I started packing my Jeep and planning a trip back not know if I would need to evacuate my parents or what the situation is. I filled it with tools, emergency supplies, and camping equipment just in case.

Around this time, about three hours after the tornado went though town, I got a call from the sheriff office saying my parents were fine but the house was severely damaged. I told him I would be there ASAP and hung up — they were making a lot of calls and couldn’t take time for questions.

Still not knowing the exact situation but knowing my parents were safe I finalized my packing and was on the road heading away from Portland on I-84 around 9PM. I drove straight though the night getting updates on the situation from friends on Twitter, Facebook, and SMS. By now the scope of the disaster had gotten the attention of the national media and I started getting updates on the radio and web.

I made it to North Platte, NE on Monday before I needed to stop to sleep. I got back on the road Tuesday and had to take an alternate route through Kansas to avoid some severe thunderstorms.

I finally got to my folks house in Joplin Tuesday night just before the 9PM curfew went into effect.

My folks were fine and the house had surprisingly little damage. The power was out due to a tree falling on the power lead and yanking the line off the house. A lot of debris was around the house and a camper shell had landed in the backyard on the fence. The chimneys on the house were missing some bricks but no roof damage or broken glass.

Shortly after I arrived a severe storm went though. A tornado was spotted to the west of town so the sirens went off. It never touched down and later the sirens went off again when winds over 75-mph were measured and with all the loose debris around it was considered dangerous.

I got up the next morning around 6AM and walked around the neighborhood.

My folks got lucky. A few houses around them were damaged by falling trees, but one block further south the serious damage started and two blocks away everything was razed to the ground. One house collapsed as I was getting ready to take a picture of it; I wish I had the iPhone on video mode. The air smelled of natural gas and you could still faintly hear fire detectors going off in the ruble of some homes. Cars were smashed and overturned. A semi truck was upside down in the remains of another.

An nearby elementary school was reduced to an empty shell. Tetherball poles in the playground embedded in asphalt were bent parallel to the ground. An electrical substation next to the school was totally destroyed and its large multi-ton transformers scattered about.

Back at my folks house my first order of business was fixing their 5000-watt generator. It was last used several years ago during an ice storm, but they couldn’t get it started. Some helpful neighbors and tried to fix it by removing the carburetor, but that didn’t help and it now leaked gas. I took it apart and it was obviously reassembled incorrectly. They had broken a complex rubber gasket that sealed the float bowl and put the float in wrong. I got it back together correctly and with some starting fluid was able to get the generator fired up and running.

So we now had power. We had water and water pressure, but there’s a boil warning in effect due to many broken water mains. Luckily the city water pumping plant is just several blocks away and was mostly undamaged so we had water pressure.

Next order of business; getting a TV running. Cable TV in town is down, so my folks have no phone, TV, or Internet service. And TV is now all digital so their old normal TVs can’t pick up over the air signals. Luckily they had ordered one of those free HDTV tuners awhile back and I was able to get that hooked up to their TV.

Next: Coffee. My dad needs his coffee. With the electricity and gas out he didn’t have a way to boil water. I brought along my JetBoil backpacking stove and it heats several cups of water to a boil in just a minute or so. Coffee achieved.

With power, TV, and coffee my folks are now comfortable, so I could now help out some friends and their families.

Kim is a dental hygienist and her brand new office is about 5 blocks from my folk’s house. She hadn’t been out since the storm so I picked her up at her house in the undamaged north part of town and went back to my parents and we walked over to her office. It was totally destroyed. A tennis shoe was embedded in an exterior wall. A king-size mattress from somewhere was inside the waiting room. A chair from the waiting room had found it’s way into Kim’s treatment room and had a 2×4 speared through the back rest.

Afterwards we drove around town for awhile looking over the places we both know so well since we grew up here. It’s surreal. The damage is just insane. There’s a quarter-mile-wide path from one side of town to the other that is stripped bare to the ground. Trees are either totally uprooted or stripped bare — even the bark is gone. Damaged cars are everywhere. I saw a guy driving a Porsche Boxster with no windshield and every body panel bashed.

At the site of one bank there was nothing left but the concrete bank vault. The sea-food restaurant I worked at in high school was reduced to one wall.

I’ll be amazed of the death count doesn’t increase dramatically — there’s just so much damage.

A lot of the deaths occurred at the Home Depot and the Wal-Mart. People were inside seeking shelter from the storm and when the roof was pulled away the tilt-up poured concrete walls fell over crushing people underneath.

The hospital that is getting a lot of the attention in the media is something else to see in person. It looks like it was bombed. The devastation around it is unreal. It honestly brings to mind the photos of Hiroshima after the atomic bombing.

After driving around awhile we went back by Kim’s office to search for something she forgot to look for. We pulled into the parking lot and there was a minivan with no license plates and a U-Haul trailer attached. We could hear someone up in the attic of the office and yelled at them but they didn’t respond back.

About this time a police patrol was driving by so I flagged him down and told him someone we didn’t know was in the building. He said he’d check it out and had a National Guard soldier with him. They confronted the guys and called for backup. Soon we had about 20 cops in the lot from a dozen different agencies. Turns out the guys in the attic were looters from out of state pulling the copper wiring out.

The police cuffed and hauled them to jail. While this was going one I talked to the cop I flagged down. He said he spent 2 years in Iraq and the devastation he’s seen in Joplin is worse than anything he ever saw over there.

But at the same time the amount of generosity and helpfulness is impressive. Before I got in town someone went from house to house in my parent’s neighborhood asking if they wanted anything to eat — they had hamburgers and hot dogs for anyone. And someone did the same with bottled water.

At Kim’s parents house I was just getting ready to fire up my chain saw when a truck with three kids came up and said they were volunteers and asked if we needed any help cutting up the downed trees. Sure, I said, and they got to work and quickly reduced the big trees to manageable logs and stacked them near the road.

There’s aid and supply stations everywhere in town and we have law enforcement people from all over the midwest helping out. People are really pulling together here as a community.

Ok, I’ve gone on long enough. I still have a lot of work to do today and still need to get my folks house cleaned up from debris. And I need to get on the roof for a though inspection. I also need to file an insurance claim for them and get the FEMA paperwork filled out.

I’m doing OK, but it’s a lot of work and emotionally draining with so much destruction around.

I’ve put some video of the destruction on Youtube: http://www.youtube.com/user/msisk6