summaryrefslogtreecommitdiff
path: root/indra/lib
diff options
context:
space:
mode:
authorAaron Brashears <aaronb@lindenlab.com>2008-02-08 23:43:16 +0000
committerAaron Brashears <aaronb@lindenlab.com>2008-02-08 23:43:16 +0000
commit446b7ecea2e1635bd66087894f23e3a45eb7b607 (patch)
tree7727e7cca1f4b75f55a722ca48808db8fd2ec947 /indra/lib
parent8bd6a0b3217ea5614d2a29195e528aa8314f6342 (diff)
Result of svn merge -r79554:79558 svn+ssh://svn/svn/linden/branches/merge-dp into release
Diffstat (limited to 'indra/lib')
-rw-r--r--indra/lib/python/indra/base/metrics.py23
-rw-r--r--indra/lib/python/indra/util/llsubprocess.py106
2 files changed, 123 insertions, 6 deletions
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