mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Add load tester (bug #3870)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5280 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										148
									
								
								contrib/scripts/loadtest.tcl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										148
									
								
								contrib/scripts/loadtest.tcl
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| #!/usr/bin/tclsh | ||||
| # | ||||
| # Usage (as root): | ||||
| # | ||||
| # $ tclsh loadtest.tcl | ||||
| # | ||||
| # Copyleft 2005 by Chris Maj <cmaj_at_freedomcorpse_dot_com> | ||||
| # | ||||
| # Create a (huge) bunch of call files to dial via pbx_spool. | ||||
| # Defaults are selected with 'Enter' and, if all defaults | ||||
| # are selected, you'll dial Zap/1/s into default|s|1 | ||||
| # | ||||
|  | ||||
|  | ||||
| # where Asterisk's pbx/pbx_spool.c will be looking for work | ||||
| set SPOOLDIR /var/spool/asterisk/outgoing | ||||
| # pbx_spool is fairly aggresive, so make files here first | ||||
| set TEMPDIR /tmp | ||||
|  | ||||
| if { ![file writable $SPOOLDIR] } { | ||||
| 	puts "Do you need to be root to write to $SPOOLDIR ?" | ||||
| 	exit | ||||
| } | ||||
|  | ||||
| if { ![file readable $TEMPDIR] } { | ||||
| 	puts "Do you need to be root to read from $TEMPDIR ?" | ||||
| 	exit | ||||
| } | ||||
|  | ||||
| if { ![file writable $TEMPDIR] } { | ||||
| 	puts "Do you need to be root to write to $TEMPDIR ?" | ||||
| 	exit | ||||
| } | ||||
|  | ||||
| # gets some input from the user | ||||
| proc get {var_ default_ prompt_} { | ||||
| 	global $var_ | ||||
| 	puts $prompt_ | ||||
| 	if { $default_ != "" } { | ||||
| 		puts -nonewline "(default: $default_) ? " | ||||
| 	} else { | ||||
| 		puts -nonewline "? " | ||||
| 	} | ||||
| 	flush stdout | ||||
| 	gets stdin $var_ | ||||
| 	if { [set $var_] == "" && $default_ != "" } { | ||||
| 		set $var_ $default_ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| # puts the user requested channels into a neat, ordered list | ||||
| proc splitchans {inch_} { | ||||
| 	global changroup | ||||
| 	set outch [list] | ||||
| 	foreach range [split $inch_ {, }] { | ||||
| 		set start [lindex [split $range -] 0] | ||||
| 		set stop [lindex [split $range -] end] | ||||
| 		if { [string is digit $start] && [string is digit $stop] } { | ||||
| 			set ::changroup "channel" | ||||
| 			for {set ch $start} {$ch <= $stop} {incr ch} { | ||||
| 				if { [lsearch $outch $ch] == -1 } { | ||||
| 					lappend outch $ch | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 			set ::changroup "group" | ||||
| 			foreach ch [split $range -] { | ||||
| 				lappend outch $ch | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return [lsort -dictionary $outch] | ||||
| } | ||||
|  | ||||
| # writes out a file in the temporary directory, | ||||
| # then changes the mtime of the file before | ||||
| # sticking it into the outgoing spool directory | ||||
| # (where pbx_spool will be looking) | ||||
| proc spool {channel_ callcnt_ when_} { | ||||
| 	set callstr " | ||||
| Channel: $::technology/$channel_/$::destination | ||||
| Context: $::context | ||||
| Extension: $::extension | ||||
| Priority: $::priority | ||||
| WaitTime: $::timeout | ||||
| RetryTime: $::retrytime | ||||
| MaxRetries: $::maxretries | ||||
| Callerid: $::clid | ||||
| SetVar: $::astvar | ||||
| Account: $::account | ||||
| " | ||||
| 	set fn "loadtest.call$callcnt_.ch$channel_" | ||||
| 	set fd [open $::TEMPDIR/$fn w] | ||||
| 	puts $fd $callstr | ||||
| 	close $fd | ||||
| 	file mtime $::TEMPDIR/$fn $when_ | ||||
| 	file rename -force $::TEMPDIR/$fn $::SPOOLDIR/$fn | ||||
| } | ||||
|  | ||||
| # prompt the user for some info | ||||
| get technology "Zap" "\nEnter technology type | ||||
| Zap, IAX, SIP, etc." | ||||
| get chans "1" "\nEnter channel(s) or group to test in formats like | ||||
| 2\n1-4\n3 5 7 9\n1-23,25-47,49-71,73-95\ng4\ng2,g1" | ||||
| set channels [splitchans $chans] | ||||
|  | ||||
| get destination "s" "\nEnter destination number" | ||||
| get context "default" "\nEnter context" | ||||
| get extension "s" "\nEnter extension" | ||||
| get priority "1" "\nEnter priority" | ||||
| get timeout "45" "\nEnter timeout for call to be answered in seconds" | ||||
| get maxretries "0" "\nEnter maximum number of retries" | ||||
|  | ||||
| if { $maxretries > 0 } { | ||||
| 	get retrytime "300" "\nEnter time between retries in seconds" | ||||
| } else { | ||||
| 	set retrytime 300 | ||||
| } | ||||
|  | ||||
| get clid "" "\nEnter callerid" | ||||
| get astvar "" "\nEnter some extra variables" | ||||
| get account "loadtest" "\nEnter account code" | ||||
| get calls "1" "\nEnter number of test calls per $changroup" | ||||
| get period "60" "\nEnter period between placing calls on a particular $changroup in seconds" | ||||
|  | ||||
| if { [llength $channels] > 1 } { | ||||
| 	get rate "0" "\nEnter period between placing each call in seconds | ||||
| 0 will send a call on each $changroup every $period seconds | ||||
| 1 will send a call on $changroup [lindex $channels 0] at [expr {$period + 0}]s, [lindex $channels 1] at [expr {$period + 1 }]s, etc. | ||||
| 5 will send a call on $changroup [lindex $channels 0] at [expr {$period + 0}]s, [lindex $channels 1] at [expr {$period + 5 }]s, etc." | ||||
| } else { | ||||
| 	set rate 0 | ||||
| } | ||||
|  | ||||
| puts -nonewline "\nCreating spooled call files...  " | ||||
| set now [clock seconds] | ||||
| set spoolcnt 0 | ||||
| set spinner [list / - \\ |] | ||||
| for {set i 0} {$i < $calls} {incr i} { | ||||
| 	foreach ch $channels { | ||||
| 		set chidx [lsearch $channels $ch] | ||||
| 		spool $ch [incr spoolcnt] [expr {$now + ($i * $period) + ($rate * $chidx)}] | ||||
| 		puts -nonewline "\b" | ||||
| 		puts -nonewline [lindex $spinner [expr {$spoolcnt % 4}]] | ||||
| 		flush stdout | ||||
| 	} | ||||
| } | ||||
| puts "\b$spoolcnt calls placed into $SPOOLDIR !" | ||||
		Reference in New Issue
	
	Block a user