feat: new hub service in hub

This commit is contained in:
2026-04-15 17:55:34 +03:00
parent 0b955bb714
commit 97e9458700
6 changed files with 85 additions and 33 deletions
+11 -13
View File
@@ -30,31 +30,29 @@ func ReadSettings(path string) (*Settings, error) {
err = nil err = nil
} }
file, err := os.Create(path + "/settings.json") settingsPath := filepath.Join(path, "settings.json")
if err != nil {
if !errors.Is(err, os.ErrExist) {
return nil, err
}
err = nil
}
defer file.Close()
var settings Settings var settings Settings
err = json.NewDecoder(file).Decode(&settings) file, err := os.Open(settingsPath)
if err != nil { if err != nil {
if !errors.Is(err, io.EOF) { if !errors.Is(err, os.ErrNotExist) {
return nil, err
}
} else {
defer file.Close()
err = json.NewDecoder(file).Decode(&settings)
if err != nil && !errors.Is(err, io.EOF) {
return nil, err return nil, err
} }
} }
settings.path = path + "/settings.json" settings.path = settingsPath
return &settings, nil return &settings, nil
} }
func (s *Settings) Insert(sett Settings) error { func (s *Settings) Insert(sett Settings) error {
file, err := os.OpenFile(s.path, os.O_RDWR, 0755) file, err := os.OpenFile(s.path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil { if err != nil {
return err return err
} }
+11 -7
View File
@@ -4,12 +4,12 @@ import (
pb "github.com/lorsanstand/HomeOps-Hub/api/gen/homeops" pb "github.com/lorsanstand/HomeOps-Hub/api/gen/homeops"
) )
func ToDomainAgentRequest(request *pb.RegisterAgentRequest) RegisterAgentData { func ToDomainAgentRequest(request *pb.RegisterAgentRequest) RegisterAgentRequest {
if request == nil { if request == nil {
return RegisterAgentData{} return RegisterAgentRequest{}
} }
return RegisterAgentData{ return RegisterAgentRequest{
AgentId: request.AgentId, AgentId: request.AgentId,
AgentName: request.AgentName, AgentName: request.AgentName,
Host: HostInfo{ Host: HostInfo{
@@ -21,12 +21,12 @@ func ToDomainAgentRequest(request *pb.RegisterAgentRequest) RegisterAgentData {
} }
} }
func ToDomainAgentResponse(response *pb.RegisterAgentResponse) RegisterAgentDataResponse { func ToDomainAgentResponse(response *pb.RegisterAgentResponse) RegisterAgentResponse {
if response == nil { if response == nil {
return RegisterAgentDataResponse{} return RegisterAgentResponse{}
} }
return RegisterAgentDataResponse{ return RegisterAgentResponse{
AgentID: response.AgentId, AgentID: response.AgentId,
Heartbeat: int(response.HeartbeatIntervalSecond), Heartbeat: int(response.HeartbeatIntervalSecond),
} }
@@ -51,7 +51,7 @@ func ToDomainCapabilities(capability []*pb.Capability) []Capability {
return caps return caps
} }
func ToGRPCAgentRequest(request RegisterAgentData) pb.RegisterAgentRequest { func ToGRPCAgentRequest(request RegisterAgentRequest) pb.RegisterAgentRequest {
return pb.RegisterAgentRequest{ return pb.RegisterAgentRequest{
AgentId: request.AgentId, AgentId: request.AgentId,
AgentName: request.AgentName, AgentName: request.AgentName,
@@ -65,6 +65,10 @@ func ToGRPCAgentRequest(request RegisterAgentData) pb.RegisterAgentRequest {
} }
} }
func ToGRPCAgentResponse(response RegisterAgentResponse) *pb.RegisterAgentResponse {
return &pb.RegisterAgentResponse{AgentId: response.AgentID, HeartbeatIntervalSecond: int64(response.Heartbeat)}
}
func ToGRPCCapability(caps []Capability) []*pb.Capability { func ToGRPCCapability(caps []Capability) []*pb.Capability {
var capability []*pb.Capability var capability []*pb.Capability
for _, capi := range caps { for _, capi := range caps {
+9 -7
View File
@@ -6,15 +6,15 @@ import (
"net" "net"
grpcserv "github.com/lorsanstand/HomeOps-Hub/internal/hub/rpc" grpcserv "github.com/lorsanstand/HomeOps-Hub/internal/hub/rpc"
"github.com/lorsanstand/HomeOps-Hub/internal/hub/service/hub_service"
"github.com/lorsanstand/HomeOps-Hub/internal/shared/config" "github.com/lorsanstand/HomeOps-Hub/internal/shared/config"
"github.com/lorsanstand/HomeOps-Hub/internal/shared/log" "github.com/lorsanstand/HomeOps-Hub/internal/shared/log"
"github.com/rs/zerolog" "github.com/rs/zerolog"
) )
type App struct { type App struct {
cfg *config.Config cfg *config.Config
log zerolog.Logger log zerolog.Logger
server *grpcserv.HubHandler
} }
func NewApp() *App { func NewApp() *App {
@@ -25,9 +25,7 @@ func NewApp() *App {
logger := log.NewLogger(cfg) logger := log.NewLogger(cfg)
server := grpcserv.NewHubHandler(logger) return &App{cfg: cfg, log: logger}
return &App{cfg: cfg, log: logger, server: server}
} }
func (a *App) Run() { func (a *App) Run() {
@@ -41,12 +39,16 @@ func (a *App) hubServe() error {
address := fmt.Sprintf("0.0.0.0:%v", a.cfg.Port) address := fmt.Sprintf("0.0.0.0:%v", a.cfg.Port)
a.log.Info().Str("address", "http://"+address).Msg("start GRPC server") a.log.Info().Str("address", "http://"+address).Msg("start GRPC server")
hub := hub_service.NewHubService(a.log)
server := grpcserv.NewHubHandler(hub, a.log)
lis, err := net.Listen("tcp", address) lis, err := net.Listen("tcp", address)
if err != nil { if err != nil {
return err return err
} }
err = a.server.GrpcServer.Serve(lis) err = server.GrpcServer.Serve(lis)
if err != nil { if err != nil {
return err return err
} }
+9 -5
View File
@@ -2,7 +2,6 @@ package rpc
import ( import (
"context" "context"
"fmt"
pb "github.com/lorsanstand/HomeOps-Hub/api/gen/homeops" pb "github.com/lorsanstand/HomeOps-Hub/api/gen/homeops"
"github.com/lorsanstand/HomeOps-Hub/internal/domain" "github.com/lorsanstand/HomeOps-Hub/internal/domain"
@@ -11,14 +10,19 @@ import (
"google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/emptypb"
) )
type HubService interface {
RegisterAgent(data domain.RegisterAgentRequest) domain.RegisterAgentResponse
}
type HubHandler struct { type HubHandler struct {
pb.UnimplementedHubServer pb.UnimplementedHubServer
log zerolog.Logger log zerolog.Logger
GrpcServer *grpc.Server GrpcServer *grpc.Server
hub HubService
} }
func NewHubHandler(logger zerolog.Logger) *HubHandler { func NewHubHandler(HubServ HubService, logger zerolog.Logger) *HubHandler {
hub := &HubHandler{log: logger} hub := &HubHandler{log: logger, hub: HubServ}
grpcServer := grpc.NewServer() grpcServer := grpc.NewServer()
pb.RegisterHubServer(grpcServer, hub) pb.RegisterHubServer(grpcServer, hub)
@@ -35,6 +39,6 @@ func (h *HubHandler) Ping(ctx context.Context, _ *emptypb.Empty) (*pb.PongRespon
func (h *HubHandler) RegisterAgent(ctx context.Context, request *pb.RegisterAgentRequest) (*pb.RegisterAgentResponse, error) { func (h *HubHandler) RegisterAgent(ctx context.Context, request *pb.RegisterAgentRequest) (*pb.RegisterAgentResponse, error) {
data := domain.ToDomainAgentRequest(request) data := domain.ToDomainAgentRequest(request)
fmt.Println(data) resp := h.hub.RegisterAgent(data)
return &pb.RegisterAgentResponse{}, nil return domain.ToGRPCAgentResponse(resp), nil
} }
+18 -1
View File
@@ -2,6 +2,7 @@ package hub_service
import ( import (
"github.com/lorsanstand/HomeOps-Hub/internal/domain" "github.com/lorsanstand/HomeOps-Hub/internal/domain"
"github.com/lorsanstand/HomeOps-Hub/internal/hub/utils/hasher"
"github.com/rs/zerolog" "github.com/rs/zerolog"
) )
@@ -9,4 +10,20 @@ type HubService struct {
log zerolog.Logger log zerolog.Logger
} }
func NewHubService(request domain.RegisterAgentRequest) func NewHubService(logger zerolog.Logger) *HubService {
return &HubService{log: logger}
}
func (h *HubService) RegisterAgent(data domain.RegisterAgentRequest) domain.RegisterAgentResponse {
AgentID := data.AgentId
if data.AgentId == "" {
var err error
AgentID, err = hasher.MakeID(data.Host, data.AgentName)
if err != nil {
h.log.Error().Err(err).Msg("failed create agent id")
AgentID = ""
}
}
return domain.RegisterAgentResponse{AgentID: AgentID, Heartbeat: 5}
}
+27
View File
@@ -0,0 +1,27 @@
package hasher
import (
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"fmt"
"github.com/lorsanstand/HomeOps-Hub/internal/domain"
)
func newSalt(n int) ([]byte, error) {
b := make([]byte, n)
_, err := rand.Read(b)
return b, err
}
func MakeID(info domain.HostInfo, AgentName string) (string, error) {
salt, err := newSalt(10)
if err != nil {
return "", err
}
s := fmt.Sprintf("v1|host=%s|distro=%s|name=%s|", info.Hostname, info.Arch, AgentName)
h := sha256.Sum256(append([]byte(s), salt...))
return hex.EncodeToString(h[:16]), nil
}