From 34a4f4215bb5d5d833e81819b7ca65a13389a842 Mon Sep 17 00:00:00 2001 From: CourtneyPacheco Date: Jan 16 2017 13:24:14 +0000 Subject: Updating workshop iPython notebook and adding solutions iPython notebook. --- diff --git a/Devconf-2017-Modularity-Workshop.ipynb b/Devconf-2017-Modularity-Workshop.ipynb index fe30528..c715b50 100644 --- a/Devconf-2017-Modularity-Workshop.ipynb +++ b/Devconf-2017-Modularity-Workshop.ipynb @@ -153,8 +153,7 @@ }, "outputs": [], "source": [ - "# Run this cell to see an example modulemd file:\n", - "cat proftpd/proftpd.yaml" + "# Run this cell to see an example modulemd file:\n" ] }, { @@ -307,8 +306,7 @@ }, "outputs": [], "source": [ - "# Print list of all of the binary packages in Base Runtime\n", - "cat proftpd/packages/gen-core-binary-pkgs.txt" + "# Print list of all of the binary packages in Base Runtime\n" ] }, { @@ -320,8 +318,7 @@ }, "outputs": [], "source": [ - "# Print the list of proftpd dependencies not provided by the Base Runtime \n", - "cat proftpd/packages/diff.txt" + "# Print the list of proftpd dependencies not provided by the Base Runtime \n" ] }, { @@ -375,9 +372,7 @@ "collapsed": false }, "outputs": [], - "source": [ - "ls results" - ] + "source": [] }, { "cell_type": "markdown", @@ -394,9 +389,7 @@ "scrolled": true }, "outputs": [], - "source": [ - "ls results/module*/results" - ] + "source": [] }, { "cell_type": "markdown", @@ -422,9 +415,7 @@ }, "outputs": [], "source": [ - "# Use `dnf repoquery` to find which packages require HTTPD x86_64.\n", - "dnf repoquery --requires --resolve httpd | grep x86_64 > tmp.txt\n", - "cat tmp.txt" + "# Use `dnf repoquery` to find which packages require HTTPD x86_64.\n" ] }, { @@ -435,9 +426,7 @@ }, "outputs": [], "source": [ - "# Let's extract the names of the packages\n", - "sed -rn 's/([A-Za-z\\-]+)\\-(.*)/\\1/p' tmp.txt > httpd_dependencies.txt\n", - "cat httpd_dependencies.txt" + "# Let's extract the names of the packages\n" ] }, { @@ -448,7 +437,7 @@ }, "outputs": [], "source": [ - "diff -a --suppress-common-lines -y httpd_dependencies.txt proftpd/packages/gen-core-binary-pkgs.txt" + "# Get the diff between Base Runtime and the names of the packages you just obtained\n" ] }, { @@ -504,7 +493,7 @@ " documentation: \n", " tracker:\n", " \n", - " # Optoinal\n", + " # Optional\n", " profiles:\n", " \n", " # Optional - 'default' build (rpms that will be included by default)\n", @@ -526,11 +515,11 @@ " # Example key-value pair\n", " user-defined-key: #change this key name to whatever you like\n", " \n", - " # Example key-value pair with list\n", + " # Example key-value pair with list (add as little or as many as you like)\n", " another-user-defined-key: #change this key name to whatever you like\n", " - the first value of the list #change this value to whatever you like\n", " - the second value of the list #change this value to whatever you like\n", - " - the third value of the list\n", + " - the third value of the list #change this value to whatever you like\n", "\n", " # Optional - Components to be included in the module. (Note: A minimal module does not have\n", " # to contain components. However, to build your own module, you will need to add components\n", @@ -570,36 +559,37 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 5. *BONUS*: Building your own qcow2 image from your module (by hand)" + "## 5. *BONUS*: Building your own qcow2 image from your module (using virt-install)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "While you can use a tool such as `virt-install`, you should learn how qcow2 images are generated. This way, you understand what is going on behind the scenes.\n", + "**`virt-install`** is one easy way you can generate your own qcow2 image. Thus, we'll be using the `virt-install` tool to create our KVM using the **`libvirt`** library (hence the `libvirt` dependency). \n", "\n", - "Now, in order to build your own qcow2 image from your module, you will first need to install the following packages:" + "In order to use `virt-install`, you'll need to install the following packages:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ - "sudo dnf install imagefactory libvirt virt-manager" + "# Install dependencies\n", + "sudo dnf install libvirt virt-install virt-viewer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Next you'll need a Fedora Kickstart file.\n", + "Now, within this workshop git repository, we've included an f24 kickstart file that you can use. You will need this file in order run `virt-install`. The Kickstart file is used to tell `virt-install` what to install and how to install it.\n", "\n", - "Within this workshop git repository, we've included an f24 kickstart file that you can use. If you wish, you can paste your modified kickstart below so that it's easier for you to see it while you complete this part of the workshop. Your job is to modify the kickstart file to use f25. Name this file `f25-cloud.ks`.\n", + "If you wish, you can paste your modified kickstart below so that it's easier for you to see it while you complete this part of the workshop. Your job is to modify the kickstart file to use **f25**. Name this file **`f25-cloud.ks`**.\n", "\n", "For information about kickstart files (e.g., what they are, how we use them, etc.), see: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-file.html" ] @@ -608,27 +598,91 @@ "cell_type": "raw", "metadata": {}, "source": [ - "# OPTIONAL: Paste your modified kickstart here" + "# Paste your kickstart file here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below is a hint to help you get started with virt-install. You'll need to add more arguments in order to generate your qcow2 image. Also, do not run this command in your notebook! It will cause your notebook to crash!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# virt-install --name --ram --disk pool=default,size=10 --location " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Following this, you'll need a template file. We've included a template file here, titled `f24-cloud-template.tdl`. Modify this template file to use f25 and name this file `f25-cloud-template.tdl`" + "As you will see, `virt-install` will take a while to run. So while your image is being generated, you can skip to step 6 (which is a slightly faster way for building your image)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. *BONUS*: Building your own qcow2 image from your module (by hand)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While you can use a tool such as `virt-install`, this method is significantly *faster*.\n", + "\n", + "Now, in order to build your own qcow2 image from your module, you will first need to install the following packages:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sudo dnf install imagefactory libvirt virt-manager" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next you'll need a Fedora Kickstart file -- the one you created in step 6 earlier." ] }, { "cell_type": "raw", "metadata": {}, "source": [ - "# OPTIONAL: Paste your modified template here" + "# OPTIONAL: Paste your modified kickstart here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "Following this, you'll need a template file. We've included a template file here, titled `f24-cloud-template.tdl`. Modify this template file to use f25 and name this file **`f25-cloud-template.tdl`**." + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "You'll also need a `cloud-init` file in order to generate this image, so follow the instructions to generate a cloud-init file: http://www.projectatomic.io/blog/2014/10/getting-started-with-cloud-init/\n", "\n", "However, instead of `wget https://alt.fedoraproject.org/pub/alt/fedora-atomic/testing/rawhide/20141008.0/cloud/fedora-atomic-rawhide-20141008.0.qcow2.xz`\n", @@ -644,7 +698,7 @@ }, "outputs": [], "source": [ - "# Obtain f25 qcow2 image\n", + "# Obtain f25 qcow2 cloud image\n", "wget https://dl.fedoraproject.org/pub/alt/atomic/stable/Fedora-Atomic-25-20161221.0/CloudImages/x86_64/images/Fedora-Atomic-25-20161221.0.x86_64.qcow2" ] }, diff --git a/solutions.ipynb b/solutions.ipynb new file mode 100644 index 0000000..4064bb8 --- /dev/null +++ b/solutions.ipynb @@ -0,0 +1,2821 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# DEVCONF 2017 Modularity Workshop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Welcome to the Modularity \"Build Your Own Module\" workshop!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this workshop, you will learn how to build your own module! But before we begin, let's review the basics of iPython bash Notebooks:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Introduction to iPython Bash Notebooks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### I. Selecting your kernel" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the menu above, there is a heading called **Kernel**. Click that heading and scroll down to **Change kernel**. Now select **bash** if you haven't selected it already. This kernel is needed in order to run this notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### II. How to use this notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you've selected your kernel, you can run the cells below to test out this notebook:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mon Jan 16 08:15:38 EST 2017\n" + ] + } + ], + "source": [ + "# To run this cell, click the \"play\" button on the menu above. (The \"play\" button is right below the word \"Cell\")\n", + "date" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Running the above cell should print the current date and time.\n", + "\n", + "You can also modify the content of cells! " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello, my name is: \n" + ] + } + ], + "source": [ + "# Below, type in your name, then click the \"play\" button to update the output\n", + "echo \"Hello, my name is: \"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before you continue, you may want to do `su root`, then run `jupyter notebook` in order to run the sudo commands later in this document." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Developing a Module" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we begin discussing how to develop a module, uncomment and run the script below **in your terminal** (i.e., not in this Notebook) to start an example module build. (Don't worry! We'll discuss this part later on. We just want to run this these bash lines because they take a while to run.) If you do not run this script in your terminal, your Notebook may crash!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "## Start example module build\n", + "# systemctl start docker\n", + "# systemctl status docker\n", + "# sudo mock --init\n", + "# sudo setenforce 0\n", + "# sudo ./build-module/build_module ./proftpd ./results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### I. modulemd basics" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "In order to develop a module, you will need to write a **modulemd** file which describes what your module will contain. A modulemd file is single YAML file that comprises of a number of key-value pairs describing the module's properties and components. Not everything needs to (or even should) be filled in by the module packager; some of the fields will be automatically populated during the module build or distribution phase later on.\n", + "\n", + "Below, we provide an example modulemd file, then describe the basics of it:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "document: modulemd\n", + "version: 1\n", + "data:\n", + " summary: A first try of a proftpd module\n", + " description: An early-stage module of proftpd - a flexible, stable and highly-configurable FTP server\n", + " license:\n", + " module: [ MIT ]\n", + " dependencies:\n", + " buildrequires:\n", + " base-runtime: master\n", + " requires:\n", + " base-runtime: master\n", + " references:\n", + " community: https://fedoraproject.org/wiki/Modularity\n", + " documentation: https://github.com/container-images/proftpd\n", + " tracker: https://github.com/container-images/proftpd\n", + " profiles:\n", + " default:\n", + " rpms:\n", + " - proftpd\n", + " api:\n", + " rpms:\n", + " - proftpd\n", + " components:\n", + " rpms:\n", + " proftpd:\n", + " rationale: Provides API for this module.\n", + " ref: f25\n", + " buildorder: 10\n", + " generic-release:\n", + " rationale: build dependency\n", + " ref: f25\n", + " GeoIP:\n", + " rationale: build dependency\n", + " ref: f25\n", + " GeoIP-GeoLite-data:\n", + " rationale: build dependency\n", + " ref: f25\n", + " libevent:\n", + " rationale: runtime dependency\n", + " ref: f25\n", + " libmemcached:\n", + " rationale: runtime dependency\n", + " ref: f25\n", + " libmnl:\n", + " rationale: runtime dependency\n", + " ref: f25\n", + " libnetfilter_conntrack:\n", + " rationale: runtime dependency\n", + " ref: f25\n", + " libnfnetlink:\n", + " rationale: runtime dependency\n", + " ref: f25\n", + " libxkbcommon:\n", + " rationale: runtime dependency\n", + " ref: f25\n", + " tcp_wrappers:\n", + " rationale: runtime dependency\n", + " ref: f25\n", + " xkeyboard-config:\n", + " rationale: runtime dependency\n", + " ref: f25\n" + ] + } + ], + "source": [ + "# Run this cell to see an example modulemd file:\n", + "cat proftpd/proftpd.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Document Header and Data Section**\n", + "\n", + "Every modulemd file *must* contain a modulemd document header, which consists of the document type tag and the document format version, and a data section holding the module data. Since there is only one version of modulemd (version 1), the version is set to 1." + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + " document: modulemd\n", + " version: 1\n", + " data:\n", + " (...)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Module Summary and Description**\n", + "\n", + "Every module *must* include a human-readable short summary and description (which expands upon the summary). Both should be written in US English:" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + " summary: A first try of a proftpd module\n", + " description: An early-stage module of proftpd - a flexible, stable and highly-configurable FTP server." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Module Licensing**\n", + "\n", + "Every module *must* contain a license section and declare a list of the module's licenses. (Note: these are *not* the module's components' licenses.)" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + " license:\n", + " module:\n", + " - MIT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Dependencies**\n", + "\n", + "Dependencies are optional. Here, *buildrequires* is the list of build dependencies for proftpd, and *requires* are the list of runtime dependencies for proftpd." + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "dependencies:\n", + " buildrequires:\n", + " base-runtime: master\n", + " requires:\n", + " base-runtime: master" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**References** \n", + "\n", + "References are optional and they list the upstream resources referenced in the module:" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "references:\n", + " community: https://fedoraproject.org/wiki/Modularity\n", + " documentation: https://github.com/container-images/proftpd\n", + " tracker: https://github.com/container-images/proftpd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Module Profiles**\n", + "\n", + "Module profiles are optional, and the 'default' option specifies the list of packages that will be installed by default." + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "profiles:\n", + " default:\n", + " rpms:\n", + " - proftpd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Everything Else**\n", + "\n", + "*API*\n", + "- Module API are components, symbols, files or abstract features the module explicitly declares to be its supported interface.\n", + "\n", + "*Components*\n", + "- The RPMs that will be installed in this module\n", + "\n", + "For more information, visit:\n", + "https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### II. RPM dependencies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your module must include all RPM dependencies for what you plan to modularize - except those which are provided by the Base Runtime. Please see the list of Base Runtime binary packages." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acl\n", + "at\n", + "attr\n", + "audispd-plugins\n", + "audispd-plugins-zos\n", + "audit\n", + "audit-libs\n", + "audit-libs-devel\n", + "audit-libs-python\n", + "audit-libs-python3\n", + "audit-libs-static\n", + "babeltrace\n", + "basesystem\n", + "bash\n", + "bash-doc\n", + "bc\n", + "binutils\n", + "binutils-devel\n", + "bsdcat\n", + "bsdcpio\n", + "bsdtar\n", + "byacc\n", + "bzip2\n", + "bzip2-devel\n", + "bzip2-libs\n", + "bzip2-static\n", + "ca-certificates\n", + "cflow\n", + "chkconfig\n", + "cmirror\n", + "cmirror-standalone\n", + "compat-libmpc\n", + "convert-to-edition\n", + "coreutils\n", + "coreutils-common\n", + "coreutils-single\n", + "cpio\n", + "cpp\n", + "cracklib\n", + "cracklib-devel\n", + "cracklib-dicts\n", + "cracklib-python\n", + "cronie\n", + "cronie-anacron\n", + "cronie-noanacron\n", + "crontabs\n", + "crypto-policies\n", + "cryptsetup\n", + "cryptsetup-devel\n", + "cryptsetup-libs\n", + "cryptsetup-python\n", + "cryptsetup-python3\n", + "cryptsetup-reencrypt\n", + "ctags\n", + "ctags-etags\n", + "curl\n", + "cyrus-sasl\n", + "cyrus-sasl-devel\n", + "cyrus-sasl-gs2\n", + "cyrus-sasl-gssapi\n", + "cyrus-sasl-ldap\n", + "cyrus-sasl-lib\n", + "cyrus-sasl-md5\n", + "cyrus-sasl-ntlm\n", + "cyrus-sasl-plain\n", + "cyrus-sasl-scram\n", + "cyrus-sasl-sql\n", + "dbus\n", + "dbus-devel\n", + "dbus-doc\n", + "dbus-libs\n", + "dbus-tests\n", + "dbus-x11\n", + "device-mapper\n", + "device-mapper-devel\n", + "device-mapper-event\n", + "device-mapper-event-devel\n", + "device-mapper-event-libs\n", + "device-mapper-libs\n", + "diffutils\n", + "dracut\n", + "dracut-caps\n", + "dracut-config-generic\n", + "dracut-config-rescue\n", + "dracut-fips\n", + "dracut-fips-aesni\n", + "dracut-live\n", + "dracut-network\n", + "dracut-tools\n", + "dwz\n", + "e2fsprogs\n", + "e2fsprogs-devel\n", + "e2fsprogs-libs\n", + "e2fsprogs-static\n", + "ed\n", + "elfutils\n", + "elfutils-default-yama-scope\n", + "elfutils-devel\n", + "elfutils-devel-static\n", + "elfutils-libelf\n", + "elfutils-libelf-devel\n", + "elfutils-libelf-devel-static\n", + "elfutils-libs\n", + "emacs\n", + "emacs-common\n", + "emacs-filesystem\n", + "emacs-gettext\n", + "emacs-nox\n", + "emacs-terminal\n", + "expat\n", + "expat-devel\n", + "expat-static\n", + "fedora-logos\n", + "fedora-logos-httpd\n", + "fedora-release\n", + "fedora-release-atomichost\n", + "fedora-release-cloud\n", + "fedora-release-server\n", + "fedora-release-workstation\n", + "fedora-repos\n", + "fedora-repos-rawhide\n", + "fedpkg-minimal\n", + "file\n", + "file-devel\n", + "file-libs\n", + "filesystem\n", + "findutils\n", + "flex\n", + "flex-devel\n", + "flex-doc\n", + "fpc-srpm-macros\n", + "freetype\n", + "freetype-demos\n", + "freetype-devel\n", + "gawk\n", + "gawk-devel\n", + "gawk-doc\n", + "gc\n", + "gcc\n", + "gcc-c++\n", + "gcc-gdb-plugin\n", + "gcc-gfortran\n", + "gcc-gnat\n", + "gcc-go\n", + "gcc-objc\n", + "gcc-objc++\n", + "gcc-plugin-devel\n", + "gc-devel\n", + "gdb\n", + "gdb-doc\n", + "gdb-gdbserver\n", + "gdb-headless\n", + "gdbm\n", + "gdbm-devel\n", + "gencore.txt\n", + "gettext\n", + "gettext-common-devel\n", + "gettext-devel\n", + "gettext-libs\n", + "ghc-srpm-macros\n", + "glib2\n", + "glib2-devel\n", + "glib2-doc\n", + "glib2-fam\n", + "glib2-static\n", + "glib2-tests\n", + "glibc\n", + "glibc-all-langpacks\n", + "glibc-benchtests\n", + "glibc-common\n", + "glibc-devel\n", + "glibc-headers\n", + "glibc-langpack-aa\n", + "glibc-langpack-af\n", + "glibc-langpack-ak\n", + "glibc-langpack-am\n", + "glibc-langpack-an\n", + "glibc-langpack-anp\n", + "glibc-langpack-ar\n", + "glibc-langpack-as\n", + "glibc-langpack-ast\n", + "glibc-langpack-ayc\n", + "glibc-langpack-az\n", + "glibc-langpack-be\n", + "glibc-langpack-bem\n", + "glibc-langpack-ber\n", + "glibc-langpack-bg\n", + "glibc-langpack-bhb\n", + "glibc-langpack-bho\n", + "glibc-langpack-bn\n", + "glibc-langpack-bo\n", + "glibc-langpack-br\n", + "glibc-langpack-brx\n", + "glibc-langpack-bs\n", + "glibc-langpack-byn\n", + "glibc-langpack-ca\n", + "glibc-langpack-ce\n", + "glibc-langpack-chr\n", + "glibc-langpack-cmn\n", + "glibc-langpack-crh\n", + "glibc-langpack-cs\n", + "glibc-langpack-csb\n", + "glibc-langpack-cv\n", + "glibc-langpack-cy\n", + "glibc-langpack-da\n", + "glibc-langpack-de\n", + "glibc-langpack-doi\n", + "glibc-langpack-dv\n", + "glibc-langpack-dz\n", + "glibc-langpack-el\n", + "glibc-langpack-en\n", + "glibc-langpack-eo\n", + "glibc-langpack-es\n", + "glibc-langpack-et\n", + "glibc-langpack-eu\n", + "glibc-langpack-fa\n", + "glibc-langpack-ff\n", + "glibc-langpack-fi\n", + "glibc-langpack-fil\n", + "glibc-langpack-fo\n", + "glibc-langpack-fr\n", + "glibc-langpack-fur\n", + "glibc-langpack-fy\n", + "glibc-langpack-ga\n", + "glibc-langpack-gd\n", + "glibc-langpack-gez\n", + "glibc-langpack-gl\n", + "glibc-langpack-gu\n", + "glibc-langpack-gv\n", + "glibc-langpack-ha\n", + "glibc-langpack-hak\n", + "glibc-langpack-he\n", + "glibc-langpack-hi\n", + "glibc-langpack-hne\n", + "glibc-langpack-hr\n", + "glibc-langpack-hsb\n", + "glibc-langpack-ht\n", + "glibc-langpack-hu\n", + "glibc-langpack-hy\n", + "glibc-langpack-ia\n", + "glibc-langpack-id\n", + "glibc-langpack-ig\n", + "glibc-langpack-ik\n", + "glibc-langpack-is\n", + "glibc-langpack-it\n", + "glibc-langpack-iu\n", + "glibc-langpack-ja\n", + "glibc-langpack-ka\n", + "glibc-langpack-kk\n", + "glibc-langpack-kl\n", + "glibc-langpack-km\n", + "glibc-langpack-kn\n", + "glibc-langpack-ko\n", + "glibc-langpack-kok\n", + "glibc-langpack-ks\n", + "glibc-langpack-ku\n", + "glibc-langpack-kw\n", + "glibc-langpack-ky\n", + "glibc-langpack-lb\n", + "glibc-langpack-lg\n", + "glibc-langpack-li\n", + "glibc-langpack-lij\n", + "glibc-langpack-ln\n", + "glibc-langpack-lo\n", + "glibc-langpack-lt\n", + "glibc-langpack-lv\n", + "glibc-langpack-lzh\n", + "glibc-langpack-mag\n", + "glibc-langpack-mai\n", + "glibc-langpack-mg\n", + "glibc-langpack-mhr\n", + "glibc-langpack-mi\n", + "glibc-langpack-mk\n", + "glibc-langpack-ml\n", + "glibc-langpack-mn\n", + "glibc-langpack-mni\n", + "glibc-langpack-mr\n", + "glibc-langpack-ms\n", + "glibc-langpack-mt\n", + "glibc-langpack-my\n", + "glibc-langpack-nan\n", + "glibc-langpack-nb\n", + "glibc-langpack-nds\n", + "glibc-langpack-ne\n", + "glibc-langpack-nhn\n", + "glibc-langpack-niu\n", + "glibc-langpack-nl\n", + "glibc-langpack-nn\n", + "glibc-langpack-nr\n", + "glibc-langpack-nso\n", + "glibc-langpack-oc\n", + "glibc-langpack-om\n", + "glibc-langpack-or\n", + "glibc-langpack-os\n", + "glibc-langpack-pa\n", + "glibc-langpack-pap\n", + "glibc-langpack-pl\n", + "glibc-langpack-ps\n", + "glibc-langpack-pt\n", + "glibc-langpack-quz\n", + "glibc-langpack-raj\n", + "glibc-langpack-ro\n", + "glibc-langpack-ru\n", + "glibc-langpack-rw\n", + "glibc-langpack-sa\n", + "glibc-langpack-sat\n", + "glibc-langpack-sc\n", + "glibc-langpack-sd\n", + "glibc-langpack-se\n", + "glibc-langpack-sgs\n", + "glibc-langpack-shs\n", + "glibc-langpack-si\n", + "glibc-langpack-sid\n", + "glibc-langpack-sk\n", + "glibc-langpack-sl\n", + "glibc-langpack-so\n", + "glibc-langpack-sq\n", + "glibc-langpack-sr\n", + "glibc-langpack-ss\n", + "glibc-langpack-st\n", + "glibc-langpack-sv\n", + "glibc-langpack-sw\n", + "glibc-langpack-szl\n", + "glibc-langpack-ta\n", + "glibc-langpack-tcy\n", + "glibc-langpack-te\n", + "glibc-langpack-tg\n", + "glibc-langpack-th\n", + "glibc-langpack-the\n", + "glibc-langpack-ti\n", + "glibc-langpack-tig\n", + "glibc-langpack-tk\n", + "glibc-langpack-tl\n", + "glibc-langpack-tn\n", + "glibc-langpack-tr\n", + "glibc-langpack-ts\n", + "glibc-langpack-tt\n", + "glibc-langpack-ug\n", + "glibc-langpack-uk\n", + "glibc-langpack-unm\n", + "glibc-langpack-ur\n", + "glibc-langpack-uz\n", + "glibc-langpack-ve\n", + "glibc-langpack-vi\n", + "glibc-langpack-wa\n", + "glibc-langpack-wae\n", + "glibc-langpack-wal\n", + "glibc-langpack-wo\n", + "glibc-langpack-xh\n", + "glibc-langpack-yi\n", + "glibc-langpack-yo\n", + "glibc-langpack-yue\n", + "glibc-langpack-zh\n", + "glibc-langpack-zu\n", + "glibc-locale-source\n", + "glibc-minimal-langpack\n", + "glibc-nss-devel\n", + "glibc-static\n", + "glibc-utils\n", + "gmp\n", + "gmp-c++\n", + "gmp-devel\n", + "gmp-static\n", + "gnat-srpm-macros\n", + "gnupg2\n", + "gnupg2-smime\n", + "gnutls\n", + "gnutls-c++\n", + "gnutls-dane\n", + "gnutls-devel\n", + "gnutls-guile\n", + "gnutls-utils\n", + "go-srpm-macros\n", + "grep\n", + "groff\n", + "groff-base\n", + "groff-doc\n", + "groff-perl\n", + "groff-x11\n", + "grub2\n", + "grub2-efi\n", + "grub2-efi-modules\n", + "grub2-starfield-theme\n", + "grub2-tools\n", + "guile\n", + "guile-devel\n", + "gzip\n", + "info\n", + "iptables\n", + "iptables-compat\n", + "iptables-devel\n", + "iptables-libs\n", + "iptables-services\n", + "iptables-utils\n", + "isl\n", + "isl-devel\n", + "iwl1000-firmware\n", + "iwl100-firmware\n", + "iwl105-firmware\n", + "iwl135-firmware\n", + "iwl2000-firmware\n", + "iwl2030-firmware\n", + "iwl3160-firmware\n", + "iwl3945-firmware\n", + "iwl4965-firmware\n", + "iwl5000-firmware\n", + "iwl5150-firmware\n", + "iwl6000-firmware\n", + "iwl6000g2a-firmware\n", + "iwl6000g2b-firmware\n", + "iwl6050-firmware\n", + "iwl7260-firmware\n", + "kernel\n", + "kernel-core\n", + "kernel-cross-headers\n", + "kernel-debug\n", + "kernel-debug-core\n", + "kernel-debug-devel\n", + "kernel-debug-modules\n", + "kernel-debug-modules-extra\n", + "kernel-devel\n", + "kernel-headers\n", + "kernel-modules\n", + "kernel-modules-extra\n", + "kernel-rpm-macros\n", + "kernel-tools\n", + "kernel-tools-libs\n", + "kernel-tools-libs-devel\n", + "keyutils\n", + "keyutils-libs\n", + "keyutils-libs-devel\n", + "kmod\n", + "kmod-devel\n", + "kmod-libs\n", + "krb5-devel\n", + "krb5-libs\n", + "krb5-pkinit\n", + "krb5-server\n", + "krb5-server-ldap\n", + "krb5-workstation\n", + "lemon\n", + "less\n", + "libacl\n", + "libacl-devel\n", + "libarchive\n", + "libarchive-devel\n", + "libasan\n", + "libasan-static\n", + "libassuan\n", + "libassuan-devel\n", + "libatomic\n", + "libatomic_ops\n", + "libatomic_ops-devel\n", + "libatomic_ops-static\n", + "libatomic-static\n", + "libattr\n", + "libattr-devel\n", + "libbabeltrace\n", + "libbabeltrace-devel\n", + "libblkid\n", + "libblkid-devel\n", + "libcap\n", + "libcap-devel\n", + "libcap-ng\n", + "libcap-ng-devel\n", + "libcap-ng-python\n", + "libcap-ng-python3\n", + "libcap-ng-utils\n", + "libcilkrts\n", + "libcilkrts-static\n", + "libcom_err\n", + "libcom_err-devel\n", + "libcroco\n", + "libcroco-devel\n", + "libcrypt\n", + "libcrypt-nss\n", + "libcurl\n", + "libcurl-devel\n", + "libdb\n", + "libdb-cxx\n", + "libdb-cxx-devel\n", + "libdb-devel\n", + "libdb-devel-doc\n", + "libdb-devel-static\n", + "libdb-java\n", + "libdb-java-devel\n", + "libdb-sql\n", + "libdb-sql-devel\n", + "libdb-tcl\n", + "libdb-tcl-devel\n", + "libdb-utils\n", + "libertas-sd8686-firmware\n", + "libertas-sd8787-firmware\n", + "libertas-usb8388-firmware\n", + "libertas-usb8388-olpc-firmware\n", + "libfdisk\n", + "libfdisk-devel\n", + "libffi\n", + "libffi-devel\n", + "libgcc\n", + "libgccjit\n", + "libgccjit-devel\n", + "libgcrypt\n", + "libgcrypt-devel\n", + "libgfortran\n", + "libgfortran-static\n", + "libgnat\n", + "libgnat-devel\n", + "libgnat-static\n", + "libgo\n", + "libgo-devel\n", + "libgomp\n", + "libgo-static\n", + "libgpg-error\n", + "libgpg-error-devel\n", + "libidn\n", + "libidn-devel\n", + "libidn-java\n", + "libidn-javadoc\n", + "libipt\n", + "libipt-devel\n", + "libitm\n", + "libitm-devel\n", + "libitm-static\n", + "libkadm5\n", + "libksba\n", + "libksba-devel\n", + "liblsan\n", + "liblsan-static\n", + "libmetalink\n", + "libmetalink-devel\n", + "libmount\n", + "libmount-devel\n", + "libmpc\n", + "libmpc-devel\n", + "libmpx\n", + "libmpx-static\n", + "libnghttp2\n", + "libnghttp2-devel\n", + "libobjc\n", + "libpcap\n", + "libpcap-devel\n", + "libpipeline\n", + "libpipeline-devel\n", + "libpng\n", + "libpng-devel\n", + "libpng-static\n", + "libpng-tools\n", + "libpsl\n", + "libpsl-devel\n", + "libpwquality\n", + "libpwquality-devel\n", + "libquadmath\n", + "libquadmath-devel\n", + "libquadmath-static\n", + "libseccomp\n", + "libseccomp-devel\n", + "libseccomp-static\n", + "libselinux\n", + "libselinux-devel\n", + "libselinux-python\n", + "libselinux-python3\n", + "libselinux-ruby\n", + "libselinux-static\n", + "libselinux-utils\n", + "libsemanage\n", + "libsemanage-devel\n", + "libsemanage-python\n", + "libsemanage-python3\n", + "libsemanage-static\n", + "libsepol\n", + "libsepol-devel\n", + "libsepol-static\n", + "libsigsegv\n", + "libsigsegv-devel\n", + "libsigsegv-static\n", + "libsmartcols\n", + "libsmartcols-devel\n", + "libss\n", + "libss-devel\n", + "libssh2\n", + "libssh2-devel\n", + "libssh2-docs\n", + "libstdc++\n", + "libstdc++-devel\n", + "libstdc++-docs\n", + "libstdc++-static\n", + "libtasn1\n", + "libtasn1-devel\n", + "libtasn1-tools\n", + "libtool\n", + "libtool-ltdl\n", + "libtool-ltdl-devel\n", + "libtsan\n", + "libtsan-static\n", + "libubsan\n", + "libubsan-static\n", + "libunistring\n", + "libunistring-devel\n", + "libutempter\n", + "libutempter-devel\n", + "libuuid\n", + "libuuid-devel\n", + "libverto\n", + "libverto-devel\n", + "libverto-glib\n", + "libverto-glib-devel\n", + "libverto-libev\n", + "libverto-libev-devel\n", + "libverto-libevent\n", + "libverto-libevent-devel\n", + "libverto-tevent\n", + "libverto-tevent-devel\n", + "libxml2\n", + "libxml2-devel\n", + "libxml2-static\n", + "linux-firmware\n", + "lua\n", + "lua-devel\n", + "lua-libs\n", + "lua-static\n", + "lvm2\n", + "lvm2-cluster\n", + "lvm2-cluster-standalone\n", + "lvm2-dbusd\n", + "lvm2-devel\n", + "lvm2-libs\n", + "lvm2-lockd\n", + "lvm2-python3-libs\n", + "lvm2-python-libs\n", + "lz4\n", + "lz4-devel\n", + "lz4-static\n", + "lzo\n", + "lzo-devel\n", + "lzo-minilzo\n", + "m4\n", + "make\n", + "make-devel\n", + "man-db\n", + "man-db-cron\n", + "minizip\n", + "minizip-devel\n", + "mpfr\n", + "mpfr-devel\n", + "ncompress\n", + "ncurses\n", + "ncurses-base\n", + "ncurses-c++-libs\n", + "ncurses-compat-libs\n", + "ncurses-devel\n", + "ncurses-libs\n", + "ncurses-static\n", + "ncurses-term\n", + "nettle\n", + "nettle-devel\n", + "nghttp2\n", + "npth\n", + "npth-devel\n", + "nscd\n", + "nspr\n", + "nspr-devel\n", + "nss\n", + "nss_db\n", + "nss-devel\n", + "nss_hesiod\n", + "nss_nis\n", + "nss-pem\n", + "nss-pkcs11-devel\n", + "nss-softokn\n", + "nss-softokn-devel\n", + "nss-softokn-freebl\n", + "nss-softokn-freebl-devel\n", + "nss-sysinit\n", + "nss-tools\n", + "nss-util\n", + "nss-util-devel\n", + "ntsysv\n", + "ocaml-srpm-macros\n", + "openldap\n", + "openldap-clients\n", + "openldap-devel\n", + "openldap-servers\n", + "openssl\n", + "openssl-devel\n", + "openssl-libs\n", + "openssl-perl\n", + "openssl-static\n", + "os-prober\n", + "p11-kit\n", + "p11-kit-devel\n", + "p11-kit-trust\n", + "pam\n", + "pam-devel\n", + "patch\n", + "pcre\n", + "pcre-cpp\n", + "pcre-devel\n", + "pcre-doc\n", + "pcre-static\n", + "pcre-tools\n", + "pcre-utf16\n", + "pcre-utf32\n", + "perf\n", + "perl-srpm-macros\n", + "pkgconfig\n", + "pkgs.txt\n", + "popt\n", + "popt-devel\n", + "popt-static\n", + "procps-ng\n", + "procps-ng-devel\n", + "procps-ng-i18n\n", + "psl\n", + "psmisc\n", + "python\n", + "python2-rpm\n", + "python2-rpm-macros\n", + "python2-setuptools\n", + "python3\n", + "python3-babeltrace\n", + "python3-debug\n", + "python3-devel\n", + "python3-libmount\n", + "python3-libs\n", + "python3-libxml2\n", + "python3-magic\n", + "python3-pip\n", + "python3-pwquality\n", + "python3-rpm\n", + "python3-rpm-macros\n", + "python3-setuptools\n", + "python3-test\n", + "python3-tkinter\n", + "python3-tools\n", + "python-debug\n", + "python-devel\n", + "python-libs\n", + "python-libxml2\n", + "python-magic\n", + "python-perf\n", + "python-pip\n", + "python-pwquality\n", + "python-rpm-macros\n", + "python-srpm-macros\n", + "python-test\n", + "python-tools\n", + "qrencode\n", + "qrencode-devel\n", + "qrencode-libs\n", + "qt5\n", + "qt5-devel\n", + "qt5-rpm-macros\n", + "qt5-srpm-macros\n", + "readline\n", + "readline-devel\n", + "readline-static\n", + "redhat-rpm-config\n", + "repodata\n", + "rpm\n", + "rpm-apidocs\n", + "rpm-build\n", + "rpm-build-libs\n", + "rpm-cron\n", + "rpm-devel\n", + "rpm-libs\n", + "rpm-plugin-ima\n", + "rpm-plugin-selinux\n", + "rpm-plugin-syslog\n", + "rpm-plugin-systemd-inhibit\n", + "rpm-sign\n", + "sed\n", + "setup\n", + "shadow-utils\n", + "sharutils\n", + "sqlite\n", + "sqlite-analyzer\n", + "sqlite-devel\n", + "sqlite-doc\n", + "sqlite-libs\n", + "sqlite-tcl\n", + "systemd\n", + "systemd-container\n", + "systemd-devel\n", + "systemd-journal-remote\n", + "systemd-libs\n", + "systemd-pam\n", + "systemd-udev\n", + "system-python\n", + "system-python-libs\n", + "tar\n", + "texinfo\n", + "texinfo-tex\n", + "time\n", + "tkinter\n", + "tzdata\n", + "tzdata-java\n", + "unzip\n", + "ustr\n", + "ustr-debug\n", + "ustr-debug-static\n", + "ustr-devel\n", + "ustr-static\n", + "util-linux\n", + "util-linux-user\n", + "uuidd\n", + "veritysetup\n", + "vim-common\n", + "vim-enhanced\n", + "vim-filesystem\n", + "vim-minimal\n", + "vim-X11\n", + "which\n", + "xz\n", + "xz-devel\n", + "xz-libs\n", + "xz-lzma-compat\n", + "xz-static\n", + "zip\n", + "zlib\n", + "zlib-devel\n", + "zlib-static\n" + ] + } + ], + "source": [ + "# Print list of all of the binary packages in Base Runtime\n", + "cat proftpd/packages/gen-core-binary-pkgs.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generic-release\n", + "GeoIP\n", + "GeoIP-GeoLite-data\n", + "libevent\n", + "libmemcached-libs\n", + "libmnl\n", + "libnetfilter_conntrack\n", + "libnfnetlink\n", + "libxkbcommon\n", + "tcp_wrappers-libs\n", + "xkeyboard-config\n" + ] + } + ], + "source": [ + "# Print the list of proftpd dependencies not provided by the Base Runtime \n", + "cat proftpd/packages/diff.txt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that these packages are the **`components`** listed section I above. We do not need to list all the `Base Runtime` modules in the `components` section because we already listed `Base Runtime` as a module dependency." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Building a Module" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you think you have your modulemd ready, you need to place it in a local git repository. The names of both the repository and the modulemd **must** match the module name.\n", + "\n", + "Example: If your module is called `proftpd`, the repo directory will also be named proftpd and the modulemd file `proftpd.yaml`.\n", + "\n", + "Then you simply build it using the build_module script." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### I. The `proftpd` module" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "scrolled": true + }, + "source": [ + "Since we already created the `proftpd` module in STEP 1, by now, the `proftpd` should be complete (or almost complete).\n", + "\n", + "Let's see what's in the `results` folder:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "module-proftpd-master-20170103132819\n" + ] + } + ], + "source": [ + "ls results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above folder contains the results of the `proftpd` module you ran earlier. Within the `module-proftpd-master*` folder, we have another `results` folder, which contains the content of the module:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generic-release-25-1.noarch.rpm\n", + "generic-release-25-1.src.rpm\n", + "generic-release-build.log\n", + "generic-release-notes-25-1.noarch.rpm\n", + "generic-release-root.log\n", + "generic-release-state.log\n", + "generic-release-status.log\n", + "GeoIP-1.6.9-2.fc25.src.rpm\n", + "GeoIP-1.6.9-2.fc25.x86_64.rpm\n", + "GeoIP-build.log\n", + "GeoIP-debuginfo-1.6.9-2.fc25.x86_64.rpm\n", + "GeoIP-devel-1.6.9-2.fc25.x86_64.rpm\n", + "GeoIP-GeoLite-data-2016.10-1.fc25.noarch.rpm\n", + "GeoIP-GeoLite-data-2016.10-1.fc25.src.rpm\n", + "GeoIP-GeoLite-data-build.log\n", + "GeoIP-GeoLite-data-extra-2016.10-1.fc25.noarch.rpm\n", + "GeoIP-GeoLite-data-root.log\n", + "GeoIP-GeoLite-data-state.log\n", + "GeoIP-GeoLite-data-status.log\n", + "GeoIP-root.log\n", + "GeoIP-state.log\n", + "GeoIP-status.log\n", + "libevent-2.0.22-1.fc25.src.rpm\n", + "libevent-2.0.22-1.fc25.x86_64.rpm\n", + "libevent-build.log\n", + "libevent-debuginfo-2.0.22-1.fc25.x86_64.rpm\n", + "libevent-devel-2.0.22-1.fc25.x86_64.rpm\n", + "libevent-doc-2.0.22-1.fc25.noarch.rpm\n", + "libevent-root.log\n", + "libevent-state.log\n", + "libevent-status.log\n", + "libmemcached-1.0.18-7.fc25.src.rpm\n", + "libmemcached-1.0.18-7.fc25.x86_64.rpm\n", + "libmemcached-build.log\n", + "libmemcached-debuginfo-1.0.18-7.fc25.x86_64.rpm\n", + "libmemcached-devel-1.0.18-7.fc25.x86_64.rpm\n", + "libmemcached-libs-1.0.18-7.fc25.x86_64.rpm\n", + "libmemcached-root.log\n", + "libmemcached-state.log\n", + "libmemcached-status.log\n", + "libmnl-1.0.4-1.fc25.src.rpm\n", + "libmnl-1.0.4-1.fc25.x86_64.rpm\n", + "libmnl-build.log\n", + "libmnl-debuginfo-1.0.4-1.fc25.x86_64.rpm\n", + "libmnl-devel-1.0.4-1.fc25.x86_64.rpm\n", + "libmnl-root.log\n", + "libmnl-state.log\n", + "libmnl-static-1.0.4-1.fc25.x86_64.rpm\n", + "libmnl-status.log\n", + "libnetfilter_conntrack-1.0.4-6.fc25.src.rpm\n", + "libnetfilter_conntrack-1.0.4-6.fc25.x86_64.rpm\n", + "libnetfilter_conntrack-build.log\n", + "libnetfilter_conntrack-debuginfo-1.0.4-6.fc25.x86_64.rpm\n", + "libnetfilter_conntrack-devel-1.0.4-6.fc25.x86_64.rpm\n", + "libnetfilter_conntrack-root.log\n", + "libnetfilter_conntrack-state.log\n", + "libnetfilter_conntrack-status.log\n", + "libnfnetlink-1.0.1-8.fc25.src.rpm\n", + "libnfnetlink-1.0.1-8.fc25.x86_64.rpm\n", + "libnfnetlink-build.log\n", + "libnfnetlink-debuginfo-1.0.1-8.fc25.x86_64.rpm\n", + "libnfnetlink-devel-1.0.1-8.fc25.x86_64.rpm\n", + "libnfnetlink-root.log\n", + "libnfnetlink-state.log\n", + "libnfnetlink-status.log\n", + "libxkbcommon-0.6.1-1.fc25.src.rpm\n", + "libxkbcommon-0.6.1-1.fc25.x86_64.rpm\n", + "libxkbcommon-build.log\n", + "libxkbcommon-debuginfo-0.6.1-1.fc25.x86_64.rpm\n", + "libxkbcommon-devel-0.6.1-1.fc25.x86_64.rpm\n", + "libxkbcommon-root.log\n", + "libxkbcommon-state.log\n", + "libxkbcommon-status.log\n", + "libxkbcommon-x11-0.6.1-1.fc25.x86_64.rpm\n", + "libxkbcommon-x11-devel-0.6.1-1.fc25.x86_64.rpm\n", + "module-build-macros-0.1-1.module_proftpd_master_20170103132819.noarch.rpm\n", + "module-build-macros-0.1-1.module_proftpd_master_20170103132819.src.rpm\n", + "module-build-macros-build.log\n", + "module-build-macros-root.log\n", + "module-build-macros-state.log\n", + "module-build-macros-status.log\n", + "proftpd-1.3.5b-2.fc25.src.rpm\n", + "proftpd-1.3.5b-2.fc25.x86_64.rpm\n", + "proftpd-build.log\n", + "proftpd-debuginfo-1.3.5b-2.fc25.x86_64.rpm\n", + "proftpd-devel-1.3.5b-2.fc25.x86_64.rpm\n", + "proftpd-ldap-1.3.5b-2.fc25.x86_64.rpm\n", + "proftpd-mysql-1.3.5b-2.fc25.x86_64.rpm\n", + "proftpd-postgresql-1.3.5b-2.fc25.x86_64.rpm\n", + "proftpd-root.log\n", + "proftpd-state.log\n", + "proftpd-status.log\n", + "proftpd-utils-1.3.5b-2.fc25.x86_64.rpm\n", + "repodata\n", + "tcp_wrappers-7.6-83.fc25.src.rpm\n", + "tcp_wrappers-7.6-83.fc25.x86_64.rpm\n", + "tcp_wrappers-build.log\n", + "tcp_wrappers-debuginfo-7.6-83.fc25.x86_64.rpm\n", + "tcp_wrappers-devel-7.6-83.fc25.x86_64.rpm\n", + "tcp_wrappers-libs-7.6-83.fc25.x86_64.rpm\n", + "tcp_wrappers-root.log\n", + "tcp_wrappers-state.log\n", + "tcp_wrappers-status.log\n", + "xkeyboard-config-2.19-1.1.fc25.noarch.rpm\n", + "xkeyboard-config-2.19-1.1.fc25.src.rpm\n", + "xkeyboard-config-build.log\n", + "xkeyboard-config-devel-2.19-1.1.fc25.noarch.rpm\n", + "xkeyboard-config-root.log\n", + "xkeyboard-config-state.log\n", + "xkeyboard-config-status.log\n" + ] + } + ], + "source": [ + "ls results/module*/results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### II. The `httpd` module" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now it's time to build an `httpd` module. \n", + "\n", + "The first step, as with the `proftpd` module, is to find the difference between `Base Runtime` and the packages `httpd` requires." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "apr-0:1.5.2-3.fc24.x86_64\n", + "apr-util-0:1.5.4-3.fc24.x86_64\n", + "bash-0:4.3.42-7.fc24.x86_64\n", + "expat-0:2.1.1-2.fc24.x86_64\n", + "glibc-0:2.23.1-11.fc24.x86_64\n", + "httpd-0:2.4.18-2.fc24.x86_64\n", + "httpd-tools-0:2.4.25-1.fc24.x86_64\n", + "libdb-0:5.3.28-14.fc24.x86_64\n", + "libnghttp2-0:1.7.1-1.fc24.x86_64\n", + "libselinux-0:2.5-12.fc24.x86_64\n", + "lua-0:5.3.3-2.fc24.x86_64\n", + "openssl-libs-1:1.0.2j-3.fc24.x86_64\n", + "pcre-0:8.39-6.fc24.x86_64\n", + "systemd-libs-0:229-16.fc24.x86_64\n", + "zlib-0:1.2.8-10.fc24.x86_64\n" + ] + } + ], + "source": [ + "# Use `dnf repoquery` to find which packages require HTTPD x86_64.\n", + "dnf repoquery --requires --resolve httpd | grep x86_64 > tmp.txt\n", + "cat tmp.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "apr\n", + "apr-util\n", + "bash\n", + "expat\n", + "glibc\n", + "httpd\n", + "httpd-tools\n", + "libdb\n", + "libselinux\n", + "lua\n", + "openssl-libs\n", + "pcre\n", + "systemd-libs\n", + "zlib\n" + ] + } + ], + "source": [ + "# Let's extract the names of the packages\n", + "sed -rn 's/([A-Za-z\\-]+)\\-(.*)/\\1/p' tmp.txt > httpd_dependencies.txt\n", + "rm tmp.txt\n", + "cat httpd_dependencies.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "apr\t\t\t\t\t\t\t |\tacl\n", + "apr-util\t\t\t\t\t\t |\tat\n", + "\t\t\t\t\t\t\t >\tattr\n", + "\t\t\t\t\t\t\t >\taudispd-plugins\n", + "\t\t\t\t\t\t\t >\taudispd-plugins-zos\n", + "\t\t\t\t\t\t\t >\taudit\n", + "\t\t\t\t\t\t\t >\taudit-libs\n", + "\t\t\t\t\t\t\t >\taudit-libs-devel\n", + "\t\t\t\t\t\t\t >\taudit-libs-python\n", + "\t\t\t\t\t\t\t >\taudit-libs-python3\n", + "\t\t\t\t\t\t\t >\taudit-libs-static\n", + "\t\t\t\t\t\t\t >\tbabeltrace\n", + "\t\t\t\t\t\t\t >\tbasesystem\n", + "\t\t\t\t\t\t\t >\tbash-doc\n", + "\t\t\t\t\t\t\t >\tbc\n", + "\t\t\t\t\t\t\t >\tbinutils\n", + "\t\t\t\t\t\t\t >\tbinutils-devel\n", + "\t\t\t\t\t\t\t >\tbsdcat\n", + "\t\t\t\t\t\t\t >\tbsdcpio\n", + "\t\t\t\t\t\t\t >\tbsdtar\n", + "\t\t\t\t\t\t\t >\tbyacc\n", + "\t\t\t\t\t\t\t >\tbzip2\n", + "\t\t\t\t\t\t\t >\tbzip2-devel\n", + "\t\t\t\t\t\t\t >\tbzip2-libs\n", + "\t\t\t\t\t\t\t >\tbzip2-static\n", + "\t\t\t\t\t\t\t >\tca-certificates\n", + "\t\t\t\t\t\t\t >\tcflow\n", + "\t\t\t\t\t\t\t >\tchkconfig\n", + "\t\t\t\t\t\t\t >\tcmirror\n", + "\t\t\t\t\t\t\t >\tcmirror-standalone\n", + "\t\t\t\t\t\t\t >\tcompat-libmpc\n", + "\t\t\t\t\t\t\t >\tconvert-to-edition\n", + "\t\t\t\t\t\t\t >\tcoreutils\n", + "\t\t\t\t\t\t\t >\tcoreutils-common\n", + "\t\t\t\t\t\t\t >\tcoreutils-single\n", + "\t\t\t\t\t\t\t >\tcpio\n", + "\t\t\t\t\t\t\t >\tcpp\n", + "\t\t\t\t\t\t\t >\tcracklib\n", + "\t\t\t\t\t\t\t >\tcracklib-devel\n", + "\t\t\t\t\t\t\t >\tcracklib-dicts\n", + "\t\t\t\t\t\t\t >\tcracklib-python\n", + "\t\t\t\t\t\t\t >\tcronie\n", + "\t\t\t\t\t\t\t >\tcronie-anacron\n", + "\t\t\t\t\t\t\t >\tcronie-noanacron\n", + "\t\t\t\t\t\t\t >\tcrontabs\n", + "\t\t\t\t\t\t\t >\tcrypto-policies\n", + "\t\t\t\t\t\t\t >\tcryptsetup\n", + "\t\t\t\t\t\t\t >\tcryptsetup-devel\n", + "\t\t\t\t\t\t\t >\tcryptsetup-libs\n", + "\t\t\t\t\t\t\t >\tcryptsetup-python\n", + "\t\t\t\t\t\t\t >\tcryptsetup-python3\n", + "\t\t\t\t\t\t\t >\tcryptsetup-reencrypt\n", + "\t\t\t\t\t\t\t >\tctags\n", + "\t\t\t\t\t\t\t >\tctags-etags\n", + "\t\t\t\t\t\t\t >\tcurl\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-devel\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-gs2\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-gssapi\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-ldap\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-lib\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-md5\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-ntlm\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-plain\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-scram\n", + "\t\t\t\t\t\t\t >\tcyrus-sasl-sql\n", + "\t\t\t\t\t\t\t >\tdbus\n", + "\t\t\t\t\t\t\t >\tdbus-devel\n", + "\t\t\t\t\t\t\t >\tdbus-doc\n", + "\t\t\t\t\t\t\t >\tdbus-libs\n", + "\t\t\t\t\t\t\t >\tdbus-tests\n", + "\t\t\t\t\t\t\t >\tdbus-x11\n", + "\t\t\t\t\t\t\t >\tdevice-mapper\n", + "\t\t\t\t\t\t\t >\tdevice-mapper-devel\n", + "\t\t\t\t\t\t\t >\tdevice-mapper-event\n", + "\t\t\t\t\t\t\t >\tdevice-mapper-event-devel\n", + "\t\t\t\t\t\t\t >\tdevice-mapper-event-libs\n", + "\t\t\t\t\t\t\t >\tdevice-mapper-libs\n", + "\t\t\t\t\t\t\t >\tdiffutils\n", + "\t\t\t\t\t\t\t >\tdracut\n", + "\t\t\t\t\t\t\t >\tdracut-caps\n", + "\t\t\t\t\t\t\t >\tdracut-config-generic\n", + "\t\t\t\t\t\t\t >\tdracut-config-rescue\n", + "\t\t\t\t\t\t\t >\tdracut-fips\n", + "\t\t\t\t\t\t\t >\tdracut-fips-aesni\n", + "\t\t\t\t\t\t\t >\tdracut-live\n", + "\t\t\t\t\t\t\t >\tdracut-network\n", + "\t\t\t\t\t\t\t >\tdracut-tools\n", + "\t\t\t\t\t\t\t >\tdwz\n", + "\t\t\t\t\t\t\t >\te2fsprogs\n", + "\t\t\t\t\t\t\t >\te2fsprogs-devel\n", + "\t\t\t\t\t\t\t >\te2fsprogs-libs\n", + "\t\t\t\t\t\t\t >\te2fsprogs-static\n", + "\t\t\t\t\t\t\t >\ted\n", + "\t\t\t\t\t\t\t >\telfutils\n", + "\t\t\t\t\t\t\t >\telfutils-default-yama-scope\n", + "\t\t\t\t\t\t\t >\telfutils-devel\n", + "\t\t\t\t\t\t\t >\telfutils-devel-static\n", + "\t\t\t\t\t\t\t >\telfutils-libelf\n", + "\t\t\t\t\t\t\t >\telfutils-libelf-devel\n", + "\t\t\t\t\t\t\t >\telfutils-libelf-devel-static\n", + "\t\t\t\t\t\t\t >\telfutils-libs\n", + "\t\t\t\t\t\t\t >\temacs\n", + "\t\t\t\t\t\t\t >\temacs-common\n", + "\t\t\t\t\t\t\t >\temacs-filesystem\n", + "\t\t\t\t\t\t\t >\temacs-gettext\n", + "\t\t\t\t\t\t\t >\temacs-nox\n", + "\t\t\t\t\t\t\t >\temacs-terminal\n", + "\t\t\t\t\t\t\t >\texpat-devel\n", + "\t\t\t\t\t\t\t >\texpat-static\n", + "\t\t\t\t\t\t\t >\tfedora-logos\n", + "\t\t\t\t\t\t\t >\tfedora-logos-httpd\n", + "\t\t\t\t\t\t\t >\tfedora-release\n", + "\t\t\t\t\t\t\t >\tfedora-release-atomichost\n", + "\t\t\t\t\t\t\t >\tfedora-release-cloud\n", + "\t\t\t\t\t\t\t >\tfedora-release-server\n", + "\t\t\t\t\t\t\t >\tfedora-release-workstation\n", + "\t\t\t\t\t\t\t >\tfedora-repos\n", + "\t\t\t\t\t\t\t >\tfedora-repos-rawhide\n", + "\t\t\t\t\t\t\t >\tfedpkg-minimal\n", + "\t\t\t\t\t\t\t >\tfile\n", + "\t\t\t\t\t\t\t >\tfile-devel\n", + "\t\t\t\t\t\t\t >\tfile-libs\n", + "\t\t\t\t\t\t\t >\tfilesystem\n", + "\t\t\t\t\t\t\t >\tfindutils\n", + "\t\t\t\t\t\t\t >\tflex\n", + "\t\t\t\t\t\t\t >\tflex-devel\n", + "\t\t\t\t\t\t\t >\tflex-doc\n", + "\t\t\t\t\t\t\t >\tfpc-srpm-macros\n", + "\t\t\t\t\t\t\t >\tfreetype\n", + "\t\t\t\t\t\t\t >\tfreetype-demos\n", + "\t\t\t\t\t\t\t >\tfreetype-devel\n", + "\t\t\t\t\t\t\t >\tgawk\n", + "\t\t\t\t\t\t\t >\tgawk-devel\n", + "\t\t\t\t\t\t\t >\tgawk-doc\n", + "\t\t\t\t\t\t\t >\tgc\n", + "\t\t\t\t\t\t\t >\tgcc\n", + "\t\t\t\t\t\t\t >\tgcc-c++\n", + "\t\t\t\t\t\t\t >\tgcc-gdb-plugin\n", + "\t\t\t\t\t\t\t >\tgcc-gfortran\n", + "\t\t\t\t\t\t\t >\tgcc-gnat\n", + "\t\t\t\t\t\t\t >\tgcc-go\n", + "\t\t\t\t\t\t\t >\tgcc-objc\n", + "\t\t\t\t\t\t\t >\tgcc-objc++\n", + "\t\t\t\t\t\t\t >\tgcc-plugin-devel\n", + "\t\t\t\t\t\t\t >\tgc-devel\n", + "\t\t\t\t\t\t\t >\tgdb\n", + "\t\t\t\t\t\t\t >\tgdb-doc\n", + "\t\t\t\t\t\t\t >\tgdb-gdbserver\n", + "\t\t\t\t\t\t\t >\tgdb-headless\n", + "\t\t\t\t\t\t\t >\tgdbm\n", + "\t\t\t\t\t\t\t >\tgdbm-devel\n", + "\t\t\t\t\t\t\t >\tgencore.txt\n", + "\t\t\t\t\t\t\t >\tgettext\n", + "\t\t\t\t\t\t\t >\tgettext-common-devel\n", + "\t\t\t\t\t\t\t >\tgettext-devel\n", + "\t\t\t\t\t\t\t >\tgettext-libs\n", + "\t\t\t\t\t\t\t >\tghc-srpm-macros\n", + "\t\t\t\t\t\t\t >\tglib2\n", + "\t\t\t\t\t\t\t >\tglib2-devel\n", + "\t\t\t\t\t\t\t >\tglib2-doc\n", + "\t\t\t\t\t\t\t >\tglib2-fam\n", + "\t\t\t\t\t\t\t >\tglib2-static\n", + "\t\t\t\t\t\t\t >\tglib2-tests\n", + "httpd\t\t\t\t\t\t\t |\tglibc-all-langpacks\n", + "httpd-tools\t\t\t\t\t\t |\tglibc-benchtests\n", + "\t\t\t\t\t\t\t >\tglibc-common\n", + "\t\t\t\t\t\t\t >\tglibc-devel\n", + "\t\t\t\t\t\t\t >\tglibc-headers\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-aa\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-af\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ak\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-am\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-an\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-anp\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ar\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-as\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ast\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ayc\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-az\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-be\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-bem\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ber\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-bg\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-bhb\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-bho\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-bn\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-bo\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-br\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-brx\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-bs\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-byn\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ca\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ce\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-chr\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-cmn\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-crh\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-cs\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-csb\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-cv\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-cy\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-da\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-de\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-doi\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-dv\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-dz\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-el\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-en\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-eo\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-es\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-et\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-eu\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-fa\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ff\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-fi\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-fil\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-fo\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-fr\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-fur\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-fy\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ga\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-gd\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-gez\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-gl\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-gu\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-gv\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ha\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-hak\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-he\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-hi\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-hne\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-hr\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-hsb\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ht\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-hu\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-hy\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ia\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-id\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ig\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ik\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-is\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-it\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-iu\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ja\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ka\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-kk\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-kl\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-km\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-kn\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ko\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-kok\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ks\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ku\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-kw\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ky\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-lb\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-lg\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-li\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-lij\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ln\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-lo\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-lt\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-lv\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-lzh\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mag\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mai\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mg\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mhr\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mi\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mk\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ml\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mn\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mni\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mr\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ms\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-mt\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-my\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-nan\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-nb\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-nds\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ne\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-nhn\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-niu\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-nl\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-nn\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-nr\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-nso\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-oc\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-om\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-or\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-os\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-pa\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-pap\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-pl\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ps\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-pt\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-quz\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-raj\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ro\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ru\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-rw\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sa\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sat\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sc\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sd\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-se\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sgs\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-shs\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-si\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sid\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sk\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sl\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-so\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sq\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sr\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ss\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-st\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sv\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-sw\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-szl\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ta\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-tcy\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-te\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-tg\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-th\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-the\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ti\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-tig\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-tk\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-tl\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-tn\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-tr\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ts\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-tt\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ug\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-uk\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-unm\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ur\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-uz\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-ve\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-vi\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-wa\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-wae\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-wal\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-wo\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-xh\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-yi\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-yo\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-yue\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-zh\n", + "\t\t\t\t\t\t\t >\tglibc-langpack-zu\n", + "\t\t\t\t\t\t\t >\tglibc-locale-source\n", + "\t\t\t\t\t\t\t >\tglibc-minimal-langpack\n", + "\t\t\t\t\t\t\t >\tglibc-nss-devel\n", + "\t\t\t\t\t\t\t >\tglibc-static\n", + "\t\t\t\t\t\t\t >\tglibc-utils\n", + "\t\t\t\t\t\t\t >\tgmp\n", + "\t\t\t\t\t\t\t >\tgmp-c++\n", + "\t\t\t\t\t\t\t >\tgmp-devel\n", + "\t\t\t\t\t\t\t >\tgmp-static\n", + "\t\t\t\t\t\t\t >\tgnat-srpm-macros\n", + "\t\t\t\t\t\t\t >\tgnupg2\n", + "\t\t\t\t\t\t\t >\tgnupg2-smime\n", + "\t\t\t\t\t\t\t >\tgnutls\n", + "\t\t\t\t\t\t\t >\tgnutls-c++\n", + "\t\t\t\t\t\t\t >\tgnutls-dane\n", + "\t\t\t\t\t\t\t >\tgnutls-devel\n", + "\t\t\t\t\t\t\t >\tgnutls-guile\n", + "\t\t\t\t\t\t\t >\tgnutls-utils\n", + "\t\t\t\t\t\t\t >\tgo-srpm-macros\n", + "\t\t\t\t\t\t\t >\tgrep\n", + "\t\t\t\t\t\t\t >\tgroff\n", + "\t\t\t\t\t\t\t >\tgroff-base\n", + "\t\t\t\t\t\t\t >\tgroff-doc\n", + "\t\t\t\t\t\t\t >\tgroff-perl\n", + "\t\t\t\t\t\t\t >\tgroff-x11\n", + "\t\t\t\t\t\t\t >\tgrub2\n", + "\t\t\t\t\t\t\t >\tgrub2-efi\n", + "\t\t\t\t\t\t\t >\tgrub2-efi-modules\n", + "\t\t\t\t\t\t\t >\tgrub2-starfield-theme\n", + "\t\t\t\t\t\t\t >\tgrub2-tools\n", + "\t\t\t\t\t\t\t >\tguile\n", + "\t\t\t\t\t\t\t >\tguile-devel\n", + "\t\t\t\t\t\t\t >\tgzip\n", + "\t\t\t\t\t\t\t >\tinfo\n", + "\t\t\t\t\t\t\t >\tiptables\n", + "\t\t\t\t\t\t\t >\tiptables-compat\n", + "\t\t\t\t\t\t\t >\tiptables-devel\n", + "\t\t\t\t\t\t\t >\tiptables-libs\n", + "\t\t\t\t\t\t\t >\tiptables-services\n", + "\t\t\t\t\t\t\t >\tiptables-utils\n", + "\t\t\t\t\t\t\t >\tisl\n", + "\t\t\t\t\t\t\t >\tisl-devel\n", + "\t\t\t\t\t\t\t >\tiwl1000-firmware\n", + "\t\t\t\t\t\t\t >\tiwl100-firmware\n", + "\t\t\t\t\t\t\t >\tiwl105-firmware\n", + "\t\t\t\t\t\t\t >\tiwl135-firmware\n", + "\t\t\t\t\t\t\t >\tiwl2000-firmware\n", + "\t\t\t\t\t\t\t >\tiwl2030-firmware\n", + "\t\t\t\t\t\t\t >\tiwl3160-firmware\n", + "\t\t\t\t\t\t\t >\tiwl3945-firmware\n", + "\t\t\t\t\t\t\t >\tiwl4965-firmware\n", + "\t\t\t\t\t\t\t >\tiwl5000-firmware\n", + "\t\t\t\t\t\t\t >\tiwl5150-firmware\n", + "\t\t\t\t\t\t\t >\tiwl6000-firmware\n", + "\t\t\t\t\t\t\t >\tiwl6000g2a-firmware\n", + "\t\t\t\t\t\t\t >\tiwl6000g2b-firmware\n", + "\t\t\t\t\t\t\t >\tiwl6050-firmware\n", + "\t\t\t\t\t\t\t >\tiwl7260-firmware\n", + "\t\t\t\t\t\t\t >\tkernel\n", + "\t\t\t\t\t\t\t >\tkernel-core\n", + "\t\t\t\t\t\t\t >\tkernel-cross-headers\n", + "\t\t\t\t\t\t\t >\tkernel-debug\n", + "\t\t\t\t\t\t\t >\tkernel-debug-core\n", + "\t\t\t\t\t\t\t >\tkernel-debug-devel\n", + "\t\t\t\t\t\t\t >\tkernel-debug-modules\n", + "\t\t\t\t\t\t\t >\tkernel-debug-modules-extra\n", + "\t\t\t\t\t\t\t >\tkernel-devel\n", + "\t\t\t\t\t\t\t >\tkernel-headers\n", + "\t\t\t\t\t\t\t >\tkernel-modules\n", + "\t\t\t\t\t\t\t >\tkernel-modules-extra\n", + "\t\t\t\t\t\t\t >\tkernel-rpm-macros\n", + "\t\t\t\t\t\t\t >\tkernel-tools\n", + "\t\t\t\t\t\t\t >\tkernel-tools-libs\n", + "\t\t\t\t\t\t\t >\tkernel-tools-libs-devel\n", + "\t\t\t\t\t\t\t >\tkeyutils\n", + "\t\t\t\t\t\t\t >\tkeyutils-libs\n", + "\t\t\t\t\t\t\t >\tkeyutils-libs-devel\n", + "\t\t\t\t\t\t\t >\tkmod\n", + "\t\t\t\t\t\t\t >\tkmod-devel\n", + "\t\t\t\t\t\t\t >\tkmod-libs\n", + "\t\t\t\t\t\t\t >\tkrb5-devel\n", + "\t\t\t\t\t\t\t >\tkrb5-libs\n", + "\t\t\t\t\t\t\t >\tkrb5-pkinit\n", + "\t\t\t\t\t\t\t >\tkrb5-server\n", + "\t\t\t\t\t\t\t >\tkrb5-server-ldap\n", + "\t\t\t\t\t\t\t >\tkrb5-workstation\n", + "\t\t\t\t\t\t\t >\tlemon\n", + "\t\t\t\t\t\t\t >\tless\n", + "\t\t\t\t\t\t\t >\tlibacl\n", + "\t\t\t\t\t\t\t >\tlibacl-devel\n", + "\t\t\t\t\t\t\t >\tlibarchive\n", + "\t\t\t\t\t\t\t >\tlibarchive-devel\n", + "\t\t\t\t\t\t\t >\tlibasan\n", + "\t\t\t\t\t\t\t >\tlibasan-static\n", + "\t\t\t\t\t\t\t >\tlibassuan\n", + "\t\t\t\t\t\t\t >\tlibassuan-devel\n", + "\t\t\t\t\t\t\t >\tlibatomic\n", + "\t\t\t\t\t\t\t >\tlibatomic_ops\n", + "\t\t\t\t\t\t\t >\tlibatomic_ops-devel\n", + "\t\t\t\t\t\t\t >\tlibatomic_ops-static\n", + "\t\t\t\t\t\t\t >\tlibatomic-static\n", + "\t\t\t\t\t\t\t >\tlibattr\n", + "\t\t\t\t\t\t\t >\tlibattr-devel\n", + "\t\t\t\t\t\t\t >\tlibbabeltrace\n", + "\t\t\t\t\t\t\t >\tlibbabeltrace-devel\n", + "\t\t\t\t\t\t\t >\tlibblkid\n", + "\t\t\t\t\t\t\t >\tlibblkid-devel\n", + "\t\t\t\t\t\t\t >\tlibcap\n", + "\t\t\t\t\t\t\t >\tlibcap-devel\n", + "\t\t\t\t\t\t\t >\tlibcap-ng\n", + "\t\t\t\t\t\t\t >\tlibcap-ng-devel\n", + "\t\t\t\t\t\t\t >\tlibcap-ng-python\n", + "\t\t\t\t\t\t\t >\tlibcap-ng-python3\n", + "\t\t\t\t\t\t\t >\tlibcap-ng-utils\n", + "\t\t\t\t\t\t\t >\tlibcilkrts\n", + "\t\t\t\t\t\t\t >\tlibcilkrts-static\n", + "\t\t\t\t\t\t\t >\tlibcom_err\n", + "\t\t\t\t\t\t\t >\tlibcom_err-devel\n", + "\t\t\t\t\t\t\t >\tlibcroco\n", + "\t\t\t\t\t\t\t >\tlibcroco-devel\n", + "\t\t\t\t\t\t\t >\tlibcrypt\n", + "\t\t\t\t\t\t\t >\tlibcrypt-nss\n", + "\t\t\t\t\t\t\t >\tlibcurl\n", + "\t\t\t\t\t\t\t >\tlibcurl-devel\n", + "\t\t\t\t\t\t\t >\tlibdb-cxx\n", + "\t\t\t\t\t\t\t >\tlibdb-cxx-devel\n", + "\t\t\t\t\t\t\t >\tlibdb-devel\n", + "\t\t\t\t\t\t\t >\tlibdb-devel-doc\n", + "\t\t\t\t\t\t\t >\tlibdb-devel-static\n", + "\t\t\t\t\t\t\t >\tlibdb-java\n", + "\t\t\t\t\t\t\t >\tlibdb-java-devel\n", + "\t\t\t\t\t\t\t >\tlibdb-sql\n", + "\t\t\t\t\t\t\t >\tlibdb-sql-devel\n", + "\t\t\t\t\t\t\t >\tlibdb-tcl\n", + "\t\t\t\t\t\t\t >\tlibdb-tcl-devel\n", + "\t\t\t\t\t\t\t >\tlibdb-utils\n", + "\t\t\t\t\t\t\t >\tlibertas-sd8686-firmware\n", + "\t\t\t\t\t\t\t >\tlibertas-sd8787-firmware\n", + "\t\t\t\t\t\t\t >\tlibertas-usb8388-firmware\n", + "\t\t\t\t\t\t\t >\tlibertas-usb8388-olpc-firmware\n", + "\t\t\t\t\t\t\t >\tlibfdisk\n", + "\t\t\t\t\t\t\t >\tlibfdisk-devel\n", + "\t\t\t\t\t\t\t >\tlibffi\n", + "\t\t\t\t\t\t\t >\tlibffi-devel\n", + "\t\t\t\t\t\t\t >\tlibgcc\n", + "\t\t\t\t\t\t\t >\tlibgccjit\n", + "\t\t\t\t\t\t\t >\tlibgccjit-devel\n", + "\t\t\t\t\t\t\t >\tlibgcrypt\n", + "\t\t\t\t\t\t\t >\tlibgcrypt-devel\n", + "\t\t\t\t\t\t\t >\tlibgfortran\n", + "\t\t\t\t\t\t\t >\tlibgfortran-static\n", + "\t\t\t\t\t\t\t >\tlibgnat\n", + "\t\t\t\t\t\t\t >\tlibgnat-devel\n", + "\t\t\t\t\t\t\t >\tlibgnat-static\n", + "\t\t\t\t\t\t\t >\tlibgo\n", + "\t\t\t\t\t\t\t >\tlibgo-devel\n", + "\t\t\t\t\t\t\t >\tlibgomp\n", + "\t\t\t\t\t\t\t >\tlibgo-static\n", + "\t\t\t\t\t\t\t >\tlibgpg-error\n", + "\t\t\t\t\t\t\t >\tlibgpg-error-devel\n", + "\t\t\t\t\t\t\t >\tlibidn\n", + "\t\t\t\t\t\t\t >\tlibidn-devel\n", + "\t\t\t\t\t\t\t >\tlibidn-java\n", + "\t\t\t\t\t\t\t >\tlibidn-javadoc\n", + "\t\t\t\t\t\t\t >\tlibipt\n", + "\t\t\t\t\t\t\t >\tlibipt-devel\n", + "\t\t\t\t\t\t\t >\tlibitm\n", + "\t\t\t\t\t\t\t >\tlibitm-devel\n", + "\t\t\t\t\t\t\t >\tlibitm-static\n", + "\t\t\t\t\t\t\t >\tlibkadm5\n", + "\t\t\t\t\t\t\t >\tlibksba\n", + "\t\t\t\t\t\t\t >\tlibksba-devel\n", + "\t\t\t\t\t\t\t >\tliblsan\n", + "\t\t\t\t\t\t\t >\tliblsan-static\n", + "\t\t\t\t\t\t\t >\tlibmetalink\n", + "\t\t\t\t\t\t\t >\tlibmetalink-devel\n", + "\t\t\t\t\t\t\t >\tlibmount\n", + "\t\t\t\t\t\t\t >\tlibmount-devel\n", + "\t\t\t\t\t\t\t >\tlibmpc\n", + "\t\t\t\t\t\t\t >\tlibmpc-devel\n", + "\t\t\t\t\t\t\t >\tlibmpx\n", + "\t\t\t\t\t\t\t >\tlibmpx-static\n", + "\t\t\t\t\t\t\t >\tlibnghttp2\n", + "\t\t\t\t\t\t\t >\tlibnghttp2-devel\n", + "\t\t\t\t\t\t\t >\tlibobjc\n", + "\t\t\t\t\t\t\t >\tlibpcap\n", + "\t\t\t\t\t\t\t >\tlibpcap-devel\n", + "\t\t\t\t\t\t\t >\tlibpipeline\n", + "\t\t\t\t\t\t\t >\tlibpipeline-devel\n", + "\t\t\t\t\t\t\t >\tlibpng\n", + "\t\t\t\t\t\t\t >\tlibpng-devel\n", + "\t\t\t\t\t\t\t >\tlibpng-static\n", + "\t\t\t\t\t\t\t >\tlibpng-tools\n", + "\t\t\t\t\t\t\t >\tlibpsl\n", + "\t\t\t\t\t\t\t >\tlibpsl-devel\n", + "\t\t\t\t\t\t\t >\tlibpwquality\n", + "\t\t\t\t\t\t\t >\tlibpwquality-devel\n", + "\t\t\t\t\t\t\t >\tlibquadmath\n", + "\t\t\t\t\t\t\t >\tlibquadmath-devel\n", + "\t\t\t\t\t\t\t >\tlibquadmath-static\n", + "\t\t\t\t\t\t\t >\tlibseccomp\n", + "\t\t\t\t\t\t\t >\tlibseccomp-devel\n", + "\t\t\t\t\t\t\t >\tlibseccomp-static\n", + "\t\t\t\t\t\t\t >\tlibselinux-devel\n", + "\t\t\t\t\t\t\t >\tlibselinux-python\n", + "\t\t\t\t\t\t\t >\tlibselinux-python3\n", + "\t\t\t\t\t\t\t >\tlibselinux-ruby\n", + "\t\t\t\t\t\t\t >\tlibselinux-static\n", + "\t\t\t\t\t\t\t >\tlibselinux-utils\n", + "\t\t\t\t\t\t\t >\tlibsemanage\n", + "\t\t\t\t\t\t\t >\tlibsemanage-devel\n", + "\t\t\t\t\t\t\t >\tlibsemanage-python\n", + "\t\t\t\t\t\t\t >\tlibsemanage-python3\n", + "\t\t\t\t\t\t\t >\tlibsemanage-static\n", + "\t\t\t\t\t\t\t >\tlibsepol\n", + "\t\t\t\t\t\t\t >\tlibsepol-devel\n", + "\t\t\t\t\t\t\t >\tlibsepol-static\n", + "\t\t\t\t\t\t\t >\tlibsigsegv\n", + "\t\t\t\t\t\t\t >\tlibsigsegv-devel\n", + "\t\t\t\t\t\t\t >\tlibsigsegv-static\n", + "\t\t\t\t\t\t\t >\tlibsmartcols\n", + "\t\t\t\t\t\t\t >\tlibsmartcols-devel\n", + "\t\t\t\t\t\t\t >\tlibss\n", + "\t\t\t\t\t\t\t >\tlibss-devel\n", + "\t\t\t\t\t\t\t >\tlibssh2\n", + "\t\t\t\t\t\t\t >\tlibssh2-devel\n", + "\t\t\t\t\t\t\t >\tlibssh2-docs\n", + "\t\t\t\t\t\t\t >\tlibstdc++\n", + "\t\t\t\t\t\t\t >\tlibstdc++-devel\n", + "\t\t\t\t\t\t\t >\tlibstdc++-docs\n", + "\t\t\t\t\t\t\t >\tlibstdc++-static\n", + "\t\t\t\t\t\t\t >\tlibtasn1\n", + "\t\t\t\t\t\t\t >\tlibtasn1-devel\n", + "\t\t\t\t\t\t\t >\tlibtasn1-tools\n", + "\t\t\t\t\t\t\t >\tlibtool\n", + "\t\t\t\t\t\t\t >\tlibtool-ltdl\n", + "\t\t\t\t\t\t\t >\tlibtool-ltdl-devel\n", + "\t\t\t\t\t\t\t >\tlibtsan\n", + "\t\t\t\t\t\t\t >\tlibtsan-static\n", + "\t\t\t\t\t\t\t >\tlibubsan\n", + "\t\t\t\t\t\t\t >\tlibubsan-static\n", + "\t\t\t\t\t\t\t >\tlibunistring\n", + "\t\t\t\t\t\t\t >\tlibunistring-devel\n", + "\t\t\t\t\t\t\t >\tlibutempter\n", + "\t\t\t\t\t\t\t >\tlibutempter-devel\n", + "\t\t\t\t\t\t\t >\tlibuuid\n", + "\t\t\t\t\t\t\t >\tlibuuid-devel\n", + "\t\t\t\t\t\t\t >\tlibverto\n", + "\t\t\t\t\t\t\t >\tlibverto-devel\n", + "\t\t\t\t\t\t\t >\tlibverto-glib\n", + "\t\t\t\t\t\t\t >\tlibverto-glib-devel\n", + "\t\t\t\t\t\t\t >\tlibverto-libev\n", + "\t\t\t\t\t\t\t >\tlibverto-libev-devel\n", + "\t\t\t\t\t\t\t >\tlibverto-libevent\n", + "\t\t\t\t\t\t\t >\tlibverto-libevent-devel\n", + "\t\t\t\t\t\t\t >\tlibverto-tevent\n", + "\t\t\t\t\t\t\t >\tlibverto-tevent-devel\n", + "\t\t\t\t\t\t\t >\tlibxml2\n", + "\t\t\t\t\t\t\t >\tlibxml2-devel\n", + "\t\t\t\t\t\t\t >\tlibxml2-static\n", + "\t\t\t\t\t\t\t >\tlinux-firmware\n", + "\t\t\t\t\t\t\t >\tlua-devel\n", + "\t\t\t\t\t\t\t >\tlua-libs\n", + "\t\t\t\t\t\t\t >\tlua-static\n", + "\t\t\t\t\t\t\t >\tlvm2\n", + "\t\t\t\t\t\t\t >\tlvm2-cluster\n", + "\t\t\t\t\t\t\t >\tlvm2-cluster-standalone\n", + "\t\t\t\t\t\t\t >\tlvm2-dbusd\n", + "\t\t\t\t\t\t\t >\tlvm2-devel\n", + "\t\t\t\t\t\t\t >\tlvm2-libs\n", + "\t\t\t\t\t\t\t >\tlvm2-lockd\n", + "\t\t\t\t\t\t\t >\tlvm2-python3-libs\n", + "\t\t\t\t\t\t\t >\tlvm2-python-libs\n", + "\t\t\t\t\t\t\t >\tlz4\n", + "\t\t\t\t\t\t\t >\tlz4-devel\n", + "\t\t\t\t\t\t\t >\tlz4-static\n", + "\t\t\t\t\t\t\t >\tlzo\n", + "\t\t\t\t\t\t\t >\tlzo-devel\n", + "\t\t\t\t\t\t\t >\tlzo-minilzo\n", + "\t\t\t\t\t\t\t >\tm4\n", + "\t\t\t\t\t\t\t >\tmake\n", + "\t\t\t\t\t\t\t >\tmake-devel\n", + "\t\t\t\t\t\t\t >\tman-db\n", + "\t\t\t\t\t\t\t >\tman-db-cron\n", + "\t\t\t\t\t\t\t >\tminizip\n", + "\t\t\t\t\t\t\t >\tminizip-devel\n", + "\t\t\t\t\t\t\t >\tmpfr\n", + "\t\t\t\t\t\t\t >\tmpfr-devel\n", + "\t\t\t\t\t\t\t >\tncompress\n", + "\t\t\t\t\t\t\t >\tncurses\n", + "\t\t\t\t\t\t\t >\tncurses-base\n", + "\t\t\t\t\t\t\t >\tncurses-c++-libs\n", + "\t\t\t\t\t\t\t >\tncurses-compat-libs\n", + "\t\t\t\t\t\t\t >\tncurses-devel\n", + "\t\t\t\t\t\t\t >\tncurses-libs\n", + "\t\t\t\t\t\t\t >\tncurses-static\n", + "\t\t\t\t\t\t\t >\tncurses-term\n", + "\t\t\t\t\t\t\t >\tnettle\n", + "\t\t\t\t\t\t\t >\tnettle-devel\n", + "\t\t\t\t\t\t\t >\tnghttp2\n", + "\t\t\t\t\t\t\t >\tnpth\n", + "\t\t\t\t\t\t\t >\tnpth-devel\n", + "\t\t\t\t\t\t\t >\tnscd\n", + "\t\t\t\t\t\t\t >\tnspr\n", + "\t\t\t\t\t\t\t >\tnspr-devel\n", + "\t\t\t\t\t\t\t >\tnss\n", + "\t\t\t\t\t\t\t >\tnss_db\n", + "\t\t\t\t\t\t\t >\tnss-devel\n", + "\t\t\t\t\t\t\t >\tnss_hesiod\n", + "\t\t\t\t\t\t\t >\tnss_nis\n", + "\t\t\t\t\t\t\t >\tnss-pem\n", + "\t\t\t\t\t\t\t >\tnss-pkcs11-devel\n", + "\t\t\t\t\t\t\t >\tnss-softokn\n", + "\t\t\t\t\t\t\t >\tnss-softokn-devel\n", + "\t\t\t\t\t\t\t >\tnss-softokn-freebl\n", + "\t\t\t\t\t\t\t >\tnss-softokn-freebl-devel\n", + "\t\t\t\t\t\t\t >\tnss-sysinit\n", + "\t\t\t\t\t\t\t >\tnss-tools\n", + "\t\t\t\t\t\t\t >\tnss-util\n", + "\t\t\t\t\t\t\t >\tnss-util-devel\n", + "\t\t\t\t\t\t\t >\tntsysv\n", + "\t\t\t\t\t\t\t >\tocaml-srpm-macros\n", + "\t\t\t\t\t\t\t >\topenldap\n", + "\t\t\t\t\t\t\t >\topenldap-clients\n", + "\t\t\t\t\t\t\t >\topenldap-devel\n", + "\t\t\t\t\t\t\t >\topenldap-servers\n", + "\t\t\t\t\t\t\t >\topenssl\n", + "\t\t\t\t\t\t\t >\topenssl-devel\n", + "\t\t\t\t\t\t\t >\topenssl-perl\n", + "\t\t\t\t\t\t\t >\topenssl-static\n", + "\t\t\t\t\t\t\t >\tos-prober\n", + "\t\t\t\t\t\t\t >\tp11-kit\n", + "\t\t\t\t\t\t\t >\tp11-kit-devel\n", + "\t\t\t\t\t\t\t >\tp11-kit-trust\n", + "\t\t\t\t\t\t\t >\tpam\n", + "\t\t\t\t\t\t\t >\tpam-devel\n", + "\t\t\t\t\t\t\t >\tpatch\n", + "\t\t\t\t\t\t\t >\tpcre-cpp\n", + "\t\t\t\t\t\t\t >\tpcre-devel\n", + "\t\t\t\t\t\t\t >\tpcre-doc\n", + "\t\t\t\t\t\t\t >\tpcre-static\n", + "\t\t\t\t\t\t\t >\tpcre-tools\n", + "\t\t\t\t\t\t\t >\tpcre-utf16\n", + "\t\t\t\t\t\t\t >\tpcre-utf32\n", + "\t\t\t\t\t\t\t >\tperf\n", + "\t\t\t\t\t\t\t >\tperl-srpm-macros\n", + "\t\t\t\t\t\t\t >\tpkgconfig\n", + "\t\t\t\t\t\t\t >\tpkgs.txt\n", + "\t\t\t\t\t\t\t >\tpopt\n", + "\t\t\t\t\t\t\t >\tpopt-devel\n", + "\t\t\t\t\t\t\t >\tpopt-static\n", + "\t\t\t\t\t\t\t >\tprocps-ng\n", + "\t\t\t\t\t\t\t >\tprocps-ng-devel\n", + "\t\t\t\t\t\t\t >\tprocps-ng-i18n\n", + "\t\t\t\t\t\t\t >\tpsl\n", + "\t\t\t\t\t\t\t >\tpsmisc\n", + "\t\t\t\t\t\t\t >\tpython\n", + "\t\t\t\t\t\t\t >\tpython2-rpm\n", + "\t\t\t\t\t\t\t >\tpython2-rpm-macros\n", + "\t\t\t\t\t\t\t >\tpython2-setuptools\n", + "\t\t\t\t\t\t\t >\tpython3\n", + "\t\t\t\t\t\t\t >\tpython3-babeltrace\n", + "\t\t\t\t\t\t\t >\tpython3-debug\n", + "\t\t\t\t\t\t\t >\tpython3-devel\n", + "\t\t\t\t\t\t\t >\tpython3-libmount\n", + "\t\t\t\t\t\t\t >\tpython3-libs\n", + "\t\t\t\t\t\t\t >\tpython3-libxml2\n", + "\t\t\t\t\t\t\t >\tpython3-magic\n", + "\t\t\t\t\t\t\t >\tpython3-pip\n", + "\t\t\t\t\t\t\t >\tpython3-pwquality\n", + "\t\t\t\t\t\t\t >\tpython3-rpm\n", + "\t\t\t\t\t\t\t >\tpython3-rpm-macros\n", + "\t\t\t\t\t\t\t >\tpython3-setuptools\n", + "\t\t\t\t\t\t\t >\tpython3-test\n", + "\t\t\t\t\t\t\t >\tpython3-tkinter\n", + "\t\t\t\t\t\t\t >\tpython3-tools\n", + "\t\t\t\t\t\t\t >\tpython-debug\n", + "\t\t\t\t\t\t\t >\tpython-devel\n", + "\t\t\t\t\t\t\t >\tpython-libs\n", + "\t\t\t\t\t\t\t >\tpython-libxml2\n", + "\t\t\t\t\t\t\t >\tpython-magic\n", + "\t\t\t\t\t\t\t >\tpython-perf\n", + "\t\t\t\t\t\t\t >\tpython-pip\n", + "\t\t\t\t\t\t\t >\tpython-pwquality\n", + "\t\t\t\t\t\t\t >\tpython-rpm-macros\n", + "\t\t\t\t\t\t\t >\tpython-srpm-macros\n", + "\t\t\t\t\t\t\t >\tpython-test\n", + "\t\t\t\t\t\t\t >\tpython-tools\n", + "\t\t\t\t\t\t\t >\tqrencode\n", + "\t\t\t\t\t\t\t >\tqrencode-devel\n", + "\t\t\t\t\t\t\t >\tqrencode-libs\n", + "\t\t\t\t\t\t\t >\tqt5\n", + "\t\t\t\t\t\t\t >\tqt5-devel\n", + "\t\t\t\t\t\t\t >\tqt5-rpm-macros\n", + "\t\t\t\t\t\t\t >\tqt5-srpm-macros\n", + "\t\t\t\t\t\t\t >\treadline\n", + "\t\t\t\t\t\t\t >\treadline-devel\n", + "\t\t\t\t\t\t\t >\treadline-static\n", + "\t\t\t\t\t\t\t >\tredhat-rpm-config\n", + "\t\t\t\t\t\t\t >\trepodata\n", + "\t\t\t\t\t\t\t >\trpm\n", + "\t\t\t\t\t\t\t >\trpm-apidocs\n", + "\t\t\t\t\t\t\t >\trpm-build\n", + "\t\t\t\t\t\t\t >\trpm-build-libs\n", + "\t\t\t\t\t\t\t >\trpm-cron\n", + "\t\t\t\t\t\t\t >\trpm-devel\n", + "\t\t\t\t\t\t\t >\trpm-libs\n", + "\t\t\t\t\t\t\t >\trpm-plugin-ima\n", + "\t\t\t\t\t\t\t >\trpm-plugin-selinux\n", + "\t\t\t\t\t\t\t >\trpm-plugin-syslog\n", + "\t\t\t\t\t\t\t >\trpm-plugin-systemd-inhibit\n", + "\t\t\t\t\t\t\t >\trpm-sign\n", + "\t\t\t\t\t\t\t >\tsed\n", + "\t\t\t\t\t\t\t >\tsetup\n", + "\t\t\t\t\t\t\t >\tshadow-utils\n", + "\t\t\t\t\t\t\t >\tsharutils\n", + "\t\t\t\t\t\t\t >\tsqlite\n", + "\t\t\t\t\t\t\t >\tsqlite-analyzer\n", + "\t\t\t\t\t\t\t >\tsqlite-devel\n", + "\t\t\t\t\t\t\t >\tsqlite-doc\n", + "\t\t\t\t\t\t\t >\tsqlite-libs\n", + "\t\t\t\t\t\t\t >\tsqlite-tcl\n", + "\t\t\t\t\t\t\t >\tsystemd\n", + "\t\t\t\t\t\t\t >\tsystemd-container\n", + "\t\t\t\t\t\t\t >\tsystemd-devel\n", + "\t\t\t\t\t\t\t >\tsystemd-journal-remote\n", + "\t\t\t\t\t\t\t >\tsystemd-pam\n", + "\t\t\t\t\t\t\t >\tsystemd-udev\n", + "\t\t\t\t\t\t\t >\tsystem-python\n", + "\t\t\t\t\t\t\t >\tsystem-python-libs\n", + "\t\t\t\t\t\t\t >\ttar\n", + "\t\t\t\t\t\t\t >\ttexinfo\n", + "\t\t\t\t\t\t\t >\ttexinfo-tex\n", + "\t\t\t\t\t\t\t >\ttime\n", + "\t\t\t\t\t\t\t >\ttkinter\n", + "\t\t\t\t\t\t\t >\ttzdata\n", + "\t\t\t\t\t\t\t >\ttzdata-java\n", + "\t\t\t\t\t\t\t >\tunzip\n", + "\t\t\t\t\t\t\t >\tustr\n", + "\t\t\t\t\t\t\t >\tustr-debug\n", + "\t\t\t\t\t\t\t >\tustr-debug-static\n", + "\t\t\t\t\t\t\t >\tustr-devel\n", + "\t\t\t\t\t\t\t >\tustr-static\n", + "\t\t\t\t\t\t\t >\tutil-linux\n", + "\t\t\t\t\t\t\t >\tutil-linux-user\n", + "\t\t\t\t\t\t\t >\tuuidd\n", + "\t\t\t\t\t\t\t >\tveritysetup\n", + "\t\t\t\t\t\t\t >\tvim-common\n", + "\t\t\t\t\t\t\t >\tvim-enhanced\n", + "\t\t\t\t\t\t\t >\tvim-filesystem\n", + "\t\t\t\t\t\t\t >\tvim-minimal\n", + "\t\t\t\t\t\t\t >\tvim-X11\n", + "\t\t\t\t\t\t\t >\twhich\n", + "\t\t\t\t\t\t\t >\txz\n", + "\t\t\t\t\t\t\t >\txz-devel\n", + "\t\t\t\t\t\t\t >\txz-libs\n", + "\t\t\t\t\t\t\t >\txz-lzma-compat\n", + "\t\t\t\t\t\t\t >\txz-static\n", + "\t\t\t\t\t\t\t >\tzip\n", + "\t\t\t\t\t\t\t >\tzlib-devel\n", + "\t\t\t\t\t\t\t >\tzlib-static\n" + ] + }, + { + "ename": "", + "evalue": "1", + "output_type": "error", + "traceback": [] + } + ], + "source": [ + "diff -a --suppress-common-lines -y httpd_dependencies.txt proftpd/packages/gen-core-binary-pkgs.txt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now generate your own modulemd document and create your module! Below is a Raw NB-convert cell where you can write out your own modulemd. (See step 4 \"BONUS\" for a skeleton if you wish.) And remember, run everything in a terminal to prevent your notebook from crashing!" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "document: modulemd\n", + "version: 1\n", + "data:\n", + " summary: My httpd module\n", + " description: My httpd module that I created during the Modularity workshop.\n", + " license:\n", + " module:\n", + " - [MIT]\n", + "\n", + " dependencies:\n", + " buildrequires:\n", + " base-runtime: master\n", + " requires:\n", + " base-runtime: master\n", + " \n", + " # Optional\n", + " references:\n", + " community: https://community.apache.org/\n", + " documentation: https://httpd.apache.org/docs/\n", + " tracker: https://github.com/apache/httpd\n", + " \n", + " # Optional\n", + " profiles:\n", + " rpms:\n", + " - httpd\n", + " \n", + " # Optional\n", + " api:\n", + " rpms:\n", + " - httpd\n", + "\n", + " components:\n", + " rpms:\n", + " apr:\n", + " rationale: build dependency\n", + " ref: f25\n", + " apr-util:\n", + " rationale: build dependency\n", + " ref: f25\n", + " httpd:\n", + " rationale: main httpd module\n", + " ref: f25\n", + " build-order: 10\n", + " httpd-tools:\n", + " rationale: build dependency\n", + " ref: f25\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. *BONUS*: Designing and building your own module from scratch" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below is a skeleton to help you design your own module. Follow part II of section 3 (\"The `httpd` module\").\n", + "\n", + "For example modules, visit:\n", + "https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules#Examples" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "document: modulemd\n", + "version: 1\n", + "data:\n", + " summary: \n", + " description:\n", + " license:\n", + " module:\n", + " \n", + " # Optional\n", + " dependencies:\n", + " buildrequires:\n", + " \n", + " requires:\n", + " \n", + " # Optional - References are optional, but highly encouraged\n", + " references:\n", + " community:\n", + " documentation: \n", + " tracker:\n", + " \n", + " # Optional\n", + " profiles:\n", + " \n", + " # Optional - 'default' build (rpms that will be included by default)\n", + " default:\n", + " rpms:\n", + " \n", + " # Optional - 'minimal' build (minimal rpms required by the module)\n", + " minimal:\n", + " rpms:\n", + " \n", + " # Optional\n", + " api:\n", + " rpms:\n", + " \n", + "\n", + " # Optional - extensible metadata block for a list of vendor-defined key-value pairs.\n", + " # The list can contain more than one value\n", + " xmd:\n", + " # Example key-value pair\n", + " user-defined-key: #change this key name to whatever you like\n", + " \n", + " # Example key-value pair with list (add as little or as many as you like)\n", + " another-user-defined-key: #change this key name to whatever you like\n", + " - the first value of the list #change this value to whatever you like\n", + " - the second value of the list #change this value to whatever you like\n", + " - the third value of the list #change this value to whatever you like\n", + "\n", + " # Optional - Components to be included in the module. (Note: A minimal module does not have\n", + " # to contain components. However, to build your own module, you will need to add components\n", + " components:\n", + " \n", + " # You will need some RPMs\n", + " rpms:\n", + " package-A:\n", + " rationale:\n", + " ref: #which fedora version, e.g. f22, f23, f24, f25...\n", + " buildorder: #optional\n", + " package-B:\n", + " rationale:\n", + " ref:\n", + " \n", + " # Optional (you can use the proftpd module you created earlier)\n", + " modules:\n", + " my-favourite-module:\n", + " rationale:\n", + " buildorder:\n", + " repository: \n", + " ref: \n", + "\n", + " # Optional - Filter out any rpms you don't want to include\n", + " filter:\n", + " rpms:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you are ready to build your module, repeat the same steps under **2. Developing a Module**, except with your module name." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. *BONUS*: Building your own qcow2 image from your module (using virt-install)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**`virt-install`** is one easy way you can generate your own qcow2 image. Thus, we'll be using the `virt-install` tool to create our KVM using the **`libvirt`** library (hence the `libvirt` dependency). \n", + "\n", + "In order to use `virt-install`, you'll need to install the following packages:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Install dependencies\n", + "sudo dnf install libvirt virt-install virt-viewer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, within this workshop git repository, we've included an f24 kickstart file that you can use. You will need this file in order run `virt-install`. The Kickstart file is used to tell `virt-install` what to install and how to install it.\n", + "\n", + "If you wish, you can paste your modified kickstart below so that it's easier for you to see it while you complete this part of the workshop. Your job is to modify the kickstart file to use **f25**. Name this file **`f25-cloud.ks`**.\n", + "\n", + "For information about kickstart files (e.g., what they are, how we use them, etc.), see: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-file.html" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "# Paste your kickstart file here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below is a hint to help you get started with virt-install. You'll need to add more arguments in order to generate your qcow2 image. Also, do not run this command in your notebook! It will cause your notebook to crash!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# virt-install --name FedoraTest --ram 1500 --disk pool=default,size=10 --location http://dl.fedoraproject.org/pub/alt/releases/24/Cloud/x86_64/os/ --initrd-inject f24-cloud.ks --extra-args \"inst.ks=f24-cloud.ks\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you will see, `virt-install` will take a while to run. So while your image is being generated, you can skip to step 6 (which is a slightly faster way for building your image)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. *BONUS*: Building your own qcow2 image from your module (by hand)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While you can use a tool such as `virt-install`, this method is significantly *faster*.\n", + "\n", + "Now, in order to build your own qcow2 image from your module, you will first need to install the following packages:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sudo dnf install imagefactory libvirt virt-manager" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next you'll need a Fedora Kickstart file -- the one you created in step 6 earlier." + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "# OPTIONAL: Paste your modified kickstart here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Following this, you'll need a template file. We've included a template file here, titled `f24-cloud-template.tdl`. Modify this template file to use f25 and name this file **`f25-cloud-template.tdl`**." + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You'll also need a `cloud-init` file in order to generate this image, so follow the instructions to generate a cloud-init file: http://www.projectatomic.io/blog/2014/10/getting-started-with-cloud-init/\n", + "\n", + "However, instead of `wget https://alt.fedoraproject.org/pub/alt/fedora-atomic/testing/rawhide/20141008.0/cloud/fedora-atomic-rawhide-20141008.0.qcow2.xz`\n", + "\n", + "use:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Obtain f25 qcow2 cloud image\n", + "wget https://dl.fedoraproject.org/pub/alt/atomic/stable/Fedora-Atomic-25-20161221.0/CloudImages/x86_64/images/Fedora-Atomic-25-20161221.0.x86_64.qcow2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, using ONLY 1 line of code, modify your Oz configuration file `/etc/oz/oz.cfg`. Comment out the following line:" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "image_type = raw" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Add this line below it:" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "image_type = qcow2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tells Imagefactory, which is built on Oz, to create the base image as a qcow2 image. And remember: complete this modification using only 1 line:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Modify Oz configuration\n", + "sudo sed -i -e 's/# image_type = raw/image_type = qcow2/' /etc/oz/oz.cfg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now use imagefactory to generate a base image:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "sudo imagefactory --debug base_image --file-parameter install_script f25-cloud.ks f25-cloud.tdl --parameter offline_icicle true" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now in order to run your image using `virt-manager`, you'll need to place the qcow2 image in your libvirt `images` folder:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "sudo mv -Z /var/lib/imagefactory/storage/ /var/lib/libvirt/images/my-f25-cloud-image.qcow2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, run `virt-manager` and play around with the settings to generate your image. Once you've done that, you're all set to go!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "virt-manager" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}