This file is indexed.

/usr/bin/twill-fork is in python-twill 0.9-4.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/python2
# This file is part of the twill source distribution.
#
# twill is a extensible scriptlet language for testing Web apps,
# available at http://twill.idyll.org/.
#
# Contact author: C. Titus Brown, titus@idyll.org.
#
# This program and all associated source code files are Copyright (C)
# 2005-2007 by C. Titus Brown.  It is released under the MIT license;
# please see the included LICENSE.txt file for more information, or
# go to http://www.opensource.org/licenses/mit-license.php.

"""
twill multiprocess execution system.
"""

import sys, os, time
from twill import execute_file
from optparse import OptionParser
from cPickle import load, dump

###
# make sure that the current working directory is in the path.  does this
# work on Windows??

if not '.' in sys.path:
    sys.path.append('.')
###

#### OPTIONS

parser = OptionParser()

parser.add_option('-u', '--url', nargs=1, action="store", dest="url",
                  help="start at the given URL before each script")

parser.add_option('-n', '--number', nargs=1, action="store", dest="number",
                  default=1, type="int",
                  help="number of times to run the given script(s)")

parser.add_option('-p', '--processes', nargs=1, action="store",
                  dest="processes", default=1, type="int",
                  help="number of processes to execute in parallel")

####

# parse arguments.
(options, args) = parser.parse_args()

if not len(args):
    sys.stderr.write('Error!  Must specify one or more scripts to execute...\n')
    sys.exit(-1)

average_number = int(options.number / options.processes)
last_number = average_number + options.number % options.processes
is_parent = True
child_pids = []

#
# start a bunch of child processes & record their pids in the parent.
#

for i in range(0, options.processes):
    pid = os.fork()
    if pid == 0:
        if i == 0:
            repeat = last_number        # make sure we execute 'em *all*
        else:
            repeat = average_number
            
        is_parent = False
        break
    else:
        child_pids.append(pid)          # keep track of children

#
# set the children up to run & record their stats
#

failed = False

if not is_parent:
    print '[twill-fork: pid %d : executing %d times]' % (os.getpid(), repeat)

    start_time = time.time()

    for i in range(0, repeat):
        for filename in args:
            execute_file(filename, initial_url=options.url)
        
    end_time = time.time()
    this_time = end_time - start_time

    # write statistics
    fp = open('.status.%d' % (os.getpid(),), 'w')
    info = (this_time, repeat)
    dump(info, fp)
    fp.close()

else:                                   # is_parent
    total_time = 0.
    total_exec = 0

    # iterate over all the child pids, wait 'til they finish, and then
    # sum statistics.
    
    left_childs = child_pids[:]
    for child_pid in left_childs:
        child_pid, status = os.waitpid(child_pid, 0)

        # status != 0 indicates failure:
        
        if status != 0:
            print '[twill-fork parent: process %d FAILED: exit status %d]' % (child_pid, status,)
            print '[twill-fork parent: (not counting stats for this process)]'
            failed = True
        else:
            # record statistics, otherwise
            
            fp = open('.status.%d' % (child_pid,))
            (this_time, n_executed) = load(fp)
            fp.close()
            os.unlink('.status.%d' % (child_pid,))

            total_time += this_time
            total_exec += n_executed

    #
    # summarize
    #

    print '\n---'
    print 'n processes: %d' % (options.processes,)
    print 'total executed: %d' % (total_exec,)
    print 'total time to execute: %f' % (total_time,)
    if total_exec:
        print 'average time: %f' % (total_time / total_exec,)
    else:
        print '(nothing completed, no average!)'

if failed:
    sys.exit(-1)

sys.exit(0)