1

I have two machines connected by a switch. I have a popular server application which we can call "SXC_SERVER" on machine A and I interrogate the "SXC_SERVER" with the corresponding application from machine B, which I'll call "SXC_CLIENT". What I am trying to do is two-fold:

  • firstly, gain the traffic flow of SXC_SERVER and SXC_CLIENT interaction through tcpdump. The interaction between the two is a simple GET and RESPONSE, but I require the traffic traces.
  • secondly, I am wanting to log the Resident Set Size (RSS) usage of the SXC_SERVER process during each interaction/iteration

Moreover, I don't just need one traffic trace of the communication and one memory usage log of the SXC_SERVER process otherwise I wouldn't be writing this because I could go away and do that in ten minutes... In fact I am aiming to do very many! But let's say here for simplicity I want to do 10.

Since this will be very labor intensive as it will require me to be at both machines stopping and starting all of the SCX_CLIENT-to-SXC_SERVER interrogation, the tcpdump traffic capture, and the RSS memory usage of SXC_SERVER logging I want to write an automation script.

But! I am not a programmer, or software guy...(darn)

However, that said I can imaging a separate client/server program that oversees this automation, which we can call AUTO_SERVER and AUTO_CLIENT. My thoughts are that machine B would run AUTO_CLIENT and machine A would run AUTO_SERVER. The aim of both are to facilitate the automation, i.e. the stopping and starting of the tcpdump, and the memory logging on machine A of SXC_SERVER process before machine B queries SXC_SERVER with SXC_CLIENT (if you follow me!).

Effectively after one run of the SXC_SERVER-to-SXC_CLIENT GET/RESPONSE interaction I'll end up with:

  • one traffic capture *.pcap file called n1.pcap
  • and one memory log dump (of the RSS associated to the process) called n1.csv.

I am not a programmer or software guy but I can see a rough method (to the best of my ability) to achieve this, as follows:

Machine A: AUTO_SERVER

BEGIN:

msgRecieved = open socket(listen on port *n*)

DO

1. wait for machine A to tell me when to start watch (as in the program) to log RSS memory usage of the SXC_SERVER process using hardcoded command:
watch -n 0.1 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk '\''{ i += $1 } END { print i }'\'' >> ~/Desktop/mem_logs/mem_i.csv

UNTIL (messageRecieved == "FINISH")

quit

END.

Machine B: AUTO_CLIENT

BEGIN:

open socket(new)

for i in 10, do

1. locally start tcpdump with hardcoded hardcoded tcpdump command with relevant filter to only capture the SXC_SERVER-to-SXC_CLIENT traffic and set output flag to capture all traffic to a PCAP file called n*i*.pcap where *i* is the integer of the current for loop, saving the file in folder "~/Desktop/test_captures/".
2. Send the GET request to SXC_SERVER
3. wait for RESPONSE reply from SXC_SERVER
4. after recieved reply tell machine B to stop watch command

i++

5. send string "FINISH" to machine A.

END.

As you can see I would assume that this would be achieved by the use of a separate, and small client/server-like program (which here I've called AUTO_SERVER and AUTO_CLIENT) on both machines. The really rought pseudo-code design should be self-explanatory.

I have found a small client/server socket program located here: http://www.velvetcache.org/2010/06/14/python-unix-sockets which I would think may be suitable if I edit it, but I am not sure how exactly I can feasibly achieve this. Which is where you may be able to provide some assistance.

Can Python to do this automating? Can it be done with a single bash script? Do you think I am on the right path with this? Or have you any helpful suggestions?

Regards.

uncle-junky
  • 723
  • 1
  • 8
  • 33

1 Answers1

0

You can use Python for this kind of thing, but I would strongly recommend using SSH for the bulk of the work (rather than coding the connection stuff yourself), and then using either a bash script or Python script to launch the tcpdump etc. processes.

Your question, however, is a bit too open-ended for stackoverflow - it sounds like you are asking someone to write this program for you, rather than for help with a specific problem.

spookylukey
  • 6,380
  • 1
  • 31
  • 34
  • Thanks for your reply. I guess it was a little too open... I've had a look at Paramiko since you suggested using SSH with Python. Is Paramiko forked into the SSH module for Python?... Anyway, bedsides the point I've also located some code that may be of use to me baed on aculich's answer here: [link](http://stackoverflow.com/questions/8783009/how-to-execute-a-script-remotely-in-python-using-ssh). That said, I won't be executing a remote script. I'll be executing two commands that will require terminating. Manually I'd use ctrl+c. How would I achieve that here? – uncle-junky Apr 01 '13 at 02:08
  • You can still terminate a command if you execute it as a script - if the SSH session is terminated, it will terminate its children by default. So Ctrl-C should work by default, I think. Otherwise, see http://stackoverflow.com/questions/1112343/how-do-i-capture-sigint-in-python – spookylukey Apr 02 '13 at 07:39