From patchwork Sun Oct 18 22:02:59 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101212 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B774CCF2CA for ; Sun, 18 Oct 2026 22:03:23 +0000 (UTC) Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.22492.1792360996382884508 for ; Sun, 18 Oct 2026 15:03:16 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=X+YzwMRO; spf=pass (domain: gmail.com, ip: 209.85.216.50, mailfrom: ticotimo@gmail.com) Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-3acb512a7a0so786388a91.1 for ; Sun, 18 Oct 2026 15:03:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792360996; x=1792965796; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=KNKy+tLo2s9D1hKO6VHKcLRCazYnLZDBzyIWFP/lrj8=; b=X+YzwMROjTNaOYaNVDKj65L/XQj1rRYcnomg4a7tQVyadpVHLZ9ZuzCxQaMiSwCBwY PfoDicj1H4jqkGWPfUgVe9FTXOZqxkDSvShgUOOiq8ejq8NWrqYF6i32I2x9aS7Ssoci 74KX1HjbHD94beEheMvxMhjG8V/7wc6xS6Zp0Dv/e8PBS5wdkikHW0b12m0d6sCte6oI iriIiSV1yHk3x/TfG7+GfLcNa4su9f5ut+Qr6cm0oI/Fm3807FjuS+8hIcsZyiZsJsnb Ja5JJAWmPpU7JyOa7rAj5nGiF38roAr1kGwlj8NFva7cuKTUtYkM/o7TSV1gOnc1FN87 dvtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792360996; x=1792965796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=KNKy+tLo2s9D1hKO6VHKcLRCazYnLZDBzyIWFP/lrj8=; b=ZTRjhWfvZormxoSWNICqLrvCMm/+WIazXe1R+7/kYNRVzX2kl90cJxvwG7h9gcBR6I eKUfubsIBtnzYjhJyu4jK1GufOVdmwKQzv9MVIHpYRFi+wOWcDYnjCDGLp+MI3udms3G cpusDyf83TIKO/+XSK9Bqfy7GqfrynH5gzIJgikqDmMcj+KTC6BN4KpJDdOVgVXRpHtj arfQakSBn/4lf3NidpIbG12w+yIhkLQKJBFGFmlMV2L4kV4LvK3jM8pSrwCXLADGsWsO apAhnjzuKY0p1OdMOKx4NQmTxnbD8nwSbvHs1vFnKRV9+U+xOybPjT2y5UbFkJ5TNMcE reIQ== X-Gm-Message-State: AFq9FYJsupacS/y4LJGml8DwUh+p3hiZ2iOfsrNrCkFNTSATVI84r3fy FVga0PV/R9RJKqn2kFLQKJz/5RthYgR3N+OTWa4Zdl75AL70s8yBvtnuZRoODB91 X-Gm-Gg: AYBFou31ltvQXmrJbn0v4GbPwxxhU1FJyYERhElBTf9HaqZ7nWZEm6BhLtQW/ulO1fX bbtzrtlHijxwrplv2hu3CrE5i58A0uDJRk0J7ddJk+VF3yvUr6Gl6HavNQn8NR1Wao31qKafJLj 0Jt4Y+WXhbLzyD6mDHVWebFis7pRyDmQX18kXlVYWLmUT9/sLw4OfQgnRf+0yKhrw2sWS08sRhe Uz/m1hNroaAXe7a/vQbMiQQYs+bVmkFGFRpiqKKkRgkSpLqy5FVSxHei9bVkXJUuziEQFrCeMZ4 fn1idFU5wNFaCl+2N68bGHCJfl8ZrP0h+UJCbuqnpLs//A6ZA/SnbPFDAMQSGBaUS+EVVYEh+iv 44UuWT0RwLHxwjVaVo6yhKpXN8vIpphTdScnw3y8RzT2JRh54Dq3eZLiE02HVU4PDVmpxwjysVC qsTeO9FvoSUQv9IyWU914JYFv+j7CQ2kwhh2TPMUhtxv9XHtzLl+iAZzxlERNicO5WtnTJKS7fP WqgXzTqBesJqbxZOqnjwPOf5USJx9QVJfn18TlG1Q== X-Received: by 2002:a17:90b:164c:b0:3ac:e6a:1b27 with SMTP id 98e67ed59e1d1-3acef29e770mr4582148a91.42.1792360995698; Sun, 18 Oct 2026 15:03:15 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.14 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:14 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 01/10] README.devel: document running the tests; update requirements Date: Sun, 18 Oct 2026 15:02:59 -0700 Message-ID: <20261018220308.72731-2-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:23 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5083 Add a "Running the tests" section covering docker/run-tests.sh (the only way to run tests/test_update.py), running the other tests against a local database, tests/test_dockersetup.py, and what the CI and Safety workflows run. The requirements still listed Python 3.6+ and Django 3.2; Django 5.2 needs Python 3.10 or later. The SMTP test server instructions used python3 -m smtpd, which was removed in Python 3.12; use Django's console email backend instead, which needs nothing extra. AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- README.devel | 56 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/README.devel b/README.devel index de370e5..31460ef 100644 --- a/README.devel +++ b/README.devel @@ -7,9 +7,9 @@ covered in the main README. In order to run this application standalone, you will need: -* Python 3.6+ -* Django 3.2.x (not compatible with 3.0 or older) -* RabbitMQ 3.8.x +* Python 3.10+ +* Django 5.2 LTS, as pinned in requirements.txt +* RabbitMQ * For production usage, a web server set up to host Django applications (not needed for local-only testing/development) * A database system supported by Django (SQLite, MariaDB/MySQL, etc.). @@ -22,8 +22,8 @@ In order to run this application standalone, you will need: have to have Django installed, have the same or similar configuration in settings.py and have access to the database used by the web application): - * Python 3.5+ to match with the version of BitBake - for the OpenEmbedded branch being parsed + * A Python version supported both by Django and by the BitBake of + the OpenEmbedded branches being parsed * Python dependencies as per requirements.txt (we still need Django etc. here since we interact with the database through Django's ORM.) @@ -128,17 +128,47 @@ SMTP test server ---------------- If you want to test email functionality (e.g. for password reset, layer -submission or other notifications) you can do so without dealing with actual -emails being sent by running python's built-in SMTP test server (in a -separate shell session): +submission or other notifications) without sending real emails, set Django's +console email backend in settings.py: -python3 -m smtpd -n -c DebuggingServer localhost:1025 +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' -This will stay running and print out any email that is sent to it. All you -need to do then is edit settings.py and set it to point to the server: +Every email is then printed to the console running the server (or the Celery +worker, for emails sent from background tasks) instead of being sent. -EMAIL_HOST = 'localhost' -EMAIL_PORT = 1025 + +Running the tests +----------------- + +The tests use pytest and pytest-django, which are not in requirements.txt: + + pip install pytest pytest-django + +To run the full suite as CI does, in the Docker image against a throwaway +MariaDB container, run this from the top of the source tree: + + docker/run-tests.sh + +This is the only way to run tests/test_update.py, which fetches +openembedded-core, meta-layerindex-test and BitBake from the network and runs +the update scripts (BitBake only runs on Linux). + +To run the other tests directly, set SECRET_KEY in settings.py and point it +at a MariaDB/MySQL server where your database user may create databases +(pytest-django creates and removes a test_ database), then run: + + pytest --ignore=tests/test_update.py tests/ + +tests/test_dockersetup.py tests the files dockersetup.py writes. It needs only +pytest and PyYAML, and is skipped inside the Docker image: + + python3 -m pytest tests/test_dockersetup.py + +On GitHub, .github/workflows/ci.yml runs docker/run-tests.sh and +tests/test_dockersetup.py for pushes to master and master-next and for pull +requests to master. .github/workflows/safety.yml scans the packages +installed in the Docker image for known vulnerabilities on each push and +weekly, if the repository has a SAFETY_API_KEY secret. From patchwork Sun Oct 18 22:03:00 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101210 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9B75CCCF2D4 for ; Sun, 18 Oct 2026 22:03:23 +0000 (UTC) Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.22591.1792360998484500266 for ; Sun, 18 Oct 2026 15:03:18 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=M9WLyB1g; spf=pass (domain: gmail.com, ip: 209.85.216.48, mailfrom: ticotimo@gmail.com) Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-3acb11973c3so1428016a91.3 for ; Sun, 18 Oct 2026 15:03:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792360998; x=1792965798; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=t4hOn2rMoFcSx85bpOrfIhZ1QwBfSg0mrNGVUg1W2/M=; b=M9WLyB1gkAo0oGw41rsy6nTTGmOuACaiy2d/Utzo4u/AKcP11nrdKWP/FHGqwjtpLF 1vMTN6qQUzzxsE5tGrC/eZc/MC2xk2ZAylqlehAHXVckYDy17KjEu9DL8mGLPXUiP7ZZ 7yxUzUFlbA3zjMUWom0QU0bBWF4PEQ+jbgPmLZmu/k3grEU0jknk4BdF/VxXfcnC+NSe mzAopjR8tuKD+hORLlq0iXN6H5i9thVnSX6HkXfzeMuple11GooyPS3TVZzaHB1Rlxb3 f7cUB+2ku18UaGLHC7hUfpZVd9gWbCmQwlrIkS0mlzBYdCDEtHy2pR+jkPP4DBXNgigh A9vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792360998; x=1792965798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=t4hOn2rMoFcSx85bpOrfIhZ1QwBfSg0mrNGVUg1W2/M=; b=l/r1VPRBH0c7G1JiC6pTXFtO3j+F5ffTFT2ai1Y4cNkRlWconOYx9b+CPORMhtieIO EuSjrnQuRp4cQWvXEfjQrD5W1T65vPN8zwPmYD0HACnHHlnrFy19/dbz0ejVMZcmjkFd WwN0TYIbQxlhWVJD7WoGqA7GoXonGv9xUUt6JpDhQqDaNVvc4ruYvAfJlqaKL1nZDIjx icmS1cYJvu5Ur6WJTV3UZ06xptsPTKLMuyOOz5fBh36GlQPQGq0x5ZPWd1pxOyWAPNjL OKb60uwedO000I5ZZYXxR2pPGkFYstWuBJIp6B27uPHoL2OuxjD7tdRTnPqW0krLb5qB S4mA== X-Gm-Message-State: AFq9FYJc9iYV/F2uLjRu6Ao7WlOwft4b0dSAULo6k9LACtwfkFl84ozm kHpWTwaSDo8itIsMZrbVZ82SLR0cqBaN5nf8jkd838XGCPPfuYhC99Gq52M0kg== X-Gm-Gg: AYBFou3jWtI5bmMe7fILOwUdJUW4zMnFLsCNhE/dpiTmFO/lnOKxGpTqhLX+7PyaIL4 zC+B/GSAmpfTOaiT+oa7W6WoZ5g7NhLIJutk3G8i3zXAfrQ601qSITY2AzElOpFlSeEGb8AFjHr yEOdufhm1kt/ktkyCfhaWs9+IUcOFAIhq3Sqk0LplMN9uAgZVQPa3hkg+Sj5sWEezgqHVFmcoEt HXkPZhYG7Sh1jet6rIOcoL7ylyDE2Zn+tJUOfj5T0F9RDD1dt5LfIPSeg26GZclzuBCnJvU2Qx4 6rxvN1eyyF2T93wB4+HTgxPedrWDwKZMQY4i3yEnuAMweLZ7/UttYigs/EfEDtmH2uKoZFSmv/D U73sbC1EXozcNLtULriAkJsII3rKw9k6pzCQL/Xvk1hAfpsf3DZ0w95JwWJUSUFfV11T1VWIY6S YhHdfjQxOrynpmKCU47RL6+A1LzlKXlGRhPkIfK/VIDh6cUC9ApCcZTQnigUmbH7ico3TEM/Qw3 KpKWu4n9HuEt+WOqWosBCJrBybQuuQ28/N5BihglQ== X-Received: by 2002:a17:90b:28c7:b0:3ac:945c:7f69 with SMTP id 98e67ed59e1d1-3acef15c97cmr5125608a91.66.1792360997815; Sun, 18 Oct 2026 15:03:17 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.16 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:16 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 02/10] README: document upgrading to env files and the new settings Date: Sun, 18 Oct 2026 15:03:00 -0700 Message-ID: <20261018220308.72731-3-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:23 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5084 dockersetup.py -u does not update the code itself, so say to update it first. Installations set up before the move to environment files keep their secrets in docker-compose.yml, which the update replaces; describe how to carry them over to .env.local.* files once. List the optional DEBUG, ENABLE_RRS, DATABASE_PORT and STATIC_ROOT settings, and point the HSTS link at the current Django documentation rather than Django 1.11's. AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- README | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/README b/README index 3f733af..49ce4d3 100644 --- a/README +++ b/README @@ -98,6 +98,14 @@ credentials, email server, DEBUG) from .env.. files, where The .env* files are excluded from the Docker images. +Other settings the app and celery files can set: + + - DEBUG: 1, true or yes enables Django's debug mode; anything else, or + leaving it unset, keeps it off. Never enable it on a public site. + - ENABLE_RRS: 1 enables the Recipe Reporting System (see README.rrs). + - DATABASE_PORT (default 3306) and STATIC_ROOT (default + /usr/share/nginx/html/static/). + TROUBLESHOOTING: @@ -209,11 +217,33 @@ Alternatively, you can update the data from an existing layer index instance Upgrading from an earlier version --------------------------------- -To upgrade the Docker-based setup from a previous release, simply run: +To upgrade the Docker-based setup from a previous release, update the code +(e.g. with git pull) and then run: ./dockersetup.py -u -This will update the code and run any required database migrations. +This will rebuild the containers and run any required database migrations. + +Installations set up by dockersetup.py before it used environment files +(see "Environment files" above) have their secret key and passwords in the +environment sections of docker-compose.yml. Carry them over by hand once: + +1. Copy docker-compose.yml somewhere safe, then restore the tracked version + (git checkout docker-compose.yml) and update the code. + +2. For each of app, celery, db and rabbit, copy .env.dev. to + .env.local. and fill in the values from the matching service + in the old file: SECRET_KEY, DATABASE_USER, DATABASE_PASSWORD, + MYSQL_ROOT_PASSWORD, RABBITMQ_DEFAULT_USER, RABBITMQ_DEFAULT_PASS and any + EMAIL_* settings. Set DEBUG=0 in .env.local.app, and make the files + readable only by you (chmod 600 .env.local.*). + +3. In docker-compose.yml, change the env_file entries from .env.dev.* to + .env.local.*, and reapply your other changes from the old file (hostname, + ports, certificate volumes and, if you use Let's Encrypt, the + layerscertbot service). + +4. Run ./dockersetup.py -u as above. @@ -371,7 +401,7 @@ REGISTRATION_OPEN = False also enable HSTS in your configuration. Refer to the Django Security guide for details on how to do that: - https://docs.djangoproject.com/en/1.11/topics/security/#ssl-https + https://docs.djangoproject.com/en/stable/topics/security/#ssl-https * To reset a forgotten account password, you can either use the password reset function ( /accounts/password_reset/ ) or alternatively from the From patchwork Sun Oct 18 22:03:01 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101209 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 55A5ECCF2C9 for ; Sun, 18 Oct 2026 22:03:23 +0000 (UTC) Received: from mail-pg1-f177.google.com (mail-pg1-f177.google.com [209.85.215.177]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.22592.1792361000919972733 for ; Sun, 18 Oct 2026 15:03:21 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=OdMZXJ8n; spf=pass (domain: gmail.com, ip: 209.85.215.177, mailfrom: ticotimo@gmail.com) Received: by mail-pg1-f177.google.com with SMTP id 41be03b00d2f7-cd3310348d2so1125515a12.1 for ; Sun, 18 Oct 2026 15:03:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792361000; x=1792965800; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=E8BEIsZg675+Zi0Xq+3mlUXeAce09+qvIgVto/L497k=; b=OdMZXJ8nVtf7EuIfctirHldL5BoQK8AFBOlH/eDhABYcNsZ6FsHeWELACemo+31pQO Pb0AY1KBS7QAebQ06tOX7CIGDsV5NhRXnu8fpCHqRUAsQK3oLCmuXvBgDECNElpUnFJe keJlvZR1k3mib1Cgbm4o5GfI1jtfx+zOUCQvY8y8jDUX/1G1V5LKo/mHp+GeNuITnLXo VERB7UihrD0GAeg2HW0H5hAT1Rvi1aS2NIT2yQc+dhePGzS36oU7xTimzPOV2clqnUum qmRJ4YunPPEcqB2pBXjPk9Am7edAfVLBRWEC4U3rcMRn1nS3K4TdPD+AtUG5AgwSJBps 3+Qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792361000; x=1792965800; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=E8BEIsZg675+Zi0Xq+3mlUXeAce09+qvIgVto/L497k=; b=vZ/FUo3eneLm5bYktyewWPaRcf5m0iFl6k6Zrln2Q8Ckt38pZEEStz0W1E6bjYzrbt x/9NYcVr8y2uafh9ZogTn9PJDxYw5wG9AdpvaDqgCnBbIxyuxycRBAqqWgv2TlR10JF/ veHmlHTwQNR7G6WB/5wefvIavu7t1ii7Q0DF9l71uuJ7NFHhmQs0CwzXHQAzz7jY2oKS knBj70MeyZJG78g5RBJffVYprUucJstgamMB+DyOr+F7ocCJHztA1OwM4deFta/8G5HP 99D4tySBZQMDQIN4U2puBIXfE0KGTbg48TRRKAeCk6A+q54e6oC2KR9nDs5ksOUm0m3f vn0g== X-Gm-Message-State: AFq9FYLmlm+bIN8rvL7TkTMUWadEReMkO/CK5CMJ83B0pDrvEft9VQws 3dcOL0AOzd9X3AOIj/SEAhaTm9Vq8whBtrofmi8gFoJj4fxZn3K6yvj2Qal2Fg== X-Gm-Gg: AYBFou3HBy810YMEKulReGaDLvC3AUZn5j4lZYrYJjy0o1M/se+WZDmI10C89Ai68nW dV+yb96Qh19VaBkYHjG7Pb48zm/Y2YVO5pJ5rizz+WhpE+9+XTa4DL8jNwZM1rVrF6LP2bjdI38 +IF0L91OkWZ6HFFpJ5jkWOX/SOfzsYfmVFQJXuXlJDAZt7hNMiU1OA2LCQvoECoxjTmJjiEj4nD yWJ2Z/Hw2iOyymALYaoE5hQwhzHvZTLGIfkGHT0ukPr4eNS1UYpYhzdSN3uk5rAeT2+zZmK2qjm EXe4l4Y2meDd2GD4AAtIjGBW2UvC6PXcbCQKEeFW3mHGRej8ak7fSrdqbd+hqB4KjEXRfB/eJAK GKfbYa+XP99x4ZrXsvURrojZYYYM1PKmyg4CTd1lOAXNnvDQzxjLG/dKw1Nt8Br46EAFTtPE+rG +1Wfwg7pNZq1Y/pxuDASx4uR3kExkYk/5lBt9LPj27DvPm+1pQ/aRE+mzG2+wcQPhlsk9u0kJiY QMzVUmwiKhBOXj2UrbdAHm8FJGphCY7 X-Received: by 2002:a17:90b:4c92:b0:3a6:f6b0:30ce with SMTP id 98e67ed59e1d1-3acef55d641mr3607330a91.36.1792361000218; Sun, 18 Oct 2026 15:03:20 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.18 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:19 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 03/10] README.rrs: mention ENABLE_RRS for the Docker-based setup Date: Sun, 18 Oct 2026 15:03:01 -0700 Message-ID: <20261018220308.72731-4-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:23 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5085 docker/settings.py adds 'rrs' to INSTALLED_APPS when ENABLE_RRS=1, so Docker users set that in the environment files rather than editing settings.py. AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- README.rrs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.rrs b/README.rrs index 07bdea9..a311adf 100644 --- a/README.rrs +++ b/README.rrs @@ -22,7 +22,9 @@ Setup procedure: 2. Edit settings.py: - * Add 'rrs' to INSTALLED_APPS + * Add 'rrs' to INSTALLED_APPS. In the Docker-based setup, set + ENABLE_RRS=1 in the app and celery environment files instead (see + "Environment files" in README) * Configure TOOLS_LOG_DIR if you wish the logs to be written somewhere other than the current directory when the scripts are run From patchwork Sun Oct 18 22:03:02 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101211 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E3DFCCF2C4 for ; Sun, 18 Oct 2026 22:03:23 +0000 (UTC) Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.22601.1792361002960216671 for ; Sun, 18 Oct 2026 15:03:23 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=c3/IJ0aI; spf=pass (domain: gmail.com, ip: 209.85.215.181, mailfrom: ticotimo@gmail.com) Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-cc1c9879395so374530a12.1 for ; Sun, 18 Oct 2026 15:03:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792361002; x=1792965802; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=E00g/+ktgwy4cYs2PVXOK5U1XB5HLNEyGiyt0z8ZZzE=; b=c3/IJ0aIh5THanp2ZP0CsxZmDL35fEK9e5ZZdZdrE0fmerRdAxYvUn+8EqujxNr1+t 0TRFrpfTV+lbbMBlpB0kqF2L6r3cDqZrMsheptDkryuyr1uN7O2I3LV4ZIx5FsYVfPuR /l6yqpew1nlqn4394+agB1WYsR/VGCuc9UPWkXtKF2UOnOD112o0klcH/NocS6OhNXnW GIV31eFfuqmEiOby81Y/7URxgP1IInA0wct1ltnJAghD+pVM8tRPVh07Uzl1C4Z6Fcy2 QqeA037QQsnXXWyI5inSYOLzGOo7lc6qEzho66gvx4eE4aQnTv1CM8P5ihzEtESZp6NT MgfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792361002; x=1792965802; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=E00g/+ktgwy4cYs2PVXOK5U1XB5HLNEyGiyt0z8ZZzE=; b=eFmC/y8iE1Puq216H6qX7oMK+6iWp5YBPrki72N1dndQUWAp2RAoAypKboQhMos6YY yodMNgJS2eYBgb/Oozhy8248fFngnmVcqKxgFsmayUypc6Wo3VYeBA/pJPTyxUamDFCy jOCfKYk1yTHTxW1Zxc2C858wvq9xtCDKqn46agZLVH3EIy+Tk9GEL1SX1/pxBO5IWgHn iI2nm4Bv/o7YeuGskWoHEZWYk1IwP87FND/qTvOSR2fVQC69qxwBhvze/QtJyvHK58FH TUSlYk/+8pf+uAD6aGf19zoVmiDFTapbjaCSgUahDnqb5MrxxfsusY5wNAEQ/KIiw9zN q3Cw== X-Gm-Message-State: AFq9FYL1imQ77wcUlMbd+8vN+NFEf57TO/WL2ZnR6kgEQWMQNEUN1/f5 lc8XwIvgkr6EK2tMqPyaou5c5boGDAqQ3TmGD7VMosO9ZoGjENA5+e0vHy/c/EK+ X-Gm-Gg: AYBFou1PFRFaDnMS/6O0cJwM5uemXlP/da5eGWtiMxMg/5TIwJMEvfhG4OFqQPby2if DtezIGRY/q9IT8PYdasFn4QohmpgKlJ4QOKhA25PWjnLbwk9+uCHVxfQ9+if70HL1gT5ibEnElD tLJpSlk8iBYoBZPOPXZDDTd+h1MQkKz5bhKM/eLsjLJdoPeAhNHpgFlpIh3SHkeYJqoZarkYfDQ 0zXZ72CBS/XDHWIipMJthbO+gGVR6+6BIEoijr1Stq1i0QE0JjtCRCI5fkIqeGytx9tDI0hh4fI pJkSiZ7a8fLrBBh1cyqWX7kz6vac3pYB1qKZWoI/UH9bJ8EIFnLXGkQzaYORjkEK4WF7A0liwAK iMOKNJ2liXPu0sFQZf77CMek3gK14+bkdB1/n7nKeK8ne1+DmFU1THmB0BA4L/GTefOIckOkbUk /eWWb2WFAfN9p4ci7FauDbVWRqqIRAP1/uCk5wGtWOyH5KYwwUqlN64cOAnsWlfV0WjNnl0oUqW 3hI3XU6HIblES2K8jWP+nPfVs+u21U= X-Received: by 2002:a17:90b:4fc8:b0:3a8:1943:cb7a with SMTP id 98e67ed59e1d1-3aceefc4effmr4790916a91.18.1792361002242; Sun, 18 Oct 2026 15:03:22 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.21 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:21 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 04/10] docker/README: remove Date: Sun, 18 Oct 2026 15:03:02 -0700 Message-ID: <20261018220308.72731-5-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:23 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5086 It has not been updated since 2018 and is superseded by the "Docker Setup" section of the main README. It still describes a setup.py script, an internal Intel clone URL and branch, and an Intel proxy. AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- docker/README | 52 --------------------------------------------------- 1 file changed, 52 deletions(-) delete mode 100644 docker/README diff --git a/docker/README b/docker/README deleted file mode 100644 index 86348a1..0000000 --- a/docker/README +++ /dev/null @@ -1,52 +0,0 @@ -Layerindex Docker Setup Instructions - -The script setup.py will set up and configure a cluster of 5 docker containers: - - - layersapp: the application - - layersdb: the database - - layersweb: NGINX web server (as a proxy and for serving static content) - - layerscelery: Celery (for running background jobs) - - layersrabbit: RabbitMQ (required by Celery) - -The script will edit all necessary configuration files, build and launch all containers, and do the initial database setup. It is advised that you start with a .sql database file to prepopulate your database. The following instructions will walk you through the setup. - -1) Install docker and docker-compose per instructions: - https://docs.docker.com/compose/install/ - ** Note: for latest docker-compose version follow the directions above, rather than using apt. - -2) Clone the repo and checkout appropriate branch: - git clone https://github.intel.com/peggleto/layerindex-web.git - git checkout origin/dev_snapshot - -2) Run the setup script (dockerstup.py). You can optionally supply your hostname, proxy settings, a sql database file of layer mappings to import, and a host to container port mapping. For more information, run: - ./dockersetup.py -h - - Example command to run containers with a proxy and with a database to import: - ./dockersetup.py -d ~/databasedump.sql -p http://proxy-chain.intel.com:911 - - During the setup you will be asked for a username, email and password to set up a super user for the database. This will allow you to access the database later, should you need to. - -3) Once the script completes, open a web browser and navigate to :/layerindex. If you haven't supplied hostname and/or port mapping, this will by default be localhost:8080. - -4) If you have chosen to not supply a prepopulated database and are instead starting fresh, you should now -follow the instructions in the "Database Setup" section of the main README. - -5) If you need to rerun this script for any reason a second time, make sure to tear the containers down first with docker-compose down. Otherwise, your new automatically generated root database password will not match. - -6) To update the layers in the future, you can optionally do the following: - - Run the layer updates - docker-compose run --rm layersapp /opt/layerindex/layerindex/update.py - - Or do a full refresh - docker-compose run --rm layersapp /opt/layerindex/layerindex/update.py -r - - -TROUBLESHOOTING: - -- Network issues behind a proxy when building container: On some Ubuntu systems, /etc/resolv.conf is set to 127.0.0.x, rather than your local DNS server. Docker will look there for your DNS server, and when it fails to find it it will default to using a public one (frequently 8.8.8.8). Many corporate proxies blocks public DNS servers, so you will need to manually supply the DNS server to docker using /etc/docker/daemon.json: - {"dns": ["xx.xx.xx.xx] } - - - - From patchwork Sun Oct 18 22:03:03 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101213 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9A44CCCA490 for ; Sun, 18 Oct 2026 22:03:33 +0000 (UTC) Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.22513.1792361005879582538 for ; Sun, 18 Oct 2026 15:03:25 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=d4tfZbEB; spf=pass (domain: gmail.com, ip: 209.85.216.54, mailfrom: ticotimo@gmail.com) Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-38759bcd877so853599a91.2 for ; Sun, 18 Oct 2026 15:03:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792361005; x=1792965805; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=4Ov1YKIf3O1PBDWKDboyrOa0zyT5HSa80wmEE6eU8+E=; b=d4tfZbEBaJLDh6NWr8h4slCmjdntDflIFRm+Mm98LKsn1F2vXRBWXaueVPpI7YBIfE /8ILU0gNNjQKBa6u9n84b1r5qoQSSick96O9J2kLQ9mJwgHdPUW+1NEVpO/lESVP2Rmc /kHced0GoFv+oSxt4aQVZYE8N1hVWlqDaht2PIaO6OTNVMWdUW/TePMamgL2tIlSp6CG cCKYhv4ibH55eVZgKuP1om5Qfrzs+NvA3jDAcGfT0aW83V24/Ob9cuaNwhqFBbnCeE/j Z9rqZLrRZsAdNQdXnD4wr9sQddmv+6MYcLiLZ4HYsN8HY0KpKQGyVC2JnRr058e9DGH5 tlOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792361005; x=1792965805; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=4Ov1YKIf3O1PBDWKDboyrOa0zyT5HSa80wmEE6eU8+E=; b=XKlfkqYKHzKxEbwRJO8RCaSU7G1MG7so6k9VuDyVRl5GFzpplx0yAVL8dGNboFizhK HDaDPAcoETuOGWpaGs9PMIQ08XWDNRRstfhPDzmMIMJhZRypynOdPQIW1AufGuU0Wajr WX5/rbHQMDG1HI3irHio0wqPEewZ+B/nP1EDHSHd8pqU5pGEeFUuGRzdzntjI++Nzk96 tjaIn1uf904Nu9q3M3b+ofiWohWCzRAYDM3iry8MHeL+YNyijQS3hoNJ2G9ByrQ539dH aaTTlU9xU7D3aAn4TXItQhuTNa9PbW1Peou4RJBCJj4BHiof46+PucPp4RgouBXyjx+J bLFg== X-Gm-Message-State: AFq9FYLeQqdLIU0YTc2Tk1ApEA/Rja3ubR+Z9J++nHxTv8ieZ04+mcdk 1X4LY44s4MIMMUKRr8WbZ39x0JLaiwW8RiRzDbL6l+GygUJ+Yb9H7l81rNFo22I8 X-Gm-Gg: AYBFou3MwGAAdqD3vvu3mzJ/JMFk0ccfXxMR4lEmpZrwrzzx3uh1r7xO5C6tMzjsv5Q M453tt+E+20Du0cqTE2NrmH6QQHVZztNN49SIWHhNecZLdZd1WoyTLE+BkLdzWqDgfgi+nOKJYs jdZDzXOYPfHeU+wpNTn2CyvXt0ytJ93CLMgCUJog5awCSLGdL8HnTUFDjfhIepeQJLCRBl24Cg2 Sz6nVxWen42m7O8HDIE/LzItuetaLjEmyXCKfy+Q01kpMnfFfheYpVB9ED7uoeZRzPDIeJdF8Ko PJOxH5T6PjVK2gt8NCtjisShTa6OT7bIUW+NmrPad90WIxil+rdtQxfV4fGC7kP6YIrZp1OwRpb IJ+20wg6hJ+gHPelYDBKR4km29IFlo4vJadMczZ92DBTgyvOWK3pp+ad8w0EMlreVBeRWmk+4Wa BTB2Taefcwgz+0Kdnol4Le5BfJ05pwXdRfvf4jEAP9ItxL4Lr0tmAsXTtbHvUxbz5aNu0wkf9IG JTV4iPq5QjTDK1DEFQ7wNnXRSjUzOU= X-Received: by 2002:a17:90b:264a:b0:3a4:6e84:e7d8 with SMTP id 98e67ed59e1d1-3acef58d5eamr5119271a91.54.1792361005212; Sun, 18 Oct 2026 15:03:25 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.23 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:23 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 05/10] Rename the README files to .md Date: Sun, 18 Oct 2026 15:03:03 -0700 Message-ID: <20261018220308.72731-6-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:33 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5087 Rename README, README.devel, README.rrs and README.vscode to .md so they can be rendered as Markdown. Only the names change here; the following commits update the formatting and the references to them. AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- README.devel => README.devel.md | 0 README => README.md | 0 README.rrs => README.rrs.md | 0 README.vscode => README.vscode.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename README.devel => README.devel.md (100%) rename README => README.md (100%) rename README.rrs => README.rrs.md (100%) rename README.vscode => README.vscode.md (100%) diff --git a/README.devel b/README.devel.md similarity index 100% rename from README.devel rename to README.devel.md diff --git a/README b/README.md similarity index 100% rename from README rename to README.md diff --git a/README.rrs b/README.rrs.md similarity index 100% rename from README.rrs rename to README.rrs.md diff --git a/README.vscode b/README.vscode.md similarity index 100% rename from README.vscode rename to README.vscode.md From patchwork Sun Oct 18 22:03:04 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101214 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A67D5CCF2C4 for ; Sun, 18 Oct 2026 22:03:33 +0000 (UTC) Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.22526.1792361008109185806 for ; Sun, 18 Oct 2026 15:03:28 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=KqAGieK0; spf=pass (domain: gmail.com, ip: 209.85.215.181, mailfrom: ticotimo@gmail.com) Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-cc1cf287ef8so948435a12.3 for ; Sun, 18 Oct 2026 15:03:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792361007; x=1792965807; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=N/Wd0sUtZ5vEXmAs4eUsVbsURaOfVuqz8kl2+U/SYI0=; b=KqAGieK0Tzc7FnieJlYCLs4l7STlFUgt9mEm3ao1d1koDykrLOwCdvqFzbWt9BBoA3 U0yt05NzJxyLekEAnGhhBLKx/kYjQ7Dco8Rjf9D4DhCa6HUMBuxAAt/uFyxGI9hkfeqU CIb6dXZPTVh0GgOVgQEXaGh/3u0L0uKQdLVbO3QLsxzVzVNAoWwxQhOPLErOFb8QLlPs XfLLGPhswGjp+YyYKUgudXOgMACc16OhzUaOxSkuV8hVW1myOV9M0M2FGCymXgLY0XR9 0OFe50E5FZEm37TQdzldwLWAnw+a5y/U41VF5uhzXCIR2dJx60oUAT0MgBArwLSPwqVA iivA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792361007; x=1792965807; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=N/Wd0sUtZ5vEXmAs4eUsVbsURaOfVuqz8kl2+U/SYI0=; b=ynVCtMhFBDdvDUyEA6eDaIx2Ajtv0YPFYweFDHnRxW6b1CroalMaxP7qyATcq2/Fr6 Polz/kP5yTEo4rON82QeN70+TJj8dbaq/KHeLS7MGAP8lKjA8A/gW42uUGS7aa2cJiB3 6bcJpG+Q9fLPeGCLNhMRQ24L45jHeOnGKThYbO0RKpkEdeAY9zKvg2UWp7votgWN1oKq XjoAJmm/gzp32HEKlE/305whP3817jNXGjUNjtvfrxGV3GrBHS9keB/h9e+dJEXoRflk Wn2nunLwb0UCg9OaYwuzOU60V6RnKEXsM+P3T4eIyBgidGShAxANlQZoGzH6nxvGVwgp +mhA== X-Gm-Message-State: AFq9FYK8GgI3IX7+nyBCXHvc1Ef3+GfshNMWFFRHEvlW4lushtQ/oVOK K9POmEhZClMPJskZODiU7VB88YgTtJmIm+Ye+mNg9eX8i7m54ok/nImx/nPFBw== X-Gm-Gg: AYBFou07NO0M8K5mxG/7yltWvIDkyqFfCVgQePUAQRO+Bf8KqGqFJVcNdgX+5zDMmmz OraP4YTIbNEYi/7j8zEcZtdr9pJoIXg7ty0lA6Nsbo4JgiaOxJXJPEhdEEsxFQXkFTudu12c/KB pdVum/9A6HFtOLrBcYjwegNO4rQ8LVsW6SNmML7xpJV2sW2zm282LpwWShf3PN/FGKhMGUh+h37 KKvr+RESCw/PzzdgokCS5jw1rhjZ+e+Is5sLHqVg19q0DYCO8LbIPPrI1gFwxPhlSmzkU56Wrq1 AcCNbBMfABndmY2aNOx4560l/e4gnpNaX6yZJpSFDsPwCS5LDBORp210U9SZqb/g8nn75QonGAS 8W4JGrLMiLSUR46DE1KPjGJ7IbOIBPOX/yIwY93zzjveXl1rGvWa2IVTPWcSGHKbPkFcDxkwSfR ObI4Rpuwr4vnyFczQvJF7WsBnV+Ef9V+SC04HLfYRLx7EgHCTzRrWsHDaZPD2PZc110GBvE1RiN egxu4qHoN/e3imPCE4sRss6p1vuOgw= X-Received: by 2002:a17:90b:1dc4:b0:3a4:f75d:d194 with SMTP id 98e67ed59e1d1-3aceec67eb5mr4792777a91.36.1792361007365; Sun, 18 Oct 2026 15:03:27 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.26 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:26 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 06/10] Update references to the renamed README files Date: Sun, 18 Oct 2026 15:03:04 -0700 Message-ID: <20261018220308.72731-7-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:33 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5088 AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- COPYING.MIT | 2 +- Dockerfile | 2 +- README.devel.md | 2 +- README.md | 4 ++-- README.rrs.md | 4 ++-- SECURITY.md | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/COPYING.MIT b/COPYING.MIT index 3de397c..ea19713 100644 --- a/COPYING.MIT +++ b/COPYING.MIT @@ -1,5 +1,5 @@ Note: for details on which portions of this application are covered by this -license, please see the README file. Other included components have LICENSE +license, please see the README.md file. Other included components have LICENSE notices within (or in files adjacent to) the distributed files. Portions copyright (C) 2013-2019 Intel Corporation. diff --git a/Dockerfile b/Dockerfile index 8e6e508..4ba040e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# See README for how to use this. +# See README.md for how to use this. FROM ubuntu:jammy LABEL maintainer="Michael Halstead " diff --git a/README.devel.md b/README.devel.md index 31460ef..ae41c8c 100644 --- a/README.devel.md +++ b/README.devel.md @@ -3,7 +3,7 @@ Standalone Setup NOTE: The standalone setup is most suitable for development and is not recommended for production; for production use the Docker-based setup -covered in the main README. +covered in the main README.md. In order to run this application standalone, you will need: diff --git a/README.md b/README.md index 49ce4d3..32572c5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ There are two main methods of setting up this application - within a set of Docker containers, or standalone. The Docker-based setup is more suited for production whereas standalone is a bit easier for development. This document will consider only the Docker-based -setup; for standalone please see README.devel. +setup; for standalone please see README.devel.md. Docker Setup @@ -102,7 +102,7 @@ Other settings the app and celery files can set: - DEBUG: 1, true or yes enables Django's debug mode; anything else, or leaving it unset, keeps it off. Never enable it on a public site. - - ENABLE_RRS: 1 enables the Recipe Reporting System (see README.rrs). + - ENABLE_RRS: 1 enables the Recipe Reporting System (see README.rrs.md). - DATABASE_PORT (default 3306) and STATIC_ROOT (default /usr/share/nginx/html/static/). diff --git a/README.rrs.md b/README.rrs.md index a311adf..b6e3724 100644 --- a/README.rrs.md +++ b/README.rrs.md @@ -15,7 +15,7 @@ This requirement may be removed in future. Setup procedure: -1. Follow the layer index setup instructions in the README file first. +1. Follow the layer index setup instructions in the README.md file first. The openembedded-core layer (or whatever replacement you have pointed CORE_LAYER_NAME to in settings.py) must be present in order to run the Recipe Reporting System database migrations. @@ -24,7 +24,7 @@ Setup procedure: * Add 'rrs' to INSTALLED_APPS. In the Docker-based setup, set ENABLE_RRS=1 in the app and celery environment files instead (see - "Environment files" in README) + "Environment files" in README.md) * Configure TOOLS_LOG_DIR if you wish the logs to be written somewhere other than the current directory when the scripts are run diff --git a/SECURITY.md b/SECURITY.md index 20a28a9..7d2ce1f 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -5,7 +5,7 @@ If you would like to report a public issue (for example, one with a released CVE number), please report it using the [https://bugzilla.yoctoproject.org/enter_bug.cgi?product=Security Security Bugzilla]. If you have a patch ready, submit it following the same procedure as any other -patch as described in README. +patch as described in README.md. If you are dealing with a not-yet released or urgent issue, please send a message to security AT yoctoproject DOT org, including as many details as From patchwork Sun Oct 18 22:03:05 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101215 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BA9AFCCF2C9 for ; Sun, 18 Oct 2026 22:03:33 +0000 (UTC) Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.22623.1792361012124927922 for ; Sun, 18 Oct 2026 15:03:32 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=f8xGh2hK; spf=pass (domain: gmail.com, ip: 209.85.216.52, mailfrom: ticotimo@gmail.com) Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-398b3c37877so858629a91.0 for ; Sun, 18 Oct 2026 15:03:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792361011; x=1792965811; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=qk4+8bzFkrX+sRTdVQISxBwqemqiTrg96GW7aAMxgXo=; b=f8xGh2hK/VplHNxyJLW36v6w7aJlTCoL/ocJjPOw4ZyO2NdxkAuyBEL94SNcdaZ1Aa fgG55XagWMeR4Cz83bUJTgcdD0zgdFp/gcKVxwJ+biFqRqCot4xPWeN1eWMpCoPakjfo dlmXLa8kSPIAroW7EvdC3c7bW93I0WpnREKK9RHaDoHnRuYY/qsSWSj0NwadQ9NcwyWZ Atiswwl43dGtYu6weHk6NKZuDKqiJhwo8tJhIm6F5uzQCLUYPRx+qm3xJeXJSgyd0u8B e8eRfT2nX2BpQWO8XnvM515x2NhA6zVgr91TJjOXpm4xBhrwZJO8UIKrkoX3Hk/AJiQf 6ibA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792361011; x=1792965811; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=qk4+8bzFkrX+sRTdVQISxBwqemqiTrg96GW7aAMxgXo=; b=KFzvrCCtN1aVjiy5v3EK8HjFMHgBQj7Knn4DiJQ41ZzOnZHG0RA2vGzQ5mBw9sHMnB VFYMjONb9vIHM+B8L96Wtue350u2RsOxofRN8mN1JArv6KXxTKPSc1ZdWAXpaKwgRW4j heB0Pd980qw5qeEj8D9nZo0clU7EWhD89YxOB1v9HjnD9EcgFGA0bEZ8uusQNzdGYS4H 7cc+2IzMim8022YrxW7ijJ7fFQHtUoZ7gFt9GeGJc2Y9pgqx+gVgj8o1lDaiYuU1I3fx OzQoH6GThoYogE0DddoSgYGUmasktQLtqRRyTnM2od75PzKcJ2mi7NivI3ePch2x459a ckBg== X-Gm-Message-State: AFq9FYI2ko26/Im/QLd9JyqduLWxB1dkub3lAWslJyfisGzoswi6QGnh wDSO7REWTsFFgyxCaJOMCk8wMTDgZNC9x4AJCFNL3TVsLKNaUMXpIm3k4//JYbr5 X-Gm-Gg: AYBFou1ZFMsNV3Iumn90g8QDiCxmsS1qh1TVT0xd5EPgcH2XQwhfuPU/Z4ZDsXE/dV6 fGp/kM9pdQTLeSuJp9DLv20SZ+lNoUV9QS+n0Gt/4Ix3VV22rTtTxnSLHUwsnboR81E70vAIHLM E650jsNvt7rq4G+JlyWOzterAfuex5KnRDACXKo8uEVeZqHX9lPXUMD5wdHbItG0MBVicoZaAFK vaafG0P1yG/arhVWwcWRVwBpKYskR0IwmKddKUNrXJEs+SyzMpFubScz5pu5qOrGYFmqIvrWePA Uc3f8xRLo59u4sLTo5Y6u0gXEwZZutLL8xLLVpp4us8MwXZGpS0USl27Vik+UCtNdEWdaiFvbOO QNFocD5WBdbMiHvWZ6omr4wVML7tKX2+2p47MU2x+dVrhWne0FrV1ZwVca0EWjPKJaUW8Upgdwj 1OUUe+Oz63RuHbwy8i8mKC5hvR1nQqgKQXEAMVZqW85znj+aUVvgzwmELRNGKhfh6imV1LvNodK up3VcSNAZLO8UvhFFz33vMgWtZ5N5U= X-Received: by 2002:a17:90b:37cd:b0:3a4:ee64:b82c with SMTP id 98e67ed59e1d1-3acef60f75cmr4935293a91.66.1792361010118; Sun, 18 Oct 2026 15:03:30 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.28 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:28 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 07/10] Format the README files as Markdown Date: Sun, 18 Oct 2026 15:03:05 -0700 Message-ID: <20261018220308.72731-8-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:33 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5089 Use Markdown headings, lists, code blocks and inline code, a table for the core layer values and links between the files. Placeholders such as and are now in code, where they would otherwise be dropped as HTML tags. The wording is unchanged. AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- README.devel.md | 155 +++++++++++------- README.md | 401 +++++++++++++++++++++++++---------------------- README.rrs.md | 50 +++--- README.vscode.md | 55 ++++--- 4 files changed, 362 insertions(+), 299 deletions(-) diff --git a/README.devel.md b/README.devel.md index ae41c8c..f5b56ec 100644 --- a/README.devel.md +++ b/README.devel.md @@ -1,33 +1,36 @@ -Standalone Setup ----------------- +## Standalone Setup -NOTE: The standalone setup is most suitable for development and is not +**NOTE:** The standalone setup is most suitable for development and is not recommended for production; for production use the Docker-based setup -covered in the main README.md. +covered in the main [README.md](README.md). In order to run this application standalone, you will need: -* Python 3.10+ -* Django 5.2 LTS, as pinned in requirements.txt -* RabbitMQ -* For production usage, a web server set up to host Django applications +- Python 3.10+ +- Django 5.2 LTS, as pinned in `requirements.txt` +- RabbitMQ +- For production usage, a web server set up to host Django applications (not needed for local-only testing/development) -* A database system supported by Django (SQLite, MariaDB/MySQL, etc.). -* Third-party Django/python modules as detailed by requirements.txt. +- A database system supported by Django (SQLite, MariaDB/MySQL, etc.). +- Third-party Django/python modules as detailed by `requirements.txt`. If you're using pip, you can install these by running: - pip install -r requirements.txt + + ```sh + pip install -r requirements.txt + ``` + (See below for a virtualenv-based setup which is easy to work with.) -* On the machine that will run the backend update script (which does not +- On the machine that will run the backend update script (which does not have to be the same machine as the web server, however it does still have to have Django installed, have the same or similar configuration - in settings.py and have access to the database used by the web + in `settings.py` and have access to the database used by the web application): - * A Python version supported both by Django and by the BitBake of + - A Python version supported both by Django and by the BitBake of the OpenEmbedded branches being parsed - * Python dependencies as per requirements.txt (we still need Django + - Python dependencies as per `requirements.txt` (we still need Django etc. here since we interact with the database through Django's ORM.) -Example virtualenv-based setup for the above: +### Example virtualenv-based setup for the above Python's virtualenv provides an easy way to isolate the python dependencies of applications such as the layer index. Here's an example of setting up a @@ -39,27 +42,37 @@ distros). pip to build the dependencies; it's also assumed you want MariaDB as the database backend): + ```sh sudo apt-get update sudo apt-get install python3-venv libmariadb-dev build-essential python3-dev libjpeg-dev libz-dev libfreetype6-dev libssl-dev mariadb-server rabbitmq-server + ``` 2. Work around path issues (you may not need this): + ```sh sudo ln -s /usr/bin/mariadb_config /usr/bin/mysql_config + ``` 3. Create a Python 3 virtualenv (path can be anywhere you like): + ```sh python3 -m venv /path/to/desired/venv + ``` 4. Activate the virtualenv: + ```sh . /path/to/desired/venv/bin/activate + ``` 5. Install requirements: + ```sh pip install -r requirements.txt + ``` -Setting up MariaDB/MySQL: +### Setting up MariaDB/MySQL Assuming you wish to use MariaDB/MySQL for storing the database - the following is completely standard, but to save you having to look it up @@ -67,38 +80,51 @@ elsewhere: 1. Start the server: + ```sh sudo /etc/init.d/mysql start + ``` 2. Set the root password and secure the database server: + ```sh sudo mysql_secure_installation + ``` 3. Create a database (substituting "mydatabase" with desired database name): + ```sh mysql -u root -p + ``` + + ```sql CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + ``` -Configuration and running: +### Configuration and running -1. Edit settings.py to specify a database, EMAIL_HOST, SECRET_KEY and +1. Edit `settings.py` to specify a database, `EMAIL_HOST`, `SECRET_KEY` and other settings specific to your installation. Ensure you set - LAYER_FETCH_DIR to an absolute path to a location with sufficient - space for fetching layer repositories. Modify RABBIT_BROKER - and RABBIT_BACKEND to reflect the settings used by your RabbitMQ + `LAYER_FETCH_DIR` to an absolute path to a location with sufficient + space for fetching layer repositories. Modify `RABBIT_BROKER` + and `RABBIT_BACKEND` to reflect the settings used by your RabbitMQ server. 2. Run the following commands within the layerindex-web directory to initialise the database: + ```sh ./manage.py migrate ./manage.py createsuperuser + ``` -3. You can test the web application locally by setting DEBUG = True in - settings.py and running the following: +3. You can test the web application locally by setting `DEBUG = True` in + `settings.py` and running the following: + ```sh ./manage.py runserver + ``` Then visit http://127.0.0.1:8000/layerindex/ with your browser. As with all Django applications there is an admin interface available @@ -106,84 +132,97 @@ Configuration and running: will be those you entered in the step above when creating an admin account. - NOTE: This local server should only be used for testing - for - production you need to use a proper web server and have DEBUG set - to False (or use the Docker-based setup). + **NOTE:** This local server should only be used for testing - for + production you need to use a proper web server and have `DEBUG` set + to `False` (or use the Docker-based setup). - 3.1. In order to process asynchronous tasks like sending email, - you will need to run a Celery worker: + 1. In order to process asynchronous tasks like sending email, + you will need to run a Celery worker: - celery -A layerindex.tasks worker --loglevel=info + ```sh + celery -A layerindex.tasks worker --loglevel=info + ``` 4. To import layer data from the public instance at layers.openembedded.org you can run the following (defaults to the master branch only): + ```sh layerindex/tools/import_layers.py -d https://layers.openembedded.org + ``` Alternatively you can add layers individually using the separate - layerindex/tools/import_layer.py script or through the admin interface. + `layerindex/tools/import_layer.py` script or through the admin interface. -SMTP test server ----------------- +## SMTP test server If you want to test email functionality (e.g. for password reset, layer submission or other notifications) without sending real emails, set Django's -console email backend in settings.py: +console email backend in `settings.py`: +```python EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' +``` Every email is then printed to the console running the server (or the Celery worker, for emails sent from background tasks) instead of being sent. -Running the tests ------------------ +## Running the tests -The tests use pytest and pytest-django, which are not in requirements.txt: +The tests use pytest and pytest-django, which are not in `requirements.txt`: - pip install pytest pytest-django +```sh +pip install pytest pytest-django +``` To run the full suite as CI does, in the Docker image against a throwaway MariaDB container, run this from the top of the source tree: - docker/run-tests.sh +```sh +docker/run-tests.sh +``` -This is the only way to run tests/test_update.py, which fetches +This is the only way to run `tests/test_update.py`, which fetches openembedded-core, meta-layerindex-test and BitBake from the network and runs the update scripts (BitBake only runs on Linux). -To run the other tests directly, set SECRET_KEY in settings.py and point it +To run the other tests directly, set `SECRET_KEY` in `settings.py` and point it at a MariaDB/MySQL server where your database user may create databases -(pytest-django creates and removes a test_ database), then run: +(pytest-django creates and removes a `test_` database), then run: - pytest --ignore=tests/test_update.py tests/ +```sh +pytest --ignore=tests/test_update.py tests/ +``` -tests/test_dockersetup.py tests the files dockersetup.py writes. It needs only +`tests/test_dockersetup.py` tests the files `dockersetup.py` writes. It needs only pytest and PyYAML, and is skipped inside the Docker image: - python3 -m pytest tests/test_dockersetup.py +```sh +python3 -m pytest tests/test_dockersetup.py +``` -On GitHub, .github/workflows/ci.yml runs docker/run-tests.sh and -tests/test_dockersetup.py for pushes to master and master-next and for pull -requests to master. .github/workflows/safety.yml scans the packages +On GitHub, `.github/workflows/ci.yml` runs `docker/run-tests.sh` and +`tests/test_dockersetup.py` for pushes to master and master-next and for pull +requests to master. `.github/workflows/safety.yml` scans the packages installed in the Docker image for known vulnerabilities on each push and -weekly, if the repository has a SAFETY_API_KEY secret. +weekly, if the repository has a `SAFETY_API_KEY` secret. - -Updating OpenEmbedded data --------------------------- +## Updating OpenEmbedded data You will likely want to update the OpenEmbedded layer information on a regular basis. To do that: - Incremental update: - - layerindex/update.py +Incremental update: - Reload all data (should only be needed if the database structure has - changed as part of an upgrade of the application code): +```sh +layerindex/update.py +``` - layerindex/update.py -r +Reload all data (should only be needed if the database structure has +changed as part of an upgrade of the application code): +```sh +layerindex/update.py -r +``` diff --git a/README.md b/README.md index 32572c5..d33bb5d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -OE Layer Index web interface -============================ +# OE Layer Index web interface This is a small Django-based web application that provides a way to manage an index of OpenEmbedded metadata layers for use on top of @@ -9,121 +8,124 @@ There are two main methods of setting up this application - within a set of Docker containers, or standalone. The Docker-based setup is more suited for production whereas standalone is a bit easier for development. This document will consider only the Docker-based -setup; for standalone please see README.devel.md. +setup; for standalone please see [README.devel.md](README.devel.md). -Docker Setup ------------- +## Docker Setup -The dockersetup.py script will set up and configure a cluster of 5 or 6 +The `dockersetup.py` script will set up and configure a cluster of 5 or 6 docker containers: - - layersapp: the application - - layersdb: the database - - layersweb: NGINX web server (as a proxy and for serving static content) - - layerscelery: Celery (for running background jobs) - - layersrabbit: RabbitMQ (required by Celery) - - layerscertbot: Runs certbot to keep letsencrypt certificates up-to-date - (optional, default disabled) +- `layersapp`: the application +- `layersdb`: the database +- `layersweb`: NGINX web server (as a proxy and for serving static content) +- `layerscelery`: Celery (for running background jobs) +- `layersrabbit`: RabbitMQ (required by Celery) +- `layerscertbot`: Runs certbot to keep letsencrypt certificates up-to-date + (optional, default disabled) The script will edit all necessary configuration files, build and launch all containers, and do the initial database setup. It is advised that you start with a .sql database file to prepopulate your database. The following instructions will walk you through the setup. -1) Install docker and docker-compose per instructions: +1. Install docker and docker-compose per instructions: - https://docs.docker.com/compose/install/ + https://docs.docker.com/compose/install/ - ** Note: for latest docker-compose version follow the directions above, - rather than using a perhaps outdated one provided by your distribution. + **Note:** for latest docker-compose version follow the directions above, + rather than using a perhaps outdated one provided by your distribution. -2) Run the setup script (dockersetup.py). You can optionally supply your +2. Run the setup script (`dockersetup.py`). You can optionally supply your hostname, proxy settings, a sql database file of layer mappings to import, and a host to container port mapping. For more information, run: - ./dockersetup.py -h + ```sh + ./dockersetup.py -h + ``` Example command to run containers with a proxy and with a database to import: - ./dockersetup.py -d ~/databasedump.sql -p http://: + ```sh + ./dockersetup.py -d ~/databasedump.sql -p http://: + ``` - NOTE: If you want email sending to work (required for user registration and - password resets), you should use the -e/--email-host option to specify your + **NOTE:** If you want email sending to work (required for user registration and + password resets), you should use the `-e`/`--email-host` option to specify your outgoing email server. During the setup you will be asked for a username, email and password to set up a super user for the database. -3) Once the script completes, open a web browser and navigate to the URL +3. Once the script completes, open a web browser and navigate to the URL printed out by the script. By default that would be: https://localhost:8081 -4) If you have chosen to not supply a prepopulated database and are instead +4. If you have chosen to not supply a prepopulated database and are instead starting fresh, you should now follow the instructions in the "Database Setup" section of the main README. -5) If you need to rerun this script for any reason a second time, you'll need +5. If you need to rerun this script for any reason a second time, you'll need to choose between two modes: - A) Updating (-u/--update) - updates the code and runs any database upgrades + 1. Updating (`-u`/`--update`) - updates the code and runs any database upgrades if applicable, or - B) Reinstalling (-r/--reinstall) - deletes the containers and reinstalls + 2. Reinstalling (`-r`/`--reinstall`) - deletes the containers and reinstalls from scratch. Be warned that this will throw away all data in the database. - Note that updating with -u/--update will only work if the configuration - changes originally made by dockersetup.py upon installation (e.g. passwords, + Note that updating with `-u`/`--update` will only work if the configuration + changes originally made by `dockersetup.py` upon installation (e.g. passwords, hostname, etc.) are still present in the source tree. The generated - passwords and secret key are written to .env.local.* files, which git + passwords and secret key are written to `.env.local.*` files, which git ignores; keep them, and do not commit them. -Environment files: +### Environment files The containers read their settings (secret key, database and RabbitMQ -credentials, email server, DEBUG) from .env.. files, where - is dev, staging or prod and is app, celery, db or rabbit: +credentials, email server, `DEBUG`) from `.env..` files, where +`` is `dev`, `staging` or `prod` and `` is `app`, `celery`, `db` or `rabbit`: - - docker-compose.yml uses the .env.dev.* files, which hold development-only - values. dockersetup.py copies them to .env.local.*, fills in the secrets - it generates, and points docker-compose.yml at those copies. - - docker-compose.staging.yml and docker-compose.prod.yml use the - .env.staging.* and .env.prod.* files. Their secrets are commented out, so - nothing starts with a known password. Set the real values, and the - hostname in the compose file, in a local commit on the server and never - push them. Then run, for example: +- `docker-compose.yml` uses the `.env.dev.*` files, which hold development-only + values. `dockersetup.py` copies them to `.env.local.*`, fills in the secrets + it generates, and points `docker-compose.yml` at those copies. +- `docker-compose.staging.yml` and `docker-compose.prod.yml` use the + `.env.staging.*` and `.env.prod.*` files. Their secrets are commented out, so + nothing starts with a known password. Set the real values, and the + hostname in the compose file, in a local commit on the server and never + push them. Then run, for example: - docker compose -f docker-compose.prod.yml up -d --build + ```sh + docker compose -f docker-compose.prod.yml up -d --build + ``` -The .env* files are excluded from the Docker images. +The `.env*` files are excluded from the Docker images. Other settings the app and celery files can set: - - DEBUG: 1, true or yes enables Django's debug mode; anything else, or - leaving it unset, keeps it off. Never enable it on a public site. - - ENABLE_RRS: 1 enables the Recipe Reporting System (see README.rrs.md). - - DATABASE_PORT (default 3306) and STATIC_ROOT (default - /usr/share/nginx/html/static/). +- `DEBUG`: `1`, `true` or `yes` enables Django's debug mode; anything else, or + leaving it unset, keeps it off. Never enable it on a public site. +- `ENABLE_RRS`: `1` enables the Recipe Reporting System (see [README.rrs.md](README.rrs.md)). +- `DATABASE_PORT` (default `3306`) and `STATIC_ROOT` (default + `/usr/share/nginx/html/static/`). - - -TROUBLESHOOTING: +### Troubleshooting - Network issues behind a proxy when building container: On some systems - (particularly where dnsmasq is installed), /etc/resolv.conf is set to + (particularly where dnsmasq is installed), `/etc/resolv.conf` is set to 127.0.0.x, rather than your local DNS server. Docker will look there for your DNS server, and when it fails to find it it will default to using a public one (frequently 8.8.8.8). Many corporate proxies blocks public DNS servers, so you will need to manually supply the DNS server to docker using - /etc/docker/daemon.json: - - {"dns": ["xx.xx.xx.xx] } + `/etc/docker/daemon.json`: + ```json + {"dns": ["xx.xx.xx.xx] } + ``` -Database Setup --------------- +## Database Setup Once the application is running you'll need to do a bit of further setup within it: @@ -132,42 +134,46 @@ setup within it: need layer data. To import the full set for the master branch from the public instance at layers.openembedded.org you can run the following: + ```sh docker-compose run --rm layersapp /opt/layerindex/layerindex/tools/import_layers.py https://layers.openembedded.org + ``` Alternatively, you can populate the database manually - you'll need to add at least the openembedded-core layer to the - database, or some equivalent that contains conf/bitbake.conf for + database, or some equivalent that contains `conf/bitbake.conf` for the base system configuration. To add this, follow these steps: - 1.1. With the server running, go to the admin page - - http://localhost:8080/admin/ by default (the hostname must - match what the web server is configured for i.e. what you - specified when running dockersetup.py). Use the login/password - for the admin account specified during setup. - - 1.2. Click on the "Submit Layer" button in the top right and - enter the details for the core layer. To use the real - openembedded-core layer, use these values: - - Layer name: openembedded-core - Layer type: Base - Summary: Core metadata - Description: Core metadata - Repository URL: https://git.openembedded.org/openembedded-core - Repository subdirectory: meta - - Once you have filled in the required values, click on the - "Submit Layer" button. - - NOTE: The name of the layer must be "openembedded-core", - unless you change CORE_LAYER_NAME in settings.py to match - whatever alternative name you use here. - - 1.3. The layer has been added but is not yet published. (For the - public index this provides some protection against spam and - malformed entries.) To publish it, click on the orange number - next to your login name at the top right, click on the - newly added layer entry, and then click on "Publish Layer". + 1. With the server running, go to the admin page - + http://localhost:8080/admin/ by default (the hostname must + match what the web server is configured for i.e. what you + specified when running `dockersetup.py`). Use the login/password + for the admin account specified during setup. + + 2. Click on the "Submit Layer" button in the top right and + enter the details for the core layer. To use the real + openembedded-core layer, use these values: + + | Field | Value | + |-------------------------|--------------------------------------------------| + | Layer name | `openembedded-core` | + | Layer type | Base | + | Summary | Core metadata | + | Description | Core metadata | + | Repository URL | `https://git.openembedded.org/openembedded-core` | + | Repository subdirectory | `meta` | + + Once you have filled in the required values, click on the + "Submit Layer" button. + + **NOTE:** The name of the layer must be "openembedded-core", + unless you change `CORE_LAYER_NAME` in `settings.py` to match + whatever alternative name you use here. + + 3. The layer has been added but is not yet published. (For the + public index this provides some protection against spam and + malformed entries.) To publish it, click on the orange number + next to your login name at the top right, click on the + newly added layer entry, and then click on "Publish Layer". 2. If you need to support multiple branches of OpenEmbedded/BitBake where some require Python 2.x and others require Python 3.x, then @@ -186,69 +192,71 @@ setup within it: 4. You may wish to customise some of the page templates to suit your installation, in particular: - * templates/base.html - * templates/layerindex/about.html - + - `templates/base.html` + - `templates/layerindex/about.html` -Updating OpenEmbedded data --------------------------- +## Updating OpenEmbedded data You will likely want to update the OpenEmbedded layer information on a regular basis. To do that by fetching and parsing all layer repositories, run the following: - Incremental update: +Incremental update: - docker-compose run --rm layersapp /opt/layerindex/layerindex/update.py +```sh +docker-compose run --rm layersapp /opt/layerindex/layerindex/update.py +``` - Reload all data (should only be needed if the database structure has - changed as part of an upgrade of the application code): +Reload all data (should only be needed if the database structure has +changed as part of an upgrade of the application code): - docker-compose run --rm layersapp /opt/layerindex/layerindex/update.py -r +```sh +docker-compose run --rm layersapp /opt/layerindex/layerindex/update.py -r +``` Alternatively, you can update the data from an existing layer index instance (as per above during setup): - docker-compose run --rm layersapp /opt/layerindex/layerindex/tools/import_layers.py https://layers.openembedded.org +```sh +docker-compose run --rm layersapp /opt/layerindex/layerindex/tools/import_layers.py https://layers.openembedded.org +``` - -Upgrading from an earlier version ---------------------------------- +## Upgrading from an earlier version To upgrade the Docker-based setup from a previous release, update the code -(e.g. with git pull) and then run: +(e.g. with `git pull`) and then run: +```sh ./dockersetup.py -u +``` This will rebuild the containers and run any required database migrations. -Installations set up by dockersetup.py before it used environment files +Installations set up by `dockersetup.py` before it used environment files (see "Environment files" above) have their secret key and passwords in the -environment sections of docker-compose.yml. Carry them over by hand once: +environment sections of `docker-compose.yml`. Carry them over by hand once: -1. Copy docker-compose.yml somewhere safe, then restore the tracked version - (git checkout docker-compose.yml) and update the code. +1. Copy `docker-compose.yml` somewhere safe, then restore the tracked version + (`git checkout docker-compose.yml`) and update the code. -2. For each of app, celery, db and rabbit, copy .env.dev. to - .env.local. and fill in the values from the matching service - in the old file: SECRET_KEY, DATABASE_USER, DATABASE_PASSWORD, - MYSQL_ROOT_PASSWORD, RABBITMQ_DEFAULT_USER, RABBITMQ_DEFAULT_PASS and any - EMAIL_* settings. Set DEBUG=0 in .env.local.app, and make the files - readable only by you (chmod 600 .env.local.*). +2. For each of `app`, `celery`, `db` and `rabbit`, copy `.env.dev.` to + `.env.local.` and fill in the values from the matching service + in the old file: `SECRET_KEY`, `DATABASE_USER`, `DATABASE_PASSWORD`, + `MYSQL_ROOT_PASSWORD`, `RABBITMQ_DEFAULT_USER`, `RABBITMQ_DEFAULT_PASS` and any + `EMAIL_*` settings. Set `DEBUG=0` in `.env.local.app`, and make the files + readable only by you (`chmod 600 .env.local.*`). -3. In docker-compose.yml, change the env_file entries from .env.dev.* to - .env.local.*, and reapply your other changes from the old file (hostname, +3. In `docker-compose.yml`, change the `env_file` entries from `.env.dev.*` to + `.env.local.*`, and reapply your other changes from the old file (hostname, ports, certificate volumes and, if you use Let's Encrypt, the - layerscertbot service). - -4. Run ./dockersetup.py -u as above. + `layerscertbot` service). +4. Run `./dockersetup.py -u` as above. -Support for OE-Classic ----------------------- +## Support for OE-Classic The Layer index optionally provides a means to index OE-Classic on a one-off import basis and then compare what was there to what you have @@ -257,32 +265,40 @@ been migrated/superseded). If you want to enable this, do the following: 1. From the admin interface, create a Branch record with the following values: - - Name: oe-classic (must be exactly this!) - - Bitbake branch: 1.12 - - Enable updates: NOT ticked - - Comparison: ticked - - Update environment: if you have set up Python environments (for - python2 vs python3 across different branches) then you'll need - to select the python2 environment that you created here + - Name: `oe-classic` (must be exactly this!) + - Bitbake branch: `1.12` + - Enable updates: NOT ticked + - Comparison: ticked + - Update environment: if you have set up Python environments (for + python2 vs python3 across different branches) then you'll need + to select the python2 environment that you created here 2. Clone OE-Classic somewhere locally on the machine running the layer index: + ```sh git clone https://git.openembedded.org/openembedded + ``` 3. Clone a bitbake somewhere locally and check out the 1.12 branch: + ```sh git clone https://git.openembedded.org/bitbake -b 1.12 + ``` -4. Run import_classic.py, specifying the path to OE-Classic and +4. Run `import_classic.py`, specifying the path to OE-Classic and the bitbake you checked out: + ```sh layerindex/tools/import_classic.py /path/to/bitbake112 /path/to/oeclassic + ``` 5. Update the migration status of OE-Classic recipes based on other layers in the database: + ```sh layerindex/tools/update_classic_status.py + ``` If you refresh the main page of the website, the OE-Classic data should now show up at the bottom of the branch drop-down menu. On a periodic @@ -291,13 +307,11 @@ new recipes are brought across (or replacements are created). Users with sufficient permissions can also manually update the migration status on the OE-Classic recipe detail pages within the website, which is useful for example when there's a replacement recipe in another layer that -doesn't have the same name, so the update_classic_status.py script +doesn't have the same name, so the `update_classic_status.py` script wouldn't be able to pick it up. - -Setting up other distro comparisons ------------------------------------ +## Setting up other distro comparisons The Layer Index also provides optional functionality to enable comparison with other distributions (currently RPM-based only) in a similar manner to @@ -306,48 +320,54 @@ the following steps: 1. From the admin interface, set up the appropriate entries: - 1.1. Create a Branch with the following values: - - Bitbake branch: - - Enable updates: NOT enabled - - Comparison: enabled + 1. Create a Branch with the following values: + - Bitbake branch: `` + - Enable updates: NOT enabled + - Comparison: enabled - 1.2. Create a Layer. Typically this would have the same name as - the branch although that is not a requirement. The "Comparison" - checkbox should be ticked. If the packages are in separate - repositories (one per package, as is typical in RPM-based - distributions such as Fedora) then in order to make the links - through to files work correctly you may need to use repository web - interface URLs similar to these: + 2. Create a Layer. Typically this would have the same name as + the branch although that is not a requirement. The "Comparison" + checkbox should be ticked. If the packages are in separate + repositories (one per package, as is typical in RPM-based + distributions such as Fedora) then in order to make the links + through to files work correctly you may need to use repository web + interface URLs similar to these: - Repository web interface tree base URL: - https://github.com/organisationname/%pathelement[0]%/tree/master/%pathelement[1:]% - Repository web interface file base URL: - https://github.com/organisationname/%pathelement[0]%/blob/master/%pathelement[1:]% + - Repository web interface tree base URL: + `https://github.com/organisationname/%pathelement[0]%/tree/master/%pathelement[1:]%` + - Repository web interface file base URL: + `https://github.com/organisationname/%pathelement[0]%/blob/master/%pathelement[1:]%` - 1.3. Create a LayerBranch to link the Branch and Layer that you - created in the previous steps. You don't need to enter anything - special here. + 3. Create a LayerBranch to link the Branch and Layer that you + created in the previous steps. You don't need to enter anything + special here. 2. Run the import script, specifying the branch and layer names and the path to the base of the packages (where each subdirectory contains a package, notably a spec file describing the package): + ```sh layerindex/tools/import_otherdistro.py import-pkgspec + ``` 3. Update the comparison status of recipes based on layers in the database: + ```sh layerindex/tools/update_classic_status.py -l -b + ``` -4. Optionally enable the Update button in the UI by setting COMPARISON_UPDATE - in settings.py to map each other distro branch to the command that should +4. Optionally enable the Update button in the UI by setting `COMPARISON_UPDATE` + in `settings.py` to map each other distro branch to the command that should be run in the background when the button is pressed. For example: -COMPARISON_UPDATE = [ - { - 'branch_name': 'otherlinux', - 'update_command': 'layerindex/tools/import_otherdistro.py import-pkgspec otherlinux otherlinux /path/to/pkgs -u %update%; layerindex/tools/update_classic_status.py -b otherlinux -l otherlinux -u %update%', - }, -] + ```python + COMPARISON_UPDATE = [ + { + 'branch_name': 'otherlinux', + 'update_command': 'layerindex/tools/import_otherdistro.py import-pkgspec otherlinux otherlinux /path/to/pkgs -u %update%; layerindex/tools/update_classic_status.py -b otherlinux -l otherlinux -u %update%', + }, + ] + ``` If you refresh the main page of the website, the other distro data should now show up at the bottom of the branch drop-down menu. On a periodic @@ -355,7 +375,7 @@ basis you can repeat steps 2 and 3 to refresh the data as changes occur on both sides. Users with sufficient permissions can also manually update the migration status on the other distro recipe detail pages within the website, which is useful for example when there's an equivalent recipe in another -layer that doesn't have the same name, so the update_classic_status.py +layer that doesn't have the same name, so the `update_classic_status.py` script wouldn't be able to pick it up. If you want to show links to additional upstream pages associated with @@ -364,30 +384,32 @@ for each type of link you want to be shown. For example, Fedora provides a summary page for each package - acl's one is at https://apps.fedoraproject.org/packages/acl, so you would create a Layer Recipe Extra URL entry with the template URL -"https://apps.fedoraproject.org/packages/%pn%" and then links would be +`https://apps.fedoraproject.org/packages/%pn%` and then links would be shown for this under the detail page for each package in the other distro. If you have the rrs application enabled the link will also be shown in the "Distros" section of the maintenance detail page for the covering recipe. - -Security Considerations ------------------------ +## Security Considerations Some things to be aware of from a security perspective: -* By default, anyone can register themselves an account. If you wish to +- By default, anyone can register themselves an account. If you wish to disable new user registration and manage users manually through the admin - interface instead, then add the following line to docker/settings.py: + interface instead, then add the following line to `docker/settings.py`: -REGISTRATION_OPEN = False + ```python + REGISTRATION_OPEN = False + ``` - Then, assuming you have already run dockersetup.py to install the + Then, assuming you have already run `dockersetup.py` to install the application, run the following command to update it: -./dockersetup.py -u + ```sh + ./dockersetup.py -u + ``` -* By default, dockersetup.py enables connection to the web server via +- By default, `dockersetup.py` enables connection to the web server via HTTPS using a self-signed certificate; connections via HTTP are re-directed to HTTPS. However, the self-signed certificate is only intended to provide a minimum level of security, but will result in @@ -397,19 +419,21 @@ REGISTRATION_OPEN = False or alternatively if the application is accessible to the internet you can use Let's Encrypt. -* If you provide your own certificates for HTTPS, you should probably +- If you provide your own certificates for HTTPS, you should probably also enable HSTS in your configuration. Refer to the Django Security guide for details on how to do that: https://docs.djangoproject.com/en/stable/topics/security/#ssl-https -* To reset a forgotten account password, you can either use the password - reset function ( /accounts/password_reset/ ) or alternatively from the +- To reset a forgotten account password, you can either use the password + reset function (`/accounts/password_reset/`) or alternatively from the backend you can run the following command: + ```sh docker-compose exec layersapp /opt/layerindex/manage.py changepassword + ``` -* The web-based password reset function will ask the user answers to +- The web-based password reset function will ask the user answers to security questions they selected and answered when they created the account. Admins can configure the selectable security questions in the admin interface under "Security questions"; however, be cautious @@ -426,22 +450,24 @@ REGISTRATION_OPEN = False into the application and then going to Edit Profile on the top-right user drop-down menu. -* Security question answers are stored using the same mechanism as +- Security question answers are stored using the same mechanism as for passwords, i.e. a secure one-way hash; thus answers cannot be retrieved from the database once set. Additionally, if a user wants to change one of their answers via the Edit Profile function, they will be required to re-specify all of them. -* Account lockout: this application will lock out the user in two ways: +- Account lockout: this application will lock out the user in two ways: - By IP address (using django-axes) after too many invalid login attempts. (default 4, resets after an hour). The lockout can be removed immediately using the following command: + ```sh docker-compose exec layersapp /opt/layerindex/manage.py axes_reset + ``` If you wish to disable this, remove or comment out "axes" in - INSTALLED_APPS. For more information on configuring axes, see: + `INSTALLED_APPS`. For more information on configuring axes, see: https://django-axes.readthedocs.io/en/latest/ @@ -449,46 +475,44 @@ REGISTRATION_OPEN = False this lockout, log into the admin interface, go to Users, click on the the user, tick the Active checkbox and then save. -* The REST API inherited from the OpenEmbedded layerindex upon which this +- The REST API inherited from the OpenEmbedded layerindex upon which this application is based has been disabled, since it has no access controls on querying data (since the OE layer index operates entirely on publicly accessible information, whereas this application may not in actual usage). - -Backup and restore ------------------- +## Backup and restore To back up the database within the docker-based setup, you can run the -following command (no need to substitute ${MYSQL_ROOT_PASSWORD}, it's +following command (no need to substitute `${MYSQL_ROOT_PASSWORD}`, it's already present within the container environment): +```sh docker-compose exec layersdb /bin/sh -c '/usr/bin/mariadb-dump -u root --password=${MYSQL_ROOT_PASSWORD} --max_allowed_packet=512M layersdb' | gzip > backup-`date +%Y_%m_%d_%H%M`.sql.gz +``` To restore one of these backups you would run the following command (take care, this will overwrite the data immediately without prompting!): +```sh zcat backupfile.sql.gz | docker-compose exec -T layersdb /bin/sh -c '/usr/bin/mariadb -u root --password=${MYSQL_ROOT_PASSWORD} layersdb' +``` - -Maintenance ------------ +## Maintenance The code for this application is maintained by the Yocto Project. The latest version of the code can always be found here: - https://git.yoctoproject.org/layerindex-web/ +https://git.yoctoproject.org/layerindex-web/ Contributions are welcome. Please send patches / pull requests to yocto-patches@lists.yoctoproject.org with '[layerindex-web]' in the subject. - -License -------- +## License This application is based upon the Django project template, whose files are covered by the BSD license and are copyright (c) Django Software @@ -508,5 +532,4 @@ under the MIT license. All other content is copyright (C) 2013-2019 Intel Corporation and licensed under the MIT license (unless otherwise noted) - see -COPYING.MIT for details. - +[COPYING.MIT](COPYING.MIT) for details. diff --git a/README.rrs.md b/README.rrs.md index b6e3724..7850656 100644 --- a/README.rrs.md +++ b/README.rrs.md @@ -1,51 +1,51 @@ -Recipe Reporting System -======================= +# Recipe Reporting System Recipe reporting system is a web-based application that provides information about recipe maintenance for OpenEmbedded layers, tracking how up-to-date each recipe is per recipe. It is an add-on for the OpenEmbedded layer index application. -Setup ------ +## Setup -NOTE: Currently the only supported database backend is MySQL (or MariaDB) +**NOTE:** Currently the only supported database backend is MySQL (or MariaDB) version 10.2 or newer, due to some raw SQL usage for performance reasons. This requirement may be removed in future. Setup procedure: -1. Follow the layer index setup instructions in the README.md file first. +1. Follow the layer index setup instructions in the [README.md](README.md) file first. The openembedded-core layer (or whatever replacement you have pointed - CORE_LAYER_NAME to in settings.py) must be present in order to run the + `CORE_LAYER_NAME` to in `settings.py`) must be present in order to run the Recipe Reporting System database migrations. -2. Edit settings.py: +2. Edit `settings.py`: - * Add 'rrs' to INSTALLED_APPS. In the Docker-based setup, set - ENABLE_RRS=1 in the app and celery environment files instead (see - "Environment files" in README.md) + - Add `'rrs'` to `INSTALLED_APPS`. In the Docker-based setup, set + `ENABLE_RRS=1` in the app and celery environment files instead (see + "Environment files" in [README.md](README.md)) - * Configure TOOLS_LOG_DIR if you wish the logs to be written somewhere + - Configure `TOOLS_LOG_DIR` if you wish the logs to be written somewhere other than the current directory when the scripts are run -3. Uncomment the include lines in conf/local.conf. +3. Uncomment the include lines in `conf/local.conf`. 4. Run database migrations: -$ python3 manage.py migrate rrs + ```sh + python3 manage.py migrate rrs + ``` 5. Set up the maintenance plan. A "default" plan will likely have been created during upgrade, you can use this if it's there, otherwise create one. Ensure that you set the following: - * "Enable updates" should be ticked + - "Enable updates" should be ticked - * Have at least one layer branch against the plan (lower part of the admin + - Have at least one layer branch against the plan (lower part of the admin page for the plan). You should select the master or equivalent branch for each layer. - * If you are importing history earlier than the Python 3 switchover, and + - If you are importing history earlier than the Python 3 switchover, and you are using virtualenv or have some other environmental requirement for different python versions, you'll need to set up a Python Environment record for Python 2 and Python 3 (or reuse the ones you've set up for @@ -54,11 +54,13 @@ $ python3 manage.py migrate rrs 6. For the first run, regenerate recipe upgrade information: -$ ./layerindex/update.py -$ ./rrs/tools/rrs_maintainer_history.py -d -$ ./rrs/tools/rrs_upgrade_history.py -d -$ ./rrs/tools/rrs_upstream_history.py -d -$ ./rrs/tools/rrs_distros.py -d + ```sh + ./layerindex/update.py + ./rrs/tools/rrs_maintainer_history.py -d + ./rrs/tools/rrs_upgrade_history.py -d + ./rrs/tools/rrs_upstream_history.py -d + ./rrs/tools/rrs_distros.py -d + ``` -7. Configure cron to run daily update, set rrs_dir and venv_activate in - rrs/tools/daily_run.sh. +7. Configure cron to run daily update, set `rrs_dir` and `venv_activate` in + `rrs/tools/daily_run.sh`. diff --git a/README.vscode.md b/README.vscode.md index db72329..bb4ea89 100644 --- a/README.vscode.md +++ b/README.vscode.md @@ -1,50 +1,49 @@ -VSCode + DevContainers Setup ----------------------------- +## VSCode + DevContainers Setup If you already use VSCode and Docker, you can setup the local development environment using preconfigured DevContainers extension. -Getting Started ---------------- +## Getting Started -1. Install Dev Containers extension (ms-vscode-remote.remote-containers) +1. Install Dev Containers extension (`ms-vscode-remote.remote-containers`) 2. Open local clone of this repository in VSCode 3. Click on "Reopen in Container" when prompted by VSCode 4. Wait 1-2 minutes for VSCode to setup your DevContainer Once the DevContainer setup process is completed, you'll have access to: -* Django development server running at http://localhost:8000 -* All Django database migrations applied -* PyTest autodiscovery and debugger configured -* Database client extension configured with the local server -* Code linting and formatting with ruff -* Command line git support with your SSH keys mounted in the container +- Django development server running at http://localhost:8000 +- All Django database migrations applied +- PyTest autodiscovery and debugger configured +- Database client extension configured with the local server +- Code linting and formatting with ruff +- Command line git support with your SSH keys mounted in the container -FAQ ---- +## FAQ -1. How do I import master branch from the public instance? +1. How do I import master branch from the public instance? - Run the following command in the VSCode Terminal: + Run the following command in the VSCode Terminal: - $ layerindex/tools/import_layers.py https://layers.openembedded.org + ```sh + layerindex/tools/import_layers.py https://layers.openembedded.org + ``` +2. How do I see emails sent by the development system? -2. How do I see emails sent by the development system? + Emails are logged to the standard output of the layerindex-web container. - Emails are logged to the standard output of the layerindex-web container. + To see the logs: - To see the logs: + 1. Open the Command Palette: Ctrl+Shift+P / Cmd+Shift+P + 2. Type: "Remote Explorer: Focus on Dev Containers View" + 3. Right-click on the layerindex-web container + 4. Select "Show Container Log" - 1. Open the Command Palette: Ctrl+Shift+P / Cmd+Shift+P - 2. Type: "Remote Explorer: Focus on Dev Containers View" - 3. Right-click on the layerindex-web container - 4. Select "Show Container Log" +3. How do I interact with Django's `manage.py` script? + Open a new terminal window in VSCode and type: -3. How do I interact with Django's manage.py script? - - Open a new terminal window in VSCode and type: - - $ ./manage.py ... \ No newline at end of file + ```sh + ./manage.py ... + ``` From patchwork Sun Oct 18 22:03:06 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101216 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB4C3CCA490 for ; Sun, 18 Oct 2026 22:03:43 +0000 (UTC) Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.22528.1792361014741398185 for ; Sun, 18 Oct 2026 15:03:34 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=NputjcU2; spf=pass (domain: gmail.com, ip: 209.85.216.42, mailfrom: ticotimo@gmail.com) Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-3ac6794fe45so1267321a91.0 for ; Sun, 18 Oct 2026 15:03:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792361014; x=1792965814; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=3imi8wcbzPfsOeZnt2hFIRAbxNtFiuhb0dG1ZSpHnyQ=; b=NputjcU2SFBScSycSeNXSoS/HSkZYGmXHrvGI15y4nTH0BvOCNLcJ8m0vDxTCbVt7q hc0wfWD5+C5Hrtu/hjsxCODyt7wswpWerhMX/g6VrSyCN4ZnBj8LOk9x5AvP8R7O9zn8 Mj5ijn1+c/tBUq7c78WMY3r9zF1PvQMTHbp+tgkB13xRuBCgVFxvT34MuYYyfH4LxQR7 OukVK/YYC/I892GCTSEEYF2On7MVKm8HmzCkaJ969j/kug3YxmDkmf6tmhspGOdIt/ut oJKv5zMrXqzWJ5fsQdB8mNnGpSUvUOfLz0nIO0ymRvZzybRMjuqr3n/P9ZS3NHuvPyl9 hveA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792361014; x=1792965814; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=3imi8wcbzPfsOeZnt2hFIRAbxNtFiuhb0dG1ZSpHnyQ=; b=Dt3MZxXgtPy71h7zRu0oU98+23AyeZJa/xL5tgQUdJIj9gCEFoAQja3uxTeBi+M+Yq v8w6wGiwUSQT04oPmezRr1YCGUoJRrKYjxQAtNSpWL17xY+4W8zrS8i/V1jP88bPwi5f CFGFq8GGwwLgGJylH83exyPHqj58dHV7wV7WDiwHkGy4VvKKcBIPzL/dMq13o6ZOuSCc ayW2AWV1ZcDRWH8FNNOJz2l2eaC2P+K2VyLy7fR3EW+s8bi6yYfPF66VRPQgbNq/ts09 BfQT0ef8v2ifo1QnZJuhtVjmP4S9D8uwEEiCPPvvs0nBCWwID0LnJ8i0/k/2ssQjFBqH 0/Tw== X-Gm-Message-State: AFq9FYLFA1AVefIBNWLrBHicpWPgRJO8GnOBUGxrQ19+un7b9gW1wZe5 UPYgGsvWg1V72Q+VB0vQ3+oyoQNvpjFehzhe+Xe5iwbJhZw9o0yVTvVD8TB9lg== X-Gm-Gg: AYBFou3xOSxwCj/47k9v/3rusfPooGONs9ONw6XeWZK62RER89ZBE9quSGL7S3K4nu4 cdkKgwymhlT6bnSWCA9nVs1d7dvOhI4uLuiGqT4Tl8d/ihIIYXl13j/jcu0QhZG+ruNGi9CBPR9 KHirE85vEUdIRz/iYa+JvBpFPM8beAjQIaqKqosSTj99DSsN/GPn2ZipGqmm9xB/tuLAQVJMKRh jGIViQhAhtYSGb7EYCsoPDr6jtaimPbQR5BddYOI1VNV8T1VYP6UE7llf33CPxmcb+k4+EG20P9 P/a2OZGfmJNTn+JH9/AB2hfu4Ctne7HYyInOn0MWFxD2CY/Z2LHjupnvF/wKR33FJZYGHlUjXPa sO/2w0akAH81OGTmh5rhjVpAv4BCRzXVFlHybp3ZvXVTEM2mA0B6xf/UktroH9JGdS0VH/AvrLX BBLis2ySKwttDj//QHtF+53GI8/oS+knIUige/WwcqHM6vEANMtWgzI0ViukN0SK9VM4fDY0Ubn 4QMtajvlHplGI/F6wwXUsLbElAiDwo= X-Received: by 2002:a17:90a:e7ca:b0:3a8:878:ebab with SMTP id 98e67ed59e1d1-3acef0c8905mr5377809a91.35.1792361014026; Sun, 18 Oct 2026 15:03:34 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.30 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:31 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 08/10] README.md: fix the REST API note, a JSON example and a typo Date: Sun, 18 Oct 2026 15:03:06 -0700 Message-ID: <20261018220308.72731-9-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:43 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5090 The security notes said the REST API had been disabled because it has no access controls. It is enabled: it is read-only, needs no login and serves the published layer data, including maintainer email addresses, to tools such as bitbake-layers layerindex-fetch and Toaster. Say so. Also add the missing quote in the /etc/docker/daemon.json example and drop a doubled "the". AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d33bb5d..e53ddfa 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ Other settings the app and celery files can set: `/etc/docker/daemon.json`: ```json - {"dns": ["xx.xx.xx.xx] } + {"dns": ["xx.xx.xx.xx"]} ``` @@ -473,12 +473,12 @@ Some things to be aware of from a security perspective: - By account for too many incorrect password reset attempts. To remove this lockout, log into the admin interface, go to Users, click on the - the user, tick the Active checkbox and then save. + user, tick the Active checkbox and then save. -- The REST API inherited from the OpenEmbedded layerindex upon which this - application is based has been disabled, since it has no access controls - on querying data (since the OE layer index operates entirely on publicly - accessible information, whereas this application may not in actual usage). +- The REST API at `/layerindex/api/` is read-only and needs no login. It + serves the same information as the public web pages for published layers, + including the names and email addresses of layer maintainers, and is used + by tools such as `bitbake-layers layerindex-fetch` and Toaster. ## Backup and restore From patchwork Sun Oct 18 22:03:07 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101217 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB56FCCF2C4 for ; Sun, 18 Oct 2026 22:03:43 +0000 (UTC) Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.22624.1792361018642726266 for ; Sun, 18 Oct 2026 15:03:38 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=l8JoYwhN; spf=pass (domain: gmail.com, ip: 209.85.216.42, mailfrom: ticotimo@gmail.com) Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-3ac6794fe45so1267335a91.0 for ; Sun, 18 Oct 2026 15:03:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792361018; x=1792965818; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=1dCUqZxHM9wIKo/TMeLgyvZ/EkqtlILk+rliCBRQVvg=; b=l8JoYwhNGNxIXnRESyRzswQim8LuRhIXDjvPcrjN41U8JjrgMoffXitNPp+6jm4BOL gGOAOQNBy/sVoelXG4b6RdbY6pyyGm4AAw6LXUX+vF3EeVRq4LCKLk9m3wrROKCv+TVW atbc5tin8Wp5eexjnfQq4iSQuyN5rUpK9RBbUQCCev1Ac1rYn/CNvSljBh97UVQ9NDf6 6T/omT811ZdhWdD8JqQ35fP3yUsacFzCI8GkGo1sS70nbtWD2pLuFxdYL2zexEiOSknG Wm8GzT5ryogq7CN/+lj+3tTeZRh+WEKXr1Gq4WvRpqU5lBGddZyoZX56YSnvrbAS+Nst Dssw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792361018; x=1792965818; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=1dCUqZxHM9wIKo/TMeLgyvZ/EkqtlILk+rliCBRQVvg=; b=cgJ2yHQz3Qz1FohuQrdC6EHEVhp9StDI4uMLHmkMYeqalld/5AGFcjFpHD8wcZBu4j Cg1W1MWpxgaWiWnD/b7rnykMc9BN20+UPbch7X1ahVNXqyF5u8CbKrHHP0hXI8/dDp7i Zcq9BlaOeu4MOI/DPVPuXUbSMMsOPal9HAPTNNkWj7fPhGHGpxV7uf+IKslrz2NqmK8R 4nL3Sm3boYeWAqiYStXCj5AdOdeQfdALEcNul5K0gGdr+iMYvk+jGQmYb3+zcnzLeS7I 2z0qfuq49PDhAXePRtcKcniR8gG8cnfG2+ecsXJdLYaudiLOY52x0z6h2eSCAEe8T8ql ioyQ== X-Gm-Message-State: AFq9FYJTvJDe9Se9DWMMbfJo0h6HtqU+OD4xb0Tn5rw8pCVH95cTjB+p u+1wz5uLvOGHLGpy6XdiHXMGB5ipm2FfgNiY2nhvTjs4Nwz3lkx93V80lwUa9Vj1 X-Gm-Gg: AYBFou3fbpdCoJ3g0zT5Shj6NKajGLvuKOtKMnbnugry+G6pjmk/B/clWQl80Bhc8Yg 6t3yW6PDem63uo0E7/+1ZZXvjQtUKHo24qClItV5i/bE8QGbOZF5ZWUFfv1+idxqwN0fYTmWqjw OkLvQ5X4Wg4huCauXaEi9sF0OS/XKMz8soGIhnFv0p7Jk4vQM+TkNaF5sOvMyiIe6uSGo37HqCb 7G1rs9n3qzX6r5mY5vGFeVZQXZEoHz9skdnlKhujKuizDXiDsABa/D2XWVw53gaLWoVxt3W0N5Y X9SkMvgYg7Dt6UmSri7wK0aWk8rrGtuekkLVret9mMawQQyBhgVIsbUT4zaCcSldBCkQVSQGcDd cP7yg1sd0VAiiIAcM+9zf0KNJIsQp3zdCqCLN/mI1mEUSb9aqxgoZxfEjGFZN/CgKF8euTgC1fa XvWfWomMhxssIpAXDBNdswDl2Q1e5CWizpbZjqux6D7wy5LgpBLuRkbZv4K0LhsHnka2wwgR2Xi yv3tNsLEBsHqjWePckyxAQmthi9RdI= X-Received: by 2002:a17:90a:e7d2:b0:3ac:a204:aa27 with SMTP id 98e67ed59e1d1-3acef55d72cmr5587440a91.66.1792361017865; Sun, 18 Oct 2026 15:03:37 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.35 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:37 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 09/10] README.md: use "docker compose" Date: Sun, 18 Oct 2026 15:03:07 -0700 Message-ID: <20261018220308.72731-10-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:43 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5091 Ask for Docker with the Compose plugin rather than docker-compose, and use "docker compose" in the example commands. Current Docker installs provide only the plugin; dockersetup.py now uses it, falling back to the standalone docker-compose. AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- README.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e53ddfa..a34457f 100644 --- a/README.md +++ b/README.md @@ -29,12 +29,13 @@ containers, and do the initial database setup. It is advised that you start with a .sql database file to prepopulate your database. The following instructions will walk you through the setup. -1. Install docker and docker-compose per instructions: +1. Install Docker Engine (or Docker Desktop) with the Compose plugin, which + provides the `docker compose` command, per instructions: https://docs.docker.com/compose/install/ - **Note:** for latest docker-compose version follow the directions above, - rather than using a perhaps outdated one provided by your distribution. + `dockersetup.py` uses `docker compose`, or the older standalone + `docker-compose` if the plugin is not installed. 2. Run the setup script (`dockersetup.py`). You can optionally supply your hostname, proxy settings, a sql database file of layer mappings to import, @@ -135,7 +136,7 @@ setup within it: public instance at layers.openembedded.org you can run the following: ```sh - docker-compose run --rm layersapp /opt/layerindex/layerindex/tools/import_layers.py https://layers.openembedded.org + docker compose run --rm layersapp /opt/layerindex/layerindex/tools/import_layers.py https://layers.openembedded.org ``` Alternatively, you can populate the database manually - @@ -205,21 +206,21 @@ following: Incremental update: ```sh -docker-compose run --rm layersapp /opt/layerindex/layerindex/update.py +docker compose run --rm layersapp /opt/layerindex/layerindex/update.py ``` Reload all data (should only be needed if the database structure has changed as part of an upgrade of the application code): ```sh -docker-compose run --rm layersapp /opt/layerindex/layerindex/update.py -r +docker compose run --rm layersapp /opt/layerindex/layerindex/update.py -r ``` Alternatively, you can update the data from an existing layer index instance (as per above during setup): ```sh -docker-compose run --rm layersapp /opt/layerindex/layerindex/tools/import_layers.py https://layers.openembedded.org +docker compose run --rm layersapp /opt/layerindex/layerindex/tools/import_layers.py https://layers.openembedded.org ``` @@ -430,7 +431,7 @@ Some things to be aware of from a security perspective: backend you can run the following command: ```sh - docker-compose exec layersapp /opt/layerindex/manage.py changepassword + docker compose exec layersapp /opt/layerindex/manage.py changepassword ``` - The web-based password reset function will ask the user answers to @@ -463,7 +464,7 @@ Some things to be aware of from a security perspective: immediately using the following command: ```sh - docker-compose exec layersapp /opt/layerindex/manage.py axes_reset + docker compose exec layersapp /opt/layerindex/manage.py axes_reset ``` If you wish to disable this, remove or comment out "axes" in @@ -488,14 +489,14 @@ following command (no need to substitute `${MYSQL_ROOT_PASSWORD}`, it's already present within the container environment): ```sh -docker-compose exec layersdb /bin/sh -c '/usr/bin/mariadb-dump -u root --password=${MYSQL_ROOT_PASSWORD} --max_allowed_packet=512M layersdb' | gzip > backup-`date +%Y_%m_%d_%H%M`.sql.gz +docker compose exec layersdb /bin/sh -c '/usr/bin/mariadb-dump -u root --password=${MYSQL_ROOT_PASSWORD} --max_allowed_packet=512M layersdb' | gzip > backup-`date +%Y_%m_%d_%H%M`.sql.gz ``` To restore one of these backups you would run the following command (take care, this will overwrite the data immediately without prompting!): ```sh -zcat backupfile.sql.gz | docker-compose exec -T layersdb /bin/sh -c '/usr/bin/mariadb -u root --password=${MYSQL_ROOT_PASSWORD} layersdb' +zcat backupfile.sql.gz | docker compose exec -T layersdb /bin/sh -c '/usr/bin/mariadb -u root --password=${MYSQL_ROOT_PASSWORD} layersdb' ``` From patchwork Sun Oct 18 22:03:08 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 101218 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id C9AC5CCF2CA for ; Sun, 18 Oct 2026 22:03:43 +0000 (UTC) Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.22625.1792361020749239867 for ; Sun, 18 Oct 2026 15:03:40 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20251104 header.b=qT1VLAhN; spf=pass (domain: gmail.com, ip: 209.85.214.173, mailfrom: ticotimo@gmail.com) Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2e8f2c3ad6bso7006085ad.1 for ; Sun, 18 Oct 2026 15:03:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792361020; x=1792965820; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=cYTJ3FCV/CLjDbnpx0gnFh62gPC35QakzO0sJliEJrM=; b=qT1VLAhNaUSU82m4EJBu1O7Et7mvvpoIqFgAhh3gtLI+6RcAMOrLRE74tce/dung6Z 9T7weMHIPHhJ+s9KQAQrzdJnyKuDXI5CMbvFucyEv29TZApjTFU3fHuYcKk6kTPPlIkz j0GptnjfioiRQkhykrDicKJH9z52VE2w2X6CrJbed0yGXOxJF8Vl9XSg0GpJDwdlbx3o 1HlHquO4T7TEPiFAqjGZYnCJqkeu3X6YWBNdxc17kbZjKnNPD+3F05Z5AJ3H1cW26X3y NY1/+IcI9UH1REenuS9LNxj/O06b3rkpgsVmub8KP7bhViQIwzQeoiQZtXqdM+zrFeaT HTTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792361020; x=1792965820; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=cYTJ3FCV/CLjDbnpx0gnFh62gPC35QakzO0sJliEJrM=; b=Xr94+92G5iFLQQKRJaKgHysDlXFvkt89aT1GXs9n8TCXc5NqM1LY3yMTLmdZHiTmDy px2Wi/YOLyDw0XrVWU9MfGf36COXrSuXYW5+gAte9y9VxrBkiyObVRusqoZw39aLX2V/ O1aLU5MhKZvWw24gbEmeyL9bKyiVthH3mlfkqRvYR2WOlJoBThxVeiiWN4rYMwdmmPjk 1XGjGI2WQrnEsYmjvw0PDNr2bBl36wWQwl+xAOs1kHdtriYdl3Xy3NTbnv6wksMK5mfW 2xxpVqRk/i680vm9H8HVXFSNQW6AFXGj9nIZyWVq85dYezzBCk9Dz+RP0RiJ7VJoOSUC DoSA== X-Gm-Message-State: AFq9FYK68k9ceTpKYjHpTpAuClfSs3FKKbhE9dnC3Pv3CTZyI+F6AfQz eqSClqL3/awz0yRFl6gjCucg3D8Fx3UHLHvHG6MJs8Sv93+GyjIHCvdMxSexh4jp X-Gm-Gg: AYBFou39j6tDRmWIhQihCCnCSOD9xPh0Toh1s7DKD7e7lRPlXbXWRGTjptU/wnYlu9T 6NAISSQQpQWbzDQCuQSvz2H7abHxwkR3mQcGtqByCFB5pO7aRzs+ieDv7Ekb7r02f8xe2x/7ONy lhQAmEkYj/ul2Z1gGdcPXbycgjpx+qML+VdpQZ+fL7RXOHrLdV3lDeEiqGUfu6jrK8jz9m4NCIR r0W/uO0evDKxEE5FymTuLA/APLJOic9e+X0KVTh6f0SlTkdutVlNgIc+YlzPWuLUm3mCysYov4a hmLXsLcHHQ38W+bxXCZ1eWS3edFM3+9xdQRezNyuP9wI3CPjFlo6jJ8zLedQZYE45sIGvuU6fBR jW6PJ83cvg7P6qo31lAJwXYpYT0NSFBHtYzNB6G+C3mdTZdU5Didqikuaan8CpL2EFlhUOtaL6F aZyB/Ro7Ahq7UI6XwuJ4+oHjDDgmdsU3GBrcI2idqesd8/jlwwZtehYwJAC0Ihghsdm8hoWrK1b FspchKmBfxpKigCKWB4LYuYUwfAOKw= X-Received: by 2002:a17:90b:2701:b0:3aa:f2c4:12ea with SMTP id 98e67ed59e1d1-3aceefc5389mr4486139a91.20.1792361020102; Sun, 18 Oct 2026 15:03:40 -0700 (PDT) Received: from localhost.localdomain ([69.9.132.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ac945e72c6sm17714440a91.5.2026.10.18.15.03.38 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 18 Oct 2026 15:03:39 -0700 (PDT) From: Tim Orling X-Google-Original-From: Tim Orling To: yocto-patches@lists.yoctoproject.org Cc: Tim Orling Subject: [layerindex-web][PATCH 10/10] README.md: show how to configure git for sending patches Date: Sun, 18 Oct 2026 15:03:08 -0700 Message-ID: <20261018220308.72731-11-tim.orling@konsulko.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261018220308.72731-1-tim.orling@konsulko.com> References: <20261018220308.72731-1-tim.orling@konsulko.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 18 Oct 2026 22:03:43 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/5092 Contributions go to the yocto-patches mailing list with '[layerindex-web]' in the subject. Show the git config settings that make git format-patch and git send-email do that, as the error-report-web README does, and drop "pull requests", which the list does not take. AI-Generated: Claude Opus 5.5 Signed-off-by: Tim Orling --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a34457f..a1f6087 100644 --- a/README.md +++ b/README.md @@ -508,9 +508,14 @@ The latest version of the code can always be found here: https://git.yoctoproject.org/layerindex-web/ -Contributions are welcome. Please send patches / pull requests to +Contributions are welcome. Please send patches with git send-email to yocto-patches@lists.yoctoproject.org with '[layerindex-web]' in the -subject. +subject. To set this up in your clone: + +```sh +git config format.subjectPrefix "layerindex-web][PATCH" +git config sendemail.to yocto-patches@lists.yoctoproject.org +``` ## License