Files
go-sip/cmd/sip-go-agent/agent_sip.go
T

41 lines
1.7 KiB
Go

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
}