Con Augeas, ¿cómo puedo modificar el valor de un atributo utilizando el valor actual?

Con Augeas, ¿cómo puedo modificar el valor de un atributo utilizando el valor actual?

Digamos que tengo algún archivo genérico de tipo INI, cubierto mejor por Samba.lns. Tengo una entrada como:

attribute = value

y quierotransformar valuea Some-VALUE-x. Para un ejemplo más concreto:

augtool> print /files/etc/yum.conf/main/cachedir
/files/etc/yum.conf/main/cachedir = "/var/cache/yum/$basearch/$releasever"

Y quiero cambiar el valor a:

"/var/cache/yum/noarch/$releasever"

Es decir, quiero reemplazar $basearchy noarchdejar el resto en paz. Mi ejemplo real es un poco más complejo. ¿Puedo incluso hacer esto dentro de augeas?

Respuesta1

No puedes hacer esto con una sola llamada a la API de Augeas, pero con aug_get y aug_set puedes hacerlo en el lenguaje de llamada. por ejemplo, usando ruby-augeas:

aug.set("/files/etc/yum.conf/main/cachedir", aug.get("/files/etc/yum.conf/main/cachedir").sub("$basearch", "noarch"))

Si está utilizando augtool según su ejemplo, en Shell podría hacer:

cachedir=$(augtool get /files/etc/yum.conf/main/cachedir | sed 's/$basearch/noarch/')
augtool set /files/etc/yum.conf/main/cachedir "$cachedir"

Respuesta2

La Shellvars_listlente original se acerca a proporcionarme lo que necesitaba.

Dado un archivo como

GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=vgroot/lvswap rd.lvm.lv=vgroot/lvroot"
GRUB_DISABLE_RECOVERY="true"

Quiero agregar valores arbitrarios de forma idempotente GRUB_CMDLINE_LINUX. Esta lente analiza este archivo de la siguiente manera:

augtool> print $v
/files/home/c14027/default-grub-sample
/files/home/c14027/default-grub-sample/GRUB_TIMEOUT
/files/home/c14027/default-grub-sample/GRUB_TIMEOUT/quote = ""
/files/home/c14027/default-grub-sample/GRUB_TIMEOUT/value = "5"
/files/home/c14027/default-grub-sample/GRUB_DEFAULT
/files/home/c14027/default-grub-sample/GRUB_DEFAULT/quote = ""
/files/home/c14027/default-grub-sample/GRUB_DEFAULT/value = "saved"
/files/home/c14027/default-grub-sample/GRUB_DISABLE_SUBMENU
/files/home/c14027/default-grub-sample/GRUB_DISABLE_SUBMENU/quote = ""
/files/home/c14027/default-grub-sample/GRUB_DISABLE_SUBMENU/value = "true"
/files/home/c14027/default-grub-sample/GRUB_TERMINAL_OUTPUT
/files/home/c14027/default-grub-sample/GRUB_TERMINAL_OUTPUT/quote = "\""
/files/home/c14027/default-grub-sample/GRUB_TERMINAL_OUTPUT/value = "console"
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX/quote = "\""
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX/value[1] = "crashkernel=auto"
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX/value[2] = "rd.lvm.lv=vgroot/lvsap"
/files/home/c14027/default-grub-sample/GRUB_CMDLINE_LINUX/value[3] = "rd.lvm.lv=vgroot/lvroot"
/files/home/c14027/default-grub-sample/GRUB_DISABLE_RECOVERY
/files/home/c14027/default-grub-sample/GRUB_DISABLE_RECOVERY/quote = "\""
/files/home/c14027/default-grub-sample/GRUB_DISABLE_RECOVERY/value = "true"

Haremos un defvarin augtool para que $vrepresente nuestro prefijo.

Agregue un nuevo valor a este CMDLINEparámetro:

set $v/GRUB_CMDLINE_LINUX/value[last()+1] test=142

Eliminar los existentes:

rm $v/GRUB_CMDLINE_LINUX/value[. =~ regexp("^test=.*")]

Reemplace el par de claves cuya clave es test=:

set $v/GRUB_CMDLINE_LINUX/value[. =~ regexp("^test=.*")] test=1234

información relacionada