start somewhere

This commit is contained in:
Jeff Carr 2024-10-11 17:22:31 -05:00
commit 245a35fd09
4 changed files with 144 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
*.swp
go.mod
go.sum
virtigo
virtigod

16
Makefile Normal file
View File

@ -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*

5
README Normal file
View File

@ -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".

117
main.go Normal file
View File

@ -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)
}
}