pvl/args.py
author Tero Marttila <terom@paivola.fi>
Sun, 22 Dec 2013 14:25:35 +0200
changeset 27 62159e5b6685
parent 25 538c02bd95e0
child 28 69e1b91cd83f
permissions -rw-r--r--
copypastasyntaxfix pvl.args
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    CLI argument handling; common stuff: logging
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
15
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
     5
import codecs
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
     6
import grp
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
import logging
15
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
     8
import optparse
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
     9
import os
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
    10
import pwd
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
    11
import sys
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import logging; log = logging.getLogger('pvl.args')
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
9
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    15
def parser (parser, setuid=None) :
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
        Return an optparse.OptionGroup.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
9
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    20
    if setuid is None :
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    21
        # autodetect: only if we will be capable of
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    22
        # XXX: use linux capabilities?
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    23
        setuid = (os.geteuid() == 0)
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    24
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    general = optparse.OptionGroup(parser, "General options")
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    general.add_option('-q', '--quiet',     dest='loglevel', action='store_const', const=logging.ERROR, help="Less output")
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    general.add_option('-v', '--verbose',   dest='loglevel', action='store_const', const=logging.INFO,  help="More output")
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    general.add_option('-D', '--debug',     dest='loglevel', action='store_const', const=logging.DEBUG, help="Even more output")
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    general.add_option('--log-file',                                                                    help="Log to file")
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    general.add_option('--debug-module',    action='append', metavar='MODULE', 
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
            help="Enable logging for the given logger/module name")
25
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    33
27
62159e5b6685 copypastasyntaxfix pvl.args
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
    34
    parser.add_option('-c', '--config',    metavar='PATH',
25
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    35
            help="Read option defaults from config")
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    36
    parser.add_option('--config-encoding',  metavar='CHARSET',  default='utf-8',
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    37
            help="Unicode decoding for config file")
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    38
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    39
   
9
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    40
    if setuid :
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    41
        general.add_option('--uid',             help="Change uid")
5e9290c55d77 pvl.args: make setuid options optional
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    42
        general.add_option('--gid',             help="Change gid")
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    # defaults
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
    parser.set_defaults(
25
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    46
        setuid              = setuid,
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        logname             = parser.prog,
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
        loglevel            = logging.WARN,
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        debug_module        = [],
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    )
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
 
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    return general
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
def options (**options) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
        Synthensise options.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
    return optparse.Values(options)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
def apply_setid (options, rootok=None) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        Drop privileges if running as root.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        XXX: this feature isn't very useful (import-time issues etc), but in certain cases (syslog-ng -> python),
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
        it's difficult to avoid this without some extra wrapper tool..?
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    # --uid -> pw
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
    if not options.uid :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
        pw = None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    elif options.uid.isdigit() :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        pw = pwd.getpwuid(int(options.uid))
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        pw = pwd.getpwnam(options.uid)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
    # --gid -> gr
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    if not options.gid and not pw :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        gr = None
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
    elif not options.gid :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        gr = grp.getgrgid(pw.pw_gid)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    elif options.gid.isdigit() :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        gr = grp.getgrgid(str(options.gid))
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        gr = grp.getgrnam(options.gid)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
    
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    if gr :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        # XXX: secondary groups? seem to get cleared
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        log.info("setgid: %s: %s", gr.gr_name, gr.gr_gid)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
        os.setgid(gr.gr_gid)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    if pw :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
        log.info("setuid: %s: %s", pw.pw_name, pw.pw_uid)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        os.setuid(pw.pw_uid)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
    
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    elif os.getuid() == 0 :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        if rootok :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
            log.info("running as root")
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
        else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
            log.error("refusing to run as root, use --uid 0 to override")
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
            sys.exit(2)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
22
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   103
def apply_file (path=None, mode='r', charset=None) :
15
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   104
    """
22
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   105
        Open (unicode-enabled) file from path, with - using stdio.
15
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   106
    """
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   107
21
559a6ce73f40 pvl.args.apply_file: support -
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   108
    if not path or path == '-' :
15
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   109
        # use stdin/out based on mode
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   110
        stream, func = {
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   111
            'r':    (sys.stdin, codecs.getreader),
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   112
            'w':    (sys.stdout, codecs.getwriter),
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   113
        }[mode[0]]
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   114
22
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   115
        if charset :
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   116
            return func(charset)(stream)
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   117
        else :
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   118
            return stream
15
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   119
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   120
    else :
22
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   121
        if charset :
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   122
            return codecs.open(path, mode, charset)
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   123
        else :
3e93880d3a40 pvl.args: apply_file: default to no unicode..
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   124
            return open(path, mode)
15
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   125
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   126
def apply_files (paths, *args, **opts) :
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   127
    """
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   128
        Open one or more files from given paths, defaulting to stdio.
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   129
    """
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   130
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   131
    if paths :
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   132
        return [apply_file(path, *args, **opts) for path in paths]
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   133
    else:
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   134
        return [apply_file(None, *args, **opts)]
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   135
25
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   136
import configobj
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   137
import copy
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   138
import optparse
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   139
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   140
class Options (object) :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   141
    """
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   142
        Custom optparse.Values implementation.
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   143
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   144
        Passed to OptionParser.parse_args(), called by Option.take_action():
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   145
            setattr(values, dest, ...)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   146
            values.ensure_value(dest, ...)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   147
    """
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   148
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   149
    def __init__ (self, defaults={ }) :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   150
        self._defaults  = defaults
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   151
        self._options   = { }
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   152
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   153
    def __setattr__ (self, name, value) :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   154
        if name.startswith('_') :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   155
            self.__dict__[name] = value
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   156
        else :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   157
            self._options[name] = value
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   158
    
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   159
    def ensure_value (self, name, default) :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   160
        if name in self._options :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   161
            pass
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   162
        elif name in self._defaults :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   163
            self._options[name] = copy.copy(self._defaults[name])
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   164
        else :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   165
            self._options[name] = default
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   166
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   167
        return self._options[name]
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   168
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   169
    def _merge (self, options) :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   170
        """
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   171
            Merge in options from given Options.
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   172
        """
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   173
        
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   174
        # TODO: lists?
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   175
        self._options.update(options._options)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   176
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   177
    def __getattr__ (self, name) :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   178
        if name.startswith('_') :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   179
            raise AttributeError(name)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   180
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   181
        if name in self._options :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   182
            return self._options[name]
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   183
        elif name in self._defaults :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   184
            return self._defaults[name]
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   185
        else :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   186
            raise AttributeError(name)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   187
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   188
def apply_config (options, parser, config, encoding=None) :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   189
    """
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   190
        Load options from config.
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   191
    """
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   192
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   193
    import configobj
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   194
        
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   195
    config = configobj.ConfigObj(config,
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   196
            encoding        = options.config_encoding if encoding is None else encoding,
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   197
    )
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   198
    config_options = Options(options._defaults)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   199
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   200
    # load scalars
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   201
    for scalar in config.scalars :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   202
        # option from config
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   203
        option = parser._long_opt.get('--' + scalar)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   204
        
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   205
        if not option :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   206
            raise optparse.BadOptionError(scalar)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   207
        
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   208
        # value from config
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   209
        if option.takes_value() :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   210
            value = config[scalar]
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   211
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   212
        else :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   213
            # ignore
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   214
            value = None
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   215
        
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   216
        # apply
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   217
        option.process(scalar, value, config_options, parser)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   218
    
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   219
    # apply in actual options
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   220
    config_options._merge(options)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   221
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   222
    return config_options
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   223
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   224
def parse (parser, argv) :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   225
    """
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   226
        Parse options, args from argv.
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   227
    """
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   228
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   229
    options, args = parser.parse_args(argv[1:], values=Options(parser.defaults))
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   230
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   231
    if options.config :
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   232
        options = apply_config(options, parser, options.config)
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   233
    
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   234
    return options, args
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   235
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
def apply (options, logname=None, rootok=True) :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
        Apply the optparse options.
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
    """
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   240
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
    if logname :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
        prefix = options.logname + ': '
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
    else :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
        prefix = ''
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
    # configure
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
    logging.basicConfig(
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
        # XXX: log Class.__init__ as Class, not __init__?
19
c511078be51d pvl.args: change logging format
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   249
        format      = prefix + '%(levelname)8s %(name)20s.%(funcName)s: %(message)s',
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
        level       = options.loglevel,
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
        filename    = options.log_file,
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
    )
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
    # TODO: use --quiet for stdout output?
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
    options.quiet = options.loglevel > logging.WARN
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
    
25
538c02bd95e0 pvl.args: new --config option, used by pvl.args.parse(...)
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   257
    if options.setuid :
10
08bb817a9966 pvl.args: fix optional setuid options
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   258
        if options.uid or options.gid or not rootok :
08bb817a9966 pvl.args: fix optional setuid options
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   259
            # set uid/gid
08bb817a9966 pvl.args: fix optional setuid options
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   260
            apply_setid(options, rootok=rootok)
1
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
    # enable debugging for specific targets
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
    for logger in options.debug_module :
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
        logging.getLogger(logger).setLevel(logging.DEBUG)
ce931075b69e import pvl.args,invoke from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   265
    
15
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   266
def main (main) :
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   267
    """
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   268
        Run given main func.
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   269
    """
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   270
e699ed00fcf1 pvl.args: apply_file(path) and main(main)
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   271
    sys.exit(main(sys.argv))