//register an event func myrebootcallback(c libvirt.VirConnection, d libvirt.VirDomain, event int, detail int) { fmt.Printf("Got event %d\n", event) if event == libvirt.VIR_DOMAIN_EVENT_STOPPED { fmt.Println("rebooting...") d.Create() } }
func registerRebootAndGetVncPort(name string, ip string, conn libvirt.VirConnection) string { var domain libvirt.VirDomain domain, err := conn.LookupByName(name) if err != nil { log.Println("FAIL: find running domain to start vncviewer") return "" } defer domain.Free() xmlData, _ := domain.GetXMLDesc() v := utils.ParseDomainXML(xmlData) /* to get VNC port */ var vncPort string if v.Devices.Graphics.VNCPort == "-1" { log.Println("FAIL:Can not get vnc port") return "" } vncPort = v.Devices.Graphics.VNCPort ret := libvirt.ConnectDomainEventRegister(conn, domain, libvirt.VIR_DOMAIN_EVENT_ID_LIFECYCLE, libvirt.LifeCycleCallBackType(myrebootcallback)) if ret == -1 { fmt.Println("can not autoreboot") } else { callbackMap.Set(name, ret) } vncAddress := ip + ":" + vncPort //e.g. http://147.2.207.233/vnc_auto.html?title=lwang-n1-sle12rc1&path=websockify?ip=147.2.207.233:5902 log.Println(fmt.Sprintf("/vnc_auto.html?title=%s&path=websockify?ip=%s", name, vncAddress)) return fmt.Sprintf("/vnc_auto.html?title=%s&path=websockify?ip=%s", name, vncAddress) }
//TODO: in the futhure, use vm := VirtualMachine{};fillvmData(domain,vm) func fillVmData(domain libvirt.VirDomain, conn libvirt.VirConnection) VirtualMachine { xmlData, _ := domain.GetXMLDesc() v := utils.ParseDomainXML(xmlData) /* if VNCPort is -1, this means the domain is closed */ var active = false var vncPort = "" if v.Devices.Graphics.VNCPort != "-1" { active = true vncPort = v.Devices.Graphics.VNCPort } /* fill MAC Address */ macMapping := make([]SubNet, 0) for _, i := range v.Devices.Interface { if i.Type == "bridge" { macMapping = append(macMapping, SubNet{MAC: i.MAC.Address, IP: "not detected"}) } } /* fill Disk info */ var vmDisks = make([]string, 0) for _, i := range v.Devices.Disks { vmDisks = append(vmDisks, i.Source.Path) } return VirtualMachine{UUIDString: v.UUID, Name: v.Name, Active: active, VNCPort: vncPort, VirDomain: domain, MACMapping: macMapping, Disks: vmDisks, Connect: conn} }
//register an event func myrebootcallback(c libvirt.VirConnection, d libvirt.VirDomain, event int, detail int) { fmt.Printf("Got event %d\n", event) if event == libvirt.VIR_DOMAIN_EVENT_STOPPED { fmt.Println("rebooting...") d.Create() } name, _ := d.GetName() if callbackMap.Check(name) == true { callbackid := callbackMap.Get(name).(int) libvirt.ConnectDomainEventDeregister(c, callbackid) callbackMap.Delete(name) } }
func startVNCviewer(conn libvirt.VirConnection, name string, hostIPAddress string) { fmt.Println("would bring up vncviewer...") var domain libvirt.VirDomain domain, err := conn.LookupByName(name) if err != nil { fmt.Println("FAIL: find running domain to start vncviewer") return } defer domain.Free() xmlData, _ := domain.GetXMLDesc() v := utils.ParseDomainXML(xmlData) /* to get VNC port */ var vncPort string if v.Devices.Graphics.VNCPort == "-1" { fmt.Println("FAIL:Can not get vnc port") return } vncPort = v.Devices.Graphics.VNCPort ret := libvirt.ConnectDomainEventRegister(conn, domain, libvirt.VIR_DOMAIN_EVENT_ID_LIFECYCLE, libvirt.LifeCycleCallBackType(myrebootcallback)) if ret == -1 { fmt.Println("can not autoreboot") return } fmt.Println("RUNNING: vncviewer " + hostIPAddress + ":" + vncPort) cmd := exec.Command("vncviewer", hostIPAddress+":"+vncPort) //Run will block err = cmd.Run() if err != nil { fmt.Println("FAIL:can not start vncviewer") fmt.Println(err) return } fmt.Println("vncviewer is quiting") time.Sleep(3 * time.Second) //re run vncviewer cmd.Run() }