* [gentoo-commits] dev/xmw:master commit in: sys-kernel/mkinitrd/, sys-kernel/mkinitrd/files/
@ 2013-12-07 22:12 Michael Weber
0 siblings, 0 replies; only message in thread
From: Michael Weber @ 2013-12-07 22:12 UTC (permalink / raw
To: gentoo-commits
commit: ff473a3eeff36813cbce547dced5c62c2759d2bf
Author: Michael Weber <michael <AT> xmw <DOT> de>
AuthorDate: Sat Dec 7 22:11:59 2013 +0000
Commit: Michael Weber <xmw <AT> gentoo <DOT> org>
CommitDate: Sat Dec 7 22:11:59 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=dev/xmw.git;a=commit;h=ff473a3e
Initial import
Package-Manager: portage-2.2.7
Manifest-Sign-Key: 62EEF090
---
sys-kernel/mkinitrd/ChangeLog | 5 +
sys-kernel/mkinitrd/files/mkinitrd-0_p20131207 | 448 ++++++++++++++++++++++++
sys-kernel/mkinitrd/metadata.xml | 8 +
sys-kernel/mkinitrd/mkinitrd-0_p20131207.ebuild | 80 +++++
4 files changed, 541 insertions(+)
diff --git a/sys-kernel/mkinitrd/ChangeLog b/sys-kernel/mkinitrd/ChangeLog
new file mode 100644
index 0000000..2ec7fbe
--- /dev/null
+++ b/sys-kernel/mkinitrd/ChangeLog
@@ -0,0 +1,5 @@
+*mkinitrd-0_p20131207 (07 Dec 2013)
+
+ 07 Dec 2013; Michael Weber <xmw@gentoo.org> +files/mkinitrd-0_p20131207,
+ +metadata.xml, +mkinitrd-0_p20131207.ebuild:
+ Initial import
diff --git a/sys-kernel/mkinitrd/files/mkinitrd-0_p20131207 b/sys-kernel/mkinitrd/files/mkinitrd-0_p20131207
new file mode 100644
index 0000000..dd9f5c1
--- /dev/null
+++ b/sys-kernel/mkinitrd/files/mkinitrd-0_p20131207
@@ -0,0 +1,448 @@
+#!/usr/bin/python3
+# Michael Weber (xmw at gentoo dot org) 06 Nov 2012
+# TODO use ClosedSytem to copy files
+# vim: tabstop=4 expandtab
+
+import argparse, glob, os, re, subprocess, sys, tempfile, time
+import portage
+
+def cat(fn, s, append=None, mode=0o644):
+ d = os.path.split(fn)[0]
+ if d and not os.path.exists(d):
+ os.makedirs(d)
+ f = open(fn, 'w' + (append and 'a' or ''))
+ f.write(s)
+ f.close()
+ os.chmod(fn, mode)
+
+def sed(src, *opts):
+ return subprocess.Popen(['sed'] + list(opts) + [src,],
+ stdout=subprocess.PIPE).stdout.read().decode('UTF-8')
+
+presets = {}
+presets['minimal'] = {
+ 'objs': [
+ sys.argv[0],
+ '/dev/console',
+ '/dev/null',
+ '/dev/tty',
+ '/etc/fstab',
+ '/etc/group',
+ '/etc/group',
+ '/etc/ld.so.cache',
+ '/etc/pam.d/system-auth',
+ '/etc/passwd',
+ '/etc/passwd',
+ '/etc/shadow',
+ '/etc/terminfo/l/linux',
+ '/etc/terminfo/s/screen',
+ '/etc/zsh/z*',
+ '/lib',
+ '/root/.screenrc',
+ '/root/.zshenv',
+ '/root/.zshfns/prompt_gentoo_setup',
+ '/root/.zshrc',
+ '/usr/lib*/zsh/*/zsh/complete.so',
+ '/usr/lib*/zsh/*/zsh/compctl.so',
+ '/usr/lib*/zsh/*/zsh/terminfo.so',
+ '/usr/lib*/zsh/*/zsh/zle.so',
+ '/usr/lib*/zsh/*/zsh/zutil.so',
+ '/usr/lib*/cracklib_dict.pwd',
+ '/usr/lib*/cracklib_dict.pwi',
+ '/usr/lib*/zsh/*/zsh/parameter.so',
+ '/usr/local/sbin/power-save.sh',
+ '/usr/share/zsh/*/functions/Completion/Unix/_git',
+ '/usr/share/zsh/*/functions/Completion/compaudit',
+ '/usr/share/zsh/*/functions/Completion/compdump',
+ '/usr/share/zsh/*/functions/Completion/compinit',
+ '/usr/share/zsh/*/functions/Zle/select-word-style',
+ '/usr/share/zsh/*/functions/Zle/url-quote-magic',
+ 'cat',
+ 'cp',
+ 'cpio',
+ 'cryptsetup',
+ 'dmesg',
+ 'env',
+ 'ethtool',
+ 'find',
+ 'halt',
+ 'id',
+ 'ip',
+ 'less',
+ 'ls',
+ 'lvchange',
+ 'lvscan',
+ 'mdadm',
+ 'mkdir',
+ 'modprobe',
+ 'more',
+ 'mount',
+ 'mountpoint',
+ 'mv',
+ 'ps',
+ 'readlink',
+ 'reboot',
+ 'rfkill',
+ 'screen',
+ 'setsid',
+ 'stat',
+ 'switch_root',
+ 'tftp',
+ 'uname',
+ 'whoami',
+ 'zsh',
+ ],
+ 'pkgs': [
+ 'sys-apps/sed',
+ ],
+ 'hooks': [
+ (sed, 'etc/passwd', '-i', '-n', '-e /^root:/p'),
+ (sed, 'etc/group', '-i', '-n', '-e /^root:/p'),
+ (cat, 'etc/shadow', ''),
+ (os.symlink, '/proc/mounts', 'etc/mtab'),
+ (cat, 'etc/resolv.conf', """nameserver 2001:4ca0::53:2
+nameserver 129.187.5.1"""),
+ (os.symlink, 'root/.zshenv', '.zshenv'),
+ #(os.symlink, 'root/.zshrc', '.zshrc'),
+ #(os.symlink, 'root/.zshfns', '.zshfns'),
+ #(os.symlink, 'root/.histfile', '.histfile'),
+ (cat, 'init', """\
+#!/bin/zsh
+echo "
+
+
+initrd created on %s by xmw.de/dotfiles/mkinitrd.py
+kernel $(uname -s -r -m)
+modules $(ls /lib/modules)
+
+"
+trap '{
+ echo
+ echo "Something went wrong. Dropping you to a shell."
+ echo "Try mount /boot; gzip -cd /boot/initramfs | cpio -i ; exec /init"
+ #exec /usr/bin/setsid /bin/zsh -c "exec /bin/zsh </dev/tty1 >/dev/tty1"
+ export USER=root
+ export HOME=/root
+ cd /root
+ exec /bin/zsh
+}' ZERR
+setopt noequals nonomatch
+
+mkdir -p /proc /sys /run /dev /mnt/target
+mountpoint -q /proc || mount -t proc none /proc
+mountpoint -q /sys || mount -t sysfs none /sys
+mountpoint -q /run || mount -t tmpfs none /run
+mountpoint -q /dev || mount -t devtmpfs none /dev
+mkdir -p /dev/pts
+mountpoint -q /dev/pts || mount -t devpts -o gid=5,mode=0620 none /dev/pts
+
+get() {
+ for x in ${(Oa)$(< /proc/cmdline)} ; do
+ [ "x${x%%%%=*}" = "x${1}" ] && { echo ${x/*=} ; return }
+ done
+ echo $2
+}
+esr() {
+ exec switch_root /mnt/target $(get init /sbin/init)
+}
+
+if [ -x /usr/local/sbin/power-save.sh ] ; then
+ /usr/local/sbin/power-save.sh || true
+fi
+
+case $(< /proc/sys/kernel/hostname) in
+ io)
+ echo "Disconnect LAN cable <Enter>" ; read
+ ip link set eth0 up
+ echo "Reconnect LAN cable <Enter>" ; read
+ ip link set eth0 up
+ if dmesg | grep -i "Hardware error" ; then
+ #stop boot sequence
+ false
+ fi
+
+ mdadm --assemble /dev/md42 /dev/sda /dev/sdb
+ cryptsetup --tries 3 luksOpen $(get crypt_dev /dev/md42) $(get crypt_name main)
+ mount $(get root /dev/mapper/main) /mnt/target
+ ;;
+ x)
+ cryptsetup --tries 3 luksOpen $(get crypt_dev /dev/sda2) $(get crypt_name main)
+ lvscan
+ lvchange -a y $(get vg_name main)
+ printf "%%d:%%d" $(stat -c "0x%%t 0x%%T" $(readlink -e $(get resume /dev/mapper/main-swap))) > /sys/power/resume
+ mount $(get root /dev/mapper/main) /mnt/target
+ ;;
+ *)
+ echo "unkown host $(< /proc/sys/kernel/hostname)"
+ echo "define at mkinitrd.py"
+ echo "mount root to /mnt/target and run esr"
+ ;;
+esac
+
+esr
+""" % (time.ctime()), '', 0o755),
+ (lambda: cat('root/.histfile', sed('init', '-e 1d')),),
+ (cat, 'root/.zshenv', """\
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+USER=root
+HOME=/root
+SHELL=/bin/zsh
+#setopt noequals nonomatch
+alias la='ls -hal'
+"""),
+
+
+ ]
+}
+
+presets['full'] = {
+ 'objs': presets['minimal']['objs'] + [
+ '/etc/wpa_supplicant/wpa_supplicant.conf',
+ ],
+ 'pkgs': presets['minimal']['pkgs'] + [
+ 'app-arch/cpio',
+ 'app-arch/pbzip2',
+ 'app-arch/tar',
+ 'app-cdr/cdrtools',
+ 'app-editors/nano',
+ 'app-misc/pax-utils',
+ 'app-misc/screen',
+ 'app-shells/zsh',
+ 'app-shells/zsh-completion',
+ 'dev-util/strace',
+ 'dev-util/vbindiff',
+ 'net-analyzer/iptraf-ng',
+ 'net-analyzer/netcat6',
+ 'net-dns/bind-tools',
+ 'net-misc/curl',
+ 'net-misc/iputils',
+ 'net-misc/dhcp',
+ 'net-misc/ntp',
+ 'net-misc/openssh',
+ 'net-misc/rsync',
+ 'net-misc/wget',
+ 'net-wireless/rfkill',
+ 'sys-apps/kmod',
+ 'sys-apps/util-linux',
+ 'net-wireless/wpa_supplicant',
+ 'sys-apps/coreutils',
+ 'sys-apps/diffutils',
+ 'sys-apps/ethtool',
+ 'sys-apps/findutils',
+ 'sys-apps/gawk',
+ 'sys-apps/grep',
+ 'sys-apps/iproute2',
+ 'sys-apps/less',
+ 'sys-apps/man',
+ 'sys-apps/net-tools',
+ 'sys-apps/pciutils',
+ 'sys-apps/pv',
+ 'sys-apps/sed',
+ 'sys-apps/shadow',
+ 'sys-apps/smartmontools',
+ 'sys-apps/sysvinit',
+ 'sys-apps/usbutils',
+ 'sys-fs/cryptsetup',
+ 'sys-fs/ddrescue',
+ 'sys-fs/e2fsprogs',
+ 'sys-fs/lvm2',
+ 'sys-fs/mdadm',
+ 'sys-fs/multipath-tools',
+ 'sys-fs/xfsprogs',
+ 'sys-libs/gpm',
+ 'sys-process/htop',
+ 'sys-process/procps',
+ 'sys-process/psmisc',
+ 'www-client/links',
+ 'www-client/w3m',
+ ],
+ 'hooks': presets['minimal']['hooks'] + [
+ (sed, 'etc/wpa_supplicant/wpa_supplicant.conf', '-i',
+ '-e', '/\(psk=\|wep_key\)/s:=.*:="":'),
+ (cat, 'root/.histfile', "wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -W -B -i wlan0 -P /var/run/wpa_supplicant-wlan0.pid"),
+ ]
+}
+
+ignorelist=(
+ '/var/lock/iptraf-ng',
+ '/var/lock/iptraf-ng/.keep_net-analyzer_iptraf-ng-0',
+ '/var/run/wpa_supplicant',
+ '/var/run/wpa_supplicant/.keep_net-wireless_wpa_supplicant-0'
+)
+
+
+def which(fn):
+ for path in os.get_exec_path():
+ if os.path.exists(os.path.join(path, fn)):
+ return os.path.join(path, fn)
+
+def list_kernels(pwd='/boot'):
+ kernels = list(set(map(os.path.realpath,
+ map(lambda f: os.path.join(pwd, f),
+ filter(lambda f: f.startswith('vmlinu'), os.listdir(pwd))))))
+ return list(map(lambda k: k[1], sorted(
+ map(lambda f: (os.lstat(f).st_mtime, f), kernels))))
+
+class ClosedSystem(list):
+ SHEBANG_MATCHER=re.compile('^\s*#\s*!\s*([^\s]*)\s*([^\s]*)')
+ def __init__(self):
+ list.__init__(self)
+ self.interpreter = set()
+
+ def isElf(fn):
+ return open(fn, 'rb').read(5) in (b'\x7fELF\x01', b'\x7fELF\x02')
+
+ def needed(fn):
+ return filter(None, subprocess.Popen(
+ ['scanelf', '-L', '-n', '-q', '-F', '%n #F', fn],
+ stdout=subprocess.PIPE
+ ).stdout.read().decode("UTF-8").strip().split(','))
+
+ def shebang(fn):
+ match=ClosedSystem.SHEBANG_MATCHER.match(
+ open(fn, 'rb').read(1000).decode('UTF-8'))
+ if not match:
+ return ()
+ if match.group(1) == '/usr/bin/env':
+ return '/usr/bin/env', which(match.group(2))
+ return match.group(1),
+
+ def append(self, fn):
+ if not fn or fn in self:
+ return
+ if not os.path.isabs(fn):
+ self.append(which(fn))
+ return
+ if not os.path.exists(fn):
+ if fn in ignorelist:
+ print('ignore missing ' + fn)
+ return
+ fns = glob.glob(fn)
+ if not fns:
+ raise BaseException('file does not exist ' + fn)
+ [self.append(fn) for fn in fns]
+ return
+
+ d, b = os.path.split(fn)
+ if b:
+ self.append(d)
+ fn = os.path.join(os.path.realpath(d), b)
+
+ list.append(self, fn)
+ if os.path.isdir(fn):
+ pass
+ elif os.path.islink(fn):
+ self.append(os.path.join(os.path.dirname(fn), os.readlink(fn)))
+ elif os.path.isfile(fn):
+ if ClosedSystem.isElf(fn):
+ [self.append(so) for so in ClosedSystem.needed(fn)]
+ else:
+ if os.stat(fn).st_mode & 0o111:
+ interpreter=ClosedSystem.shebang(fn)
+ if not len(interpreter):
+ print('unable to handle executeable %s' % fn)
+ else:
+ [self.interpreter.add(i) for i in interpreter]
+ else:
+ BaseException('unable to handle %s' % fn)
+
+if __name__ == '__main__':
+ kernels = list_kernels()
+ def kernel_version(kernel):
+ return os.path.split(os.path.realpath(kernel))[1].split('-', 1)[1]
+ def modules_dir(kernel_version):
+ return os.path.join('/lib/modules', kernel_version)
+
+ parser = argparse.ArgumentParser(description='arch testing',
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+ parser.add_argument('--preset', default='full',
+ choices=presets.keys(),
+ help="select file set")
+ parser.add_argument('--kernel', default=kernels[-1],
+ help="select kernel filename")
+ parser.add_argument('--initrd', default='',
+ help="select initrd filename")
+ parser.add_argument('--chroot', action='store_true',
+ help="chroot into target")
+ parser.add_argument('--force', action='store_true',
+ help="overwrite destination")
+ parser.add_argument('--keep', action='store_true',
+ help="keep tempdir")
+ parser.add_argument('--compressor', default='lzop -9',
+ help="kernel compartible initrd compressor (cat,gzip,lzop,bzip2,xz)")
+ args = parser.parse_args()
+
+ if not os.path.exists(args.kernel):
+ print('kernel file %s not found in %s' % \
+ (args.kernel, list_kernels()))
+ sys.exit(1)
+ if not args.preset in presets.keys():
+ print('preset %s not found in %s' % \
+ (args.preset, sorted(presets.keys())))
+ sys.exit(1)
+ args.initrd = args.initrd or (
+ '/boot/initrd.img-' + kernel_version(args.kernel))
+ if not args.force and os.path.exists(args.initrd):
+ print('initrd %s already exists' % args.initrd)
+ sys.exit(1)
+
+
+ print("building preset %s for kernel %s" % (args.preset, args.kernel))
+ print("Target %s" % args.initrd)
+
+ system = ClosedSystem()
+
+
+ for path, directories, files in os.walk(
+ modules_dir(kernel_version(args.kernel))):
+ system.append(path)
+ [system.append(os.path.join(path, fn)) for fn in files]
+
+ [system.append(fn) for fn in presets[args.preset].get('objs', [])]
+
+ pkgs = set()
+ vartree = portage.db[portage.root]['vartree']
+ missing=[]
+ for atom in presets[args.preset].get('pkgs', []):
+ cand = vartree.dbapi.match(atom)
+ if not cand:
+ missing.append(atom)
+ else:
+ [pkgs.add(c) for c in cand]
+ if missing:
+ print('package not installed/found: ' + ' '.join(missing))
+ sys.exit(1)
+ for cpv in sorted(pkgs):
+ link = portage.dblink(cpv.cpv_split[0], '-'.join(cpv.cpv_split[1:]),
+ treetype='vartree', vartree=vartree, settings=portage.settings)
+ [system.append(os.path.normpath(fn)) for fn in sorted(link.getcontents())]
+
+ system.interpreter.difference(set('/usr/bin/python3'))
+ print("list of interpreters %s" % sorted(system.interpreter))
+ [system.append(fn) for fn in sorted(system.interpreter)]
+
+ tmpdir = tempfile.mkdtemp(prefix='/tmp/mkinitrd.py-')
+ os.chdir(tmpdir)
+ print('copy %i files to %s' % (len(system), tmpdir))
+ p1 = subprocess.Popen(['tar', 'cC', '/', '--no-recursion'] + system,
+ stdout=subprocess.PIPE)
+ p2 = subprocess.Popen(['tar', 'xC', tmpdir], stdin=p1.stdout)
+ p2.communicate()
+
+ print('hooks')
+ for hook in presets[args.preset].get('hooks', []):
+ print(hook[0])
+ hook[0](*hook[1:])
+
+ if args.chroot:
+ os.system('chroot .')
+
+ print('compress')
+ os.system('find . -print0 | sort | cpio --null -o --format=newc | pv -s $(du -s . | cut -f 1)k | %s > %s' % (args.compressor, args.initrd))
+ if not args.keep:
+ os.chdir('..')
+ print('remove ' + tmpdir)
+ os.system('rm -r ' + tmpdir)
+ else:
+ print('keep ' + tmpdir)
+
diff --git a/sys-kernel/mkinitrd/metadata.xml b/sys-kernel/mkinitrd/metadata.xml
new file mode 100644
index 0000000..5b80fb9
--- /dev/null
+++ b/sys-kernel/mkinitrd/metadata.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+<maintainer>
+<email>xmw@gentoo.org</email>
+<name>Michael Weber</name>
+</maintainer>
+</pkgmetadata>
diff --git a/sys-kernel/mkinitrd/mkinitrd-0_p20131207.ebuild b/sys-kernel/mkinitrd/mkinitrd-0_p20131207.ebuild
new file mode 100644
index 0000000..a1df5b2
--- /dev/null
+++ b/sys-kernel/mkinitrd/mkinitrd-0_p20131207.ebuild
@@ -0,0 +1,80 @@
+# Copyright 1999-2013 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=5
+
+DESCRIPTION="Create initrd using python"
+HOMEPAGE="http://xmw.de"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE="-minimal"
+
+DEPEND=""
+RDEPEND="
+ sys-apps/sed
+ !minimal? (
+ app-arch/cpio
+ app-arch/pbzip2
+ app-arch/tar
+ app-cdr/cdrtools
+ app-editors/nano
+ app-misc/pax-utils
+ app-misc/screen
+ app-shells/zsh
+ app-shells/zsh-completion
+ dev-util/strace
+ dev-util/vbindiff
+ net-analyzer/iptraf-ng
+ net-analyzer/netcat6
+ net-dns/bind-tools
+ net-misc/curl
+ net-misc/iputils
+ net-misc/dhcp
+ net-misc/ntp
+ net-misc/openssh
+ net-misc/rsync
+ net-misc/wget
+ net-wireless/rfkill
+ sys-apps/kmod
+ sys-apps/util-linux
+ net-wireless/wpa_supplicant
+ sys-apps/coreutils
+ sys-apps/diffutils
+ sys-apps/ethtool
+ sys-apps/findutils
+ sys-apps/gawk
+ sys-apps/grep
+ sys-apps/iproute2
+ sys-apps/less
+ sys-apps/man
+ sys-apps/net-tools
+ sys-apps/pciutils
+ sys-apps/pv
+ sys-apps/sed
+ sys-apps/shadow
+ sys-apps/smartmontools
+ sys-apps/sysvinit
+ sys-apps/usbutils
+ sys-fs/cryptsetup
+ sys-fs/ddrescue
+ sys-fs/e2fsprogs
+ sys-fs/lvm2
+ sys-fs/mdadm
+ sys-fs/multipath-tools
+ sys-fs/xfsprogs
+ sys-libs/gpm
+ sys-process/htop
+ sys-process/procps
+ sys-process/psmisc
+ www-client/links
+ www-client/w3m
+ )"
+
+S=${WORKDIR}
+
+src_install() {
+ newsbin "${FILESDIR}"/${P} ${PN}.py
+}
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2013-12-07 22:12 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-07 22:12 [gentoo-commits] dev/xmw:master commit in: sys-kernel/mkinitrd/, sys-kernel/mkinitrd/files/ Michael Weber
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox