firehol/netdata

View on GitHub
src/go/plugin/go.d/modules/boinc/collect.go

Summary

Maintainability
A
1 hr
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package boinc

import (
    "fmt"
    "net"
)

func (b *Boinc) collect() (map[string]int64, error) {
    if b.conn == nil {
        conn, err := b.establishConn()
        if err != nil {
            return nil, err
        }
        b.conn = conn
    }

    results, err := b.conn.getResults()
    if err != nil {
        b.Cleanup()
        return nil, err
    }

    mx := make(map[string]int64)

    if err := b.collectResults(mx, results); err != nil {
        return nil, err
    }

    return mx, nil
}

func (b *Boinc) collectResults(mx map[string]int64, results []boincReplyResult) error {
    mx["total"] = int64(len(results))
    mx["active"] = 0

    for _, v := range resultStateMap {
        mx[v] = 0
    }
    for _, v := range activeTaskStateMap {
        mx[v] = 0
    }
    for _, v := range schedulerStateMap {
        mx[v] = 0
    }

    for _, r := range results {
        mx[r.state()]++
        if r.ActiveTask != nil {
            mx["active"]++
            mx[r.activeTaskState()]++
            mx[r.schedulerState()]++
        }
    }

    return nil
}

func (b *Boinc) establishConn() (boincConn, error) {
    conn := b.newConn(b.Config, b.Logger)

    if err := conn.connect(); err != nil {
        return nil, fmt.Errorf("failed to establish connection: %w", err)
    }

    if host, _, err := net.SplitHostPort(b.Address); err == nil {
        // for the commands we use, authentication is only required for remote connections
        ip := net.ParseIP(host)
        if host == "localhost" || (ip != nil && ip.IsLoopback()) {
            return conn, nil
        }
    }

    if err := conn.authenticate(); err != nil {
        return nil, fmt.Errorf("failed to authenticate: %w", err)
    }

    return conn, nil
}