{"id":2223064,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2223064/?format=json","project":{"id":27,"url":"http://patchwork.ozlabs.org/api/1.0/projects/27/?format=json","name":"Buildroot development","link_name":"buildroot","list_id":"buildroot.buildroot.org","list_email":"buildroot@buildroot.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260414095841.445592-1-mooz@blockos.org>","date":"2026-04-14T09:56:25","name":"[v2] package/python-ncclient: new package","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"3a971f6e0bb75ce7f44777714f9437b99d125cf5","submitter":{"id":92650,"url":"http://patchwork.ozlabs.org/api/1.0/people/92650/?format=json","name":"Vincent Cruz","email":"mooz@blockos.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/buildroot/patch/20260414095841.445592-1-mooz@blockos.org/mbox/","series":[{"id":499812,"url":"http://patchwork.ozlabs.org/api/1.0/series/499812/?format=json","date":"2026-04-14T09:56:25","name":"[v2] package/python-ncclient: new package","version":2,"mbox":"http://patchwork.ozlabs.org/series/499812/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2223064/checks/","tags":{},"headers":{"Return-Path":"<buildroot-bounces@buildroot.org>","X-Original-To":["incoming-buildroot@patchwork.ozlabs.org","buildroot@buildroot.org"],"Delivered-To":["patchwork-incoming-buildroot@legolas.ozlabs.org","buildroot@buildroot.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=buildroot.org header.i=@buildroot.org\n header.a=rsa-sha256 header.s=default header.b=fwaPLWTV;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=buildroot.org\n (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org;\n envelope-from=buildroot-bounces@buildroot.org; receiver=patchwork.ozlabs.org)"],"Received":["from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fw0LJ4YmZz1y2d\n\tfor <incoming-buildroot@patchwork.ozlabs.org>;\n Tue, 14 Apr 2026 20:06:46 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp4.osuosl.org (Postfix) with ESMTP id B83144292C;\n\tTue, 14 Apr 2026 10:06:44 +0000 (UTC)","from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id 7YdatBA0Gqxl; Tue, 14 Apr 2026 10:06:43 +0000 (UTC)","from lists1.osuosl.org (lists1.osuosl.org [140.211.166.142])\n\tby smtp4.osuosl.org (Postfix) with ESMTP id A29CB42965;\n\tTue, 14 Apr 2026 10:06:43 +0000 (UTC)","from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n by lists1.osuosl.org (Postfix) with ESMTP id 65792375\n for <buildroot@buildroot.org>; Tue, 14 Apr 2026 10:06:42 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id 635BB42965\n for <buildroot@buildroot.org>; Tue, 14 Apr 2026 10:06:42 +0000 (UTC)","from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id af4_g597TDjl for <buildroot@buildroot.org>;\n Tue, 14 Apr 2026 10:06:41 +0000 (UTC)","from 11.mo534.mail-out.ovh.net (11.mo534.mail-out.ovh.net\n [46.105.33.174])\n by smtp4.osuosl.org (Postfix) with ESMTPS id 894C14292C\n for <buildroot@buildroot.org>; Tue, 14 Apr 2026 10:06:39 +0000 (UTC)","from director2.derp.mail-out.ovh.net\n (director2.derp.mail-out.ovh.net [79.137.60.36])\n by mo534.mail-out.ovh.net (Postfix) with ESMTPS id 4fw0935MMfz6Myt;\n Tue, 14 Apr 2026 09:58:47 +0000 (UTC)","from director2.derp.mail-out.ovh.net\n (director2.derp.mail-out.ovh.net. [127.0.0.1])\n by director2.derp.mail-out.ovh.net (inspect_sender_mail_agent) with SMTP\n for <mooz@blockos.org>; Tue, 14 Apr 2026 09:58:47 +0000 (UTC)","from mta3.priv.ovhmail-u1.ea.mail.ovh.net (unknown [10.109.249.197])\n by director2.derp.mail-out.ovh.net (Postfix) with ESMTPS id\n 4fw0934TpPz1yhZ; Tue, 14 Apr 2026 09:58:47 +0000 (UTC)","from blockos.org (unknown [10.1.6.6])\n (Authenticated sender: mooz@blockos.org)\n by mta3.priv.ovhmail-u1.ea.mail.ovh.net (Postfix) with ESMTPSA id\n 975709415D0;\n Tue, 14 Apr 2026 09:58:46 +0000 (UTC)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.166.142;\n helo=lists1.osuosl.org; envelope-from=buildroot-bounces@buildroot.org;\n receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp4.osuosl.org A29CB42965","OpenDKIM Filter v2.11.0 smtp4.osuosl.org 894C14292C"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=buildroot.org;\n\ts=default; t=1776161203;\n\tbh=3ai/M5q6+FB8yuzj81RhFKYHTPDoMVbwjVB6QyTRqh4=;\n\th=From:To:Date:Subject:List-Id:List-Unsubscribe:List-Archive:\n\t List-Post:List-Help:List-Subscribe:Cc:From;\n\tb=fwaPLWTV3JUZFum7C5XbQO3QuyE/xyPhSgzIskyW8JwrMNA/vWF4SokBd3spSLFHL\n\t irsoFFZE59Jtny77YFXyse38B/919dCltk9li7soSrLSuGx13MmozlA5FcGg3BmgWK\n\t yYZL6p9Gs6CgqN+IPBn8V8Z/ms3ryWgF++QwC7YOzvH2uO5ttQyApvxeE3Z1cf+ko6\n\t HBQToTvD9qhZggQ0liLE+0rBnXbZHKABnVZ18Ewkw2m2SwZ9xkQvkCTqOg3/rKJNzl\n\t HfUnn2Nse0+n6bIEP6e1J+NYNR0iSm6yVLzr1+kjoGoRpWRKiSDNsTu9noiEobItLj\n\t 5jyWU6GwIFnBg==","Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=46.105.33.174;\n helo=11.mo534.mail-out.ovh.net; envelope-from=mooz@blockos.org;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp4.osuosl.org 894C14292C","X-OVh-ClientIp":"213.36.7.12","From":"Vincent Cruz <mooz@blockos.org>","To":"buildroot@buildroot.org","Date":"Tue, 14 Apr 2026 11:56:25 +0200","Message-ID":"<20260414095841.445592-1-mooz@blockos.org>","X-Mailer":"git-send-email 2.51.0","MIME-Version":"1.0","x-ovh-tracer-id":"1141381033407269794","X-VR-SPAMSTATE":"OK","X-VR-SPAMSCORE":"-100","X-VR-SPAMCAUSE":"\n dmFkZTGEleDuZF7qvu0gLVn/pVN8l9+YpV6dI/ZnfmQl7tidSt7o3X/WNldqb5C2J3dwlsfeR7D3qGmJmG93lzU9KezHgh3oMNm8fPjFi90UDjjvcLXUp4W4M18NWXzKVaQaBVRmGYlMvhss3n/YbOJinF/5Xy0eXpfKG9HiuZBINLqDEvjIfKCgI35sTf8qoSiEC+zBw8LxcBgPxQQUxlezO3dM1KLgg0MMlfkk/Zat0IBqu1wNPZj223U4gXff5uF3W+fC0NHEa2G3jlNIdfO19HmFj0v9Kf6KfDweuepIEgaCCbWDPTITj6sUt7YRCU6Io+8Y5/N/dfYiIwZZykj1NkESXoSLvbdXbujp3f3wR1PRukGxhw/FOnWeDtOlkmt6X2lmlOwkSIS1/SZBMKE2xkWik7LY2bjyy8BDwz01cOuN51QJDWeaQ6P5EO0FMfn/1DVdcJ/R8vS5WrWhm6DycWcjGja40GyA8fVrzt9HxvQz9u2Ybx5fIuE4dPjMxL3KUNKFH7MN2H0YQGqczFXcyTqYmPd2H3472R6PfqZ/ycPPIWBWlZdg8EgY/MHbwCsXmK1xH8Uov5hAjWoPkBUTMQfytj8oS4myHOxsB+8q6w0T9CyNrshyKnqDt+5HzkxVynQLu0vgDW4JXE/FUt2HjGIs8I5h6QVK4qG43R1kRz9wfA","X-Mailman-Original-Authentication-Results":["smtp4.osuosl.org;\n dmarc=none (p=none dis=none)\n header.from=blockos.org","garm.ovh; auth=pass\n (GARM-112S006b408b295-a44a-4060-8526-0a27c1b58b97,\n 57EC06D2F55947E19987155D42FF0DD2D92A6C82) smtp.auth=mooz@blockos.org"],"Subject":"[Buildroot] [PATCH v2] package/python-ncclient: new package","X-BeenThere":"buildroot@buildroot.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Discussion and development of buildroot <buildroot.buildroot.org>","List-Unsubscribe":"<https://lists.buildroot.org/mailman/options/buildroot>,\n <mailto:buildroot-request@buildroot.org?subject=unsubscribe>","List-Archive":"<http://lists.buildroot.org/pipermail/buildroot/>","List-Post":"<mailto:buildroot@buildroot.org>","List-Help":"<mailto:buildroot-request@buildroot.org?subject=help>","List-Subscribe":"<https://lists.buildroot.org/mailman/listinfo/buildroot>,\n <mailto:buildroot-request@buildroot.org?subject=subscribe>","Cc":"Vincent Jardin <vjardin@free.fr>,\n James Hilliard <james.hilliard1@gmail.com>,\n Thomas Petazzoni <thomas.petazzoni@bootlin.com>,\n Vincent Cruz <mooz@blockos.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"buildroot-bounces@buildroot.org","Sender":"\"buildroot\" <buildroot-bounces@buildroot.org>"},"content":"From: Vincent Jardin <vjardin@free.fr>\n\nncclient is a Python library for NETCONF clients. It facilitates\nclient-side scripting and application development around NETCONF.\n\nhttps://github.com/ncclient/ncclient\nSigned-off-by: Vincent Jardin <vjardin@free.fr>\nSigned-off-by: Vincent Cruz <mooz@blockos.org>\n\n---\nChanges v1 -> v2:\n  - Bump version to 0.7.1\n  - Add test\n\nSigned-off-by: Vincent Cruz <mooz@blockos.org>\n---\n DEVELOPERS                                    |  1 +\n package/Config.in                             |  1 +\n package/python-ncclient/Config.in             | 13 +++++++\n package/python-ncclient/python-ncclient.hash  |  5 +++\n package/python-ncclient/python-ncclient.mk    | 17 ++++++++\n .../tests/package/sample_python_ncclient.py   | 19 +++++++++\n .../tests/package/test_python_ncclient.py     | 39 +++++++++++++++++++\n .../rootfs-overlay/root/add_root.xml          | 35 +++++++++++++++++\n 8 files changed, 130 insertions(+)\n create mode 100644 package/python-ncclient/Config.in\n create mode 100644 package/python-ncclient/python-ncclient.hash\n create mode 100644 package/python-ncclient/python-ncclient.mk\n create mode 100644 support/testing/tests/package/sample_python_ncclient.py\n create mode 100644 support/testing/tests/package/test_python_ncclient.py\n create mode 100644 support/testing/tests/package/test_python_ncclient/rootfs-overlay/root/add_root.xml","diff":"diff --git a/DEVELOPERS b/DEVELOPERS\nindex 1ad64e876e..4a4a25e2c8 100644\n--- a/DEVELOPERS\n+++ b/DEVELOPERS\n@@ -3369,6 +3369,7 @@ F:\tpackage/dpdk/\n F:\tpackage/libecoli/\n F:\tpackage/libnss-ato/\n F:\tpackage/libyang-cpp/\n+F:\tpackage/python-ncclient/\n F:\tpackage/sysrepo-cpp/\n \n N:\tVincent Prince <vincent.prince.fr@gmail.com>\ndiff --git a/package/Config.in b/package/Config.in\nindex 71501cea53..4eeac53563 100644\n--- a/package/Config.in\n+++ b/package/Config.in\n@@ -1250,6 +1250,7 @@ menu \"External python modules\"\n \tsource \"package/python-mwscrape2slob/Config.in\"\n \tsource \"package/python-mypy/Config.in\"\n \tsource \"package/python-mypy-extensions/Config.in\"\n+\tsource \"package/python-ncclient/Config.in\"\n \tsource \"package/python-nested-dict/Config.in\"\n \tsource \"package/python-netaddr/Config.in\"\n \tsource \"package/python-netifaces/Config.in\"\ndiff --git a/package/python-ncclient/Config.in b/package/python-ncclient/Config.in\nnew file mode 100644\nindex 0000000000..7cad899ca2\n--- /dev/null\n+++ b/package/python-ncclient/Config.in\n@@ -0,0 +1,13 @@\n+config BR2_PACKAGE_PYTHON_NCCLIENT\n+\tbool \"python-ncclient\"\n+\tdepends on BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS # python-paramiko\n+\tselect BR2_PACKAGE_PYTHON3_PYEXPAT # runtimeq\n+\tselect BR2_PACKAGE_PYTHON_LXML # runtime\n+\tselect BR2_PACKAGE_PYTHON_PARAMIKO # runtime\n+\tselect BR2_PACKAGE_PYTHON_SIX # runtime\n+\thelp\n+\t  ncclient is a Python library for NETCONF clients. It\n+\t  facilitates client-side scripting and application\n+\t  development around NETCONF.\n+\n+\t  https://github.com/ncclient/ncclient\ndiff --git a/package/python-ncclient/python-ncclient.hash b/package/python-ncclient/python-ncclient.hash\nnew file mode 100644\nindex 0000000000..5901cb0ddc\n--- /dev/null\n+++ b/package/python-ncclient/python-ncclient.hash\n@@ -0,0 +1,5 @@\n+# From https://pypi.org/pypi/ncclient/0.7.1/json\n+sha256  60dabb6ac1a2d84fbc3349cb104ef7d0c5d12cf8eee43fefc715410d70410ddc  ncclient-0.7.1.tar.gz\n+\n+# Locally computed\n+sha256  cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30  LICENSE\ndiff --git a/package/python-ncclient/python-ncclient.mk b/package/python-ncclient/python-ncclient.mk\nnew file mode 100644\nindex 0000000000..36223e835a\n--- /dev/null\n+++ b/package/python-ncclient/python-ncclient.mk\n@@ -0,0 +1,17 @@\n+################################################################################\n+#\n+# python-ncclient\n+#\n+################################################################################\n+\n+PYTHON_NCCLIENT_VERSION = 0.7.1\n+PYTHON_NCCLIENT_SOURCE = ncclient-$(PYTHON_NCCLIENT_VERSION).tar.gz\n+PYTHON_NCCLIENT_SITE = https://files.pythonhosted.org/packages/source/n/ncclient\n+\n+PYTHON_NCCLIENT_LICENSE = Apache-2.0\n+PYTHON_NCCLIENT_LICENSE_FILES = LICENSE\n+\n+PYTHON_NCCLIENT_SETUP_TYPE = hatch\n+PYTHON_NCCLIENT_DEPENDENCIES = host-python-hatch-vcs\n+\n+$(eval $(python-package))\ndiff --git a/support/testing/tests/package/sample_python_ncclient.py b/support/testing/tests/package/sample_python_ncclient.py\nnew file mode 100644\nindex 0000000000..cfd4e260e8\n--- /dev/null\n+++ b/support/testing/tests/package/sample_python_ncclient.py\n@@ -0,0 +1,19 @@\n+import os\n+from ncclient import manager\n+\n+filter = \"\"\"\n+<filter xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n+    <netconf-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring\">\n+        <sessions/>\n+    </netconf-state>\n+</filter>\n+\"\"\"\n+\n+with manager.connect(host='localhost',\n+                     port=830,\n+                     username=os.getenv(\"USER\"),\n+                     key_filename='/root/.ssh/dummy_key',\n+                     hostkey_verify=False,\n+                     allow_agent=False,\n+                     look_for_keys=False) as m:\n+    print(m.get(filter=filter).data_xml)\ndiff --git a/support/testing/tests/package/test_python_ncclient.py b/support/testing/tests/package/test_python_ncclient.py\nnew file mode 100644\nindex 0000000000..ca77b2080c\n--- /dev/null\n+++ b/support/testing/tests/package/test_python_ncclient.py\n@@ -0,0 +1,39 @@\n+import os\n+import infra\n+from xml.etree import ElementTree\n+from tests.package.test_python import TestPythonPackageBase\n+\n+\n+class TestPythonNCClient(TestPythonPackageBase):\n+    rootfs_overlay = infra.filepath(\"tests/package/test_python_ncclient/rootfs-overlay\")\n+\n+    __test__ = True\n+    config = TestPythonPackageBase.config + \\\n+        f\"\"\"\n+        BR2_INSTALL_LIBSTDCPP=y\n+        BR2_PACKAGE_OPENSSH=y\n+        BR2_PACKAGE_NETOPEER2=y\n+        BR2_PACKAGE_NETOPEER2_CLI=y\n+        BR2_PACKAGE_PYTHON3=y\n+        BR2_PACKAGE_PYTHON_NCCLIENT=y\n+        BR2_ROOTFS_OVERLAY=\"{rootfs_overlay}\"\n+        \"\"\"\n+    sample_scripts = [\"tests/package/sample_python_ncclient.py\"]\n+\n+    def test_run(self):\n+        self.login()\n+        self.check_sample_scripts_exist()\n+\n+        self.assertRunOk('mkdir -p /root/.ssh')\n+        self.assertRunOk('ssh-keygen -t ed25519 -f /root/.ssh/dummy_key -N \"\"')\n+        self.assertRunOk('cat /root/.ssh/dummy_key.pub > /root/.ssh/authorized_keys')\n+\n+        self.assertRunOk('sysrepocfg -f xml -I ./add_root.xml -d running -m ietf-netconf-server')\n+\n+        cmd = \"%s %s\" % (self.interpreter, os.path.basename(self.sample_scripts[0]))\n+        output, exit_code = self.emulator.run(cmd, timeout=15)\n+        self.assertEqual(exit_code, 0)\n+\n+        tree = ElementTree.fromstringlist(output)\n+        self.assertEqual(tree.tag, '{urn:ietf:params:xml:ns:netconf:base:1.0}data')\n+        self.assertEqual(tree.find('.//{*}username').text, 'root')\ndiff --git a/support/testing/tests/package/test_python_ncclient/rootfs-overlay/root/add_root.xml b/support/testing/tests/package/test_python_ncclient/rootfs-overlay/root/add_root.xml\nnew file mode 100644\nindex 0000000000..4f48be2483\n--- /dev/null\n+++ b/support/testing/tests/package/test_python_ncclient/rootfs-overlay/root/add_root.xml\n@@ -0,0 +1,35 @@\n+<?xml version=\"1.0\"?>\n+<netconf-server xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-server\">\n+  <listen>\n+    <endpoints>\n+      <endpoint>\n+        <name>default-ssh</name>\n+        <ssh>\n+          <tcp-server-parameters>\n+            <local-address>0.0.0.0</local-address>\n+          </tcp-server-parameters>\n+          <ssh-server-parameters>\n+            <server-identity>\n+              <host-key>\n+                <name>default-key</name>\n+                <public-key>\n+                  <central-keystore-reference>genkey</central-keystore-reference>\n+                </public-key>\n+              </host-key>\n+            </server-identity>\n+            <client-authentication>\n+              <users>\n+                <user>\n+                  <name>root</name>\n+                  <public-keys>\n+                    <use-system-keys xmlns=\"urn:cesnet:libnetconf2-netconf-server\"/>\n+                  </public-keys>\n+                </user>\n+              </users>\n+            </client-authentication>\n+          </ssh-server-parameters>\n+        </ssh>\n+      </endpoint>\n+    </endpoints>\n+  </listen>\n+</netconf-server>\n","prefixes":["v2"]}