From 446b7ecea2e1635bd66087894f23e3a45eb7b607 Mon Sep 17 00:00:00 2001 From: Aaron Brashears Date: Fri, 8 Feb 2008 23:43:16 +0000 Subject: Result of svn merge -r79554:79558 svn+ssh://svn/svn/linden/branches/merge-dp into release --- indra/lib/python/indra/base/metrics.py | 23 ++++-- indra/lib/python/indra/util/llsubprocess.py | 106 ++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 indra/lib/python/indra/util/llsubprocess.py (limited to 'indra/lib/python') diff --git a/indra/lib/python/indra/base/metrics.py b/indra/lib/python/indra/base/metrics.py index 751757d5b0..d26f571be7 100644 --- a/indra/lib/python/indra/base/metrics.py +++ b/indra/lib/python/indra/base/metrics.py @@ -31,12 +31,23 @@ $/LicenseInfo$ import sys from indra.base import llsd -def log(location, stats, file=None): - "Write a standard llmetrics log" - metrics = {'location':location, 'stats':stats} - if file is None: +_sequence_id = 0 + +def record_metrics(table, stats, dest=None): + "Write a standard metrics log" + _log("LLMETRICS", table, stats, dest) + +def record_event(table, data, dest=None): + "Write a standard logmessage log" + _log("LLLOGMESSAGE", table, data, dest) + +def _log(header, table, data, dest): + if dest is None: # do this check here in case sys.stdout changes at some # point. as a default parameter, it will never be # re-evaluated. - file = sys.stdout - print >>file, "LLMETRICS:", llsd.format_notation(metrics) + dest = sys.stdout + global _sequence_id + print >>dest, header, "(" + str(_sequence_id) + ")", + print >>dest, table, llsd.format_notation(data) + _sequence_id += 1 diff --git a/indra/lib/python/indra/util/llsubprocess.py b/indra/lib/python/indra/util/llsubprocess.py new file mode 100644 index 0000000000..b6082de74a --- /dev/null +++ b/indra/lib/python/indra/util/llsubprocess.py @@ -0,0 +1,106 @@ +"""\ +@file llsubprocess.py +@author Phoenix +@date 2008-01-18 +@brief The simplest possible wrapper for a common sub-process paradigm. + +$LicenseInfo:firstyear=2007&license=mit$ + +Copyright (c) 2007, Linden Research, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +$/LicenseInfo$ +""" + +import os +import popen2 +import time +import select + +class Timeout(RuntimeError): + "Exception raised when a subprocess times out." + pass + +def run(command, args=None, data=None, timeout=None): + """\ +@brief Run command with arguments + +This is it. This is the function I want to run all the time when doing +subprocces, but end up copying the code everywhere. none of the +standard commands are secure and provide a way to specify input, get +all the output, and get the result. +@param command A string specifying a process to launch. +@param args Arguments to be passed to command. Must be list, tuple or None. +@param data input to feed to the command. +@param timeout Maximum number of many seconds to run. +@return Returns (result, stdout, stderr) from process. +""" + cmd = [command] + if args: + cmd.extend([str(arg) for arg in args]) + #print "cmd: ","' '".join(cmd) + child = popen2.Popen3(cmd, True) + #print child.pid + out = [] + err = [] + result = -1 + time_left = timeout + tochild = [child.tochild.fileno()] + while True: + time_start = time.time() + #print "time:",time_left + p_in, p_out, p_err = select.select( + [child.fromchild.fileno(), child.childerr.fileno()], + tochild, + [], + time_left) + if p_in: + new_line = os.read(child.fromchild.fileno(), 32 * 1024) + if new_line: + #print "line:",new_line + out.append(new_line) + new_line = os.read(child.childerr.fileno(), 32 * 1024) + if new_line: + #print "error:", new_line + err.append(new_line) + if p_out: + if data: + #print "p_out" + bytes = os.write(child.tochild.fileno(), data) + data = data[bytes:] + if len(data) == 0: + data = None + tochild = [] + child.tochild.close() + result = child.poll() + if result != -1: + child.tochild.close() + child.fromchild.close() + child.childerr.close() + break + if time_left is not None: + time_left -= (time.time() - time_start) + if time_left < 0: + raise Timeout + #print "result:",result + out = ''.join(out) + #print "stdout:", out + err = ''.join(err) + #print "stderr:", err + return result, out, err -- cgit v1.2.3