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