Thursday, February 09, 2006
Debugging other people's code
I understand why Smirk wants this, I thought to myself, but I still don't like them.
I was neck deep in PHP and shell scripts, trying to figure out what the heck Ravencore (a control panel—sigh) was doing when configuring the IMAP and POP servers. You see, the IMAP and POP servers weren't authenticating the users—or rather, they were, but for some reason were not authenticating against the passwords set for the users.
It took a good half hour or so to track the problem down to a shell script that regenerated the password file for the IMAP and POP servers. The script generated the following from MySQL:
4:testuser:example.net:true::guessme
Six fields, separated by colons—and if you look closely, you'll notice that one of the fields is empty. Keep that in mind, it's an important point. Then it was doing the following:
# separate the string into a temp variable so we don't # have to make several calls to to the sed command tmp=$(echo $i | sed 's/:/ /g') mid=$(echo $tmp | awk '{print $1}') mail_name=$(echo $tmp | awk '{print $2}') domain_name=$(echo $tmp | awk '{print $3}') mailbox=$(echo $tmp | awk '{print $4}') spam_folder=$(echo $tmp | awk '{print $5}') mail_pass=$(echo $tmp | awk '{print $6}') email_addr="$mail_name@$domain_name"
The problem?
The first line, the one that calls sed
to remove the colons.
It transforms the line from MySQL to:
4 testuser example.net true guessme
So there's only five fields instead of six! So the
password was being set to nothing (there is no
spoon sixth field).
The fix was simple:
mid=$(echo $i | cut -d: -f1) mail_name=$(echo $i | cut -d: -f2) domain_name=$(echo $i | cut -d: -f3) mailbox=$(echo $i | cut -d: -f4) spam_folder=$(echo $i | cut -d: -f5) mail_pass=$(echo $i | cut -d: -f6)
Have I mentioned that I hate control panels?