[CentralOH] parsing Windows command line output
Eric Lake
ericlake at gmail.com
Wed Jul 23 17:40:26 CEST 2008
Neil,
That seems to do exactly what I need it to do. Now I just need to get
to a point where I can understand what the heck it is doing :)
On Wed, Jul 23, 2008 at 11:27 AM, Neil Ludban <nludban at osc.edu> wrote:
> On Wed, 23 Jul 2008 07:52:49 -0400
> "Eric Lake" <ericlake at gmail.com> wrote:
>> I have been looking for a way to monitor a Windows cluster that we
>> have at work. I was really hoping for a good wmi class that I could
>> use from my XP machine to do it but I have not been lucky finding one.
>> I did however come across the 'cluster' command. I am thinking that I
>> could just call that from within my python code and parse the output
>> to get what I need. I want to get all of the data from the output and
>> then put it in a database. I can not see how to split the lines up
>> though. It would be easy if it was comma delimited but it seems to use
>> a varying number of spaces. My only thought is that I could do a split
>> on anything that is more than 2 spaces.
>
> #!/usr/local/bin/python
>
> import re
>
> fin = open('cluster.txt', 'r')
>
> fin.readline() # Listing status for all available resources:
> fin.readline() #
> fin.readline() # Resource Group Node Status
> nom_len = [ len(x) # - - - -
> for x in re.findall('-+', fin.readline().strip()) ]
> #print nom_len # [20, 20, 15, 6]
>
> def combinations(items, n):
> if len(items) < n:
> return
> if n == 1:
> for i in items:
> yield [ i ]
> return
> for i in range(len(items)):
> for rest in combinations(items[i+1:], n-1):
> yield [ items[i] ] + rest
> return
>
> #for c in combinations([ 'a', 'b', 'c', 'd' ], 2):
> # print c
>
> def score(cols):
> s = 100.0
> # small penalty if too long
> s -= 0.20 * sum([ max(len(c) - n, 0.0)
> for c, n in zip(cols, nom_len) ])
> # large penalty if too short
> s -= 0.80 * sum([ max(n - len(c), 0.0)
> for c, n in zip(cols, nom_len) ])
> # bonus for trailing whitespace?
> return s
>
> for line in fin.readlines():
> line = line.strip()
> cols = re.findall('\s+|[^\s]+', line)
> #print cols
> seps = range(1, len(cols), 2)
> #print [ cols[i] for i in seps ]
> best_cols = None
> best_score = None
> for seps in combinations(seps, 3):
> tmp = [ ]
> a = 0
> for b in seps:
> tmp.append(''.join(cols[a:b+1]))
> a = b + 1
> tmp.append(''.join(cols[a:]))
> #print tmp
> s = score(tmp)
> if ((best_cols is None) or (s > best_score)):
> best_cols = tmp
> best_score = s
> print [ c.strip() for c in best_cols ]
>
> #--#
>
--
Thanks,
Eric Lake
More information about the CentralOH
mailing list