package main import ( "errors" "os" "path/filepath" agentpb "git.ipao.vip/rogee/go-sip/gen/agent" "git.ipao.vip/rogee/go-sip/internal/asterisk" "git.ipao.vip/rogee/go-sip/internal/config" "git.ipao.vip/rogee/go-sip/internal/rpc" "github.com/google/uuid" ) func newSIPOnlyAgentServer(settings config.AgentEnvironment) (*rpc.Server, error) { if settings.AgentID == "" || settings.CellID == "" || settings.DispatcherID == "" || settings.SessionPath == "" || len(settings.PeerFingerprints) == 0 { return nil, errors.New("SIP-only Agent requires bound identities, persistent sessions and pinned peer certificates") } for _, path := range []string{settings.AsteriskConfigDir, settings.AsteriskBin, settings.AsteriskLibraryDir} { if !filepath.IsAbs(path) { return nil, errors.New("native Asterisk paths must be explicit absolute paths") } } if err := rejectLegacyAgentSpool(settings.RecoveryRoot); err != nil { return nil, err } if _, err := os.Lstat(filepath.Join(settings.RecoveryRoot, ".executions")); err == nil { return nil, errors.New("legacy Agent execution state requires operator disposition") } else if !errors.Is(err, os.ErrNotExist) { return nil, err } loader := asterisk.Loader{ConfigDir: settings.AsteriskConfigDir, Asterisk: settings.AsteriskBin, LibraryDir: settings.AsteriskLibraryDir} return rpc.NewServer(rpc.ServerOptions{ Mode: "sip-only", StatePath: settings.SessionPath, ApprovedDispatcherID: settings.DispatcherID, Status: &agentpb.AgentStatus{AgentId: settings.AgentID, CellId: settings.CellID, BootId: uuid.NewString(), ProtocolVersion: "agent.v1"}, RequirePeerCertificate: true, PeerCertificateFingerprints: settings.PeerFingerprints, LoadedSIP: loader.LoadedSIP, ApplySIP: loader.Apply, }), nil }