[24452] in Source-Commits

home help back first fref pref prev next nref lref last post

/svn/athena r24043 - in trunk/debathena/debathena: . metrics metrics/debathena metrics/debathena/metrics metrics/debian

daemon@ATHENA.MIT.EDU (Evan Broder)
Sun Oct 4 21:34:39 2009

Date: Sun, 4 Oct 2009 21:34:20 -0400
From: Evan Broder <broder@MIT.EDU>
Message-Id: <200910050134.n951YKxA032015@drugstore.mit.edu>
To: source-commits@mit.edu
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Author: broder
Date: 2009-10-04 21:34:19 -0400 (Sun, 04 Oct 2009)
New Revision: 24043

Added:
   trunk/debathena/debathena/metrics/
   trunk/debathena/debathena/metrics/debathena/
   trunk/debathena/debathena/metrics/debathena/__init__.py
   trunk/debathena/debathena/metrics/debathena/metrics/
   trunk/debathena/debathena/metrics/debathena/metrics/__init__.py
   trunk/debathena/debathena/metrics/debathena/metrics/connector.pxd
   trunk/debathena/debathena/metrics/debathena/metrics/connector.pyx
   trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py
   trunk/debathena/debathena/metrics/debian/
   trunk/debathena/debathena/metrics/debian/25debathena-metrics-startup
   trunk/debathena/debathena/metrics/debian/75debathena-metrics-stop
   trunk/debathena/debathena/metrics/debian/90debathena-metrics
   trunk/debathena/debathena/metrics/debian/changelog
   trunk/debathena/debathena/metrics/debian/compat
   trunk/debathena/debathena/metrics/debian/control
   trunk/debathena/debathena/metrics/debian/copyright
   trunk/debathena/debathena/metrics/debian/debathena-metrics.install
   trunk/debathena/debathena/metrics/debian/pycompat
   trunk/debathena/debathena/metrics/debian/rules
   trunk/debathena/debathena/metrics/install-pkg
   trunk/debathena/debathena/metrics/setup.py
Log:
Create debathena-metrics package for gathering information on how
Athena is being used.

This package will start	a daemon at the	beginning of a login
session. This daemon captures any path executed	  by the user over the
course of their session, any packages installed	  by the user, and the
total length of	the login session.

The collected information is sent to wslogger when the user is logged
out.



Added: trunk/debathena/debathena/metrics/debathena/__init__.py
===================================================================

Added: trunk/debathena/debathena/metrics/debathena/metrics/__init__.py
===================================================================

Added: trunk/debathena/debathena/metrics/debathena/metrics/connector.pxd
===================================================================
--- trunk/debathena/debathena/metrics/debathena/metrics/connector.pxd	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debathena/metrics/connector.pxd	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,116 @@
+cdef extern from "errno.h":
+    int errno
+
+cdef extern from "stdlib.h":
+    ctypedef long size_t
+
+cdef extern from "sys/types.h":
+    ctypedef long pid_t
+
+cdef extern from "sys/socket.h":
+    ctypedef long socklen_t
+    struct sockaddr:
+        pass
+
+    int socket(int, int, int)
+    int bind(int, sockaddr *, socklen_t)
+    size_t send(int, void *, size_t, int)
+    size_t recvfrom(int, void *, size_t, int, sockaddr *, socklen_t *)
+
+    enum:
+        SOCK_DGRAM
+        PF_NETLINK
+        AF_NETLINK
+
+cdef extern from "linux/netlink.h":
+    enum:
+        NETLINK_CONNECTOR
+        NLMSG_DONE
+    struct sockaddr_nl:
+        unsigned long nl_family
+        unsigned long nl_pad
+        unsigned long nl_pid
+        unsigned long nl_groups
+    struct nlmsghdr:
+        long nlmsg_len
+        long nlmsg_type
+        long nlmsg_flags
+        long nlmsg_seq
+        long nlmsg_pid
+    long NLMSG_LENGTH(long)
+    void * NLMSG_DATA(void *)
+
+cdef extern from "linux/connector.h":
+    enum:
+        CN_IDX_PROC
+        CN_VAL_PROC
+    struct cb_id:
+        long idx
+        long val
+    struct cn_msg:
+        cb_id id
+        long seq
+        long ack
+        long len
+        long flags
+        char data[0]
+
+cdef extern from "linux/cn_proc.h":
+    enum proc_cn_mcast_op:
+        PROC_CN_MCAST_LISTEN
+        PROC_CN_MCAST_IGNORE
+
+    enum what:
+        C_PROC_EVENT_NONE "PROC_EVENT_NONE"
+        C_PROC_EVENT_FORK "PROC_EVENT_FORK"
+        C_PROC_EVENT_EXEC "PROC_EVENT_EXEC"
+        C_PROC_EVENT_UID "PROC_EVENT_UID"
+        C_PROC_EVENT_GID "PROC_EVENT_GID"
+        C_PROC_EVENT_EXIT "PROC_EVENT_EXIT"
+
+    struct ack_proc_event:
+        long err
+    struct fork_proc_event:
+        pid_t parent_pid
+        pid_t parent_tgid
+        pid_t child_pid
+        pid_t child_tgid
+    struct exec_proc_event:
+        pid_t process_pid
+        pid_t process_tgid
+    union id_proc_event_r:
+        long ruid
+        long rgid
+    union id_proc_event_e:
+        long euid
+        long egid
+    struct id_proc_event:
+        pid_t process_pid
+        pid_t process_tgid
+        id_proc_event_r r
+        id_proc_event_e e
+    struct exit_proc_event:
+        pid_t process_pid
+        pid_t process_tgid
+        long exit_code
+        long exit_signal
+
+    union event_data:
+        ack_proc_event ack
+        fork_proc_event fork
+        exec_proc_event exec_ "exec"
+        id_proc_event id_ "id"
+        exit_proc_event exit_ "exit"
+
+    struct proc_event:
+        what what
+        long cpu
+        long timestamp_ns
+        event_data event_data
+
+cdef extern from "string.h":
+    char * strerror(int)
+
+cdef extern from "unistd.h":
+    pid_t getpid()
+    int close(int)

Added: trunk/debathena/debathena/metrics/debathena/metrics/connector.pyx
===================================================================
--- trunk/debathena/debathena/metrics/debathena/metrics/connector.pyx	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debathena/metrics/connector.pyx	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,197 @@
+PROC_EVENT_NONE = C_PROC_EVENT_NONE
+PROC_EVENT_FORK = C_PROC_EVENT_FORK
+PROC_EVENT_EXEC = C_PROC_EVENT_EXEC
+PROC_EVENT_UID = C_PROC_EVENT_UID
+PROC_EVENT_GID = C_PROC_EVENT_GID
+PROC_EVENT_EXIT = C_PROC_EVENT_EXIT
+
+
+cdef class ProcEvent:
+    cdef public long what
+    cdef public long cpu
+    cdef public long timestamp_ns
+
+
+cdef class AckProcEvent(ProcEvent):
+    cdef public long err
+
+    def __repr__(self):
+        return "<AckProcEvent err=%d>" % self.err
+
+
+cdef class ForkProcEvent(ProcEvent):
+    cdef public long parent_pid
+    cdef public long parent_tgid
+    cdef public long child_pid
+    cdef public long child_tgid
+
+    def __repr__(self):
+        return "<ForkProcEvent ppid=%d ptgid=%d pid=%d tgid=%d>" % (
+            self.parent_pid,
+            self.parent_tgid,
+            self.child_pid,
+            self.child_tgid)
+
+
+cdef class ExecProcEvent(ProcEvent):
+    cdef public long process_pid
+    cdef public long process_tgid
+
+    def __repr__(self):
+        return "<ExecProcEvent pid=%d tgid=%d>" % (
+            self.process_pid,
+            self.process_tgid)
+
+
+cdef class UidProcEvent(ProcEvent):
+    cdef public long process_pid
+    cdef public long process_tgid
+    cdef public long ruid
+    cdef public long euid
+
+    def __repr__(self):
+        return "<UidProcEvent pid=%d tgid=%d ruid=%d euid=%d>" % (
+            self.process_pid,
+            self.process_tgid,
+            self.ruid,
+            self.euid)
+
+
+cdef class GidProcEvent(ProcEvent):
+    cdef public long process_pid
+    cdef public long process_tgid
+    cdef public long rgid
+    cdef public long egid
+
+    def __repr__(self):
+        return "<GidProcEvent pid=%d tgid=%d rgid=%d egid=%d>" % (
+            self.process_pid,
+            self.process_tgid,
+            self.rgid,
+            self.egid)
+
+
+cdef class ExitProcEvent(ProcEvent):
+    cdef public long process_pid
+    cdef public long process_tgid
+    cdef public long exit_code
+    cdef public long exit_signal
+
+    def __repr__(self):
+        return "<ExitProcEvent pid=%d tgid=%d code=%d signal=%d>" % (
+            self.process_pid,
+            self.process_tgid,
+            self.exit_code,
+            self.exit_signal)
+
+
+cdef class Connector:
+    cdef int sock
+    cdef public object closed
+
+    def __cinit__(self):
+        self.closed = False
+
+        cdef int flags
+        cdef sockaddr_nl my_addr
+        cdef char buf[4096]
+        cdef nlmsghdr *nl_hdr
+        cdef cn_msg *cn_hdr
+        cdef proc_cn_mcast_op *mcop_msg
+
+        self.sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR)
+
+        my_addr.nl_family = AF_NETLINK
+        my_addr.nl_groups = CN_IDX_PROC
+        my_addr.nl_pid = getpid()
+
+        if bind(self.sock, <sockaddr *>&my_addr, sizeof(my_addr)) < 0:
+            raise IOError(errno, strerror(errno))
+
+        nl_hdr = <nlmsghdr *>buf
+        nl_hdr.nlmsg_len = NLMSG_LENGTH(sizeof(cn_msg) + sizeof(proc_cn_mcast_op))
+        nl_hdr.nlmsg_type = NLMSG_DONE
+        nl_hdr.nlmsg_flags = 0
+        nl_hdr.nlmsg_seq = 0
+        nl_hdr.nlmsg_pid = getpid()
+
+        cn_hdr = <cn_msg *>NLMSG_DATA(nl_hdr)
+        cn_hdr.id.idx = CN_IDX_PROC
+        cn_hdr.id.val = CN_VAL_PROC
+        cn_hdr.seq = 0
+        cn_hdr.ack = 0
+        cn_hdr.len = sizeof(proc_cn_mcast_op)
+
+        mcop_msg = <proc_cn_mcast_op *>cn_hdr.data
+        mcop_msg[0] = PROC_CN_MCAST_LISTEN
+
+        if send(self.sock, nl_hdr, nl_hdr.nlmsg_len, 0) != nl_hdr.nlmsg_len:
+            raise IOError(errno, strerror(errno))
+
+    def __dealloc__(self):
+        if not self.closed:
+            close(self.sock)
+
+    def fileno(self):
+        return self.sock
+
+    def close(self):
+        if not self.closed:
+            close(self.sock)
+            self.closed = True
+
+    def recv_event(self):
+        cdef char buf[4096]
+        cdef sockaddr_nl from_addr
+        cdef socklen_t s
+        cdef proc_event *ev
+        cdef object ret
+
+        while True:
+            from_addr.nl_family = AF_NETLINK
+            from_addr.nl_groups = CN_IDX_PROC
+            from_addr.nl_pid = 1
+            s = sizeof(from_addr)
+
+            if recvfrom(self.sock, buf, sizeof(buf), 0,
+                        <sockaddr *>&from_addr, &s) == -1:
+                raise IOError(errno, strerror(errno))
+
+            ev = <proc_event *>((<cn_msg *>NLMSG_DATA(buf)).data)
+
+            if ev.what == PROC_EVENT_FORK:
+                ret = ForkProcEvent()
+                ret.parent_pid = ev.event_data.fork.parent_pid
+                ret.parent_tgid = ev.event_data.fork.parent_tgid
+                ret.child_pid = ev.event_data.fork.child_pid
+                ret.child_tgid = ev.event_data.fork.child_tgid
+            elif ev.what == PROC_EVENT_EXEC:
+                ret = ExecProcEvent()
+                ret.process_pid = ev.event_data.exec_.process_pid
+                ret.process_tgid = ev.event_data.exec_.process_tgid
+            elif ev.what == PROC_EVENT_UID:
+                ret = UidProcEvent()
+                ret.process_pid = ev.event_data.id_.process_pid
+                ret.process_tgid = ev.event_data.id_.process_tgid
+                ret.ruid = ev.event_data.id_.r.ruid
+                ret.euid = ev.event_data.id_.e.euid
+            elif ev.what == PROC_EVENT_GID:
+                ret = GidProcEvent()
+                ret.process_pid = ev.event_data.id_.process_pid
+                ret.process_tgid = ev.event_data.id_.process_tgid
+                ret.rgid = ev.event_data.id_.r.rgid
+                ret.egid = ev.event_data.id_.e.egid
+            elif ev.what == PROC_EVENT_EXIT:
+                ret = ExitProcEvent()
+                ret.process_pid = ev.event_data.exit_.process_pid
+                ret.process_tgid = ev.event_data.exit_.process_tgid
+                ret.exit_code = ev.event_data.exit_.exit_code
+                ret.exit_signal = ev.event_data.exit_.exit_signal
+            else:
+                continue
+
+            ret.what = ev.what
+            ret.cpu = ev.cpu
+            ret.timestamp_ns = ev.timestamp_ns
+
+            return ret

Added: trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py
===================================================================
--- trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,134 @@
+#!/usr/bin/python
+"""Debathena metrics collection.
+Usage: debathena-metrics
+
+This script wraps an X session, collecting statistics on what programs
+are run by the user over the course of the session.
+
+This script also collects notifications about software being installed
+through apt.
+
+At the end of the login session, the collected information is batched
+and sent to the Athena syslog server, along with the duration of the
+login session.
+"""
+
+
+import errno
+import fcntl
+import os
+import pwd
+import socket
+import syslog
+import time
+import uuid
+
+import dbus
+import dbus.mainloop.glib
+import dbus.service
+import gobject
+
+from debathena.metrics import connector
+
+
+DBUS_OBJECT = '/'
+DBUS_INTERFACE = 'edu.mit.debathena.Metrics'
+
+
+LOG_LEVEL = syslog.LOG_DAEMON | syslog.LOG_INFO
+LOG_SERVER = ('wslogger.mit.edu', 514)
+
+
+def make_non_blocking(fd):
+    flags = fcntl.fcntl(fd, fcntl.F_GETFL)
+    fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK)
+
+
+class Metrics(dbus.service.Object):
+    def __init__(self, loop, uid, *args):
+        super(Metrics, self).__init__(*args)
+
+        self.loop = loop
+        self.uid = uid
+        self.installed_packages = set()
+        self.executed_programs = set()
+        self.start_time = time.time()
+        self.session_uuid = str(uuid.uuid4())
+
+        proc_conn = connector.Connector()
+        make_non_blocking(proc_conn)
+        gobject.io_add_watch(
+            proc_conn,
+            gobject.IO_IN,
+            self.run_program,
+            )
+
+        dbus.SystemBus().add_signal_receiver(
+            self.install_package,
+            signal_name='InstallPackage',
+            dbus_interface=DBUS_INTERFACE,
+            path=DBUS_OBJECT,
+            )
+
+        dbus.SystemBus().add_signal_receiver(
+            self.logout,
+            signal_name='LogOut',
+            dbus_interface=DBUS_INTERFACE,
+            path=DBUS_OBJECT,
+            )
+
+    def run_program(self, fd, cond):
+        while True:
+            try:
+                ev = fd.recv_event()
+            except IOError, e:
+                if e.errno == errno.EAGAIN:
+                    break
+                raise
+
+            if ev.what == connector.PROC_EVENT_EXEC:
+                try:
+                    prog = os.readlink("/proc/%d/exe" % ev.process_pid)
+                    self.executed_programs.add(prog)
+                except OSError, e:
+                    if e.errno == errno.ENOENT:
+                        continue
+                    raise
+
+        return True
+
+    def install_package(self, package):
+        self.installed_packages.add(str(package))
+
+    def logout(self):
+        session_length = time.time() - self.start_time
+
+        lines = []
+        lines.append('session_len: %d' % session_length)
+
+        for p in self.installed_packages:
+            lines.append('installed_package: %s' % p)
+
+        for p in self.executed_programs:
+            lines.append('executed_programs: %s' % p)
+
+        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+        for l in lines:
+            s.sendto('<%d> debathena-metrics %s: %s\n' % (LOG_LEVEL, self.session_uuid, l),
+                     LOG_SERVER)
+
+        self.loop.quit()
+
+
+def main():
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+    uid = pwd.getpwnam(os.environ['USER']).pw_uid
+
+    loop = gobject.MainLoop()
+    m = Metrics(loop, uid)
+    loop.run()
+
+
+if __name__ == '__main__':
+    main()


Property changes on: trunk/debathena/debathena/metrics/debathena/metrics/gatherer.py
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/debathena/debathena/metrics/debian/25debathena-metrics-startup
===================================================================
--- trunk/debathena/debathena/metrics/debian/25debathena-metrics-startup	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/25debathena-metrics-startup	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,5 @@
+# This script is sourced (not executed) as root at the beginning of a
+# gdm login session.  gdm blocks until it finishes.
+
+# Startup the metrics gathering daemon
+daemon -e "USER=$USER" -- python -m debathena.metrics.gatherer

Added: trunk/debathena/debathena/metrics/debian/75debathena-metrics-stop
===================================================================
--- trunk/debathena/debathena/metrics/debian/75debathena-metrics-stop	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/75debathena-metrics-stop	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,6 @@
+# This script is sourced (not executed) as root at the end of a gdm
+# login session.  gdm blocks until it finishes.  DISPLAY is set but
+# the X server might be dead in some cases.
+
+# Collect and send off metrics
+dbus-send --system / edu.mit.debathena.Metrics.LogOut

Added: trunk/debathena/debathena/metrics/debian/90debathena-metrics
===================================================================
--- trunk/debathena/debathena/metrics/debian/90debathena-metrics	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/90debathena-metrics	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1 @@
+DPkg::Pre-Install-Pkgs {"/usr/lib/debathena-metrics/install-pkg || :";};
\ No newline at end of file

Added: trunk/debathena/debathena/metrics/debian/changelog
===================================================================
--- trunk/debathena/debathena/metrics/debian/changelog	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/changelog	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,5 @@
+debathena-metrics (1.0) unstable; urgency=low
+
+  * Initial release.
+
+ -- Evan Broder <broder@mit.edu>  Sun, 30 Aug 2009 17:14:06 -0400

Added: trunk/debathena/debathena/metrics/debian/compat
===================================================================
--- trunk/debathena/debathena/metrics/debian/compat	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/compat	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1 @@
+4

Added: trunk/debathena/debathena/metrics/debian/control
===================================================================
--- trunk/debathena/debathena/metrics/debian/control	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/control	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,19 @@
+Source: debathena-metrics
+Section: debathena/misc
+Priority: extra
+Maintainer: Debathena Project <debathena@mit.edu>
+Build-Depends: cdbs (>= 0.4.43), debhelper (>= 5.0.37.2),
+ python-all-dev (>= 2.3.5-11), python-support (>= 0.5.3),
+ python-pyrex, python-setuptools
+Standards-Version: 3.8.3
+
+Package: debathena-metrics
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends},
+ daemon, dbus
+Conflicts: ${diverted-files}
+Description: Collect metrics on Athena usage
+ This package collects, anonymizes, and centrally logs statistics on
+ how Athena cluster machines are being used. This information is used
+ both to help guide inclusion or exclusion of software, justify
+ devoting resources to Athena development, and focus those resources.

Added: trunk/debathena/debathena/metrics/debian/copyright
===================================================================
--- trunk/debathena/debathena/metrics/debian/copyright	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/copyright	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,18 @@
+The Athena source code was obtained from the Athena SVN repository at
+<svn://debathena.mit.edu/athena/trunk>, and is licensed as follows:
+
+  Copyright © 2008 by the Massachusetts Institute of Technology.
+
+  Permission to use, copy, modify, and distribute this software and
+  its documentation for any purpose and without fee is hereby granted,
+  provided that the above copyright notice appear in all copies and
+  that both that copyright notice and this permission notice appear in
+  supporting documentation, and that the name of M.I.T. not be used in
+  advertising or publicity pertaining to distribution of the software
+  without specific, written prior permission.  M.I.T. makes no
+  representations about the suitability of this software for any
+  purpose.  It is provided "as is" without express or implied
+  warranty.
+
+The Debian packaging is Copyright © 2008 Massachusetts Institute of
+Technology, and has the same license as the original software.

Added: trunk/debathena/debathena/metrics/debian/debathena-metrics.install
===================================================================
--- trunk/debathena/debathena/metrics/debian/debathena-metrics.install	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/debathena-metrics.install	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,4 @@
+debian/25debathena-metrics-startup usr/share/debathena-gdm-config/PreSession.d
+debian/75debathena-metrics-stop usr/share/debathena-gdm-config/PostSession.d
+debian/90debathena-metrics etc/apt/apt.conf.d
+install-pkg usr/lib/debathena-metrics

Added: trunk/debathena/debathena/metrics/debian/pycompat
===================================================================
--- trunk/debathena/debathena/metrics/debian/pycompat	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/pycompat	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1 @@
+2

Added: trunk/debathena/debathena/metrics/debian/rules
===================================================================
--- trunk/debathena/debathena/metrics/debian/rules	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/debian/rules	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,9 @@
+#!/usr/bin/make -f
+
+DEB_PYTHON_SYSTEM=pysupport
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/python-distutils.mk
+
+clean::
+	rm -rf debathena.metrics.egg-info debathena/metrics/connector.c


Property changes on: trunk/debathena/debathena/metrics/debian/rules
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/debathena/debathena/metrics/install-pkg
===================================================================
--- trunk/debathena/debathena/metrics/install-pkg	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/install-pkg	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+while read pkg_path; do
+    pkg="$(echo "$pkg_path" | sed -e 's#.*/##; s#_.*##')"
+    dbus-send --system edu.mit.debathena.Metrics.InstallPackage "string:$pkg"
+done


Property changes on: trunk/debathena/debathena/metrics/install-pkg
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/debathena/debathena/metrics/setup.py
===================================================================
--- trunk/debathena/debathena/metrics/setup.py	2009-10-04 03:25:13 UTC (rev 24042)
+++ trunk/debathena/debathena/metrics/setup.py	2009-10-05 01:34:19 UTC (rev 24043)
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+
+from setuptools import setup, find_packages
+from distutils.extension import Extension
+from Pyrex.Distutils import build_ext
+
+try:
+    from debian_bundle.changelog import Changelog
+    from debian_bundle.deb822 import Deb822
+    from email.utils import parseaddr
+
+    version = Changelog(open(path.join(path.dirname(__file__), 'debian/changelog')).read()).\
+              get_version().full_version
+
+    maintainer_full = Deb822(open(path.join(path.dirname(__file__), 'debian/control')))['Maintainer']
+    maintainer, maintainer_email = parseaddr(maintainer_full)
+except:
+    version = '0.0.0'
+    maintainer = ''
+    maintainer_email = ''
+
+setup(
+    name="debathena.metrics",
+    version=version,
+    description="Metrics gatherer for Debathena cluster machines.",
+    maintainer=maintainer,
+    maintainer_email=maintainer_email,
+    license="MIT",
+    requires=['Pyrex'],
+    packages=find_packages(),
+    ext_modules=[
+        Extension("debathena.metrics.connector",
+                  ["debathena/metrics/connector.pyx"])
+        ],
+    cmdclass= {"build_ext": build_ext}
+)


Property changes on: trunk/debathena/debathena/metrics/setup.py
___________________________________________________________________
Name: svn:executable
   + *


home help back first fref pref prev next nref lref last post