You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2009/02/24 15:15:29 UTC

svn commit: r747389 - in /qpid/trunk/qpid: cpp/src/qpid/broker/ cpp/src/qpid/client/ cpp/src/qpid/sys/ cpp/src/qpid/sys/posix/ cpp/src/qpid/sys/windows/ python/qpid/ ruby/lib/qpid/ specs/

Author: tross
Date: Tue Feb 24 14:15:28 2009
New Revision: 747389

URL: http://svn.apache.org/viewvc?rev=747389&view=rev
Log:
QPID-1676 - Added client process name and pid to connection object for management.
            Supported in C++, Python, and Ruby clients.
            Still needs to be added to the Java clients.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h
    qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/SystemInfo.h
    qpid/trunk/qpid/cpp/src/qpid/sys/posix/SystemInfo.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/windows/SystemInfo.cpp
    qpid/trunk/qpid/python/qpid/delegates.py
    qpid/trunk/qpid/ruby/lib/qpid/delegates.rb
    qpid/trunk/qpid/specs/management-schema.xml

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h Tue Feb 24 14:15:28 2009
@@ -125,6 +125,8 @@
     management::ManagementAgent* agent;
     Timer& timer;
     boost::intrusive_ptr<TimerTask> heartbeatTimer;
+  public:
+    qmf::org::apache::qpid::broker::Connection* getMgmtObject() { return mgmtObject; }
 };
 
 }}

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp Tue Feb 24 14:15:28 2009
@@ -46,6 +46,9 @@
 const std::string QPID_FED_LINK = "qpid.fed_link";
 const std::string QPID_FED_TAG  = "qpid.federation_tag";
 const std::string SESSION_FLOW_CONTROL("qpid.session_flow");
+const std::string CLIENT_PROCESS_NAME("qpid.client_process");
+const std::string CLIENT_PID("qpid.client_pid");
+const std::string CLIENT_PPID("qpid.client_ppid");
 const int SESSION_FLOW_CONTROL_VER = 1;
 }
 
@@ -141,9 +144,22 @@
         }
         QPID_LOG(info, "Connection is a federation link");
     }
-    if ( clientProperties.getAsInt(SESSION_FLOW_CONTROL) == SESSION_FLOW_CONTROL_VER ) {
+    if (clientProperties.getAsInt(SESSION_FLOW_CONTROL) == SESSION_FLOW_CONTROL_VER) {
         connection.setClientThrottling();
     }
+
+    if (connection.getMgmtObject() != 0) {
+        string procName = clientProperties.getAsString(CLIENT_PROCESS_NAME);
+        uint32_t pid = clientProperties.getAsInt(CLIENT_PID);
+        uint32_t ppid = clientProperties.getAsInt(CLIENT_PPID);
+
+        if (!procName.empty())
+            connection.getMgmtObject()->set_remoteProcessName(procName);
+        if (pid != 0)
+            connection.getMgmtObject()->set_remotePid(pid);
+        if (ppid != 0)
+            connection.getMgmtObject()->set_remoteParentPid(ppid);
+    }
 }
 
 void ConnectionHandler::Handler::secureOk(const string& response)

Modified: qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp Tue Feb 24 14:15:28 2009
@@ -28,6 +28,7 @@
 #include "qpid/framing/reply_exceptions.h"
 #include "qpid/log/Helpers.h"
 #include "qpid/log/Statement.h"
+#include "qpid/sys/SystemInfo.h"
 
 using namespace qpid::client;
 using namespace qpid::framing;
@@ -52,6 +53,9 @@
 const std::string INVALID_STATE_CLOSE_OK("close-ok received in invalid state");
 
 const std::string SESSION_FLOW_CONTROL("qpid.session_flow");
+const std::string CLIENT_PROCESS_NAME("qpid.client_process");
+const std::string CLIENT_PID("qpid.client_pid");
+const std::string CLIENT_PPID("qpid.client_ppid");
 const int SESSION_FLOW_CONTROL_VER = 1;
 }
 
@@ -80,6 +84,9 @@
     FINISHED.insert(CLOSED);
     
     properties.setInt(SESSION_FLOW_CONTROL, SESSION_FLOW_CONTROL_VER);
+    properties.setString(CLIENT_PROCESS_NAME, sys::SystemInfo::getProcessName());
+    properties.setInt(CLIENT_PID, sys::SystemInfo::getProcessId());
+    properties.setInt(CLIENT_PPID, sys::SystemInfo::getParentProcessId());
 }
 
 void ConnectionHandler::incoming(AMQFrame& frame)

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/SystemInfo.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/SystemInfo.h?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/SystemInfo.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/SystemInfo.h Tue Feb 24 14:15:28 2009
@@ -73,6 +73,11 @@
      */
     uint32_t getParentProcessId();
 
+    /**
+     * Get the name of the current process (i.e. the name of the executable)
+     */
+    std::string getProcessName();
+
 
 }}} // namespace qpid::sys::SystemInfo
 

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/posix/SystemInfo.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/SystemInfo.cpp?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/SystemInfo.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/SystemInfo.cpp Tue Feb 24 14:15:28 2009
@@ -27,6 +27,9 @@
 #include <arpa/inet.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <iostream>
+#include <fstream>
+#include <sstream>
 
 #ifndef HOST_NAME_MAX
 #  define HOST_NAME_MAX 256
@@ -104,6 +107,27 @@
     return (uint32_t) ::getppid();
 }
 
+string SystemInfo::getProcessName()
+{
+    uint32_t pid = getProcessId();
+    string value;
+
+    stringstream pathStream;
+    pathStream << "/proc/" << pid << "/status";
+    ifstream input(pathStream.str().c_str());
+    if (input.good()) {
+        while (!input.eof()) {
+            string key;
+            input >> key;
+            if (key == "Name:") {
+                input >> value;
+                break;
+            }
+        }
+        input.close();
+    }
 
+    return value;
+}
 
 }} // namespace qpid::sys

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/windows/SystemInfo.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/windows/SystemInfo.cpp?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/SystemInfo.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/windows/SystemInfo.cpp Tue Feb 24 14:15:28 2009
@@ -155,6 +155,25 @@
         machine = "unknown";
         break;
     }
+
+uint32_t SystemInfo::getProcessId()
+{
+    // TODO: Provide Windows implementation
+    return 0;
+}
+
+uint32_t SystemInfo::getParentProcessId()
+{
+    // TODO: Provide Windows implementation
+    return 0;
+}
+
+std::string SystemInfo::getProcessName()
+{
+    // TODO: Provide Windows implementation
+    return std::string();
+}
+
 }
 
 }} // namespace qpid::sys

Modified: qpid/trunk/qpid/python/qpid/delegates.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/delegates.py?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/delegates.py (original)
+++ qpid/trunk/qpid/python/qpid/delegates.py Tue Feb 24 14:15:28 2009
@@ -21,6 +21,7 @@
 from util import notify
 from datatypes import RangedSet
 from logging import getLogger
+import sys
 
 log = getLogger("qpid.io.ctl")
 
@@ -141,7 +142,10 @@
 
   PROPERTIES = {"product": "qpid python client",
                 "version": "development",
-                "platform": os.name}
+                "platform": os.name,
+                "qpid.client_process": os.path.basename(sys.argv[0]),
+                "qpid.client_pid": os.getpid(),
+                "qpid.client_ppid": os.getppid()}
 
   def __init__(self, connection, username="guest", password="guest",
                mechanism="PLAIN", heartbeat=None):

Modified: qpid/trunk/qpid/ruby/lib/qpid/delegates.rb
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/ruby/lib/qpid/delegates.rb?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/ruby/lib/qpid/delegates.rb (original)
+++ qpid/trunk/qpid/ruby/lib/qpid/delegates.rb Tue Feb 24 14:15:28 2009
@@ -168,7 +168,10 @@
       # analog in Ruby
       PROPERTIES = {"product"  => "qpid python client",
         "version"  => "development",
-        "platform" => Config::CONFIG["build_os"]}
+        "platform" => Config::CONFIG["build_os"],
+        "qpid.client_process" => File.basename($0),
+        "qpid.client_pid" => Process.pid,
+        "qpid.client_ppid" => Process.ppid}
 
 
       def initialize(connection, args)

Modified: qpid/trunk/qpid/specs/management-schema.xml
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/specs/management-schema.xml?rev=747389&r1=747388&r2=747389&view=diff
==============================================================================
--- qpid/trunk/qpid/specs/management-schema.xml (original)
+++ qpid/trunk/qpid/specs/management-schema.xml Tue Feb 24 14:15:28 2009
@@ -206,6 +206,9 @@
     <property name="SystemConnection"   type="bool"   access="RC" desc="Infrastucture/ Inter-system connection (Cluster, Federation, ...)"/>
     <property name="federationLink"     type="bool"   access="RO" desc="Is this a federation link"/>
     <property name="authIdentity"       type="sstr"   access="RO" desc="authId of connection if authentication enabled"/>
+    <property name="remoteProcessName"  type="sstr"   access="RO" optional="y" desc="Name of executable running as remote client"/>
+    <property name="remotePid"          type="uint32" access="RO" optional="y" desc="Process ID of remote client"/>
+    <property name="remoteParentPid"    type="uint32" access="RO" optional="y" desc="Parent Process ID of remote client"/>
     <statistic name="closing"          type="bool" desc="This client is closing by management request"/>
     <statistic name="framesFromClient" type="count64"/>
     <statistic name="framesToClient"   type="count64"/>



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org