From nobody Thu May 14 18:50:32 2026 X-Original-To: freebsd-pkg@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gGfXt5YP6z5Wq4g for ; Thu, 14 May 2026 18:50:38 +0000 (UTC) (envelope-from sasha@starnix.net) Received: from mail-ot1-x336.google.com (mail-ot1-x336.google.com [IPv6:2607:f8b0:4864:20::336]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "WR4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gGfXs1yVbz443h for ; Thu, 14 May 2026 18:50:37 +0000 (UTC) (envelope-from sasha@starnix.net) Authentication-Results: mx1.freebsd.org; dkim=pass header.d=starnix.net header.s=google header.b=koEEKez9; dmarc=pass (policy=quarantine) header.from=starnix.net; spf=pass (mx1.freebsd.org: domain of sasha@starnix.net designates 2607:f8b0:4864:20::336 as permitted sender) smtp.mailfrom=sasha@starnix.net Received: by mail-ot1-x336.google.com with SMTP id 46e09a7af769-7d1872504cbso204984a34.0 for ; Thu, 14 May 2026 11:50:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=starnix.net; s=google; t=1778784634; x=1779389434; darn=freebsd.org; h=in-reply-to:autocrypt:from:content-language:references:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=H+hEpLDsdPfv0B/YMGrtVsmb5whoJXFLNM+SLsfn5E8=; b=koEEKez9eXCnu1qX1GHRJ4+kl+g5pEdg1ffhpGDLDfXXYG16A96tC04HYYexDWjcZQ kXGDpGZIYx8Z8TGWRNWwhvIOKSfHzaa4d21Tv+0IYzcZc7FeJBXeFdiFwxeHnl6n9lHJ qjx7abPhas/UZx4i8z7nzkZxywV8DXHg14vIo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778784634; x=1779389434; h=in-reply-to:autocrypt:from:content-language:references:to:subject :user-agent:mime-version:date:message-id:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=H+hEpLDsdPfv0B/YMGrtVsmb5whoJXFLNM+SLsfn5E8=; b=rzqhSefTHw8vPmYGLBsc6tmvd2Cx3R/0W3rZdg1ISRIorVjWwcS/GJr4iqg5P2OYrE FtO/wEqajSOeuSDlFW1dNtXwax04Qh0twGBtkyego1AOu46t2celakOjYVvMlz9YfnVj XmRw3xOad+H4dgfK565AbYGYFs397XCpt1kjXvnHeVZQEEurSGbfkaSscLaJN3hgNJVD 3Yr56oVOO44NSVhkZtAhMb7YecwuH3TDnmN4+yyPF92+Od5eaLk8pXBg2R/poRD0vD77 ASNaBzM13lLMPyrCX1CQPiCx45cmOm0F8lTxi6t9/7qAWBylosqXvXQOR2m5XY0B6R4c vnbA== X-Gm-Message-State: AOJu0Yxtx0MoiVs4IslSKs6q1jFWHQ90R6Fl3UaQx1NaMcshw0wlceug VrIBfSmgDlfIm2o0nxC8OZ7jLmZ8K5xuQo8pbI4kt/AfW898mlXXIrC8lk8lBTrqg0IKJ1bc1oD 9JFbg X-Gm-Gg: Acq92OFHQcAGDgLcimsZ1aNH9OlzXHQGCbHIT7yAbg3gQkovlPiHcEFrmqU5R+e9Res olSKzeNTbGfUtsBhzHkG3pyF9f4zOO+TB9zXZ8v3wPXWGhREqYMzGrEsbc7hn0LPjt0jUI6r2N+ FI1ikIG+UPKZBAtsymbzUXN7d+WEFt1QM8vQeHH1lo2EChrliQPDAh8n36mVb/5HysIcSLrRkFj araqdExI+Q/vRVELYd5ZFVnN3bZ1NF/qLt9IYF0DO7XwAvYdR3TIdemFnbcVVtzBKvknNxg+kp7 kYWk+UwWP+exSkda/LbULJjB7ePkAhetuXJuBCSuW0SsV8z5VTPQ5IsyEVPkvASrfVVgQw4aOy5 EoEothSdhLMfkf826Pji5RRox2BjKO3DTB7DVGeNQ5PYL3UbVfnO/ViVBKNYvjq53hhYeozRW+f /IXYf+FDugRVgF4Sc3cJI8AGLP0J2ifoxmRvX1tOgLdJgUG00cf7o= X-Received: by 2002:a05:6830:4129:b0:7db:f286:18ee with SMTP id 46e09a7af769-7e3f0b98627mr3112818a34.4.1778784634121; Thu, 14 May 2026 11:50:34 -0700 (PDT) Received: from [172.16.4.67] (75-163-70-225.omah.qwest.net. [75.163.70.225]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e3f4045e0csm2247644a34.25.2026.05.14.11.50.32 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 14 May 2026 11:50:33 -0700 (PDT) Message-ID: Date: Thu, 14 May 2026 13:50:32 -0500 List-Id: Binary package management and package tools discussion List-Archive: https://lists.freebsd.org/archives/freebsd-pkg List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-freebsd-pkg@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: pkg-be-plugin: auto-create ZFS boot environments before pkg transactions To: freebsd-pkg@freebsd.org References: <1733843605.178.1778759999712@localhost> Content-Language: en-US From: Sasha Karcz Autocrypt: addr=sasha@starnix.net; keydata= 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 In-Reply-To: <1733843605.178.1778759999712@localhost> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------bW0FT9dhnISiMhWcWFOXk6U3" X-Spamd-Result: default: False [-5.86 / 15.00]; SIGNED_PGP(-2.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_MEDIUM(-0.99)[-0.993]; NEURAL_HAM_SHORT(-0.96)[-0.964]; DMARC_POLICY_ALLOW(-0.50)[starnix.net,quarantine]; R_SPF_ALLOW(-0.20)[+ip6:2607:f8b0:4864::/56]; R_DKIM_ALLOW(-0.20)[starnix.net:s=google]; MIME_GOOD(-0.20)[multipart/signed,multipart/mixed,multipart/alternative,text/plain]; MIME_UNKNOWN(0.10)[application/pgp-keys]; MIME_BASE64_TEXT(0.10)[]; HAS_ATTACHMENT(0.00)[]; FROM_HAS_DN(0.00)[]; RCVD_TLS_LAST(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; ARC_NA(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; DKIM_TRACE(0.00)[starnix.net:+]; RCVD_VIA_SMTP_AUTH(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:+,3:+,4:+,5:~,6:~,7:~]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; TO_DN_NONE(0.00)[]; MLMMJ_DEST(0.00)[freebsd-pkg@freebsd.org]; PREVIOUSLY_DELIVERED(0.00)[freebsd-pkg@freebsd.org]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::336:from] X-Spamd-Bar: ----- X-Rspamd-Queue-Id: 4gGfXs1yVbz443h This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------bW0FT9dhnISiMhWcWFOXk6U3 Content-Type: multipart/mixed; boundary="------------ex2NFteAASHiHAzi8QcUhnH7"; protected-headers="v1"; hp="clear" Message-ID: Date: Thu, 14 May 2026 13:50:32 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: pkg-be-plugin: auto-create ZFS boot environments before pkg transactions To: freebsd-pkg@freebsd.org References: <1733843605.178.1778759999712@localhost> Content-Language: en-US From: Sasha Karcz Autocrypt: addr=sasha@starnix.net; keydata= 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 In-Reply-To: <1733843605.178.1778759999712@localhost> --------------ex2NFteAASHiHAzi8QcUhnH7 Content-Type: multipart/mixed; boundary="------------73G9mW0Myn3x2biKm0tgVs8P" --------------73G9mW0Myn3x2biKm0tgVs8P Content-Type: multipart/alternative; boundary="------------8Rkq1EM0jetSbUb0MYdFDANb" --------------8Rkq1EM0jetSbUb0MYdFDANb Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 SGkhDQoNCg0KVGhhbmtzIGZvciB0aGUgcXVpY2sgZmVlZGJhY2shIEkgd2FzIHRoaW5raW5n IG9mIGFkZGluZyB0byB0aGUgcG9ydHMgDQpjb2xsZWN0aW9uIGFmdGVyIG1vcmUgZXllcyBn ZXQgb24gaXQsIGJ1dCBtYXliZSB0aGUgd2F5IHRvIGdldCBtb3JlIGV5ZXMgDQpvbiBpdCBp cyB0byBhZGQgaXQgdG8gdGhlIHBvcnRzIGNvbGxlY3Rpb24uDQoNCg0KSSB3aWxsIHdvcmsg b24gYSBQUiBmb3IgdGhhdCA6KQ0KDQoNCi1TYXNoYQ0KDQpPbiA1LzE0LzI2IDY6NTkgQU0s IFJvbmFsZCBLbG9wIHdyb3RlOg0KPiBMb29rcyB1c2VmdWwhDQo+DQo+IEFyZSB5b3UgcGxh bm5pbmcgdG8gY3JlYXRlIGEgcG9ydCBmb3IgdGhpcz8NCj4NCj4gUmVnYXJkcywNCj4gUm9u YWxkLg0KPg0KPiAqVmFuOiogU2FzaGEgS2FyY3ogPHNhc2hhQHN0YXJuaXgubmV0Pg0KPiAq RGF0dW06KiBkb25kZXJkYWcsIDE0IG1laSAyMDI2IDA3OjMwDQo+ICpBYW46KiBmcmVlYnNk LXBrZ0BmcmVlYnNkLm9yZw0KPiAqT25kZXJ3ZXJwOiogcGtnLWJlLXBsdWdpbjogYXV0by1j cmVhdGUgWkZTIGJvb3QgZW52aXJvbm1lbnRzIGJlZm9yZSANCj4gcGtnIHRyYW5zYWN0aW9u cw0KPg0KPiAgICAgSGVsbG8sDQo+DQo+ICAgICBJJ3ZlIHdyaXR0ZW4gYSBwa2coOCkgcGx1 Z2luIHRoYXQgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgWkZTIGJvb3QNCj4gICAgIGVudmly b25tZW50IGJlZm9yZSBlYWNoIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCBkZWluc3RhbGwNCj4g ICAgIHRyYW5zYWN0aW9uLiBJZiBhIHRyYW5zYWN0aW9uIGxlYXZlcyB0aGUgc3lzdGVtIGlu IGEgYnJva2VuIHN0YXRlLA0KPiAgICAgdGhlIHByZS10cmFuc2FjdGlvbiBCRSBpcyB0aGVy ZSB0byBib290IGludG8uDQo+DQo+ICAgICBUaGUgcGx1Z2luIGlzIGNhbGxlZCBwa2ctYmUt cGx1Z2luIGFuZCBpbnN0YWxscyBhcyBiZS5zby4gSXQgdXNlcw0KPiAgICAgbGliYmUoMykg ZGlyZWN0bHkg4oCUIG5vIGV4ZWMgb2YgYmVjdGwoOCkgb3IgemZzKDgpLg0KPg0KPiAgICAg KkJlaGF2aW91cioNCj4NCj4gICAgIE9uIGVhY2ggY292ZXJlZCB0cmFuc2FjdGlvbiwgdGhl IHBsdWdpbiBjYWxscyB8bGliYmVfaW5pdCgpfCBhbmQNCj4gICAgIHxiZV9jcmVhdGUoKXwg dG8gc25hcHNob3QgdGhlIGN1cnJlbnQgQkUgdW5kZXIgYSB0aW1lc3RhbXBlZCBuYW1lDQo+ ICAgICAoZGVmYXVsdCBwcmVmaXg6IHxwcmUtcGtnfCwgZS5nLiB8cHJlLXBrZy0yMDI2MDUx NC0wOTE1MzJ8KS4gQWZ0ZXINCj4gICAgIGNyZWF0aW9uLCBpdCBwcnVuZXMgb2xkZXIgYXV0 by1jcmVhdGVkIEJFcyB0byBrZWVwIHRoZSBjb3VudCBhdCBvcg0KPiAgICAgYmVsb3cgYSBj b25maWd1cmFibGUgbGltaXQsIHdpdGggYSBtaW5pbXVtLWFnZSBndWFyZCBzbyByZWNlbnQN Cj4gICAgIHJvbGxiYWNrIHBvaW50cyBhcmVuJ3QgZGVzdHJveWVkIGV2ZW4gd2hlbiBvdmVy IHRoZSBsaW1pdC4NCj4NCj4gICAgIEFsbCBhY3Rpdml0eSBpcyBsb2dnZWQgdG8gc3lzbG9n KDMpIGF0IExPR19OT1RJQ0UgZm9yIG5vcm1hbA0KPiAgICAgb3BlcmF0aW9ucyBhbmQgTE9H X1dBUk5JTkcvTE9HX0VSUiBmb3IgZmFpbHVyZXMsIHNvIGFkbWlucyBjYW4NCj4gICAgIGdy ZXAgfC92YXIvbG9nL21lc3NhZ2VzfCB0byBmaW5kIEJFIG5hbWVzIGZvciByb2xsYmFjayBh ZnRlciBhIGJhZA0KPiAgICAgdHJhbnNhY3Rpb24uDQo+DQo+ICAgICAqQ29uZmlndXJhdGlv biogKHZpYSB8L3Vzci9sb2NhbC9ldGMvcGtnL2JlLmNvbmZ8LCBVQ0wgZm9ybWF0KQ0KPg0K PiAgICAgICAqIHxCRV9QTFVHSU5fRU5BQkxFRHwg4oCUIG1hc3RlciBzd2l0Y2ggKGRlZmF1 bHQ6IHRydWUpDQo+ICAgICAgICogfEJFX1BMVUdJTl9LRUVQfCDigJQgbWF4aW11bSBCRXMg dG8gcmV0YWluIChkZWZhdWx0OiA1KQ0KPiAgICAgICAqIHxCRV9QTFVHSU5fTkFNRV9QUkVG SVh8IOKAlCBuYW1lIHByZWZpeCAoZGVmYXVsdDogfHByZS1wa2d8KQ0KPiAgICAgICAqIHxC RV9QTFVHSU5fTUlOX0FHRXwg4oCUIG1pbmltdW0gYWdlIGJlZm9yZSBwcnVuaW5nIChkZWZh dWx0OiA3ZDsNCj4gICAgICAgICBwcm90ZWN0cyByZWNlbnQgcm9sbGJhY2sgcG9pbnRzIGZy b20gYmVpbmcgZGVzdHJveWVkIHdoZW4NCj4gICAgICAgICBjb3VudCBleGNlZWRzIEtFRVAp DQo+ICAgICAgICogfEJFX1BMVUdJTl9TVFJJQ1R8IOKAlCBhYm9ydCB0cmFuc2FjdGlvbiBv biBCRSBjcmVhdGlvbiBmYWlsdXJlDQo+ICAgICAgICAgKGRlZmF1bHQ6IGZhbHNlKQ0KPiAg ICAgICAqIHxCRV9QTFVHSU5fU0tJUF9UUkFOU0FDVElPTlN8IOKAlCBjb21tYS1zZXBhcmF0 ZWQgbGlzdCBvZg0KPiAgICAgICAgIHRyYW5zYWN0aW9uIHR5cGVzIHRvIHNraXAgKHxpbnN0 YWxsfCwgfHVwZ3JhZGV8LCB8ZGVpbnN0YWxsfCkNCj4NCj4gICAgICpOb24tWkZTIHN5c3Rl bXMqDQo+DQo+ICAgICB8bGliYmVfaW5pdCgpfCBmYWlscyBvbiBVRlMgcm9vdHMgYW5kIGlu IGphaWxzIHdpdGhvdXQgWkZTIGFjY2Vzcy4NCj4gICAgIEluIG5vbi1zdHJpY3QgbW9kZSAo dGhlIGRlZmF1bHQpIHRoaXMgaXMgbG9nZ2VkIGFzIGEgd2FybmluZyBhbmQNCj4gICAgIHRo ZSB0cmFuc2FjdGlvbiBwcm9jZWVkcyBub3JtYWxseS4gU3RyaWN0IG1vZGUgY2F1c2VzIGEN Cj4gICAgIGZhaWwtY2xvc2VkIGFib3J0LCB3aGljaCBtYXkgYmUgYXBwcm9wcmlhdGUgZm9y IFpGUy1vbmx5IGZsZWV0cy4NCj4NCj4gICAgICpUZXN0aW5nKg0KPg0KPiAgICAgVGVzdGVk IG9uIEZyZWVCU0QgMTUuMC1SRUxFQVNFLXA1IHdpdGggdGhlDQo+ICAgICBpbnN0YWxsL3Vw Z3JhZGUvZGVpbnN0YWxsIHRyYW5zYWN0aW9uIHR5cGVzLCBpbmNsdWRpbmcNCj4gICAgIG11 bHRpLXBhY2thZ2UgdHJhbnNhY3Rpb25zLCB0aGUgcHJ1bmUgcGF0aCAob3Zlci1LRUVQIGFu ZA0KPiAgICAgdW5kZXItbWluLWFnZSBzY2VuYXJpb3MpLCBhbmQgc3RyaWN0LW1vZGUgYmVo YXZpb3VyLiBVbml0IHRlc3RzDQo+ICAgICBjb3ZlciB0aGUgY29uZmlnIHBhcnNlciBhbmQg cHJ1bmUgc29ydC9maWx0ZXIgbG9naWMuDQo+DQo+ICAgICAqU291cmNlKg0KPg0KPiAgICAg aHR0cHM6Ly9naXRodWIuY29tL3VzZW5peDE3L3BrZy1iZS1wbHVnaW4NCj4gICAgIDxodHRw czovL2dpdGh1Yi5jb20vdXNlbml4MTcvcGtnLWJlLXBsdWdpbj4NCj4NCj4gICAgIEZlZWRi YWNrIHdlbGNvbWUuIFNwZWNpZmljIHRoaW5ncyBJJ2QgYXBwcmVjaWF0ZSBleWVzIG9uOg0K Pg0KPiAgICAgIDEuICpwa2cgcGx1Z2luIEFQSSB1c2FnZSog4oCUIHBhcnRpY3VsYXJseSB0 aGUgaG9vayBsaWZlY3ljbGUgKGluaXQNCj4gICAgICAgICBtdWx0aXBsZSBob29rcyBzaHV0 ZG93bikgYW5kIHdoZXRoZXINCj4gICAgICAgICB8UEtHX1BMVUdJTl9IT09LX1BSRV97SU5T VEFMTCxVUEdSQURFLERFSU5TVEFMTH18IGFyZSB0aGUNCj4gICAgICAgICByaWdodCBob29r cyBmb3IgdGhpcyBwdXJwb3NlLCBvciB3aGV0aGVyIHRoZXJlJ3MgYQ0KPiAgICAgICAgIGxl c3Mtc3VycHJpc2luZyBwbGFjZSB0byBkbyBCRSBjcmVhdGlvbi4NCj4gICAgICAyLiAqbGli YmUgbnZsaXN0IHByb3BlcnR5IGFjY2Vzcyog4oCUIHRoZSB8Y3JlYXRpb258IHByb3BlcnR5 IGlzDQo+ICAgICAgICAgc3RvcmVkIGFzIGEgc3RyaW5nIG9mIGRlY2ltYWwgVW5peCBlcG9j aCBzZWNvbmRzIHJhdGhlciB0aGFuIGENCj4gICAgICAgICB1aW50NjQuIEkgd29ya2VkIHRo aXMgb3V0IHZpYSBpbnRlZ3JhdGlvbiB0ZXN0aW5nOyBpZiB0aGlzIGlzDQo+ICAgICAgICAg ZG9jdW1lbnRlZCBzb21ld2hlcmUgSSBtaXNzZWQsIHBvaW50ZXJzIHdlbGNvbWUuDQo+ICAg ICAgMy4gKlBydW5lIHNlbWFudGljcyog4oCUIGN1cnJlbnRseSB0aGUgY291bnQgY2FuIGRy aWZ0IGFib3ZlIHxLRUVQfA0KPiAgICAgICAgIGlmIGFsbCBjYW5kaWRhdGUgQkVzIGFyZSB1 bmRlciB8TUlOX0FHRXwuIFRyYWRlLW9mZiBjaG9zZW4gZm9yDQo+ICAgICAgICAgdGhlIGhv bWVsYWItZnJpZW5kbHkgIm5ldmVyIGRlc3Ryb3kgYSByZWNlbnQgcm9sbGJhY2siDQo+ICAg ICAgICAgcHJvcGVydHkuIElmIGxpc3QgY29uc2Vuc3VzIHByZWZlcnMgc3RyaWN0LWNvdW50 IGVuZm9yY2VtZW50LA0KPiAgICAgICAgIHRoZSBwb2xpY3kgaXMgYSBvbmUtbGluZSBjaGFu Z2UuDQo+DQo+ICAgICBTYXNoYSBLYXJjeg0KPg0KPg0K --------------8Rkq1EM0jetSbUb0MYdFDANb Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

Hi!


Thanks for the quick feedback! I was thinking of adding to the ports collection after more eyes get on it, but maybe the way to get more eyes on it is to add it to the ports collection.=C2=A0

=


I will work on a PR for that :)


-Sasha

On 5/14/26 6:59 AM, Ronald Klop wrote:=
Looks useful!

Are you planning to create a port for this?

Regards,
Ronald.

=C2=A0

Van: Sasha Karcz <sasha@starnix.net>
Datum: donderdag, 14 mei 2026 07:30
Aan: freebsd-pkg@freebsd.org
Onderwerp: pkg-be-plugin: auto-create ZFS boot environments before pkg transactions

Hello,

I've written a pkg(8) plugin that automatically creates a ZFS boot environment before each install, upgrade, and deinstall transaction. If a transaction leaves the system in a broken state, the pre-transaction BE is there to boot into.

The plugin is called pkg-be-plugin and installs as be.so. It uses libbe(3) directly =E2=80=94 no exec = of bectl(8) or zfs(8).

Behaviour

On each covered transaction, the plugin calls libbe_in= it() and be_creat= e() to snapshot the current BE under a timestamped name (default prefix: pre-pkg<= /code>, e.g. pre-pkg-= 20260514-091532). After creation, it prunes older auto-created BEs to keep the count at or below a configurable limit, with a minimum-age guard so recent rollback points aren't destroyed even when over the limit.

All activity is logged to syslog(3) at LOG_NOTICE for normal operations and LOG_WARNING/LOG_ERR for failures, so admins can grep /var/log= /messages to find BE names for rollback after a bad transaction.

Configuration (via /usr/loc= al/etc/pkg/be.conf, UCL format)

  • BE_PLUGI= N_ENABLED =E2=80=94 master switch (default: true)
  • BE_PLUGI= N_KEEP =E2=80=94 maximum BEs to retain (default: 5)
  • =
  • BE_PLUGI= N_NAME_PREFIX =E2=80=94 name prefix (default: pre-pkg<= /code>)
  • BE_PLUGI= N_MIN_AGE =E2=80=94 minimum age before pruning (default: 7d= ; protects recent rollback points from being destroyed when count exceeds KEEP)
  • BE_PLUGI= N_STRICT =E2=80=94 abort transaction on BE creation failur= e (default: false)
  • BE_PLUGI= N_SKIP_TRANSACTIONS =E2=80=94 comma-separated list of transaction typ= es to skip (install<= /code>, upgrade<= /code>, deinstal= l)

Non-ZFS systems

libbe_in= it() fails on UFS roots and in jails without ZFS access. In non-strict mode (the default) this is logged as a warning and the transaction proceeds normally. Strict mode causes a fail-closed abort, which may be appropriate for ZFS-only fleets.

Testing

Tested on FreeBSD 15.0-RELEASE-p5 with the install/upgrade/deinstall transaction types, including multi-package transactions, the prune path (over-KEEP and under-min-age scenarios), and strict-mode behaviour. Unit tests cover the config parser and prune sort/filter logic.

Source

https://github.com/useni= x17/pkg-be-plugin

Feedback welcome. Specific things I'd appreciate eyes on:

  1. pkg plugin API usage =E2=80=94 particularl= y the hook lifecycle (init multiple hooks shutdown) and whether PKG_PLUG= IN_HOOK_PRE_{INSTALL,UPGRADE,DEINSTALL} are the right hooks for this purpose, or whether there's a less-surprising place to do BE creation.
  2. libbe nvlist property access =E2=80=94 the <= code class=3D"bg-text-200/5 border border-0.5 border-border-300 text-danger-00= 0 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">creation= property is stored as a string of decimal Unix epoch seconds rather than a uint64. I worked this out via integration testing; if this is documented somewhere I missed, pointers welcome.<= /li>
  3. Prune semantics =E2=80=94 currently the coun= t can drift above KEEP if all candidate BEs are under MIN_AGE<= /code>. Trade-off chosen for the homelab-friendly "never destroy a recent rollback" property. If list consensus prefers strict-count enforcement, the policy is a one-line change.

Sasha Karcz

=C2=A0
=C2=A0

=C2=A0
--------------8Rkq1EM0jetSbUb0MYdFDANb-- --------------73G9mW0Myn3x2biKm0tgVs8P Content-Type: application/pgp-keys; name="OpenPGP_0x5B87F629EFFCBF51_and_old_rev.asc" Content-Disposition: attachment; filename="OpenPGP_0x5B87F629EFFCBF51_and_old_rev.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- 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 q37/cnVcsMc=3D =3Dqvvj -----END PGP PUBLIC KEY BLOCK----- --------------73G9mW0Myn3x2biKm0tgVs8P-- --------------ex2NFteAASHiHAzi8QcUhnH7-- --------------bW0FT9dhnISiMhWcWFOXk6U3 Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature.asc" -----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEEW9tJcFXjBvf+7cvXW4f2Ke/8v1EFAmoGGXgFAwAAAAAACgkQW4f2Ke/8v1Ex 6BAAgiM2DWE2kDovQRqz18MharTBiuLVqrIsi50nxcI3usuonMvl70v/c3PgCihbsoi1UgzKJaPp aeBZNfU+LGg6K9zMH7YkNFp7J5l/Sd8Kjn9y9e3SUM/s5lGvxXJ5bQmiRMr9+W/qwM6wS7WKSwUG Zdk2GDvqoiuWZuaGhI0PY0i3cghZmy+CRMgMowdC36pOkR4CDFkgmnw3MuXQoudBQUlvMOpWzs4W czhXv5nF4mCiUPiAQGnIJ1uxfl2HgHd7sRnWGlnZ6A5N01h7t5Q6d3vsYZA54aWCzvq64iRLF66e b0E2a6b0yugFEfABCYZjGTDDqPNGFzMrtUO9CdTEyCVN2nqp9bqJ5Zyr/hkIEzYH7WQOEkyr6nVV Jfzl4eRz4dV9904ScimEdL5gbfkKQXPnzWVItumlR/JQ98yIMhuzB0Fa4zIijbT3dtpzVh5HT+Rx 5UMzmkKpHG6RReD68rwT0g+p5PWGV0dlbsFPfS8YrrVGZ+DAlvwfkunsaWIj5e/AXNqNn0Kx1EhG OASBEft7t+3ZZJuXtrE1inf3XZEniifywVr1sux/p6vRTWJ66ekKj7TmBQkWFsRThQUk/YR1vQXb 81IJG2VZqneJ9HJdCMWQYDtBFh+uN6JKlsMHmklz02rmoyYDuepjOpJGuXQnUhH87nNOQBooIEM+ +FM= =0UAM -----END PGP SIGNATURE----- --------------bW0FT9dhnISiMhWcWFOXk6U3--