The module from python3-toml is not a correct TOML implementation (at the moment at least) — it cannot handle triple-quoted strings.
That is a big problem for any includes in flavors that contain quotes, since trying to use triple quotes to avoid having to watch the quote type leads to broken data.
For example:
vyos_bld@17c979e9fa91:/vyos$ python3
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import toml
>>>
>>> with open('data/build-flavors/iso-test.toml', 'r') as f:
... s = f.read()
...
>>> print(s)
# Generic (aka "universal") ISO image
image_format = "iso"
# Include these packages in the image regardless of the architecture
packages = [
# QEMU and Xen guest tools exist for multiple architectures
"qemu-guest-agent",
"vyos-xe-guest-utilities",
]
[[includes_chroot]]
path = "opt/vyatta/etc/config/config.test"
data = '''
system {
host-name totally-not-vyos
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password ""
}
}
}
syslog {
global {
facility all {
level info
}
facility protocols {
level debug
}
}
}
ntp {
server "time1.vyos.net"
server "time2.vyos.net"
server "time3.vyos.net"
}
console {
device ttyS0 {
speed 115200
}
}
config-management {
commit-revisions 150
}
}
interfaces {
loopback lo {
}
}
'''
[architectures.amd64]
# Hyper-V and VMware guest tools are x86-only
packages = ["hyperv-daemons", "vyos-1x-vmware"]
>>> t = toml.loads(s)
>>> print(t["includes_chroot"][0]["data"]
... )
system {
host-name totally-not-vyos
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password """ }
}
}
syslog {
global {
facility all {
level info
}
facility protocols {
level debug
}
}
}
ntp {
server "time1.vyos.net"
server "time2.vyos.net"
server "time3.vyos.net"
}
console {
device ttyS0 {
speed 115200
}
}
config-management {
commit-revisions 150
}
}
interfaces {
loopback lo {
}
}As you can see, python3-toml thinks that the "" quote pair was supposed contains a stray quote and mangles the string:
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password """ }
}
}The good news is that python3-tomli works correctly and it's a more active project overall, and it has the same loads() interface.