I'm working on adding static (predictable) dhcp records to libvirt guests (code at the end). It seems like I might need to either do the equivalent of
virsh net-update default delete ip-dhcp-host "<host mac='52:54:00:f0:62:01'/>" --config --live || /bin/true
virsh net-update default add ip-dhcp-host "<host mac='52:54:00:f0:62:01' ip='192.168.122.32'/>" --config --live
or parse the xml output of "virsh net-dumpxml". Is there some simple lightweight xml parsing option? Last time I tried something like this was a decade ago using HXT.Arrow, which didn't really end well.
staticDHCP :: Host -> IPAddr -> Maybe Network.Gateway -> Property UnixLike
staticDHCP h ip gw = property "assign ip to host via dhcp" $ do
mac <- liftIO $ macAddress
case mac of
Nothing -> errorMessage "no interface"
Just addr -> makeChange $ unlessM (updateIt addr) $
errorMessage "failed to update network"
where
updateIt mac = boolSystem "virsh" [ Param "net-update"
, Param "default"
, Param "add-last"
, Param "ip-dhcp-host"
, Param $ "<host mac=\""++mac++"\" ip=\""++(ifaceToString ip)++"\"/>"
, Param "--config"
, Param "--live"]
ifaceToString (IPv6 ipstr) = ipstr
ifaceToString (IPv4 ipstr) = ipstr
macAddress = do
ifaces <- virshGetColumns ["domiflist", hostName h]
case ifaces of
[] -> return Nothing
(i:_) -> return $ Just $ Propellor.Base.last i
The former seems easier than parsing the XML.
I mean, aeson is quite good and easy to parse XML with, but I prefer to keep propellor's haskell dependencies minimal and so if you used aeson there would be a big question about merging the result into propellor core.
gw
parameter is unused? What was that for?