From 245a35fd09c36a2985ede9098a275b84ebda7e65 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Fri, 11 Oct 2024 17:22:31 -0500 Subject: [PATCH] start somewhere --- .gitignore | 6 +++ Makefile | 16 ++++++++ README | 5 +++ main.go | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0772ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.swp +go.mod +go.sum + +virtigo +virtigod diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5c82159 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +all: + make redomod + go build + sudo ./virtigod + +goimports: + goimports -w *.go + +redomod: + rm -f go.* + GO111MODULE= go mod init + GO111MODULE= go mod tidy + +clean: + rm -f go.* + rm -f virtigo* diff --git a/README b/README new file mode 100644 index 0000000..704f5bd --- /dev/null +++ b/README @@ -0,0 +1,5 @@ +This is the virtigo daemon. Run this on the hypervisors. + +The name is wierd, but that's just how it worked out. Perhaps it's +appropriate because domU information should be accurate from dom0 here. +Nonetheless, this should be called "virtigo D" not "virti-god". diff --git a/main.go b/main.go new file mode 100644 index 0000000..a53e556 --- /dev/null +++ b/main.go @@ -0,0 +1,117 @@ +// Copyright 2016 The go-qemu Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "flag" + "fmt" + "log" + "net" + "time" + + hypervisor "github.com/digitalocean/go-qemu/hypervisor" + "github.com/digitalocean/go-qemu/qemu" +) + +var ( + network = flag.String("network", "unix", `Named network used to connect on. For Unix sockets -network=unix, for TCP connections: -network=tcp`) + address = flag.String("address", "/var/run/libvirt/libvirt-sock", `Address of the hypervisor. This could be in the form of Unix or TCP sockets. For TCP connections: -address="host:16509"`) + timeout = flag.Duration("timeout", 2*time.Second, "Connection timeout. Another valid value could be -timeout=500ms") +) + +func main() { + flag.Parse() + + // fmt.Printf("\nConnecting to %s://%s\n", *network, *address) + newConn := func() (net.Conn, error) { + // return net.DialTimeout(*network, *address, *timeout) + return net.DialTimeout("unix", "/var/run/libvirt/libvirt-sock", *timeout) + // return net.DialTimeout("tcp", "farm02:16514", *timeout) + } + + driver := hypervisor.NewRPCDriver(newConn) + hv := hypervisor.New(driver) + + // fmt.Printf("\n**********Domains**********\n") + domains, err := hv.Domains() + if err != nil { + log.Fatalf("Unable to get domains from hypervisor: %v", err) + } + for _, dom := range domains { + var name string + var err error + var drives []string + var status qemu.Status + name = dom.Name + // fmt.Printf("%s\n", dom.Name) + status, err = dom.Status() + if err != nil { + fmt.Println(name, status, err) + continue + } + // fmt.Printf("\nStatus: %s\n", status) + /* + if status == qemu.StatusRunning { + // getBlockDevices(dom) + // fmt.Println(name, status, err) + } + */ + blockDevices, err := dom.BlockDevices() + for _, blockDevice := range blockDevices { + drives = append(drives, blockDevice.Device) + drives = append(drives, blockDevice.Inserted.Driver) + drives = append(drives, blockDevice.Inserted.File) + // fmt.Printf("%20s %8s %30s\n", + // blockDevice.Device, blockDevice.Inserted.Driver, blockDevice.Inserted.File) + } + if status == qemu.StatusRunning { + fmt.Println("ON ", name, drives) + } else { + fmt.Println("OFF", status, name, drives) + } + } + // fmt.Printf("\n***************************\n") +} + +func displayBlockDevices(domain *qemu.Domain) { + // var []blks string + blockDevices, err := domain.BlockDevices() + if err != nil { + log.Fatalf("Error getting blockDevices: %v\n", blockDevices) + } + fmt.Printf("\n[ BlockDevices ]\n") + fmt.Printf("========================================================================\n") + fmt.Printf("%20s %8s %30s\n", "Device", "Driver", "File") + fmt.Printf("========================================================================\n") + for _, blockDevice := range blockDevices { + fmt.Printf("%20s %8s %30s\n", + blockDevice.Device, blockDevice.Inserted.Driver, blockDevice.Inserted.File) + } +} + +func displayPCIDevices(domain *qemu.Domain) { + pciDevices, err := domain.PCIDevices() + if err != nil { + log.Fatalf("Error getting PCIDevices: %v\n", pciDevices) + } + fmt.Printf("\n[ PCIDevices ]\n") + fmt.Printf("======================================\n") + fmt.Printf("%10s %20s\n", "[ID]", "[Description]") + fmt.Printf("======================================\n") + for _, pciDevice := range pciDevices { + fmt.Printf("[%10s] [%20s]\n", pciDevice.QdevID, pciDevice.ClassInfo.Desc) + } +} +