mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-27 06:31:54 +00:00 
			
		
		
		
	git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@122234 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			149 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
| #!/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 DAHDI/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 "DAHDI" "\nEnter technology type
 | |
| DAHDI, 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 !"
 |