123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- #!/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 !"
|