Skip to content

Instantly share code, notes, and snippets.

@brianredbeard
Created July 9, 2019 18:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brianredbeard/51d1d87ee8fec3350c2b7da7e4fe45f3 to your computer and use it in GitHub Desktop.
Save brianredbeard/51d1d87ee8fec3350c2b7da7e4fe45f3 to your computer and use it in GitHub Desktop.
rpm2mc.py - a tool to convert RPMs to Kubernetes machine-configs
#!/usr/bin/env python3
#
# rpm2mc.py -- Generate a Kubernetes machine-config from an RPM
# Copyright (c) 2019 Brian 'redbeard' Harrington <redbeard@dead-city.org>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import base64
import mimetypes
import os
import rpm
import sys
import yaml
from optparse import OptionParser
# Create the stub of a machine-config object to hold our resulting output
mco = {"spec": {"config": {
"storage": {"files": []},
"systemd": {"units": []}
}
}
}
class FileNotFoundError(Exception):
"""Class to simplify the handling of missing files"""
pass
def file_to_data(path):
"""Convert a file (specified by a path) into a data URI."""
if not os.path.exists(path):
raise FileNotFoundError
mime, _ = mimetypes.guess_type(path)
data64 = base64.b64encode(open(path, "rb").read())
return 'data:{};base64,{}'.format(mime, data64.decode('UTF-8'))
def main():
usage = "usage: %prog [options] arg"
parser = OptionParser(usage)
parser.add_option("-f", "--file", dest="isFile",
action="store_true",
help="read data from FILENAME")
parser.add_option("-a", "--all", action="store_true", dest="allFiles",
help="store all files, not just configs and systemd units")
parser.add_option("-v", action="store_true", dest="verbose")
(options, args) = parser.parse_args()
if len(args) != 1:
print(len(args))
parser.error("incorrect number of arguments")
sys.exit(1)
pkg = args[0]
ts = rpm.TransactionSet()
if options.isFile:
fdno = os.open(pkg, os.O_RDONLY)
try:
hdr = ts.hdrFromFdno(fdno)
except rpm.error:
fdno = os.open(rpm_file, os.O_RDONLY)
ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES)
hdr = ts.hdrFromFdno(fdno)
os.close(fdno)
else:
mi = ts.dbMatch('name', pkg)
hdr = next(mi)
if options.isFile:
print("WARNING: Parsing uninstalled RPM files is experimental")
for f in rpm.files(hdr):
p = {}
if options.verbose:
print("path: {}".format(f.name))
p["path"] = f.name
p["mode"] = f.mode
p["filesystem"] = "root"
p["user"] = f.user
p["group"] = f.group
if (f.name.startswith('/etc/systemd/system/') or
f.name.startswith('/usr/lib/systemd/system/')):
mco["spec"]["config"]["systemd"]["units"].append(p)
elif (f.name.startswith('/etc/') or options.allFiles):
mco["spec"]["config"]["storage"]["files"].append(p)
try:
p["contents"] = {}
if options.isFile:
pass
else:
p["contents"]["source"] = file_to_data(f.name)
except IsADirectoryError:
pass
ymco = yaml.dump(mco, default_style='"')
print(ymco)
if __name__ == '__main__':
main()
@brianredbeard
Copy link
Author

e.g.:

[~]$ ./rpm2mc.py rdma-core
"spec":
  "config":
    "storage":
      "files":
      - "contents":
          "source": "data:text/plain;base64,IyBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgZm9yIHVzZXJzIHRvIHNlbGVjdCB0aGUgdmFyaW91cyBtb2R1bGUgb3B0aW9ucwojIHRoZXkgbmVlZCBmb3IgdGhlIG1seDQgZHJpdmVyLiAgT24gdXBncmFkZSBvZiB0aGUgcmRtYSBwYWNrYWdlLAojIGFueSB1c2VyIG1hZGUgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIHByZXNlcnZlZC4gIEFueSBjaGFuZ2VzIG1hZGUKIyB0byB0aGUgbGlibWx4NC5jb25mIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIG92ZXJ3cml0dGVuIG9uCiMgcGFjYWtnZSB1cGdyYWRlLgojCiMgU29tZSBzYW1wbGUgb3B0aW9ucyBhbmQgd2hhdCB0aGV5IHdvdWxkIGRvCiMgRW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQsIGRldmljZSBtYW5hZ2VkIGZsb3cgY29udHJvbCwgYW5kIGRpc2FibGUgU1JJT1YKI29wdGlvbnMgbWx4NF9jb3JlIGRlYnVnX2xldmVsPTEgbG9nX251bV9tZ21fZW50cnlfc2l6ZT0tMSBwcm9iZV92Zj0wIG51bV92ZnM9MAojCiMgRW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQgYW5kIGNyZWF0ZSBTUklPViBkZXZpY2VzLCBidXQgZG9uJ3QgYXR0YWNoIGFueSBvZgojIHRoZSBjaGlsZCBkZXZpY2VzIHRvIHRoZSBob3N0LCBvbmx5IHRoZSBwYXJlbnQgZGV2aWNlCiNvcHRpb25zIG1seDRfY29yZSBkZWJ1Z19sZXZlbD0xIHByb2JlX3ZmPTAgbnVtX3Zmcz03CiMKIyBFbmFibGUgZGVidWdnaW5nIG91dHB1dCwgU1JJT1YsIGFuZCBhdHRhY2ggb25lIG9mIHRoZSBTUklPViBjaGlsZCBkZXZpY2VzCiMgaW4gYWRkaXRpb24gdG8gdGhlIHBhcmVudCBkZXZpY2UgdG8gdGhlIGhvc3QKI29wdGlvbnMgbWx4NF9jb3JlIGRlYnVnX2xldmVsPTEgcHJvYmVfdmY9MSBudW1fdmZzPTcKIwojIEVuYWJsZSBwZXIgcHJpb3JpdHkgZmxvdyBjb250cm9sIGZvciBzZW5kIGFuZCByZWNlaXZlLCBzZXR0aW5nIGJvdGggcHJpb3JpdHkKIyAxIGFuZCAyIGFzIG5vIGRyb3AgcHJpb3JpdGllcwojb3B0aW9ucyBtbHg0X2VuIHBmY3R4PTMgcGZjcng9Mwo="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/modprobe.d/mlx4.conf"
        "user": "root"
      - "contents":
          "source": "data:text/plain;base64,aW5zdGFsbCBpYl9xaWIgbW9kcHJvYmUgLWkgaWJfcWliICRDTURMSU5FX09QVFMgJiYgL3Vzci9saWJleGVjL3RydWVzY2FsZS1zZXJkZXMuY21kcyBzdGFydAo="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/modprobe.d/truescale.conf"
        "user": "root"
      - "contents": {}
        "filesystem": "root"
        "group": "root"
        "mode": !!int "16877"
        "path": "/etc/rdma"
        "user": "root"
      - "contents":
          "source": "data:text/plain;base64,IyBDb25maWcgZmlsZSBmb3IgbWx4NCBoYXJkd2FyZSBwb3J0IHNldHRpbmdzCiMgVGhpcyBmaWxlIGlzIHJlYWQgd2hlbiB0aGUgbWx4NF9jb3JlIG1vZHVsZSBpcyBsb2FkZWQgYW5kIHVzZWQgdG8KIyBzZXQgdGhlIHBvcnQgdHlwZXMgZm9yIGFueSBoYXJkd2FyZSBmb3VuZC4gIElmIGEgY2FyZCBpcyBub3QgbGlzdGVkCiMgaW4gdGhpcyBmaWxlLCB0aGVuIGl0cyBwb3J0IHR5cGVzIGFyZSBsZWZ0IGFsb25lLgojCiMgRm9ybWF0OgojIDxwY2lfZGV2aWNlX29mX2NhcmQ+IDxwb3J0MV90eXBlPiBbcG9ydDJfdHlwZV0KIwojIEBwb3J0MSBhbmQgQHBvcnQyOgojICAgT25lIG9mIGF1dG8sIGliLCBvciBldGguICBObyBjaGVja2luZyBpcyBwZXJmb3JtZWQgdG8gbWFrZSBzdXJlIHRoYXQKIyAgIGNvbWJpbmF0aW9ucyBhcmUgdmFsaWQuICBJbnZhbGlkIGlucHV0cyB3aWxsIHJlc3VsdCBpbiB0aGUgZHJpdmVyCiMgICBub3Qgc2V0dGluZyB0aGUgcG9ydCB0byB0aGUgdHlwZSByZXF1ZXN0ZWQuICBwb3J0MSBpcyByZXF1aXJlZCBhdAojICAgYWxsIHRpbWVzLCBwb3J0MiBpcyByZXF1aXJlZCBmb3IgZHVhbCBwb3J0IGNhcmRzLgojCiMgRXhhbXBsZToKIyAwMDAwOjBiOjAwLjAgZXRoIGV0aAojCiMgWW91IGNhbiBmaW5kIHRoZSByaWdodCBwY2kgZGV2aWNlIHRvIHVzZSBmb3IgYW55IGdpdmVuIGNhcmQgYnkgbG9hZGluZwojIHRoZSBtbHg0X2NvcmUgbW9kdWxlLCB0aGVuIGdvaW5nIHRvIC9zeXMvYnVzL3BjaS9kcml2ZXJzL21seDRfY29yZSBhbmQKIyBzZWVpbmcgd2hhdCBwb3NzaWJsZSBQQ0kgZGV2aWNlcyBhcmUgbGlzdGVkIHRoZXJlLiAgVGhlIHBvc3NpYmxlIHZhbHVlcwojIGZvciBwb3J0cyBhcmU6IGliLCBldGgsIGFuZCBhdXRvLiAgSG93ZXZlciwgbm90IGFsbCBjYXJkcyBzdXBwb3J0IGFsbAojIHR5cGVzLCBzbyBpZiB5b3UgZ2V0IG1lc3NhZ2VzIGZyb20gdGhlIGtlcm5lbCB0aGF0IHlvdXIgc2VsZWN0ZWQgcG9ydAojIHR5cGUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVyZSdzIG5vdGhpbmcgdGhpcyBzY3JpcHQgY2FuIGRvIGFib3V0IGl0LiAgQWxzbywKIyBzb21lIGNhcmRzIGRvbid0IHN1cHBvcnQgdXNpbmcgZGlmZmVyZW50IHR5cGVzIG9uIHRoZSB0d28gcG9ydHMgKGFrYSwKIyBib3RoIHBvcnRzIG11c3QgYmUgZWl0aGVyIGV0aCBvciBpYikuICBBZ2Fpbiwgd2UgY2FuJ3Qgc2V0IHdoYXQgdGhlIGtlcm5lbAojIG9yIGhhcmR3YXJlIHdvbid0IHN1cHBvcnQuCiMK"
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/rdma/mlx4.conf"
        "user": "root"
      - "contents":
          "source": "data:text/plain;base64,IyBUaGVzZSBtb2R1bGVzIGFyZSBsb2FkZWQgYnkgdGhlIHN5c3RlbSBpZiBhbnkgSW5maW5pQmFuZCBkZXZpY2UgaXMgaW5zdGFsbGVkCiMgSW5maW5pQmFuZCBvdmVyIElQIG5ldGRldmljZQppYl9pcG9pYgoKIyBBY2Nlc3MgdG8gZmFicmljIG1hbmFnZW1lbnQgU01QcyBhbmQgR01QcyBmcm9tIHVzZXJzcGFjZS4KaWJfdW1hZAoKIyBTQ1NJIFJlbW90ZSBQcm90b2NvbCB0YXJnZXQgc3VwcG9ydAojIGliX3NycHQKCiMgaWJfdWNtIHByb3ZpZGVzIHRoZSBvYnNvbGV0ZSAvZGV2L2luZmluaWJhbmQvdWNtMAojIGliX3VjbQo="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/rdma/modules/infiniband.conf"
        "user": "root"
      - "contents":
          "source": "data:text/plain;base64,IyBUaGVzZSBtb2R1bGVzIGFyZSBsb2FkZWQgYnkgdGhlIHN5c3RlbSBpZiBhbnkgaVdhcnAgZGV2aWNlIGlzIGluc3RhbGxlZAo="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/rdma/modules/iwarp.conf"
        "user": "root"
      - "contents":
          "source": "data:text/plain;base64,IyBUaGVzZSBtb2R1bGVzIGFyZSBsb2FkZWQgYnkgdGhlIHN5c3RlbSBpZiBhbnkgT21uaVBhdGggQXJjaGl0ZWN0dXJlIGRldmljZQojIGlzIGluc3RhbGxlZAojIEluZmluaWJhbmQgb3ZlciBJUCBuZXRkZXZpY2UKaWJfaXBvaWIKCiMgQWNjZXNzIHRvIGZhYnJpYyBtYW5hZ2VtZW50IFNNUHMgYW5kIEdNUHMgZnJvbSB1c2Vyc3BhY2UuCmliX3VtYWQKCiMgT21uaXBhdGggRXRoZXJuZXQgVmlydHVhbCBOSUMgbmV0ZGV2aWNlCm9wYV92bmljCg=="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/rdma/modules/opa.conf"
        "user": "root"
      - "contents":
          "source": "data:text/plain;base64,IyBUaGVzZSBtb2R1bGVzIGFyZSBsb2FkZWQgYnkgdGhlIHN5c3RlbSBpZiBhbnkgUkRNQSBkZXZpY2VzIGlzIGluc3RhbGxlZAojIGlTQ1NJIG92ZXIgUkRNQSBjbGllbnQgc3VwcG9ydAppYl9pc2VyCgojIGlTQ1NJIG92ZXIgUkRNQSB0YXJnZXQgc3VwcG9ydAojIGliX2lzZXJ0CgojIFVzZXIgYWNjZXNzIHRvIFJETUEgdmVyYnMgKHN1cHBvcnRzIGxpYmlidmVyYnMpCmliX3V2ZXJicwoKIyBVc2VyIGFjY2VzcyB0byBSRE1BIGNvbm5lY3Rpb24gbWFuYWdlbWVudCAoc3VwcG9ydHMgbGlicmRtYWNtKQpyZG1hX3VjbQoKIyBSRFMgb3ZlciBSRE1BIHN1cHBvcnQKIyByZHNfcmRtYQoKIyBORlMgb3ZlciBSRE1BIGNsaWVudCBzdXBwb3J0CnhwcnRyZG1hCgojIE5GUyBvdmVyIFJETUEgc2VydmVyIHN1cHBvcnQKc3ZjcmRtYQo="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/rdma/modules/rdma.conf"
        "user": "root"
      - "contents":
          "source": "data:text/plain;base64,IyBUaGVzZSBtb2R1bGVzIGFyZSBsb2FkZWQgYnkgdGhlIHN5c3RlbSBpZiBhbnkgUkRNQSBvdmVyIENvbnZlcmdlZCBFdGhlcm5ldAojIGRldmljZSBpcyBpbnN0YWxsZWQK"
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/rdma/modules/roce.conf"
        "user": "root"
      - "contents":
          "source": "data:text/plain;base64,IyBMb2FkIElQb0lCCklQT0lCX0xPQUQ9eWVzCiMgTG9hZCBTUlAgKFNDU0kgUmVtb3RlIFByb3RvY29sIGluaXRpYXRvciBzdXBwb3J0KSBtb2R1bGUKU1JQX0xPQUQ9eWVzCiMgTG9hZCBTUlBUIChTQ1NJIFJlbW90ZSBQcm90b2NvbCB0YXJnZXQgc3VwcG9ydCkgbW9kdWxlClNSUFRfTE9BRD15ZXMKIyBMb2FkIGlTRVIgKGlTQ1NJIG92ZXIgUkRNQSBpbml0aWF0b3Igc3VwcG9ydCkgbW9kdWxlCklTRVJfTE9BRD15ZXMKIyBMb2FkIGlTRVJUIChpU0NTSSBvdmVyIFJETUEgdGFyZ2V0IHN1cHBvcnQpIG1vZHVsZQpJU0VSVF9MT0FEPXllcwojIExvYWQgUkRTIChSZWxpYWJsZSBEYXRhZ3JhbSBTZXJ2aWNlKSBuZXR3b3JrIHByb3RvY29sClJEU19MT0FEPW5vCiMgTG9hZCBORlNvUkRNQSBjbGllbnQgdHJhbnNwb3J0IG1vZHVsZQpYUFJUUkRNQV9MT0FEPXllcwojIExvYWQgTkZTb1JETUEgc2VydmVyIHRyYW5zcG9ydCBtb2R1bGUKU1ZDUkRNQV9MT0FEPW5vCiMgTG9hZCBUZWNoIFByZXZpZXcgZGV2aWNlIGRyaXZlciBtb2R1bGVzClRFQ0hfUFJFVklFV19MT0FEPW5vCg=="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/rdma/rdma.conf"
        "user": "root"
      - "contents":
          "source": "data:None;base64,IyBBbGwgbGluZXMgaW4gdGhpcyBmaWxlIHRoYXQgc3RhcnQgd2l0aCBhICMgYXJlIGNvbW1lbnRzLAojIGFsbCBvdGhlciBsaW5lcyB3aWxsIGJlIHByb2Nlc3NlZCB3aXRob3V0IGFyZ3VtZW50IGNoZWNrcwojIEZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgb25lIHNyaW92IHZmIHNldHRpbmcgcGVyIGxpbmUgd2l0aAojIGFyZ3VtZW50cyBhcyBmb2xsb3dzOgojICAgIHZmIFtwb3J0ICNdIFtldGhlcm5ldCBzZXR0aW5ncyB8IGluZmluaWJhbmQgc2V0dGluZ3NdCiMKIyAgQHZmIC0gUENJIGFkZHJlc3Mgb2YgZGV2aWNlIHRvIGNvbmZpZ3VyZSBhcyBmb3VuZCBpbgojCSAgL3N5cy9idXMvcGNpL2RldmljZXMvCiMKIyAgW3BvcnQgQHBvcnRdIC0gT3B0aW9uYWw6IHRoZSBwb3J0IG51bWJlciB3ZSBhcmUgc2V0dGluZyBvbgojICAgICAgICAgdGhlIGRldmljZS4gIFdlIGFsd2F5cyBhc3N1bWUgcG9ydCAxIHVubGVzcyB0b2xkCiMgICAgICAgICBvdGhlcndpc2UuCiMKIyAgRXRoZXJuZXQgc2V0dGluZ3M6CiMgIG1hYyA8bWFjIGFkZHJlc3M+IFthZGRpdGlvbmFsIG9wdGlvbnNdCiMgICAgQG1hYyAtIG1hYyBhZGRyZXNzIHRvIGFzc2lnbiB0byB2Zi4uLnRoaXMgaXMgY3VycmVudGx5IHJlcXVpcmVkIGJ5CiMgICAgICAgIHRoZSBpcCBwcm9ncmFtIGlmIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gc2V0IGFueSBvZiB0aGUgb3RoZXIKIyAgICAgICAgc2V0dGluZ3MuICBJZiB5b3UgZG9uJ3Qgc2V0IGFueXRoaW5nIG9uIGEgdmYsIGl0IHdpbGwgZ2V0IGEKIyAgICAgICAgcmFuZG9tIG1hYyBhZGRyZXNzIGFuZCB5b3UgbWF5IHVzZSBzdGF0aWMgSVAgYWRkcmVzc2luZyB0bwojICAgICAgICBoYXZlIGEgY29uc2lzdGVudCBJUCBhZGRyZXNzIGluIHNwaXRlIG9mIHRoZSByYW5kb20gbWFjCiMgICAgQCogLSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIGlwIGxpbmsgd2l0aG91dCBhbnkKIyAgICAgIGZ1cnRoZXIgcHJvY2Vzc2luZy9jaGVja2luZywgYWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY291bGQKIyAgICAgIGJlIHBhc3NlZCBhcyBvZiB0aGUgdGltZSBvZiB3cml0aW5nIHRoaXMgYXJlOgojICAgICAgICBbIHZsYW4gVkxBTklEIFsgcW9zIFZMQU4tUU9TIF0gXQojICAgICAgICBbIHJhdGUgVFhSQVRFIF0KIyAgICAgICAgWyBzcG9vZmNoayB7IG9uIHwgb2ZmfSBdCiMgICAgICAgIFsgc3RhdGUgeyBhdXRvIHwgZW5hYmxlIHwgZGlzYWJsZX0gXQojCiMgIEluZmluaUJhbmQgc2V0dGluZ3M6CiMgIFtndWlkIDxndWlkPl0gW3BrZXkgPHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHBrZXlzPl0KIyAgICBAZ3VpZCAtIDY0Yml0IEdVSUQgdmFsdWUgdG8gYXNzaWduIHRvIHZmLiAgT21pdCB0aGlzIG9wdGlvbiB0bwojICAgICAgICAgIHVzZSBhIHN1Ym5ldCBtYW5hZ2VyIGFzc2lnbmVkIEdVSUQuCiMgICAgQHBrZXkgLSBvbmUgb3IgbW9yZSBwa2V5cyB0byBhc3NpZ24gdG8gdGhpcyBndWVzdCwgbXVzdCBiZSBsYXN0CiMgICAgICAgICAgaXRlbSBvbiBsaW5lCiMKIyAgRXhhbXBsZXM6CiMKIyAgICAwMDAwOjQ0OjAwLjEgZ3VpZCAwNTAxMTQwMzAwN2JjYmExIHBrZXkgMHhmZmZmIDB4ODAwMgojICAgIDAwMDA6NDQ6MDAuMSBwb3J0IDIgbWFjIGFhOmJiOmNjOmRkOmVlOmYwIHNwb29mY2hrIG9uCiMgICAgMDAwMDo0NDowMC4yIHBvcnQgMSBwa2V5IDB4N2ZmZiAweDAwMDIKIyAgICAwMDAwOjQ0OjAwLjIgcG9ydCAyIG1hYyBhYTpiYjpjYzpkZDplZTpmMSB2bGFuIDEwIHNwb29mY2hrIG9uIHN0YXRlIGVuYWJsZQo="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/rdma/sriov-vfs"
        "user": "root"
      - "contents":
          "source": "data:None;base64,IyBUaGlzIGlzIGEgc2FtcGxlIHVkZXYgcnVsZXMgZmlsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gZ2V0IHVkZXYgdG8KIyBzZXQgdGhlIG5hbWUgb2YgSVBvSUIgaW50ZXJmYWNlcyB0byB3aGF0ZXZlciB5b3Ugd2lzaC4gIFRoZXJlIGlzIGEKIyAxNiBjaGFyYWN0ZXIgbGltaXQgb24gbmV0d29yayBkZXZpY2UgbmFtZXMuCiMKIyBJbXBvcnRhbnQgaXRlbXMgdG8gbm90ZTogQVRUUnt0eXBlfT09IjMyIiBpcyBJUG9JQiBpbnRlcmZhY2VzLCBhbmQgdGhlCiMgQVRUUnthZGRyZXNzfSBtYXRjaCBtdXN0IHN0YXJ0IHdpdGggPyogYW5kIG9ubHkgcmVmZXJlbmNlIHRoZSBsYXN0IDgKIyBieXRlcyBvZiB0aGUgYWRkcmVzcyBvciBlbHNlIHRoZSBhZGRyZXNzIG1pZ2h0IG5vdCBtYXRjaCB0aGUgdmFyaWFibGUgUVBOCiMgcG9ydGlvbi4KIwojIE1vZGVybiB1ZGV2IGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBhbGwgYWRkcmVzc2VzIG5lZWQgdG8gYmUgaW4gbG93ZXIgY2FzZS4KIwojIEFDVElPTj09ImFkZCIsIFNVQlNZU1RFTT09Im5ldCIsIERSSVZFUlM9PSI/KiIsIEFUVFJ7dHlwZX09PSIzMiIsIEFUVFJ7YWRkcmVzc309PSI/KjAwOjAyOmM5OjAzOjAwOjMxOjc4OmYyIiwgTkFNRT0ibWx4NF9pYjMiCg=="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/etc/udev/rules.d/70-persistent-ipoib.rules"
        "user": "root"
    "systemd":
      "units":
      - "contents":
          "source": "data:None;base64,W1VuaXRdCkRlc2NyaXB0aW9uPVJETUEgSGFyZHdhcmUKRG9jdW1lbnRhdGlvbj1maWxlOi91c3Ivc2hhcmUvZG9jL3JkbWEtY29yZS0xNi4yL3VkZXYubWQKU3RvcFdoZW5Vbm5lZWRlZD15ZXMKCiMgU3RhcnQgdGhlIGJhc2ljIFVMUCBSRE1BIGtlcm5lbCBtb2R1bGVzIHdoZW4gUkRNQSBoYXJkd2FyZSBpcyBkZXRlY3RlZCAobm90ZQojIHRoZSByZG1hLWxvYWQtbW9kdWxlc0Auc2VydmljZSBpcyBhbHJlYWR5IGJlZm9yZSB0aGlzIHRhcmdldCkKV2FudHM9cmRtYS1sb2FkLW1vZHVsZXNAcmRtYS5zZXJ2aWNlCiMgT3JkZXIgYWZ0ZXIgdGhlIHN0YW5kYXJkIG5ldHdvcmsudGFyZ2V0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggaW5pdC5kCiMgc2NyaXB0cyB0aGF0IG9yZGVyIGFmdGVyIG5ldHdvcmtpbmcgLSB0aGlzIHdpbGwgbWVhbiBSRE1BIGlzIHJlYWR5IHRvby4KQmVmb3JlPW5ldHdvcmsudGFyZ2V0CiMgV2UgZG8gbm90IG9yZGVyIHJkbWEtaHcgYmVmb3JlIGJhc2ljLnRhcmdldCwgdW5pdHMgZm9yIGRhZW1vbnMgdGhhdCB1c2UgUkRNQQojIGhhdmUgdG8gbWFudWFsbHkgb3JkZXIgYWZ0ZXIgcmRtYS1ody50YXJnZXQK"
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/usr/lib/systemd/system/rdma-hw.target"
        "user": "root"
      - "contents":
          "source": "data:None;base64,W1VuaXRdCkRlc2NyaXB0aW9uPUxvYWQgUkRNQSBtb2R1bGVzIGZyb20gL2V0Yy9yZG1hL21vZHVsZXMvJUkuY29uZgpEb2N1bWVudGF0aW9uPWZpbGU6L3Vzci9zaGFyZS9kb2MvcmRtYS1jb3JlLTE2LjIvdWRldi5tZAojIEtlcm5lbCBtb2R1bGUgbG9hZGluZyBtdXN0IHRha2UgcGxhY2UgYmVmb3JlIHN5c2luaXQudGFyZ2V0LCBzaW1pbGFyIHRvCiMgc3lzdGVtZC1tb2R1bGVzLWxvYWQuc2VydmljZQpEZWZhdWx0RGVwZW5kZW5jaWVzPW5vCkJlZm9yZT1zeXNpbml0LnRhcmdldAojIERvIG5vdCBleGVjdXRlIGNvbmN1cnJlbnRseSB3aXRoIGFuIG9uZ29pbmcgc2h1dGRvd24KQ29uZmxpY3RzPXNodXRkb3duLnRhcmdldApCZWZvcmU9c2h1dGRvd24udGFyZ2V0CiMgUGFydGlhbGx5IHN1cHBvcnQgZGlzdHJvIG5ldHdvcmsgc2V0dXAgc2NyaXB0cyB0aGF0IHJ1biBhZnRlcgojIHN5c3RlbWQtbW9kdWxlcy1sb2FkLnNlcnZpY2UgYnV0IGJlZm9yZSBzeXNpbml0LnRhcmdldCwgZWcgYSBjbGFzc2ljIG5ldHdvcmsKIyBzZXR1cCBzY3JpcHQuIFJ1biB0aGVtIGFmdGVyIG1vZHVsZXMgaGF2ZSBsb2FkZWQuCldhbnRzPW5ldHdvcmstcHJlLnRhcmdldApCZWZvcmU9bmV0d29yay1wcmUudGFyZ2V0CiMgT3JkZXJzIGFsbCBrZXJuZWwgbW9kdWxlIHN0YXJ0dXAgYmVmb3JlIHJkbWEtaHcudGFyZ2V0IGNhbiBiZWNvbWUgcmVhZHkKQmVmb3JlPXJkbWEtaHcudGFyZ2V0CgpDb25kaXRpb25DYXBhYmlsaXR5PUNBUF9TWVNfTU9EVUxFCgpbU2VydmljZV0KVHlwZT1vbmVzaG90ClJlbWFpbkFmdGVyRXhpdD15ZXMKRXhlY1N0YXJ0PS9saWIvc3lzdGVtZC9zeXN0ZW1kLW1vZHVsZXMtbG9hZCAvZXRjL3JkbWEvbW9kdWxlcy8lSS5jb25mClRpbWVvdXRTZWM9OTBzCg=="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/usr/lib/systemd/system/rdma-load-modules@.service"
        "user": "root"
      - "contents":
          "source": "data:None;base64,W1VuaXRdCkRlc2NyaXB0aW9uPVJETUEgTm9kZSBEZXNjcmlwdGlvbiBEYWVtb24KRG9jdW1lbnRhdGlvbj1tYW46cmRtYS1uZGQKU3RvcFdoZW5Vbm5lZWRlZD15ZXMKIyByZG1hLW5kZCBpcyBhIGtlcm5lbCBzdXBwb3J0IHByb2dyYW0gYW5kIG5lZWRzIHRvIHJ1biBhcyBlYXJseSBhcyBwb3NzaWJsZSwKIyBiZWZvcmUgdGhlIG5ldHdvcmsgbGluayBpcyBicm91Z2h0IHVwLCBhbmQgYmVmb3JlIGFuIGV4dGVybmFsIG1hbmFnZXIgdHJpZXMKIyB0byByZWFkIHRoZSBsb2NhbCBub2RlIGRlc2NyaXB0aW9uLgpEZWZhdWx0RGVwZW5kZW5jaWVzPW5vCkJlZm9yZT1zeXNpbml0LnRhcmdldAojIERvIG5vdCBleGVjdXRlIGNvbmN1cnJlbnRseSB3aXRoIGFuIG9uZ29pbmcgc2h1dGRvd24gKHJlcXVpcmVkIGZvciBEZWZhdWx0RGVwZW5kZW5jaWVzPW5vKQpDb25mbGljdHM9c2h1dGRvd24udGFyZ2V0CkJlZm9yZT1zaHV0ZG93bi50YXJnZXQKIyBOZXR3b3JraW5nLCBwYXJ0aWN1bGFybHkgbGluayB1cCwgc2hvdWxkIG5vdCBoYXBwZW4gdW50aWwgbmRkIGlzIHJlYWR5CldhbnRzPW5ldHdvcmstcHJlLnRhcmdldApCZWZvcmU9bmV0d29yay1wcmUudGFyZ2V0CiMgcmRtYS1odyBpcyBub3QgcmVhZHkgdW50aWwgbmRkIGlzIHJ1bm5pbmcKQmVmb3JlPXJkbWEtaHcudGFyZ2V0CgpbU2VydmljZV0KVHlwZT1ub3RpZnkKUmVzdGFydD1hbHdheXMKRXhlY1N0YXJ0PS91c3Ivc2Jpbi9yZG1hLW5kZCAtLXN5c3RlbWQKCiMgcmRtYS1uZGQgaXMgYXV0b21hdGljYWxseSB3YW50ZWQgYnkgdWRldiB3aGVuIGFuIFJETUEgZGV2aWNlIHdpdGggYSBub2RlIGRlc2NyaXB0aW9uIGlzIHByZXNlbnQK"
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/usr/lib/systemd/system/rdma-ndd.service"
        "user": "root"
      - "contents":
          "source": "data:None;base64,W1VuaXRdCkRlc2NyaXB0aW9uPUluaXRpYWxpemUgdGhlIGlXQVJQL0luZmluaUJhbmQvUkRNQSBzdGFjayBpbiB0aGUga2VybmVsCkRvY3VtZW50YXRpb249ZmlsZTovZXRjL3JkbWEvcmRtYS5jb25mClJlZnVzZU1hbnVhbFN0b3A9dHJ1ZQpEZWZhdWx0RGVwZW5kZW5jaWVzPWZhbHNlCkNvbmZsaWN0cz1lbWVyZ2VuY3kudGFyZ2V0IGVtZXJnZW5jeS5zZXJ2aWNlCkJlZm9yZT1uZXR3b3JrLnRhcmdldCByZW1vdGUtZnMtcHJlLnRhcmdldAoKW1NlcnZpY2VdClR5cGU9b25lc2hvdApSZW1haW5BZnRlckV4aXQ9eWVzCkV4ZWNTdGFydD0vdXNyL2xpYmV4ZWMvcmRtYS1pbml0LWtlcm5lbAoKW0luc3RhbGxdCldhbnRlZEJ5PXN5c2luaXQudGFyZ2V0Cg=="
        "filesystem": "root"
        "group": "root"
        "mode": !!int "33188"
        "path": "/usr/lib/systemd/system/rdma.service"
        "user": "root"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment