Hello all,

I imagine that there are quite a few (old) sysadmins, developers and 
Pythonistas lurking on this list who are also interested in this 
question.  I'm one of them, I suppose, and I couldn't help but want 
to add a point or two.

Rich--I think you have gotten quite a bit of help so far in this 
question (which you brought up a few weeks ago).

I will observe that you are encountering many of the problems 
inherent in working with and relying on networked services.  
Sometimes those ervices aren't available, sometimes the code on the 
other side is broken, sometimes the code on your side is broken.  I 
learned an amusingly relevant expression from a very experienced 
developer.  'My code inhabits a hostile universe.'

So, here are some tips that come to my mind as I read this thread.

  * if you are writing a file where it is important that the file 
    is either written completely or not present, consider using 
    filesystem atomicity to guarantee that the data in the file are 
    good; here is an example:

       set -e  # -- exit whole script if any command fails
       DATAFILE=my-critical-info
       URL=http://some.flaky.org/information 
       curl --silent --fail --output "${DATAFILE}.tmp" -- "${URL}" \
         && mv -v "${DATAFILE}.tmp" "${DATAFILE}"

       # -- if we made it here, $DATAFILE fetched $URL and wrote completely

    if you don't understand what filesystem atomicity is and/or what 
    it affords you, it is worth it

  * if you are reading a file that you know should have contents
    check it for non-zero size before reading; depends on how 
    paranoid you are

  * and, I'll pick on Dwight's solution (thank you for sharing your 
    example, Dwight)--there can be many sorts of strings which 
    contain four dots, so why not by a bit more assiduous and make
    Python do the work for you; let's assume that your data are 
    normally valid IPs, then use the old easier to ask for 
    forgiveness approach

    Instead of:

      if len(result.split('.')) == 4:

    Perhaps something like this (which assumes False, and/or 
    raises an error if something other than socket.error occurs):

      import socket
      def validate_ip(ipstr):
          ipstr = ipstr.strip()
          try:
              packed = socket.inet_pton(socket.AF_INET,ipstr)      # -- network 
order
              if ipstr == socket.inet_ntop(socket.AF_INET,packed): # -- back to 
str
                  return True
          except socket.error:
              return False
          return False

For those from the old school, you'll note that I used inet_pton() 
and inet_ntop() instead of the rather venerable inet_aton() and 
inet_ntoa().  Why, you might ask?  Well, according to the ancient 
rules of socket programming, the following is true (and ghastly, to 
my mind):

   >>> socket.inet_ntoa(socket.inet_aton('010.010.010.010'))
   '8.8.8.8'

Octal?  No thanks.  I'll specify the address family, thank you very 
much.

-Martin

-- 
Martin A. Brown
http://linux-ip.net/
_______________________________________________
PLUG mailing list
PLUG@lists.pdxlinux.org
http://lists.pdxlinux.org/mailman/listinfo/plug

Reply via email to