~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to utilities/local-latency

  • Committer: Aaron Bentley
  • Date: 2011-08-04 15:24:09 UTC
  • mto: This revision was merged to the branch mainline in revision 13612.
  • Revision ID: aaron@canonical.com-20110804152409-aclvf1nz3puyc26q
Allow specifying delay.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/env python
 
2
 
 
3
__metaclass__ = type
 
4
 
 
5
from optparse import OptionParser
2
6
import sys
3
7
import subprocess
4
8
 
 
9
 
5
10
class UserError(Exception):
6
11
    pass
7
12
 
 
13
 
8
14
def tc(command):
9
15
     subprocess.call('sudo tc ' + command, shell=True)
10
16
 
11
 
def start(delay=500, port=443):
12
 
    tc('qdisc add dev lo root handle 1: prio')
13
 
    tc('qdisc add dev lo parent 1:3 handle 30: netem delay %dms' % delay)
14
 
    tc('filter add dev lo protocol ip parent 1:0 prio 3 u32 match ip'
15
 
       ' dport %d 0xffff flowid 1:3' % port)
16
 
    tc('filter add dev lo protocol ip parent 1:0 prio 3 u32 match ip'
17
 
       ' sport %d 0xffff flowid 1:3' % port)
18
 
 
19
 
 
20
 
def stop():
21
 
    tc('qdisc del dev lo root')
 
17
 
 
18
class Command:
 
19
 
 
20
    UNSPECIFIED = object()
 
21
 
 
22
    @classmethod
 
23
    def get_specified_values(cls, parser, cmd_args):
 
24
        options, args = parser.parse_args(cmd_args)
 
25
        kwargs = dict(
 
26
            item for item in options.__dict__.items()
 
27
            if item[1] is not cls.UNSPECIFIED)
 
28
        return args, kwargs
 
29
 
 
30
    @classmethod
 
31
    def run_from_args(cls, cmd_args):
 
32
        args, kwargs = cls.get_specified_values(cls.get_parser(), cmd_args)
 
33
        cls.run(*args, **kwargs)
 
34
 
 
35
 
 
36
class StartCommand(Command):
 
37
 
 
38
    @classmethod
 
39
    def get_parser(cls):
 
40
        parser = OptionParser()
 
41
        parser.add_option(
 
42
            '-d', '--delay', dest='delay', type='int',
 
43
            default=cls.UNSPECIFIED,
 
44
            help='Length of delay in miliseconds (each way).')
 
45
        return parser
 
46
 
 
47
    @staticmethod
 
48
    def run(delay=500, port=443):
 
49
        tc('qdisc add dev lo root handle 1: prio')
 
50
        tc('qdisc add dev lo parent 1:3 handle 30: netem delay %dms' % delay)
 
51
        tc('filter add dev lo protocol ip parent 1:0 prio 3 u32 match ip'
 
52
           ' dport %d 0xffff flowid 1:3' % port)
 
53
        tc('filter add dev lo protocol ip parent 1:0 prio 3 u32 match ip'
 
54
           ' sport %d 0xffff flowid 1:3' % port)
 
55
 
 
56
 
 
57
class StopCommand(Command):
 
58
 
 
59
    @staticmethod
 
60
    def get_parser():
 
61
        parser = OptionParser()
 
62
        return parser
 
63
 
 
64
    @staticmethod
 
65
    def run():
 
66
        tc('qdisc del dev lo root')
22
67
 
23
68
 
24
69
def main(argv):
25
70
    commands = {
26
 
        'start': start,
27
 
        'stop': stop,
 
71
        'start': StartCommand,
 
72
        'stop': StopCommand,
28
73
    }
29
 
    if len(argv) != 1:
 
74
    if len(argv) < 1:
30
75
        raise UserError('Must supply a command: %s.' %
31
76
                        ', '.join(commands.keys()))
32
77
    try:
33
78
        command = commands[argv[0]]
34
79
    except KeyError:
35
80
        raise UserError('%s invalid.  Valid commands: %s.' %
36
 
                        (argv[1], ', '.join(commands.keys())))
37
 
    command()
 
81
                        (argv[0], ', '.join(commands.keys())))
 
82
    command.run_from_args(argv[1:])
38
83
 
39
84
 
40
85
if __name__ == "__main__":