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