blob: dc0cfb4888eb88d79fa742c2afed71e2f0e1dde8 [file] [log] [blame]
package main
import (
"context"
"flag"
"code.hackerspace.pl/hscloud/go/mirko"
"github.com/golang/glog"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
pb "code.hackerspace.pl/hscloud/dc/cmc-proxy/proto"
)
var (
flagCMCAddress string
flagCMCUsername string
flagCMCPassword string
)
const (
pathLogin = "cgi-bin/webcgi/login"
pathLogout = "cgi-bin/webcgi/logout"
pathiDRACURL = "cgi-bin/webcgi/blade_iDRAC_url"
)
func init() {
flag.Set("logtostderr", "true")
}
type service struct {
cmc *cmcClient
}
func (s *service) GetKVMData(ctx context.Context, req *pb.GetKVMDataRequest) (*pb.GetKVMDataResponse, error) {
if req.BladeNum < 1 || req.BladeNum > 16 {
return nil, status.Error(codes.InvalidArgument, "blade_num must be [1,16]")
}
details, err := s.cmc.RequestKVMDetails(ctx, int(req.BladeNum))
if err != nil {
glog.Errorf("RequestKVMDetails(_, %d): %v", req.BladeNum, err)
return nil, status.Error(codes.Unavailable, "CMC unavailable")
}
return &pb.GetKVMDataResponse{
Arguments: details.arguments,
}, nil
}
func main() {
flag.StringVar(&flagCMCAddress, "cmc_address", "https://10.10.10.10", "URL of Dell M1000e CMC")
flag.StringVar(&flagCMCUsername, "cmc_username", "root", "Login username for CMC")
flag.StringVar(&flagCMCPassword, "cmc_password", "", "Login password for CMC")
flag.Parse()
m := mirko.New()
if err := m.Listen(); err != nil {
glog.Exitf("Could not listen: %v", err)
}
s := &service{
cmc: NewCMCClient(),
}
pb.RegisterCMCProxyServer(m.GRPC(), s)
if err := m.Serve(); err != nil {
glog.Exitf("Could not run: %v", err)
}
go s.cmc.Run(m.Context())
glog.Info("Running.")
<-m.Done()
}