@@ -30,6 +30,7 @@ import Data.Maybe
3030import Data.Int
3131import Data.Word
3232import Data.Bits
33+ import Data.List
3334import qualified Data.Map as M
3435import qualified Data.Text.Lazy as TL
3536import Text.Printf
@@ -150,26 +151,52 @@ getVmNameFromUuid uuid =
150151
151152
152153xsVifMac :: String -> String -> IO (Maybe String )
153- xsVifMac gDomid gDevid = xsRead $ printf " /local/domain/%s/device/vif/%s/mac" gDomid gDevid
154+ xsVifMac gDomid gDevid = do
155+ res <- xsRead $ printf " /local/domain/%s/device/vif/%s/mac" gDomid gDevid
156+ case res of
157+ Just _ -> return $ res
158+ Nothing -> xsRead $ printf " /local/domain/%s/device/vwif/%s/mac" gDomid gDevid
154159
155160xsVifRemove :: String -> String -> IO ()
156- xsVifRemove gDomid gDevid = xsRm $ printf " /local/domain/%s/device/vif/%s" gDomid gDevid
161+ xsVifRemove gDomid gDevid = do
162+ xsRm $ printf " /local/domain/%s/device/vif/%s" gDomid gDevid
163+ xsRm $ printf " /local/domain/%s/device/vwif/%s" gDomid gDevid
157164
158165xsBackendVifNode :: String -> String
159166xsBackendVifNode = printf " /local/domain/%s/backend/vif"
160167
168+ xsBackendVwifNode :: String -> String
169+ xsBackendVwifNode = printf " /local/domain/%s/backend/vwif"
170+
161171xsVifNetwork :: String -> String -> String -> IO (Maybe String )
162- xsVifNetwork domid devid backendDomid = xsRead $ printf " %s/%s/%s/bridge" (xsBackendVifNode backendDomid) domid devid
163- -- xsVifMac domid devid backendDomid = xsRead $ printf "%s/%s/%s/mac" (xsBackendVifNode backendDomid) domid devid
172+ xsVifNetwork domid devid backendDomid = do
173+ vif <- xsRead $ printf " %s/%s/%s/bridge" (xsBackendVifNode backendDomid) domid devid
174+ case vif of
175+ Just _ -> return $ vif
176+ Nothing -> xsRead $ printf " %s/%s/%s/bridge" (xsBackendVwifNode backendDomid) domid devid
164177
165178xsVifState :: String -> String -> String -> IO (Maybe String )
166- xsVifState domid devid backendDomid = xsRead $ printf " %s/%s/%s/state" (xsBackendVifNode backendDomid) domid devid
179+ xsVifState domid devid backendDomid = do
180+ vif <- xsRead $ printf " %s/%s/%s/state" (xsBackendVifNode backendDomid) domid devid
181+ case vif of
182+ Just _ -> return $ vif
183+ Nothing -> xsRead $ printf " %s/%s/%s/state" (xsBackendVwifNode backendDomid) domid devid
167184
168185xsVifFrontend :: String -> String -> String -> IO (Maybe String )
169- xsVifFrontend domid devid backendDomid = xsRead $ printf " %s/%s/%s/frontend" (xsBackendVifNode backendDomid) domid devid
186+ xsVifFrontend domid devid backendDomid = do
187+ vif <- xsRead $ printf " %s/%s/%s/frontend" (xsBackendVifNode backendDomid) domid devid
188+ case vif of
189+ Just _ -> return $ vif
190+ Nothing -> xsRead $ printf " %s/%s/%s/frontend" (xsBackendVwifNode backendDomid) domid devid
191+
192+ rmDups :: (Ord a ) => [a ] -> [a ]
193+ rmDups = map head . group . sort
170194
171195xsGuestDomains :: String -> IO ([String ])
172- xsGuestDomains backendDomid = xsDir (xsBackendVifNode backendDomid)
196+ xsGuestDomains backendDomid = do
197+ vifNodes <- xsDir (xsBackendVifNode backendDomid)
198+ vwifNodes <- xsDir (xsBackendVwifNode backendDomid)
199+ return $ rmDups (vifNodes ++ vwifNodes)
173200
174201xsDevIds :: String -> String -> IO ([String ])
175202xsDevIds backendDomid guestDomid = xsDir $ printf " %s/%s" (xsBackendVifNode backendDomid) guestDomid
0 commit comments