P
Prabhu Gurumurthy
Here is a simple program, which queries /var/log/daemon on my OpenBSD box and
gets the list of valid ntp peers.
Questions:
what is the easiest way for me to create lists on the fly, by that I mean like perl
push my @foo, something_from_say_stderr. The reason is as you can ip = [""]
statement before the for loop, I want to avoid that and use list within the
second ip loop, where I extract the ip address. Am I confusing?
regex: I presume this is rather a dumb question, anyways here it comes! as you
can see from my program, pattIp = r\d{1,3}\.... etc, is there any other easy way
to group the reptitions, instead of typing the same regex 4 times.
TIA
Prabhu
-
amazon: [~/working/programs/python/regex]
ttyp4: [109]$ cat syslog.py
#!/usr/bin/env python
# $Id: syslog.py,v 1.6 2006/11/09 06:24:03 pgurumur Exp $
import getopt, re, os, string, sys, time
(dirname, program) = os.path.split(sys.argv[0])
argc = len(sys.argv)
def usage():
print program + ": options"
print "options: "
print " --filename | -f [ name of the file ]"
print " --help | -h [ prints this help ]"
sys.exit(1)
if __name__ == "__main__":
if (argc <= 1):
usage()
else:
try:
opts, args = getopt.getopt(sys.argv[1:], "f:h", ["help", "filename="])
except getopt.GetoptError:
usage()
else:
filename = ""
for optind, optarg in opts:
if optind in ("-f", "--filename"):
filename = optarg
elif optind in ("-h", "--help"):
usage()
if len(filename):
fh = 0
try:
fh = open(filename, "r")
except IOError, (error, message):
print program + ": cannot open " + filename + ": " + message
sys.exit(1)
pattNtp = r'.*ntpd(?=.*now\s+valid)'
count = 0
ip = [""]
pid = 0
for line in fh.readlines():
if re.match(pattNtp, line.strip(), re.IGNORECASE):
string = line.strip()
pattPid = r'\[\d{1,5}\]'
pidMatch = re.search(pattPid, string, re.IGNORECASE)
if pidMatch is not None:
pid = int(re.sub(r'\[|\]', "", pidMatch.group()))
pattIp = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
match = re.search(pattIp, string, re.IGNORECASE)
if match is not None:
ip.append(match.group())
count += 1
print "NTP program started with pid:", pid
print "Number of valid peers:", count
for x in ip:
if len(x):
print x
fh.close()
gets the list of valid ntp peers.
Questions:
what is the easiest way for me to create lists on the fly, by that I mean like perl
push my @foo, something_from_say_stderr. The reason is as you can ip = [""]
statement before the for loop, I want to avoid that and use list within the
second ip loop, where I extract the ip address. Am I confusing?
regex: I presume this is rather a dumb question, anyways here it comes! as you
can see from my program, pattIp = r\d{1,3}\.... etc, is there any other easy way
to group the reptitions, instead of typing the same regex 4 times.
TIA
Prabhu
-
amazon: [~/working/programs/python/regex]
ttyp4: [109]$ cat syslog.py
#!/usr/bin/env python
# $Id: syslog.py,v 1.6 2006/11/09 06:24:03 pgurumur Exp $
import getopt, re, os, string, sys, time
(dirname, program) = os.path.split(sys.argv[0])
argc = len(sys.argv)
def usage():
print program + ": options"
print "options: "
print " --filename | -f [ name of the file ]"
print " --help | -h [ prints this help ]"
sys.exit(1)
if __name__ == "__main__":
if (argc <= 1):
usage()
else:
try:
opts, args = getopt.getopt(sys.argv[1:], "f:h", ["help", "filename="])
except getopt.GetoptError:
usage()
else:
filename = ""
for optind, optarg in opts:
if optind in ("-f", "--filename"):
filename = optarg
elif optind in ("-h", "--help"):
usage()
if len(filename):
fh = 0
try:
fh = open(filename, "r")
except IOError, (error, message):
print program + ": cannot open " + filename + ": " + message
sys.exit(1)
pattNtp = r'.*ntpd(?=.*now\s+valid)'
count = 0
ip = [""]
pid = 0
for line in fh.readlines():
if re.match(pattNtp, line.strip(), re.IGNORECASE):
string = line.strip()
pattPid = r'\[\d{1,5}\]'
pidMatch = re.search(pattPid, string, re.IGNORECASE)
if pidMatch is not None:
pid = int(re.sub(r'\[|\]', "", pidMatch.group()))
pattIp = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
match = re.search(pattIp, string, re.IGNORECASE)
if match is not None:
ip.append(match.group())
count += 1
print "NTP program started with pid:", pid
print "Number of valid peers:", count
for x in ip:
if len(x):
print x
fh.close()