Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 1 | # Class for generating signed RPM packages. |
| 2 | # |
| 3 | # Configuration variables used by this class: |
| 4 | # RPM_GPG_PASSPHRASE_FILE |
| 5 | # Path to a file containing the passphrase of the signing key. |
| 6 | # RPM_GPG_NAME |
| 7 | # Name of the key to sign with. Alternatively you can define |
| 8 | # %_gpg_name macro in your ~/.oerpmmacros file. |
| 9 | # RPM_GPG_PUBKEY |
| 10 | # Path to a file containing the public key (in "armor" format) |
| 11 | # corresponding the signing key. |
| 12 | # GPG_BIN |
| 13 | # Optional variable for specifying the gpg binary/wrapper to use for |
| 14 | # signing. |
| 15 | # |
| 16 | inherit sanity |
| 17 | |
| 18 | RPM_SIGN_PACKAGES='1' |
| 19 | |
| 20 | |
| 21 | _check_gpg_name () { |
| 22 | macrodef=`rpm -E '%_gpg_name'` |
| 23 | [ "$macrodef" == "%_gpg_name" ] && return 1 || return 0 |
| 24 | } |
| 25 | |
| 26 | |
| 27 | def rpmsign_wrapper(d, files, passphrase, gpg_name=None): |
| 28 | import pexpect |
| 29 | |
| 30 | # Find the correct rpm binary |
| 31 | rpm_bin_path = d.getVar('STAGING_BINDIR_NATIVE', True) + '/rpm' |
| 32 | cmd = rpm_bin_path + " --addsign " |
| 33 | if gpg_name: |
| 34 | cmd += "--define '%%_gpg_name %s' " % gpg_name |
| 35 | else: |
| 36 | try: |
| 37 | bb.build.exec_func('_check_gpg_name', d) |
| 38 | except bb.build.FuncFailed: |
| 39 | raise_sanity_error("You need to define RPM_GPG_NAME in bitbake " |
| 40 | "config or the %_gpg_name RPM macro defined " |
| 41 | "(e.g. in ~/.oerpmmacros", d) |
| 42 | if d.getVar('GPG_BIN', True): |
| 43 | cmd += "--define '%%__gpg %s' " % d.getVar('GPG_BIN', True) |
| 44 | cmd += ' '.join(files) |
| 45 | |
| 46 | # Need to use pexpect for feeding the passphrase |
| 47 | proc = pexpect.spawn(cmd) |
| 48 | try: |
| 49 | proc.expect_exact('Enter pass phrase:', timeout=15) |
| 50 | proc.sendline(passphrase) |
| 51 | proc.expect(pexpect.EOF, timeout=900) |
| 52 | proc.close() |
| 53 | except pexpect.TIMEOUT as err: |
| 54 | bb.debug('rpmsign timeout: %s' % err) |
| 55 | proc.terminate() |
| 56 | return proc.exitstatus |
| 57 | |
| 58 | |
| 59 | python sign_rpm () { |
| 60 | import glob |
| 61 | |
| 62 | rpm_gpg_pass_file = (d.getVar("RPM_GPG_PASSPHRASE_FILE", True) or "") |
| 63 | if rpm_gpg_pass_file: |
| 64 | with open(rpm_gpg_pass_file) as fobj: |
| 65 | rpm_gpg_passphrase = fobj.readlines()[0].rstrip('\n') |
| 66 | else: |
| 67 | raise_sanity_error("You need to define RPM_GPG_PASSPHRASE_FILE in the config", d) |
| 68 | |
| 69 | rpm_gpg_name = (d.getVar("RPM_GPG_NAME", True) or "") |
| 70 | |
| 71 | rpms = glob.glob(d.getVar('RPM_PKGWRITEDIR', True) + '/*') |
| 72 | |
| 73 | if rpmsign_wrapper(d, rpms, rpm_gpg_passphrase, rpm_gpg_name) != 0: |
| 74 | raise bb.build.FuncFailed("RPM signing failed") |
| 75 | } |