firehol/netdata

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

Summary

Maintainability
A
40 mins
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package postfix

import (
    "bufio"
    "bytes"
    "errors"
    "fmt"
    "strconv"
    "strings"
)

type postqueueStats struct {
    sizeKbyte int64
    requests  int64
}

func (p *Postfix) collect() (map[string]int64, error) {
    bs, err := p.exec.list()
    if err != nil {
        return nil, err
    }

    stats, err := parsePostqueueOutput(bs)
    if err != nil {
        return nil, err
    }

    mx := make(map[string]int64)

    mx["emails"] = stats.requests
    mx["size"] = stats.sizeKbyte

    return mx, nil
}

func parsePostqueueOutput(bs []byte) (*postqueueStats, error) {
    if len(bs) == 0 {
        return nil, errors.New("empty postqueue output")
    }

    var lastLine string
    sc := bufio.NewScanner(bytes.NewReader(bs))
    for sc.Scan() {
        if line := strings.TrimSpace(sc.Text()); line != "" {
            lastLine = strings.TrimSpace(sc.Text())
        }
    }

    if lastLine == "Mail queue is empty" {
        return &postqueueStats{}, nil
    }

    // -- 3 Kbytes in 3 Requests.
    parts := strings.Fields(lastLine)
    if len(parts) < 5 {
        return nil, fmt.Errorf("unexpected postqueue output ('%s')", lastLine)
    }

    size, err := strconv.ParseInt(parts[1], 10, 64)
    if err != nil {
        return nil, fmt.Errorf("unexpected postqueue output ('%s')", lastLine)
    }
    requests, err := strconv.ParseInt(parts[4], 10, 64)
    if err != nil {
        return nil, fmt.Errorf("unexpected postqueue output ('%s')", lastLine)
    }

    return &postqueueStats{sizeKbyte: size, requests: requests}, nil
}