{"id":23738078,"url":"https://github.com/csmart/ipa-buildroot","last_synced_at":"2025-09-04T13:32:21.241Z","repository":{"id":48290201,"uuid":"81269865","full_name":"csmart/ipa-buildroot","owner":"csmart","description":null,"archived":false,"fork":false,"pushed_at":"2017-06-13T23:39:25.000Z","size":494,"stargazers_count":4,"open_issues_count":0,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2023-04-13T11:10:34.155Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/csmart.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-02-08T00:34:32.000Z","updated_at":"2023-02-22T18:52:14.000Z","dependencies_parsed_at":"2022-07-25T22:18:06.630Z","dependency_job_id":null,"html_url":"https://github.com/csmart/ipa-buildroot","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csmart%2Fipa-buildroot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csmart%2Fipa-buildroot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csmart%2Fipa-buildroot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csmart%2Fipa-buildroot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/csmart","download_url":"https://codeload.github.com/csmart/ipa-buildroot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231965415,"owners_count":18453071,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-31T08:52:40.686Z","updated_at":"2024-12-31T08:52:41.344Z","avatar_url":"https://github.com/csmart.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"[buildroot-list-defconfigs]: https://github.com/csmart/ipa-buildroot/raw/master/doc/img/buildroot-list-defconfigs.png \"Listing available Buildroot configs, showing IPA\"\n[buildroot-menuconfig]: https://github.com/csmart/ipa-buildroot/raw/master/doc/img/buildroot-menuconfig.png \"The welcome window of Buildroot menuconfig\"\n[buildroot-menuconfig-external]: https://github.com/csmart/ipa-buildroot/raw/master/doc/img/buildroot-menuconfig-external.png \"Configuration for IPA Buildroot configs\"\n[buildroot-menuconfig-external-releases]: https://github.com/csmart/ipa-buildroot/raw/master/doc/img/buildroot-menuconfig-external-releases.png \"Setting the Git release for building IPA\"\n[buildroot-menuconfig-password]: https://github.com/csmart/ipa-buildroot/raw/master/doc/img/buildroot-menuconfig-password.png \"A salted, sha256 hashed password for root\"\n[buildroot-menuconfig-readme]: https://github.com/csmart/ipa-buildroot/raw/master/doc/img/buildroot-menuconfig-readme.png \"This shows how to navigate and use Buildroot menuconfig\"\n[buildroot-menuconfig-search]: https://github.com/csmart/ipa-buildroot/raw/master/doc/img/buildroot-menuconfig-search.png \"Search and navigate to options\"\n\n# OpenStack Ironic Python Agent\n\nThis is an experiment using [Buildroot](https://buildroot.org) to create a\nsmall, custom Ironic Python Agent image for OpenStack.\n\nFeedback is most welcome!\n\n* [How the build works](#how-the-build-works)\n   * [Directory structure](#directory-structure)\n* [Getting Buildroot](#getting-buildroot)\n   * [Git clone](#git-clone)\n* [Build dependencies](#build-dependencies)\n   * [Fedora](#fedora)\n   * [Ubuntu](#ubuntu)\n* [Building the image](#building-the-image)\n   * [Step 1 - Exporting variables](#step-1---exporting-variables)\n   * [Step 2 - Preparing the output directory](#step-2---preparing-the-output-directory)\n   * [Step 3 - Loading the Buildroot configuration](#step-3---loading-the-buildroot-configuration)\n   * [Step 4 - Making changes to Buildroot configuration](#step-4---making-changes-to-buildroot-configuration)\n   * [Step 5 - Building the image](#step-5---building-the-image)\n* [Testing the image](#testing-the-image)\n* [Making changes](#making-changes)\n   * [Making changes to Buildroot](#making-changes-to-buildroot)\n      * [Setting the IPA version](#setting-the-ipa-version)\n      * [Adding users](#adding-users)\n      * [Setting root password](#setting-root-password)\n         * [Using a hashed password](#using-a-hashed-password)\n      * [Using filesystem overlays](#using-filesystem-overlays)\n      * [Adding SSH keys](#adding-ssh-keys)\n   * [Making changes to Busybox](#making-changes-to-busybox)\n   * [Making changes to the Linux kernel](#making-changes-to-the-linux-kernel)\n* [Rebuilding](#rebuilding)\n* [Saving changes](#saving-changes)\n\n# How the build works\n\nBuildroot is a popular open source tool for building embedded Linux\nsystems. It supports many popular (and generic) platforms, however it\ncan also be extended to support third party platforms.\n\nWe will track a stable version of Buildroot, and create an extra set\nof configs to support our own platform.\n\nThen we will simply tell Buildroot where these extra configs are so\nthat we can build our own Ironic Python Agent images.\n\nThe build is done as a regular user, *not* as root.\n\n## Directory structure\n\nInside this main _ipa-buildroot_ repository will be directories which\nare used to build your images.\n\n| Directory | Description |\n| --- | --- |\n| buildroot | Upstream Buildroot source code Git submodule |\n| buildroot-ipa | Ironic Python Agent image configurations for Buildroot |\n| ccache | Directory for storing ccache files to speed up subsequent builds |\n| dl | Cache directory for downloaded source code tarballs |\n| doc | Files for documentation, including screenshots |\n| output | Output directory for build |\n| overlay | For users to include own files into the target image |\n| scripts | For users to run own scripts when building the image |\n\nWe will export variables later to help use these.\n\n# Getting Buildroot\n\nThis Git repository (_ipa-buildroot_) contains our configuration files\nfor building the IPA image (in the _buildroot-ipa_ subdirectory).\n\nThis repo also uses a Git submodule to pull in a stable release of the\nupstream Buildroot Git repository for us to build against (in the\n_buildroot_ subdirectory).\n\nWe shouldn't modify anything in the upstream Buildroot repository, but\nrather put any changes in our own configuration space under\n_buildroot-ipa_.\n\n## Git clone\n\nClone this ipa-buildroot repo into your home directory, adding the\n_--recursive_ option to also pull in the upstream Buildroot Git repo.\n\n\tcd ~\n\tgit clone --recursive https://github.com/csmart/ipa-buildroot\n\nAlternatively, if you have already cloned this ipa-buildroot repository\non its own, you can pull in the upstream Buildroot Git submodule manually.\n\n\tcd ~/ipa-buildroot/\n\tgit submodule init\n\tgit submodule update\n\nNow you should have both of the Git repos required to build an image!\n\n# Build dependencies\n\nFor additional details on build dependencies, see the\n[relevant Buildroot documentation](https://buildroot.org/downloads/manual/manual.html#requirement).\n\n## Fedora\n\nSomething like this should be about right.\n\n\tsudo dnf install bash bc binutils bison bzip2 cmake cpio \\\n\tflex gcc gcc-c++ glibc-devel glibc-devel.i686 glibc-headers.i686 \\\n\tgzip make ncurses-devel patch perl python redhat-lsb.i686 rsync \\\n\tsed tar texinfo unzip wget which\n\nInstall tools for downloading source.\n\n\tsudo dnf install bzr cvs git mercurial rsync subversion\n\nInstall deps for busybox menuconfig.\n\n\tsudo dnf install 'perl(ExtUtils::MakeMaker)' 'perl(Thread::Queue)'\n\n## Ubuntu\n\nSomething like this should be about right.\n\n\tsudo apt-get install bc build-essential libncurses5-dev libc6:i386 texinfo unzip\n\nInstall tools for downloading source.\n\n\tsudo apt-get install bzr cvs git mercurial rsync subversion\n\n# Building the image\n\nBuildroot makes use of environment variables and it can make our life\neasier, too.\n\nIn the next steps we're going to export the following variables.\n\n| Variable | Description | Used by |\n| --- | --- | --- |\n| BR2_IPA_REPO | Where this _ipa-buildroot_ Git repo was cloned, e.g. ~/ipa-buildroot | Shell |\n| BR2_UPSTREAM | Where upstream Buildroot Git submodule was cloned, e.g. ~/ipa-buildroot/buildroot | Shell |\n| BR2_EXTERNAL | Ironic Python Agent Buildroot configs, e.g. ~/ipa-buildroot/buildroot-ipa | Buildroot |\n| BR2_OUTPUT_DIR | Where Buildroot conducts builds and saves built images, e.g. ~/ipa-buildroot/output | Shell |\n\n## Step 1 - Exporting variables\n\nFirst, let's export the location of this cloned ipa-buildroot Git repo, as\nother variables will be relative to it.\n\n_Substitute this directory as appropriate, based on where you cloned this repo._\n\n\texport BR2_IPA_REPO=\"${HOME}/ipa-buildroot\"\n\nSet the location of the upstream Buildroot code.\n\n\texport BR2_UPSTREAM=\"${BR2_IPA_REPO}/buildroot\"\n\nLet's export the BR2_EXTERNAL variable to tell Buildroot where the IPA\nspecific configs are inside the cloned ipa-buildroot Git repository, so\nthat it can find our IPA specific customisations. Without this, Buildroot\nwill not include our IPA configs and won't be able to build our image.\n\n\texport BR2_EXTERNAL=\"${BR2_IPA_REPO}/buildroot-ipa\"\n\n## Step 2 - Preparing the output directory\n\nWe will utilise Buildroot's out-of-tree support and build in the existing\n _output_ dir inside the top level of our _ipa-buildroot_ Git repository.\n\nNote that the _output_ directory will be ignored by Git.\n\n\texport BR2_OUTPUT_DIR=\"${BR2_IPA_REPO}/output\"\n\nAlternatively, specify a _unique_ output dir if you need to perform concurrent\nbuilds.\n\n\texport BR2_OUTPUT_DIR=\"$(mktemp -d -p ${BR2_IPA_REPO}/output \\\n\t-t \"$(date +%s)-XXXXXX\")\"\n\nNow you should be able to list all of the available Buildroot configs from inside\nthe output directory.\n\n\tcd \"${BR2_OUTPUT_DIR}\"\n\tmake -C \"${BR2_UPSTREAM}\" list-defconfigs\n\nIf this worked, you should see the IPA build listed under \"External configs.\"\n\n![alt text][buildroot-list-defconfigs]\n\n## Step 3 - Loading the Buildroot configuration\n\nNow you can load the default IPA config that you saw above. Note that we specify\nthe output directory (O=) and the change directory (-C) options to make use if\nout-of-tree builds.\n\n\tcd \"${BR2_OUTPUT_DIR}\"\n\tmake O=\"${BR2_OUTPUT_DIR}\" -C \"${BR2_UPSTREAM}\" openstack_ipa_defconfig\n\n**Note:** From now on you do not need to specify the output directory (O=) and\nchange to source directory (-C) options. After the first time, Buildroot will write a\nconfiguration file in the output directory and remember automatically in the future.\n\n## Step 4 - Making changes to Buildroot configuration\n\n**Note:** This step is entirely optional, however you may wish to perform the following:\n* [Setting root password](#setting-root-password)\n* [Adding SSH keys](#adding-ssh-keys)\n\nNow that you have loaded the configuration file, you have the opportunity to\nmake any changes you might need.\n\nThere are three main components you may want to configure.\n\n* Buildroot itself\n  * System details\n    * Enable root login\n    * Set root password\n  * Compiler\n  * Target packages\n  * Image formats\n  * External options\n    * Version of IPA\n* Busybox\n  * Packages to include\n* Linux kernel\n  * Features\n  * Hardware support\n\nSee the [Making changes](#making-changes) section below for details and examples.\n\n## Step 5 - Building the image\n\nFinally, make the image!\n\n**Note:** You should **not** use -j option with make, it is set in the config\nand determined automatically. Specifying -j here may cause Buildroot components\nto be built out of order, causing a failure.\n\n\tmake\n\nA successful build should create both a *_bzImage_* Linux kernel image and the\nIPA *_rootfs.cpio.xz_* initramfs in the ${BR2_OUTPUT_DIR}/images directory.\n\n# Testing the image\n\nYou can test the kernel and initramfs images in QEMU.\n\n\tqemu-system-x86_64 \\\n\t-enable-kvm \\\n\t-cpu host \\\n\t-m 1G \\\n\t-kernel images/bzImage \\\n\t-append earlyprintk \\\n\t-initrd images/rootfs.cpio.xz \\\n\t-netdev user,id=net0 \\\n\t-device e1000,netdev=net0\n\nYou should see a login prompt, however note that **root login is disabled by\ndefault**. See [Setting root password](#setting-root-password) and/or\n[Adding SSH keys](#adding-ssh-keys) below on how to enable these if you require\nthem.\n\nThe Python packages for IPA should have been installed and the daemon\nshould be running on port 9999.\n\nNote that you may want to use different QEMU networking settings than _user_\nabove if you want to access IPA on your network. If you have virt-manager, you\ncan easily boot up the kernel and initramfs using its graphical interface.\n\n# Making changes\n\nThis assumes you have already loaded the openstack_ipa_defconfig as per\nthe [Building the image](#building-the-image) section above and are ready to\nmodify it (you do not need to have built anything yet).\n\nChanges can be made directly via the various .config files, but it is better\nto use the graphical menu tools to make changes which will write to the\n.config files.\n\nAny changes that you make will be in the output directory, not in the main\nGit repositories. To save your changes, see the _Saving changes_ section\nbelow.\n\nConfiguration files are in the following locations:\n\n| Component | Location |\n| --- | --- |\n| Buildroot | ${BR2_OUTPUT_DIR}/.config|\n| Busybox | ${BR2_OUTPUT_DIR}/build/busybox-[version]/.config|\n| Linux | ${BR2_OUTPUT_DIR}/build/linux-[version]/.config|\n\n## Making changes to Buildroot\n\nThe main Buildroot configuration specifies many core components of the\ntarget system, such as architecture, toolchain and build options, system\noptions and settings, kernel and config, packages to build, images to\ncreate, bootloader support and more.\n\nIt is also where we will make the most common changes, such as:\n\n* Enabling and setting a password for the root account\n* Add/override any files in the target image, like SSH keys\n* Changing download and cache build directory locations\n\nTo make changes, you can modify the options directly in the .config file\nand then run _make oldconfig_ or you can use the menu (recommended).\n\n\tmake menuconfig\n\nYou should be greeted with a configuration menu.\n\n![alt text][buildroot-menuconfig]\n\nNavigate by pressing the arrow keys and select using \u003c_Enter_\u003e or \u003c_Space bar_\u003e.\n\n**Note:** You can get help for any option by navigating across to \u003c Help \u003e option\nand hitting \u003c_Enter_\u003e.\n\nThe \u003c Help \u003e on the main screen presents the README which explains how the options\nwork.\n\n![alt text][buildroot-menuconfig-readme]\n\nHitting the forward slash (/) key will let you search for any option in\nBuildroot and go directly to it by pressing the corresponding number.\n\nIn the example below, we searched for _python_ and pressing _8_ would take us\nstraight to the Python target package.\n\n![alt text][buildroot-menuconfig-search]\n\n### Setting the IPA version\n\nThe Ironic Python Agent and dependencies are created by the post-build.sh script.\n\nIt uses pip to automatically create wheels based on the provided requirements.txt\nfrom the upstream OpenStack Ironic Python Agent project as well as the\nupper-constraints.txt from the OpenStack Requirements project.\n\nThere are two config options in Buildroot to set the Git version of these repos\nso that you can build for multiple OpenStack releases.\n\n| Config option | Purpose |\n| --- | --- |\n| OPENSTACK_IPA_GIT_URL | Setting the Git URL for Ironic Python Agent (defaults to upstream) |\n| OPENSTACK_IPA_RELEASE | Setting the Git commit/tag/branch from Ironic Python Agent repo for fetching requirements.txt (defaults to master) |\n| OPENSTACK_REQUIREMENTS_GIT_URL | Setting the Git URL for OpenStack Requirements repo (defaults to upstream) |\n| OPENSTACK_REQUIREMENTS_RELEASE | Setting the Git commit/tag/branch from Requirements repo for fetching upper-constraints.txt (defaults to master) |\n\nIf you want to build from the master branches on upstream repositories, then you\ndo not have to change anything.\n\nIf you want to build another branch and/or from another repository, then change\naccordingly. Note that local paths are supported, e.g. /home/csmart/ironic-python-agent\n\nIf you want to fetch HEAD (in case of local repository) or the default remote branch,\nthen don't specify anything for the Git release value.\n\nTo set these to a specific Git repo, tag or branch, under menuconfig browse to _External\noptions_ (at the very bottom).\n\n![alt text][buildroot-menuconfig-external]\n\nIn the sub menu, you should see the options mentioned above. Simply enter the\ndetails you wish to use.\n\n![alt text][buildroot-menuconfig-external-releases]\n\nSave and exit menuconfig. The next time _make_ is run, Buildroot will re-clone from the\nspecified Git repositories and build the IPA version for the target using the specified\nGit commit/tag/branch.\n\n### Adding users\n\nOnly the root user is configured, although login is disabled by default and there is no\npassword.\n\nIf you need to add another user, Buildroot supports this via a file which contains\na list of users, specified at BR2_ROOTFS_USERS_TABLES option.\n\nSee their online documentation on [adding custom user accounts](https://buildroot.org/downloads/manual/manual.html#customize-users)\nif you need to make use of this.\n\n### Setting root password\n\nThe default configuration **does not allow root login** and there is **no\npassword configured**.\n\nTo enable the root account and set a password, navigate to the\n_System configuration_ menu and hit \u003c_Enter_\u003e.\n\n\tSystem configuration  ---\u003e\n\nNavigate down to the login option and enable it with \u003c_Space bar_\u003e.\n\n\t[*] Enable root login with password\n\nThis will enable a sub-option for specifying the password.\n\n\t() Root password\n\nHitting \u003c_Enter_\u003e on this option will open a free form text field for\nyou to enter the password.\n\n#### Using a hashed password\n\nThe password will be **saved in plain text** inside the .config file,\nso it is probably best to use a hash of a password.\n\nSpecifying sha256 hashed passwords must be prefixed with _$5$_ like so:\n  * $5$salt$Gcm6FsVtF/Qa77ZKD.iwsJlCVPY0XSMgLJL0Hnww/c1\n\nHowever, all instances of _$_ in the hashed password __must be doubled__, so it becomes:\n  * $$5$$salt$$Gcm6FsVtF/Qa77ZKD.iwsJlCVPY0XSMgLJL0Hnww/c1\n\nYou can generate a fully compliant password like follows (note that you\nshould replace _salt_ with some other string and _password_ with the\npassword you want to use).\n\n\tpython -c 'import crypt; print crypt.crypt(\"password\", \"$5$random_salt\")' \\\n\t|sed 's|\\$|\\$\\$|g'\n\nThen set this in the free text password field.\n\n![alt text][buildroot-menuconfig-password]\n\n### Using filesystem overlays\n\nYou can add or replace any file on the target system using an overlay. These\nfiles should still be owned by your user, there is no need to change ownership\nto root.\n\nThe IPA board already has an overlay to copy in important files such as\nsystemd init scripts to start IPA. This is located at:\n\n* ${BR2_EXTERNAL}/board/openstack/ipa/rootfs-overlay/\n\nA second overlay is preconfigured (which is not tracked by Git) for users to\nadd files to. It is located in the _overlay_ directory in the top level\nipa-buildroot Git repository at:\n\n* ${BR2_IPA_REPO}/overlay/\n\nThe configuration option which specifies both of these locations is\n__BR2_ROOTFS_OVERLAY__.\n\nIn order to make use of the overlay, simply add files and directories to\nthe overlay at ${BR2_IPA_REPO}/overlay/ and they will be copied into the\ntarget filesystem at build time.\n\n**Note:** The following files and directories are ignored and will **not** be\ncopied into the target.\n\n* Directories like .git .svn and .hg\n* Files called .empty\n* Files ending in ~\n\n### Adding SSH keys\n\nNote that by default, the SSH server does not allow login by root at all. The\npost-build.sh script currently sets __PermitRootLogin prohibit-password__ in\nsshd_config if it detects that root has an authorized_keys file. This is done\nfor convenience so that login will work out of the box.\n\nHowever, ultimately it's probably better to provide your own complete sshd_config\nin the overlay with the configuration options you require.\n\nThe easiest way to add SSH keys is with an overlay, see\n[Using filesystem overlays](#using-filesystem-overlays).\n\nCreate the required root directory structure.\n\n\tmkdir -p ${BR2_IPA_REPO}/overlay/{etc/ssh,root/.ssh}\n\nAny keys and configs for _root_ should go under:\n\n* ${BR2_IPA_REPO}/overlay/root/.ssh\n\nIf you have pre-generated host keys, then place these under:\n\n* ${BR2_IPA_REPO}/overlay/etc/ssh/\n\nIf you wish to override the default sshd_config then you can also do so\nby playing it at.\n\n* ${BR2_IPA_REPO}/overlay/etc/ssh/sshd_config\n\n**Note:** Permissions are very important for SSH, so the post-build.sh\nscript will ensure that these are set correctly.\n\n## Making changes to Busybox\n\nThe busybox config is very minimal, however you may find that you want\nto add (or remove) some of the packages that it offers.\n\nYou can use a menuconfig to make any changes you want (note this\nmay do some downloading and extracting first).\n\n\tmake busybox-menuconfig\n\nBe sure to save your changes when you exit menuconfig and see\n[Saving changes](#saving-changes) if you want to add them permanently\nto Git.\n\n## Making changes to the Linux kernel\n\nThe Linux kernel was made from scratch using tiny-config and is\ndeliberately very limited in the amount of hardware it supports. Having\nsaid that, it is also designed to support a wide range of server grade\nhardware.\n\nThe idea is to add support for hardware as we encounter it, so please\nfile a bug report if some essential support is missing.\n\nIf you need to make any Linux kernel configuration changes, you can use\nthe menuconfig (note this may do some downloading, extracting and building\nfirst).\n\n\tmake linux-menuconfig\n\nBe sure to save your changes when you exit menuconfig and see\n[Saving changes](#saving-changes) if you want to add them permanently\nto Git.\n\n# Rebuilding\n\nBuildroot makes use of stamp files to track the state of the build. These\nare located in the package build directories under ${BR2_OUTPUT_DIR}/build/.\n\nIn most cases you can tweak the Buildroot configuration and then just\nre-run _make_ to get updated images.\n\nHowever, if you are making changes to a package which was already built,\nBuildroot will not re-build it as the stamps say it is already been done.\n\nIn such a case, you can remove the stamp file (or entire package build\ndirectory) and try again.\n\n\trm ./build/python-2.7.13/.stamp_built\n\nYou can also tell Buildroot to only build a specific package if you just want\nto test rebuilding one package at a time.\n\n\tmake python\n\n# Saving changes\n\nIf you made changes to the Buildroot, Linux kernel or Busybox configs, you\ncan save them over the top of the existing configs in the IPA buildroot repo.\n\n\tmake savedefconfig\n\tmake linux-savedefconfig \u0026\u0026 make linux-update-defconfig\n\tmake busybox-update-config\n\nThen back in the ipa-buildroot repository you can use Git to review/commit\nthem.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcsmart%2Fipa-buildroot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcsmart%2Fipa-buildroot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcsmart%2Fipa-buildroot/lists"}