Blame SOURCES/pesign.py

4bf471
#!/usr/bin/python3
4bf471
#
4bf471
# Copyright 2017 Peter Jones <Peter Jones@random>
4bf471
#
4bf471
# Distributed under terms of the GPLv3 license.
4bf471
4bf471
"""
4bf471
mock plugin to make sure pesign and mockbuild users have the right uid and
4bf471
gid.
4bf471
"""
4bf471
4bf471
from mockbuild.trace_decorator import getLog, traceLog
4bf471
import mockbuild.util
4bf471
4bf471
requires_api_version = "1.1"
4bf471
4bf471
@traceLog()
4bf471
def init(plugins, conf, buildroot):
4bf471
    """ hello """
4bf471
    Pesign(plugins, conf, buildroot)
4bf471
4bf471
def getuid(name):
4bf471
    """ get a uid for a user name """
4bf471
    output = mockbuild.util.do(["getent", "passwd", "%s" % (name,)],
4bf471
                               returnOutput=1, printOutput=True)
4bf471
    output = output.split(':')
4bf471
    return output[2], output[3]
4bf471
4bf471
def getgid(name):
4bf471
    """ get a gid for a group name """
4bf471
    output = mockbuild.util.do(["getent", "group", "%s" % (name,)],
4bf471
                               returnOutput=1, printOutput=True)
4bf471
    return output.split(':')[2]
4bf471
4bf471
def newgroup(name, gid, rootdir):
4bf471
    """ create a group with a gid """
4bf471
    getLog().info("creating group %s with gid %s" % (name, gid))
4bf471
    mockbuild.util.do(["groupadd",
4bf471
                       "-g", "%s" % (gid,),
4bf471
                       "-R", "%s" % (rootdir,),
4bf471
                       "%s" % (name,),
4bf471
                      ])
4bf471
4bf471
def newuser(name, uid, gid, rootdir):
4bf471
    """ create a user with a uid """
4bf471
    getLog().info("creating user %s with uid %s" % (name, uid))
4bf471
    mockbuild.util.do(["useradd",
4bf471
                       "-u", "%s" % (uid,),
4bf471
                       "-g", "%s" % (gid,),
4bf471
                       "-R", "%s" % (rootdir,),
4bf471
                       "%s" % (name,)])
4bf471
4bf471
class Pesign(object):
4bf471
    """ Creates some stuff in our mock root """
4bf471
    # pylint: disable=too-few-public-methods
4bf471
    @traceLog()
4bf471
    def __init__(self, plugins, conf, buildroot):
4bf471
        """ Effectively we're doing:
4bf471
            getent group pesign >/dev/null || groupadd -r pesign
4bf471
            getent passwd pesign >/dev/null || \
4bf471
                    useradd -r -g pesign -d /var/run/pesign -s /sbin/nologin \
4bf471
                    -c "Group for the pesign signing daemon" pesign
4bf471
        """
4bf471
4bf471
        self.buildroot = buildroot
4bf471
        self.pesign_opts = conf
4bf471
        self.config = buildroot.config
4bf471
        self.state = buildroot.state
4bf471
        self.users = {}
4bf471
        self.groups = {}
4bf471
        plugins.add_hook("postinit", self._pesignPostInitHook)
4bf471
4bf471
    @traceLog()
4bf471
    def _pesignPostInitHook(self):
4bf471
        """ find our uid and gid lists """
4bf471
        for user in self.pesign_opts['users']:
4bf471
            uid, gid = getuid(user)
4bf471
            self.users[user] = [user, uid, gid]
4bf471
        for group in self.pesign_opts['groups']:
4bf471
            gid = getgid(group)
4bf471
            self.groups[group] = [group, gid]
4bf471
4bf471
        # create our users
4bf471
        rootdir = self.buildroot.make_chroot_path()
4bf471
        for name, gid in self.groups.values():
4bf471
            newgroup(name, gid, rootdir)
4bf471
        for name, uid, gid in self.users.values():
4bf471
            newuser(name, uid, gid, rootdir)
4bf471
4bf471
# -*- coding: utf-8 -*-
4bf471
# vim:fenc=utf-8:tw=75