Skip to content

Commit

Permalink
Merge pull request #202 from mfreeman451/feat/snmp_poller_cmd
Browse files Browse the repository at this point in the history
Feat/snmp poller cmd
  • Loading branch information
mfreeman451 authored Feb 16, 2025
2 parents 93b0251 + 1b2cb27 commit 6fb5c1e
Show file tree
Hide file tree
Showing 15 changed files with 270 additions and 24 deletions.
4 changes: 2 additions & 2 deletions Dockerfile.cloud
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ WORKDIR /web-build

COPY web/package*.json ./
RUN npm install
COPY web/ .
COPY ../web/ .
RUN npm run build

# Stage 2: Build the Go binary
Expand All @@ -20,7 +20,7 @@ RUN apt-get update && apt-get install -y \
libsqlite3-dev

# Copy go mod files first for better caching
COPY go.mod go.sum ./
COPY ../go.mod go.sum ./
RUN go mod download

# Copy the rest of the source
Expand Down
86 changes: 86 additions & 0 deletions cmd/checkers/snmp/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package main

import (
"context"
"flag"
"fmt"
"log"

"github.com/mfreeman451/serviceradar/pkg/checker/snmp"
"github.com/mfreeman451/serviceradar/pkg/config"
"github.com/mfreeman451/serviceradar/pkg/grpc"
"github.com/mfreeman451/serviceradar/pkg/lifecycle"
"github.com/mfreeman451/serviceradar/proto"
)

var (
errFailedToLoadConfig = fmt.Errorf("failed to load config")
)

func main() {
if err := run(); err != nil {
log.Fatalf("Fatal error: %v", err)
}
}

func run() error {
log.Printf("Starting SNMP checker...")

// Parse command line flags
configPath := flag.String("config", "/etc/serviceradar/checkers/snmp.json", "Path to config file")
flag.Parse()

// Load and validate configuration using shared config package
var cfg snmp.Config
if err := config.LoadAndValidate(*configPath, &cfg); err != nil {
return fmt.Errorf("%w: %w", errFailedToLoadConfig, err)
}

// Create SNMP service
service, err := snmp.NewSNMPService(&cfg)
if err != nil {
return fmt.Errorf("failed to create SNMP service: %w", err)
}

// Create and register block service
snmpAgentService := snmp.NewSNMPPollerService(&snmp.Poller{Config: cfg})

// Create gRPC service registrar
registerServices := func(s *grpc.Server) error {
// Register agent service
proto.RegisterAgentServiceServer(s.GetGRPCServer(), snmpAgentService)

return nil
}

// Create and configure service options
opts := lifecycle.ServerOptions{
ListenAddr: cfg.ListenAddr,
Service: &snmpService{service: service},
RegisterGRPCServices: []lifecycle.GRPCServiceRegistrar{registerServices},
EnableHealthCheck: true,
Security: cfg.Security,
}

// Run service with lifecycle management
if err := lifecycle.RunServer(context.Background(), &opts); err != nil {
return fmt.Errorf("server error: %w", err)
}

return nil
}

// snmpService wraps the SNMPService to implement lifecycle.Service
type snmpService struct {
service *snmp.SNMPService
}

func (s *snmpService) Start(ctx context.Context) error {
log.Printf("Starting SNMP service...")
return s.service.Start(ctx)
}

func (s *snmpService) Stop(ctx context.Context) error {
log.Printf("Stopping SNMP service...")
return s.service.Stop()
}
5 changes: 5 additions & 0 deletions pkg/checker/snmp/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ func (c *SNMPCollector) collect(ctx context.Context) {

// pollTarget performs a single poll of all OIDs for the target.
func (c *SNMPCollector) pollTarget(ctx context.Context) error {
log.Printf("Polling target %s (%s) for %d OIDs", c.target.Name, c.target.Host, len(c.target.OIDs))

oids := make([]string, len(c.target.OIDs))
for i, oid := range c.target.OIDs {
oids[i] = oid.OID
Expand All @@ -131,6 +133,7 @@ func (c *SNMPCollector) pollTarget(ctx context.Context) error {
return fmt.Errorf("%w - %w", ErrSNMPGet, err)
}

log.Printf("Successfully polled target %s, processing %d results", c.target.Name, len(results))
c.updateStatus(true, "")

// Process each result
Expand Down Expand Up @@ -173,6 +176,8 @@ func (c *SNMPCollector) processResult(ctx context.Context, oid string, value int
Timestamp: time.Now(),
}

log.Printf("Collected data point for %s: %v", point.OIDName, point.Value)

// Update OID status
c.updateOIDStatus(oidConfig.Name, point)

Expand Down
17 changes: 17 additions & 0 deletions pkg/checker/snmp/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,13 @@ func (s *SNMPService) Start(ctx context.Context) error {
s.mu.Lock()
defer s.mu.Unlock()

log.Printf("Starting SNMP Service with %d targets", len(s.config.Targets))

// Initialize collectors for each target
for _, target := range s.config.Targets {
log.Printf("Initializing target %s (%s) with %d OIDs",
target.Name, target.Host, len(target.OIDs))

if err := s.initializeTarget(ctx, &target); err != nil {
return fmt.Errorf("failed to initialize target %s: %w", target.Name, err)
}
Expand Down Expand Up @@ -192,12 +197,17 @@ func (s *SNMPService) GetServiceStatus(ctx context.Context, req *proto.StatusReq

// initializeTarget sets up collector and aggregator for a target.
func (s *SNMPService) initializeTarget(ctx context.Context, target *Target) error {
log.Printf("Creating collector for target %s", target.Name)

// Create collector
collector, err := s.collectorFactory.CreateCollector(target)
if err != nil {
return fmt.Errorf("%w: %s", errFailedToCreateCollector, target.Name)
}

log.Printf("Creating aggregator for target %s with interval %v",
target.Name, time.Duration(target.Interval))

// Create aggregator
aggregator, err := s.aggregatorFactory.CreateAggregator(time.Duration(target.Interval))
if err != nil {
Expand All @@ -209,6 +219,8 @@ func (s *SNMPService) initializeTarget(ctx context.Context, target *Target) erro
return fmt.Errorf("%w: %s", errFailedToStartCollector, target.Name)
}

log.Printf("Started collector for target %s", target.Name)

// Store components
s.collectors[target.Name] = collector
s.aggregators[target.Name] = aggregator
Expand All @@ -223,6 +235,8 @@ func (s *SNMPService) initializeTarget(ctx context.Context, target *Target) erro
// Start processing results
go s.processResults(ctx, target.Name, collector, aggregator)

log.Printf("Successfully initialized target %s", target.Name)

return nil
}

Expand Down Expand Up @@ -267,6 +281,9 @@ func (s *SNMPService) handleDataPoint(targetName string, point DataPoint, aggreg

status.LastPoll = point.Timestamp
s.status[targetName] = status

log.Printf("Updated status for target %s, OID %s: %v",
targetName, point.OIDName, point.Value)
}
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/checker/snmp/snmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ type Poller struct {
}

type PollerService struct {
proto.UnimplementedPollerServiceServer
proto.UnimplementedAgentServiceServer
checker *Poller
}

Expand Down
6 changes: 3 additions & 3 deletions scripts/build-cloud.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ fi
echo "Building cloud component version ${VERSION}"

# Ensure output directory exists
mkdir -p ../dist/cloud_linux_amd64_v1
mkdir -p ./dist/cloud_linux_amd64_v1

# Build using Docker
docker build -f ../Dockerfile.cloud \
docker build -f ./Dockerfile.cloud \
--build-arg VERSION="${VERSION}" \
-t serviceradar-cloud-build:${VERSION} ../.
-t serviceradar-cloud-build:${VERSION} .

# Extract binary
CONTAINER_ID=$(docker create serviceradar-cloud-build:${VERSION})
Expand Down
3 changes: 1 addition & 2 deletions scripts/build-web.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ set -e
echo "Building web interface..."

# Build web interface
cd ../web
cd ./web
npm install
npm run build
cd ..

echo "Web interface build complete."
16 changes: 9 additions & 7 deletions scripts/buildAll.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
VERSION=${VERSION:-1.0.16}


./setup-deb-poller.sh
./setup-deb-dusk-checker.sh
./setup-deb-agent.sh

scp ../release-artifacts/serviceradar-poller_${VERSION}.deb [email protected]:~/
scp ../release-artifacts/serviceradar-agent_${VERSION}.deb [email protected]:~/
scp ../release-artifacts/serviceradar-dusk-checker_${VERSION}.deb [email protected]:~/
./scripts/setup-deb-poller.sh
./scripts/setup-deb-dusk-checker.sh
./scripts/setup-deb-agent.sh
./scripts/setup-deb-snmp-checker.sh

scp ./release-artifacts/serviceradar-poller_${VERSION}.deb [email protected]:~/
scp ./release-artifacts/serviceradar-agent_${VERSION}.deb [email protected]:~/
scp ./release-artifacts/serviceradar-dusk-checker_${VERSION}.deb [email protected]:~/
scp ./release-artifacts/serviceradar-snmp-checker_${VERSION}.deb [email protected]:~/
2 changes: 1 addition & 1 deletion scripts/buildRpms.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/bash
set -e

export VERSION=${VERSION:-1.0.16}
export VERSION=${VERSION:-1.0.17}
export RELEASE=${RELEASE:-1}

# Create directories if they don't exist
Expand Down
2 changes: 1 addition & 1 deletion scripts/deployTesting.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/bash

# Define the version of the packages
VERSION=${VERSION:-1.0.16}
VERSION=${VERSION:-1.0.17}

# Define the list of remote machines
MACHINES=("192.168.2.10" "192.168.2.11" "192.168.2.12" "192.168.2.68")
Expand Down
4 changes: 2 additions & 2 deletions scripts/setup-deb-agent.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ mkdir -p "${PKG_ROOT}/lib/systemd/system"
echo "Building Go binaries..."

# Build agent and checker binaries
GOOS=linux GOARCH=amd64 go build -o "${PKG_ROOT}/usr/local/bin/serviceradar-agent" ../cmd/agent
GOOS=linux GOARCH=amd64 go build -o "${PKG_ROOT}/usr/local/bin/serviceradar-agent" ./cmd/agent

echo "Creating package files..."

Expand Down Expand Up @@ -120,6 +120,6 @@ mkdir -p ../release-artifacts
dpkg-deb --build "${PKG_ROOT}"

# Move the deb file to the release-artifacts directory
mv "${PKG_ROOT}.deb" "../release-artifacts/"
mv "${PKG_ROOT}.deb" "./release-artifacts/"

echo "Package built: release-artifacts/${PKG_ROOT}.deb"
2 changes: 1 addition & 1 deletion scripts/setup-deb-cloud.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ mkdir -p "${PKG_ROOT}/lib/systemd/system"
echo "Building web interface..."

# Build web interface
cd ../web
cd ./web
npm install
npm run build
cd ..
Expand Down
4 changes: 2 additions & 2 deletions scripts/setup-deb-dusk-checker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ mkdir -p "${PKG_ROOT}/lib/systemd/system"
echo "Building Go binary..."

# Build dusk checker binary
GOOS=linux GOARCH=amd64 go build -o "${PKG_ROOT}/usr/local/bin/dusk-checker" ../cmd/checkers/dusk
GOOS=linux GOARCH=amd64 go build -o "${PKG_ROOT}/usr/local/bin/dusk-checker" ./cmd/checkers/dusk

echo "Creating package files..."

Expand Down Expand Up @@ -127,6 +127,6 @@ mkdir -p ../release-artifacts
dpkg-deb --build "${PKG_ROOT}"

# Move the deb file to the release-artifacts directory
mv "${PKG_ROOT}.deb" "../release-artifacts/"
mv "${PKG_ROOT}.deb" "./release-artifacts/"

echo "Package built: release-artifacts/${PKG_ROOT}.deb"
4 changes: 2 additions & 2 deletions scripts/setup-deb-poller.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ mkdir -p "${PKG_ROOT}/lib/systemd/system"
echo "Building Go binary..."

# Build poller binary
GOOS=linux GOARCH=amd64 go build -o "${PKG_ROOT}/usr/local/bin/serviceradar-poller" ../cmd/poller
GOOS=linux GOARCH=amd64 go build -o "${PKG_ROOT}/usr/local/bin/serviceradar-poller" ./cmd/poller

echo "Creating package files..."

Expand Down Expand Up @@ -150,6 +150,6 @@ mkdir -p release-artifacts
dpkg-deb --build "${PKG_ROOT}"

# Move the deb file to the release-artifacts directory
mv "${PKG_ROOT}.deb" "../release-artifacts/"
mv "${PKG_ROOT}.deb" "./release-artifacts/"

echo "Package built: release-artifacts/${PKG_ROOT}.deb"
Loading

0 comments on commit 6fb5c1e

Please sign in to comment.