When is nothing something?

We use devmon to automatically monitor a variety of things on our network, including our uninterruptible power supplies (UPSs) that ensure our core infrastructure is able to withstand short power outages.
Our UPSs should perform a self-test routine every two weeks, and thus I wanted to have our automated monitoring report on whether or not a self-test had been performed sufficiently recently. The UPSs report the date they were last tested in the format MM/DD/YYYY (i.e. today, the 8th of June 2017, is 06/08/2017), and so I needed to parse dates of that format so I could calculate the number of days since the last self-test.
Ordinarily the advice on performing any sort of date calculation when programming is “use a date library”: date calculations are notoriously difficult to get totally right, and you’re normally better off using a library that someone has written and which has already been thoroughly tested. But that’s not an option inside devmon: one can perform basic mathematical and string manipulation operations, but little else.
I wrote the monitoring report about a week ago, and it had been working fine – but I noticed that it had stopped reporting today. The first step in parsing the date is to take a string like 06/08/2017 and extract characters 1 and 2, then 4 and 5, then 7 to 10 and store them as the month, day and year respectively.
An oft-used convention in programming languages is that numbers that start with a leading zero should be interpreted as octal (base 8) numbers. Thus, in octal, the decimal numbers 1 to 10 are 01, 02, 03, 04, 05, 06, 07, 010, 011, 012.
You might now see the problem: 08 is not a valid octal number, so the underlying code stopped working today! Running devmon in debug mode quickly let me find the reason for the problem:
Illegal octal digit ‘8’ at (eval 13) line 1, at end of line
and so the fix was simply to remove any leading zeroes from the month and day.

This entry was posted in Hardware, technical. Bookmark the permalink.