pvl/args.py
author Tero Marttila <terom@paivola.fi>
Sun, 27 Jan 2013 15:07:04 +0200
changeset 187 cbf9371a472d
parent 96 d02b0b67c29c
child 191 3d318e4ef190
permissions -rw-r--r--
pvl.verkko-rrd-interfaces: script to setup symlinks for pvl.verkko.rrd from collectd
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    CLI argument handling; common stuff: logging
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import optparse
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import logging
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
96
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
     8
import pwd, grp, os, sys
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
     9
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    10
import logging; log = logging.getLogger('pvl.args')
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    11
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
def parser (parser) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
    """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
        Return an optparse.OptionGroup.
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
    """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    general = optparse.OptionGroup(parser, "General options")
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
    general.add_option('-q', '--quiet',     dest='loglevel', action='store_const', const=logging.ERROR, help="Less output")
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    general.add_option('-v', '--verbose',   dest='loglevel', action='store_const', const=logging.INFO,  help="More output")
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    general.add_option('-D', '--debug',     dest='loglevel', action='store_const', const=logging.DEBUG, help="Even more output")
86
5bd98d185c48 pvl.args: implement --log-file
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    22
    general.add_option('--log-file',                                                                    help="Log to file")
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    general.add_option('--debug-module',    action='append', metavar='MODULE', 
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
            help="Enable logging for the given logger/module name")
96
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    25
    
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    26
    general.add_option('--uid',             help="Change uid")
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    27
    general.add_option('--gid',             help="Change gid")
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    # defaults
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    parser.set_defaults(
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
        logname             = parser.prog,
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
        loglevel            = logging.WARN,
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
        debug_module        = [],
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
    )
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
 
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    return general
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
96
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    38
def apply_setid (options, rootok=None) :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    39
    """
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    40
        Drop privileges if running as root.
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    41
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    42
        XXX: this feature isn't very useful (import-time issues etc), but in certain cases (syslog-ng -> python),
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    43
        it's difficult to avoid this without some extra wrapper tool..?
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    44
    """
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    45
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    46
    # --uid -> pw
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    47
    if not options.uid :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    48
        pw = None
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    49
    elif options.uid.isdigit() :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    50
        pw = pwd.getpwuid(int(options.uid))
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    51
    else :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    52
        pw = pwd.getpwnam(options.uid)
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    53
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    54
    # --gid -> gr
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    55
    if not options.gid and not pw :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    56
        gr = None
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    57
    elif not options.gid :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    58
        gr = grp.getgrgid(pw.pw_gid)
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    59
    elif options.gid.isdigit() :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    60
        gr = grp.getgrgid(str(options.gid))
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    61
    else :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    62
        gr = grp.getgrnam(options.gid)
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    63
    
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    64
    if gr :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    65
        # XXX: secondary groups? seem to get cleared
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    66
        log.info("setgid: %s: %s", gr.gr_name, gr.gr_gid)
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    67
        os.setgid(gr.gr_gid)
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    68
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    69
    if pw :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    70
        log.info("setuid: %s: %s", pw.pw_name, pw.pw_uid)
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    71
        os.setuid(pw.pw_uid)
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    72
    
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    73
    elif os.getuid() == 0 :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    74
        if rootok :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    75
            log.info("running as root")
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    76
        else :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    77
            log.error("refusing to run as root, use --uid 0 to override")
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    78
            sys.exit(2)
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    79
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
    80
def apply (options, logname=None, rootok=True) :
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
    """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        Apply the optparse options.
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
    """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
    if logname :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
        prefix = options.logname + ': '
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        prefix = ''
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    # configure
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
    logging.basicConfig(
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        # XXX: log Class.__init__ as Class, not __init__?
86
5bd98d185c48 pvl.args: implement --log-file
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    93
        format      = prefix + '%(name)-20s: %(levelname)5s %(funcName)s: %(message)s',
5bd98d185c48 pvl.args: implement --log-file
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    94
        level       = options.loglevel,
5bd98d185c48 pvl.args: implement --log-file
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    95
        filename    = options.log_file,
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    )
187
cbf9371a472d pvl.verkko-rrd-interfaces: script to setup symlinks for pvl.verkko.rrd from collectd
Tero Marttila <terom@paivola.fi>
parents: 96
diff changeset
    97
cbf9371a472d pvl.verkko-rrd-interfaces: script to setup symlinks for pvl.verkko.rrd from collectd
Tero Marttila <terom@paivola.fi>
parents: 96
diff changeset
    98
    # TODO: use --quiet for stdout output?
cbf9371a472d pvl.verkko-rrd-interfaces: script to setup symlinks for pvl.verkko.rrd from collectd
Tero Marttila <terom@paivola.fi>
parents: 96
diff changeset
    99
    options.quiet = options.loglevel > logging.WARN
96
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
   100
    
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
   101
    if options.uid or options.gid or not rootok :
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
   102
        # set uid/gid
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
   103
        apply_setid(options, rootok=rootok)
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
    # enable debugging for specific targets
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
    for logger in options.debug_module :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
        logging.getLogger(logger).setLevel(logging.DEBUG)
96
d02b0b67c29c pvl.args: implement optional --uid/gid support, but not particularly useful..
Tero Marttila <terom@paivola.fi>
parents: 86
diff changeset
   108