2727from multiprocessing import Pool
2828import os
2929import re
30+ import socket
31+ import sys
3032import time
3133import urllib2
3234
@@ -168,42 +170,47 @@ def _attack(params):
168170 """
169171print 'Bee %i is joining the swarm.' % params ['i' ]
170172
171- client = paramiko .SSHClient ()
172- client .set_missing_host_key_policy (paramiko .AutoAddPolicy ())
173- client .connect (
174- params ['instance_name' ],
175- username = params ['username' ],
176- key_filename = _get_pem_path (params ['key_name' ]))
173+ try :
174+ client = paramiko .SSHClient ()
175+ client .set_missing_host_key_policy (paramiko .AutoAddPolicy ())
176+ client .connect (
177+ params ['instance_name' ],
178+ username = params ['username' ],
179+ key_filename = _get_pem_path (params ['key_name' ]))
177180
178- print 'Bee %i is firing his machine gun. Bang bang!' % params ['i' ]
181+ print 'Bee %i is firing his machine gun. Bang bang!' % params ['i' ]
179182
180- stdin , stdout , stderr = client .exec_command ('ab -r -n %(num_requests)s -c %(concurrent_requests)s -C "sessionid=NotARealSessionID" %(url)s' % params )
183+ stdin , stdout , stderr = client .exec_command ('ab -r -n %(num_requests)s -c %(concurrent_requests)s -C "sessionid=NotARealSessionID" %(url)s' % params )
181184
182- response = {}
185+ response = {}
183186
184- ab_results = stdout .read ()
185- ms_per_request_search = re .search ('Time\ per\ request:\s+([0-9.]+)\ \[ms\]\ \(mean\)' , ab_results )
187+ ab_results = stdout .read ()
188+ ms_per_request_search = re .search ('Time\ per\ request:\s+([0-9.]+)\ \[ms\]\ \(mean\)' , ab_results )
186189
187- if not ms_per_request_search :
188- print 'Bee %i lost sight of the target (connection timed out).' % params ['i' ]
189- return None
190+ if not ms_per_request_search :
191+ print 'Bee %i lost sight of the target (connection timed out).' % params ['i' ]
192+ return None
193+
194+ requests_per_second_search = re .search ('Requests\ per\ second:\s+([0-9.]+)\ \[#\/sec\]\ \(mean\)' , ab_results )
195+ fifty_percent_search = re .search ('\s+50\%\s+([0-9]+)' , ab_results )
196+ ninety_percent_search = re .search ('\s+90\%\s+([0-9]+)' , ab_results )
197+ complete_requests_search = re .search ('Complete\ requests:\s+([0-9]+)' , ab_results )
190198
191- requests_per_second_search = re .search ('Requests\ per\ second:\s+([0-9.]+)\ \[#\/sec\]\ \(mean\)' , ab_results )
192- fifty_percent_search = re .search ('\s+50\%\s+([0-9]+)' , ab_results )
193- ninety_percent_search = re .search ('\s+90\%\s+([0-9]+)' , ab_results )
194- complete_requests_search = re .search ('Complete\ requests:\s+([0-9]+)' , ab_results )
199+ response ['ms_per_request' ] = float (ms_per_request_search .group (1 ))
200+ response ['requests_per_second' ] = float (requests_per_second_search .group (1 ))
201+ response ['fifty_percent' ] = float (fifty_percent_search .group (1 ))
202+ response ['ninety_percent' ] = float (ninety_percent_search .group (1 ))
203+ response ['complete_requests' ] = float (complete_requests_search .group (1 ))
195204
196- response ['ms_per_request' ] = float (ms_per_request_search .group (1 ))
197- response ['requests_per_second' ] = float (requests_per_second_search .group (1 ))
198- response ['fifty_percent' ] = float (fifty_percent_search .group (1 ))
199- response ['ninety_percent' ] = float (ninety_percent_search .group (1 ))
200- response ['complete_requests' ] = float (complete_requests_search .group (1 ))
205+ print 'Bee %i is out of ammo.' % params ['i' ]
201206
202- print 'Bee %i is out of ammo.' % params [ 'i' ]
207+ client . close ()
203208
204- client .close ()
209+ return response
210+ except socket .error :
211+ print 'Uh oh, one of your bees is out of the action. He might be taking a little longer than normal to find his machine gun, or may have been terminated without using "bees down".'
212+ return None
205213
206- return response
207214
208215def _print_results (results ):
209216"""
@@ -215,6 +222,10 @@ def _print_results(results):
215222print ' Target failed to fully respond to %i bees.' % len (incomplete_results )
216223
217224complete_results = [r ['complete_requests' ] for r in results if r is not None ]
225+
226+ if len (complete_results == 0 ):
227+ print ' No results were completed. Apparently your bees are peace-loving hippies.'
228+
218229total_complete_requests = sum (complete_results )
219230print ' Complete requests:\t \t %i' % total_complete_requests
220231
@@ -223,6 +234,7 @@ def _print_results(results):
223234print ' Requests per second:\t %f [#/sec] (mean)' % mean_requests
224235
225236complete_results = [r ['ms_per_request' ] for r in results if r is not None ]
237+
226238mean_response = sum (complete_results ) / len (complete_results )
227239print ' Time per request:\t \t %f [ms] (mean)' % mean_response
228240
@@ -244,7 +256,7 @@ def _print_results(results):
244256print 'Mission Assessment: Target severely compromised.'
245257else :
246258print 'Mission Assessment: Swarm annihilated target.'
247-
259+
248260def attack (url , n , c ):
249261"""
250262 Test the root url of this site.
0 commit comments