mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-05-27 10:44:33 +00:00
upgrades: Add augeas lens for Deb822 apt sources
Helps #214. Tests: - Augeas lens tests passed using augparse. Signed-off-by: James Valleroy <jvalleroy@mailbox.org> [sunil: Fix issue with not being able write back with lens] [sunil: Parse single/multi field values based on man page] [sunil: Allow creating multi field values by adding \n at the end of the value] [sunil: Add documentation and make ready for upstream submission] Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org> Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
This commit is contained in:
parent
3fac4f55fe
commit
cd21c7f247
@ -0,0 +1,104 @@
|
|||||||
|
(*
|
||||||
|
Module: Aptsources822
|
||||||
|
Augeas module for souces list (Deb822 style) for Apt package manager
|
||||||
|
|
||||||
|
Authors:
|
||||||
|
James Valleroy <jvalleroy@mailbox.org>
|
||||||
|
Sunil Mohan Adapa <sunil@medhas.org>
|
||||||
|
|
||||||
|
About: Reference
|
||||||
|
1. Deb822(5):
|
||||||
|
https://manpages.debian.org/bullseye/dpkg-dev/deb822.5.en.html
|
||||||
|
2. sources.list(5):
|
||||||
|
https://manpages.debian.org/bullseye/apt/sources.list.5.en.html
|
||||||
|
|
||||||
|
About: License
|
||||||
|
This file is licensed under the LGPLv2+, like the rest of Augeas.
|
||||||
|
|
||||||
|
About: Configuration files
|
||||||
|
This lens applies to files in /etc/apt/sources.list.d/ ending with the
|
||||||
|
extension .sources. See <filter>.
|
||||||
|
|
||||||
|
*)
|
||||||
|
|
||||||
|
|
||||||
|
module Aptsources822 =
|
||||||
|
|
||||||
|
autoload xfm
|
||||||
|
|
||||||
|
(* Variable: single_value_field_name
|
||||||
|
Names of known fields for which only a single value is allowed. *)
|
||||||
|
let single_value_field_name = /(Enabled|PDiffs|By-Hash|Allow-Insecure|Allow-Weak|Allow-Downgrade-To-Insecure|Trusted|Check-Valid-Until|Valid-Until-Min|Valid-Until-Max|Check-Date|Date-Max-Future|InRelease-Path)/
|
||||||
|
|
||||||
|
(* Variable: multi_value_field_name
|
||||||
|
Names of known fields for which multiple values are allowed and names of
|
||||||
|
unknown fields. Unknown fields are assumed to contain multiple values as
|
||||||
|
that is the safest assumption.
|
||||||
|
|
||||||
|
According to deb822(5) man page, "The field name is composed of US-ASCII
|
||||||
|
characters excluding control characters, space, and colon (i.e., characters
|
||||||
|
in the ranges U+0021 ‘!’ through U+0039 ‘9’, and U+003B ‘;’ through U+007E
|
||||||
|
‘~’, inclusive). Field names must not begin with the comment character
|
||||||
|
(U+0023 ‘#’), nor with the hyphen character (U+002D ‘-’)." *)
|
||||||
|
let multi_value_field_name = /[!"$-,.-9;-~][!-9;-~]*/ - single_value_field_name
|
||||||
|
|
||||||
|
(* Variable: field_value
|
||||||
|
Value that a field can contain. Deb822 styles sources list files defines some
|
||||||
|
fields to have multiple values separated by space, tab or a newline. *)
|
||||||
|
let field_value = /[!-Z\\^-~][!-Z\\^-~]*/
|
||||||
|
|
||||||
|
(* Variable: empty_line
|
||||||
|
Lens for an empty line separating two stanzas. It can't be a comment. Only
|
||||||
|
tabs and spaces are allowed. *)
|
||||||
|
let empty_line = Util.empty_generic /[ \t]*/
|
||||||
|
|
||||||
|
(* Variable: name_value_separator
|
||||||
|
Lens for separating a name and value. Field name is followed by a ':' and
|
||||||
|
then optionally space. The file format also allow for a value to be on a
|
||||||
|
new line when the new line starts with space or a tab. *)
|
||||||
|
let name_value_separator = Sep.colon . del (Rx.opt_space . /(\n[ \t])?/) " "
|
||||||
|
|
||||||
|
(* Variable: field_value_with_newline
|
||||||
|
Lens for value that followed by a new line and a space. This indicates that
|
||||||
|
another value follows it. *)
|
||||||
|
let field_value_with_newline = [seq "item" . store (field_value . /\n/) .
|
||||||
|
del /[\t ]/ " "]
|
||||||
|
|
||||||
|
(* Variable: field_value_with_separator
|
||||||
|
Lens for value that followed by a space or a tab. This indicates that another
|
||||||
|
value follows it. *)
|
||||||
|
let field_value_with_separator = [seq "item" . store field_value . del Rx.space " "]
|
||||||
|
|
||||||
|
(* Variable: field_value_with_eol
|
||||||
|
Lens for value that followed by an end-of-line. This indicates that this is
|
||||||
|
the last value for this field. *)
|
||||||
|
let field_value_with_eol = [seq "item" . store field_value . Util.eol]
|
||||||
|
|
||||||
|
(* Variable: single_value_field
|
||||||
|
Lens for a field (field name, separator and field value) with only a single
|
||||||
|
value. *)
|
||||||
|
let single_value_field = [ key single_value_field_name . name_value_separator .
|
||||||
|
store field_value . Util.eol ]
|
||||||
|
|
||||||
|
(* Variable: multi_value_field
|
||||||
|
Lens for a field (field name, separator and field value) with multiple values
|
||||||
|
*)
|
||||||
|
let multi_value_field = [ key multi_value_field_name . name_value_separator .
|
||||||
|
counter "item" . (field_value_with_newline | field_value_with_separator)* .
|
||||||
|
field_value_with_eol ]
|
||||||
|
|
||||||
|
(* Variable: stanza
|
||||||
|
Lens for a stanza that describes one or more sources for apt. *)
|
||||||
|
let stanza = [ seq "source" . (single_value_field | multi_value_field |
|
||||||
|
Util.comment_noindent)+ ]
|
||||||
|
|
||||||
|
(* Variable: lns
|
||||||
|
Lens for parsing the entire apt sources file in Deb822 format. *)
|
||||||
|
let lns = stanza . (empty_line . stanza)*
|
||||||
|
|
||||||
|
(* Variable: filter
|
||||||
|
All files in the sources.list.d directory are files describing sources.
|
||||||
|
However, only those ending with .sources extension are in Deb822 format. *)
|
||||||
|
let filter = incl "/etc/apt/sources.list.d/*.sources"
|
||||||
|
|
||||||
|
let xfm = transform lns filter
|
||||||
@ -0,0 +1,120 @@
|
|||||||
|
module Test_Aptsources822 =
|
||||||
|
|
||||||
|
(* Test multiple values, multi-line values and multiple source stanzas *)
|
||||||
|
let sources1 = "Enabled: yes
|
||||||
|
Types: deb deb-src
|
||||||
|
URIs: http://deb.debian.org/debian
|
||||||
|
Suites: bullseye
|
||||||
|
bullseye-backports
|
||||||
|
Components: main non-free-firmware
|
||||||
|
Allow-Insecure: no
|
||||||
|
Signed-By:
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
.
|
||||||
|
mDMEYCQjIxYJKwYBBAHaRw8BAQdAD/P5Nvvnvk66SxBBHDbhRml9ORg1WV5CvzKY
|
||||||
|
CuMfoIS0BmFiY2RlZoiQBBMWCgA4FiEErCIG1VhKWMWo2yfAREZd5NfO31cFAmAk
|
||||||
|
IyMCGyMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQREZd5NfO31fbOwD6ArzS
|
||||||
|
dM0Dkd5h2Ujy1b6KcAaVW9FOa5UNfJ9FFBtjLQEBAJ7UyWD3dZzhvlaAwunsk7DG
|
||||||
|
3bHcln8DMpIJVXht78sL
|
||||||
|
=IE0r
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
Enabled: no
|
||||||
|
URIs: http://dl.google.com/linux/chrome/deb
|
||||||
|
Suites: stable
|
||||||
|
Components: main
|
||||||
|
Architectures: amd64
|
||||||
|
"
|
||||||
|
test Aptsources822.lns get sources1 =
|
||||||
|
{ "1"
|
||||||
|
{ "Enabled" = "yes" }
|
||||||
|
{ "Types"
|
||||||
|
{ "1" = "deb" }
|
||||||
|
{ "2" = "deb-src" }
|
||||||
|
}
|
||||||
|
{ "URIs" { "1" = "http://deb.debian.org/debian" } }
|
||||||
|
{ "Suites"
|
||||||
|
{ "1" = "bullseye\n" }
|
||||||
|
{ "2" = "bullseye-backports" }
|
||||||
|
}
|
||||||
|
{ "Components"
|
||||||
|
{ "1" = "main" }
|
||||||
|
{ "2" = "non-free-firmware" }
|
||||||
|
}
|
||||||
|
{ "Allow-Insecure" = "no" }
|
||||||
|
{ "Signed-By"
|
||||||
|
{ "1" = "-----BEGIN" }
|
||||||
|
{ "2" = "PGP" }
|
||||||
|
{ "3" = "PUBLIC" }
|
||||||
|
{ "4" = "KEY" }
|
||||||
|
{ "5" = "BLOCK-----\n" }
|
||||||
|
{ "6" = ".\n" }
|
||||||
|
{ "7" = "mDMEYCQjIxYJKwYBBAHaRw8BAQdAD/P5Nvvnvk66SxBBHDbhRml9ORg1WV5CvzKY\n" }
|
||||||
|
{ "8" = "CuMfoIS0BmFiY2RlZoiQBBMWCgA4FiEErCIG1VhKWMWo2yfAREZd5NfO31cFAmAk\n" }
|
||||||
|
{ "9" = "IyMCGyMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQREZd5NfO31fbOwD6ArzS\n" }
|
||||||
|
{ "10" = "dM0Dkd5h2Ujy1b6KcAaVW9FOa5UNfJ9FFBtjLQEBAJ7UyWD3dZzhvlaAwunsk7DG\n" }
|
||||||
|
{ "11" = "3bHcln8DMpIJVXht78sL\n" }
|
||||||
|
{ "12" = "=IE0r\n" }
|
||||||
|
{ "13" = "-----END" }
|
||||||
|
{ "14" = "PGP" }
|
||||||
|
{ "15" = "PUBLIC" }
|
||||||
|
{ "16" = "KEY" }
|
||||||
|
{ "17" = "BLOCK-----" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{ }
|
||||||
|
{ "2"
|
||||||
|
{ "Enabled" = "no" }
|
||||||
|
{ "URIs" { "1" = "http://dl.google.com/linux/chrome/deb" } }
|
||||||
|
{ "Suites" { "1" = "stable" } }
|
||||||
|
{ "Components" { "1" = "main" } }
|
||||||
|
{ "Architectures" { "1" = "amd64" } }
|
||||||
|
}
|
||||||
|
|
||||||
|
let sources2 = "Enabled: yes
|
||||||
|
Types: deb deb-src
|
||||||
|
URIs: http://archive.ubuntu.com/ubuntu
|
||||||
|
Suites: disco disco-updates disco-security disco-backports
|
||||||
|
Components: main universe multiverse restricted
|
||||||
|
|
||||||
|
Enabled: yes
|
||||||
|
Types: deb
|
||||||
|
URIs: http://ppa.launchpad.net/system76/pop/ubuntu
|
||||||
|
Suites: disco
|
||||||
|
Components: main
|
||||||
|
"
|
||||||
|
test Aptsources822.lns get sources2 =
|
||||||
|
{ "1"
|
||||||
|
{ "Enabled" = "yes" }
|
||||||
|
{ "Types"
|
||||||
|
{ "1" = "deb" }
|
||||||
|
{ "2" = "deb-src" }
|
||||||
|
}
|
||||||
|
{ "URIs" { "1" = "http://archive.ubuntu.com/ubuntu" } }
|
||||||
|
{ "Suites"
|
||||||
|
{ "1" = "disco" }
|
||||||
|
{ "2" = "disco-updates" }
|
||||||
|
{ "3" = "disco-security" }
|
||||||
|
{ "4" = "disco-backports" }
|
||||||
|
}
|
||||||
|
{ "Components"
|
||||||
|
{ "1" = "main" }
|
||||||
|
{ "2" = "universe" }
|
||||||
|
{ "3" = "multiverse" }
|
||||||
|
{ "4" = "restricted" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{ }
|
||||||
|
{ "2"
|
||||||
|
{ "Enabled" = "yes" }
|
||||||
|
{ "Types" { "1" = "deb" } }
|
||||||
|
{ "URIs" { "1" = "http://ppa.launchpad.net/system76/pop/ubuntu" } }
|
||||||
|
{ "Suites" { "1" = "disco" } }
|
||||||
|
{ "Components" { "1" = "main" } }
|
||||||
|
}
|
||||||
|
|
||||||
|
(* Test adding nodes to tree *)
|
||||||
|
test Aptsources822.lns put "Types: deb\n" after set "/1/Enabled" "yes" = "Types: deb\nEnabled: yes\n"
|
||||||
|
test Aptsources822.lns put "Types: deb\n" after
|
||||||
|
set "/1/URIs/1" "uri1\n";
|
||||||
|
set "/1/URIs/2" "uri2" = "Types: deb\nURIs: uri1\n uri2\n"
|
||||||
Loading…
x
Reference in New Issue
Block a user