An SNMP library written in GoLang.

gosnmp

Mentioned in Awesome Go

Build Status PkgGoDev

GoSNMP is an SNMP client library fully written in Go. It provides Get, GetNext, GetBulk, Walk, BulkWalk, Set and Traps. It supports IPv4 and IPv6, using SNMPv1, SNMPv2c or SNMPv3. Builds are tested against linux/amd64 and linux/386.

About

gosnmp was started by Andreas Louca, then completely rewritten by Sonia Hamilton (2012-2020), and now ownership has been transferred to the community at gosnmp/gosnmp.

For support and help, join us in the #snmp channel of Gophers Slack.

Overview

GoSNMP has the following SNMP functions:

  • Get (single or multiple OIDs)
  • GetNext
  • GetBulk (SNMPv2c and SNMPv3 only)
  • Walk - retrieves a subtree of values using GETNEXT.
  • BulkWalk - retrieves a subtree of values using GETBULK (SNMPv2c and SNMPv3 only).
  • Set - supports Integers and OctetStrings.
  • SendTrap - send SNMP TRAPs.
  • Listen - act as an NMS for receiving TRAPs.

GoSNMP has the following helper functions:

  • ToBigInt - treat returned values as *big.Int
  • Partition - facilitates dividing up large slices of OIDs

gosnmp/gosnmp has completely diverged from alouca/gosnmp, your code will require modification in these (and other) locations:

  • the Get function has a different method signature
  • the NewGoSNMP function has been removed, use Connect instead (see Usage below). Connect uses the GoSNMP struct; gosnmp.Default is provided for you to build on.
  • GoSNMP no longer relies on alouca/gologger - you can use your logger if it conforms to the gosnmp.Logger interface; otherwise debugging will be discarded (/dev/null).
type Logger interface {
    Print(v ...interface{})
    Printf(format string, v ...interface{})
}

Installation

go get github.com/gosnmp/gosnmp

Documentation

https://pkg.go.dev/github.com/gosnmp/gosnmp

Usage

Here is examples/example/main.go, demonstrating how to use GoSNMP:

// Default is a pointer to a GoSNMP struct that contains sensible defaults
// eg port 161, community public, etc
g.Default.Target = "192.168.1.10"
err := g.Default.Connect()
if err != nil {
    log.Fatalf("Connect() err: %v", err)
}
defer g.Default.Conn.Close()

oids := []string{"1.3.6.1.2.1.1.4.0", "1.3.6.1.2.1.1.7.0"}
result, err2 := g.Default.Get(oids) // Get() accepts up to g.MAX_OIDS
if err2 != nil {
    log.Fatalf("Get() err: %v", err2)
}

for i, variable := range result.Variables {
    fmt.Printf("%d: oid: %s ", i, variable.Name)

    // the Value of each variable returned by Get() implements
    // interface{}. You could do a type switch...
    switch variable.Type {
    case g.OctetString:
        bytes := variable.Value.([]byte)
        fmt.Printf("string: %s\n", string(bytes))
    default:
        // ... or often you're just interested in numeric values.
        // ToBigInt() will return the Value as a BigInt, for plugging
        // into your calculations.
        fmt.Printf("number: %d\n", g.ToBigInt(variable.Value))
    }
}

Running this example gives the following output (from my printer):

% go run example.go
0: oid: 1.3.6.1.2.1.1.4.0 string: Administrator
1: oid: 1.3.6.1.2.1.1.7.0 number: 104
  • examples/example2.go is similar to example.go, however it uses a custom &GoSNMP rather than g.Default
  • examples/walkexample.go demonstrates using BulkWalk
  • examples/example3.go demonstrates SNMPv3
  • examples/trapserver.go demonstrates writing an SNMP v2c trap server

MIB Parser

I don't have any plans to write a mib parser. Others have suggested https://github.com/sleepinggenius2/gosmi

Contributions

Contributions are welcome, especially ones that have packet captures (see below).

If you've never contributed to a Go project before, here is an example workflow.

  1. fork this repo on the GitHub webpage
  2. go get github.com/gosnmp/gosnmp
  3. cd $GOPATH/src/github.com/gosnmp/gosnmp
  4. git remote rename origin upstream
  5. git remote add origin [email protected]:<your-github-username>/gosnmp.git
  6. git checkout -b development
  7. git push -u origin development (setup where you push to, check it works)

Packet Captures

Create your packet captures in the following way:

Expected output, obtained via an snmp command. For example:

% snmpget -On -v2c -c public 203.50.251.17 1.3.6.1.2.1.1.7.0 \
  1.3.6.1.2.1.2.2.1.2.6 1.3.6.1.2.1.2.2.1.5.3
.1.3.6.1.2.1.1.7.0 = INTEGER: 78
.1.3.6.1.2.1.2.2.1.2.6 = STRING: GigabitEthernet0
.1.3.6.1.2.1.2.2.1.5.3 = Gauge32: 4294967295

A packet capture, obtained while running the snmpget. For example:

sudo tcpdump -s 0 -i eth0 -w foo.pcap host 203.50.251.17 and port 161

Bugs

Rane's document SNMP: Simple? Network Management Protocol was useful when learning the SNMP protocol.

Please create an issue on Github with packet captures (upload capture to Google Drive, Dropbox, or similar) containing samples of missing BER types, or of any other bugs you find. If possible, please include 2 or 3 examples of the missing/faulty BER type.

The following BER types have been implemented:

  • 0x00 UnknownType
  • 0x01 Boolean
  • 0x02 Integer
  • 0x03 BitString
  • 0x04 OctetString
  • 0x05 Null
  • 0x06 ObjectIdentifier
  • 0x07 ObjectDescription
  • 0x40 IPAddress (IPv4 & IPv6)
  • 0x41 Counter32
  • 0x42 Gauge32
  • 0x43 TimeTicks
  • 0x44 Opaque (Float & Double)
  • 0x45 NsapAddress
  • 0x46 Counter64
  • 0x47 Uinteger32
  • 0x78 OpaqueFloat
  • 0x79 OpaqueDouble
  • 0x80 NoSuchObject
  • 0x81 NoSuchInstance
  • 0x82 EndOfMibView

Running the Tests

Local testing in Docker

docker build -t gosnmp/gosnmp:latest .
docker run -it gosnmp/gosnmp:latest

or

export GOSNMP_TARGET=1.2.3.4
export GOSNMP_PORT=161
export GOSNMP_TARGET_IPV4=1.2.3.4
export GOSNMP_PORT_IPV4=161
export GOSNMP_TARGET_IPV6='0:0:0:0:0:ffff:102:304'
export GOSNMP_PORT_IPV6=161
go test -v -tags all        # for example
go test -v -tags helper     # for example

Tests are grouped as follows:

  • Unit tests (validating data packing and marshalling):
    • marshal_test.go
    • misc_test.go
  • Public API consistency tests:
    • gosnmp_api_test.go
  • End-to-end integration tests:
    • generic_e2e_test.go

The generic end-to-end integration test generic_e2e_test.go should work against any SNMP MIB-2 compliant host (e.g. a router, NAS box, printer).

Mocks were generated using:

mockgen -source=interface.go -destination=mocks/gosnmp_mock.go -package=mocks

However they're currently removed, as they were breaking linting.

To profile cpu usage:

go test -cpuprofile cpu.out
go test -c
go tool pprof gosnmp.test cpu.out

To profile memory usage:

go test -memprofile mem.out
go test -c
go tool pprof gosnmp.test mem.out

To check test coverage:

go get github.com/axw/gocov/gocov
go get github.com/matm/gocov-html
gocov test github.com/gosnmp/gosnmp | gocov-html > gosnmp.html && firefox gosnmp.html &

License

Parts of the code are taken from the Golang project (specifically some functions for unmarshaling BER responses), which are under the same terms and conditions as the Go language. The rest of the code is under a BSD license.

See the LICENSE file for more details.

The remaining code is Copyright 2012 the GoSNMP Authors - see AUTHORS.md for a list of authors.

Comments
  • Udp listen

    Udp listen

    Good day.

    Help to understand the best way to solve this problem:

    00:00:20.414081 IP 10.12.2.2.23568 > 10.15.44.1.161:  C=totgfh0xre GetNextRequest(30)  .1.3.6.1.2.1.31.1.1.1.1
    00:00:20.442642 IP 8.9.1.1.161 > 10.12.2.2.23568:  C=totgfh0xre GetResponse(35)  .1.3.6.1.2.1.31.1.1.1.1.1="fxp0"
    

    Some equipment is responsible at a different address (it can not be configure). Such as Juniper. Accordingly, I get "Last error was: Error reading from UDP: read udp 10.15.44.1:161: i/o timeout"

  • Add INFORM responses

    Add INFORM responses

    Not yet ready for merge, but just to get this on the radar: this adds preliminary support for handling INFORM requests and sending responses.

    TODO:

    • [x] Add basic INFORM handling and responding
    • [x] Test with net-snmp snmpinform -Ci
    • [x] Examine compliance with protocol spec
    • [x] Update unit tests
  • Improved perfomance

    Improved perfomance

    The marshalOID () and oidToString () functions use the string functions Trim, Split, Join, which work internally with an array of strings. Also, to convert the oid string to an array of numbers and in the opposite direction, an additional array is created inside both marshalOID () and oidToString (), which causes at least twice the load on the GC. In my case, with parallel polling of 100k + devices, this change in these functions improved performance and CPU load by 10% -15%. The average CPU load dropped from 80% to 65% after. In addition, the total polling time has noticeably decreased.

    The second patch (reverted due to broken ci check) concerns the logging function logger.Printf(). Even with logging disabled, the Printf() system call is still called, which, according to pprof, also consumes a significant portion of the CPU time. I don't know what to do in this case, so I just commented them out in problem areas. Logically, the logPrintf () function should be called here, but in these cases it is not available for call.

  • Few bug fixes and walk support

    Few bug fixes and walk support

    Hi Sonia,

    I've been reviewing a few Go SNMP implementations and running them through a few real world cases. I really like the changes you've done on your fork. Are you willing to accept some full requests?

    Assuming you're are, please review this pull request and let me know what changes you'd like before merging.

    I also noted that @virtuallynathan is also doing some good work on your branch. Hopefully we can all coordinate to make SNMP great in Go!

    Changes:

    Changes to minimise impact of unimplemented types

    • If GetMultiple or GetBulk returns a MIB with an Unimplemented type (e.g. Opaque) the whole call would return an error. It's more desirable to return an UnknownType so it's at least possible to read other values. The UnknownType's byte number has been set to 0x00. Java SNMP takes the same approach.
    • Minor bugfix - The RequestID was not being correctly parsed.
    • Added FIXME to the RequestID. This should be set to an atomic counter and the read should discard (and retry) if the sent ID does not match the received ID. In the current implementation it would be possible for a late arriving packet form a pervious (failed) request to be incorrectly associated with the call. This will be fixed in a future commit.

    Added SNMP walk (via both GETBULK and GETNEXT) The original 'alouca' version has a limited walk implementation. This version's logic is more robust and is able to successfully walk large trees across a range of different devices/agents. Flow is based off existing walk implementations found in net-snmp and Java snmp.

    TODO: To make this just as reliable as other implementations, we'll need to add retry support at the send() layer, and ensure packet request IDs are matched. I'll open this as an issue.

    Cheers from Melbourne,

    Chris

  • Implement RFC7860 HMAC-SHA-2 hash functions

    Implement RFC7860 HMAC-SHA-2 hash functions

    Newer hash functions were standardised for SNMPv3 USM in RFC7860, theye are implemented at newer network equipment and it would be great to support them.

  • Multithreading issue?

    Multithreading issue?

    I am using the library with 15 simultaneous threads. Sometimes I get false values which mixup my rrd graphics. Any Idea how to solve this?

    device someswitch fetched: 70 .1.3.6.1.2.1.31.1.1.1.10.10111 25027549639180
    device someswitch fetched: 70 .1.3.6.1.2.1.31.1.1.1.10.10111 25027572865391
    device someswitch fetched: 70 .1.3.6.1.2.1.31.1.1.1.10.10111 90438050323
    device someswitch fetched: 70 .1.3.6.1.2.1.31.1.1.1.10.10111 25027622435917
    device someswitch fetched: 70 .1.3.6.1.2.1.31.1.1.1.10.10111 25027639781760
    

    Tcpdump -v looks like

    someswitch.161 > monitorserver.55751:  { SNMPv2c C=bla { GetResponse(38) R=-1251415802  .1.3.6.1.2.1.31.1.1.1.10.10111=25027549639180.000000 } }
    someswitch.161 > monitorserver.51930:  { SNMPv2c C=bla { GetResponse(38) R=1668428858  .1.3.6.1.2.1.31.1.1.1.10.10111=25027570860335.000000 } }
    someswitch.161 > monitorserver.51578:  { SNMPv2c C=bla { GetResponse(38) R=-1144811484  .1.3.6.1.2.1.31.1.1.1.10.10111=25027572865391.000000 } }
    someswitch.161 > monitorserver.60215:  { SNMPv2c C=bla { GetResponse(38) R=-1081929899  .1.3.6.1.2.1.31.1.1.1.10.10111=25027593968410.000000 } }
    someswitch.161 > monitorserver.51400:  { SNMPv2c C=bla { GetResponse(38) R=-524292265  .1.3.6.1.2.1.31.1.1.1.10.10111=25027615759785.000000 } }
    someswitch.161 > monitorserver.56794:  { SNMPv2c C=bla { GetResponse(38) R=-1679001924  .1.3.6.1.2.1.31.1.1.1.10.10111=25027622435917.000000 } }
    someswitch.161 > monitorserver.51984:  { SNMPv2c C=bla { GetResponse(38) R=-1214439598  .1.3.6.1.2.1.31.1.1.1.10.10111=25027639781760.000000 } }
    
  • Build fails on 32 bit arch with constant overflows int error

    Build fails on 32 bit arch with constant overflows int error

    When I try to build on a 32 bit architecture such as linux/386 or windows/386 I get an error:

    $ GOARCH=386 go test -v -tags marshal
    # github.com/soniah/gosnmp
    ./helper.go:365:31: constant 4294967295 overflows int
    ./helper.go:366:26: constant 4278190080 overflows int
    FAIL    github.com/soniah/gosnmp [build failed]
    

    I assume it was introduced in #134

  • Fix runtime integer divide by zero error.

    Fix runtime integer divide by zero error.

    This fixes runtime error: integer divide by zero, found in https://github.com/prometheus/snmp_exporter/issues/185 when private password is empty string.

    More detailed debug details can be found in my comment at https://github.com/prometheus/snmp_exporter/issues/185#issuecomment-328992935

  • Moved maxOids const to MaxOids variable in Default

    Moved maxOids const to MaxOids variable in Default

    This is a small change, moving the constant 'maxOids' to an int 'MaxOids' in the GoSNMP struct. This is necessary to allow users to accommodate for devices with fewer resources, by limiting the number of OIDs they request without having to maintain their own copy of the library.

    This is in relation to issue #72

  • snmp request

    snmp request "IO WAIT" issues observed after pr #277

    AFTER COMMIT https://github.com/gosnmp/gosnmp/pull/277

    very bad commit this one did not work at all After commit 70% snmp reuest "IO WAIT" SNMP V2 udp on port 161 not work after this commit 70-90% snmp get ERROR "IO WAIT"

  • Add support for SNMP v1 traps

    Add support for SNMP v1 traps

    According to: http://www.tcpipguide.com/free/t_SNMPVersion1SNMPv1MessageFormat-3.htm the SNMP v1 Trap PDU is quite different from standard PDUs, so it has to be created in a bit different way.

    I tried to avoid unnecessary changes, and this is the end result of adding support for sending SNMP v1 Traps.

  • multiple device concurrent polling fails unless you create your own snmp object

    multiple device concurrent polling fails unless you create your own snmp object

    I know just enough go to create unreliable web applications. The default example code uses the "Default" object. This works fine unless you have any kind of concurrent snmp polling. All of the concurrent processes will be trying to use the same gosnmp object. The answer is to create your own gosnmp object.

          var my_snmp gosnmp.GoSNMP
           my_snmp.Port = 161
           my_snmp.Transport = "udp"
           my_snmp.Version = gosnmp.Version2c
           my_snmp.MaxOids = 50
    
           my_snmp.Target = snmp_ip
           my_snmp.Community = snmp_community
           my_snmp.Timeout = time.Duration(3) * time.Second
           my_snmp.Retries = 2
           my_snmp.ExponentialTimeout = false
           my_snmp.UseUnconnectedUDPSocket = false
           my_snmp.LocalAddr = "0.0.0.0:" + fmt.Sprint( Port_Number )
    
    	// gosnmp.Default.Target = snmp_ip
           // gosnmp.Default.Community = snmp_community
           // gosnmp.Default.Timeout = time.Duration(3) * time.Second
           // gosnmp.Default.Retries = 2
           // gosnmp.Default.ExponentialTimeout = false
           // gosnmp.Default.UseUnconnectedUDPSocket = true
           // gosnmp.Default.LocalAddr = "0.0.0.0:" + fmt.Sprint( Port_Number )
    
           log.Printf( "DEBUG ip %s req %s port %d", snmp_ip, snmp_type, Port_Number )
    
           //err := gosnmp.Default.Connect()
           err := (&my_snmp).Connect()
    
    

    and to get data

                    get_oids := []string{"1.3.6.1.2.1.1.4.0", "1.3.6.1.2.1.1.7.0"}
                    //result, err2 := gosnmp.Default.Get( get_oids )
                    result, err2 := (&my_snmp).Get( get_oids )
                    if err2 != nil {
                            log.Printf("Get() ip %s req %s port %d err: %v", snmp_ip, snmp_type, Port_Number, err2 )
    
    
  • Query on gosnmp feature as snmp agent

    Query on gosnmp feature as snmp agent

    So far, we have explored gosnmp Get GetBuld etc. apis to query an snmp agent. i.e as client to an snmp agent, working like an snmp manager.

    Does gosnmp also support or provide apis to work as an snmp agent ? I.e to run snmp agent via gosnmp golang library/apis and respond to Get or GetBuldk etc. snmp api calls ?

  • The Get method is unable to collect data, if we provide multiple OIDs, which includes an invalid OID.

    The Get method is unable to collect data, if we provide multiple OIDs, which includes an invalid OID.

    Recently we started using gosnmp, but during negative testing, we found that the 'Get' method call does not provide data, for valid OIDs, which includes one invalid OID.

    We tested the same scenario with 'snmpget.exe' from net-snmp and it works properly with valid and invalid OIDs.

    The attached file contains the sample go code. main.txt

  • refactor scripts and trap.md

    refactor scripts and trap.md

    Make project structure cleaner:

    Merge trap.md with README.md (also lint and fix markdown files)

    Move various helper scripts to a separate scripts folder.

  • BulkWalk (not Walk) hangs permanently if malformed OID is anywhere in tree

    BulkWalk (not Walk) hangs permanently if malformed OID is anywhere in tree

    BulkWalk, but not Walk, hangs permanently if a malformed OID like the following is encountered (NET-SNMP v5.7.2 bulkwalk output shown below):

    UCD-SNMP-MIB::versionIdent.0 = STRING: $Id$
    UCD-SNMP-MIB::versionConfigureOptions.0 = STRING:  '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--program-prefix=' '--disable-dependency-tracking' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-static' '--enable-shared' '--enable-as-needed' '--enable-blumenthal-aes' '--enable-embedded-perl' '--enable-ipv6' '--enable-local-smux' '--enable-mfd-rewrites' '--enable-ucd-snmp-compatibility' '--sysconfdir=/etc' '--with-cflags=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' '--with-ldflags=-Wl,-z,relro -Wl,-z,now -l
    UCD-SNMP-MIB::versionClearCache.0 = INTEGER: 0
    

    The middle OID overruns the 1 KiB buffer it has apparently been allocated, and is therefore probably not null-terminated and also has an unclosed '. I included the surrounding OIDs just in case they affect the result.

    go.mod:

    go 1.17
    
    require github.com/gosnmp/gosnmp v1.35.0
    

    Using the walkexample code with some extra debug:

    package main
    
    import (
            "flag"
            "fmt"
            "log"
            "os"
            "path/filepath"
            "time"
    
            "github.com/gosnmp/gosnmp"
    )
    
    func main() {
            flag.Usage = func() {
                    fmt.Printf("Usage:\n")
                    fmt.Printf("   %s [-community=<community>] host [oid]\n", filepath.Base(os.Args[0]))
                    fmt.Printf("     host      - the host to walk/scan\n")
                    fmt.Printf("     oid       - the MIB/Oid defining a subtree of values\n\n")
                    flag.PrintDefaults()
            }
    
            var community string
            flag.StringVar(&community, "community", "public", "the community string for device")
    
            flag.Parse()
    
            if len(flag.Args()) < 1 {
                    flag.Usage()
                    os.Exit(1)
            }
            target := flag.Args()[0]
            var oid string
            if len(flag.Args()) > 1 {
                    oid = flag.Args()[1]
            }
    
            gosnmp.Default.Target = target
            gosnmp.Default.Community = community
            gosnmp.Default.Timeout = time.Duration(10 * time.Second) // Timeout better suited to walking
            err := gosnmp.Default.Connect()
            if err != nil {
                    fmt.Printf("Connect err: %v\n", err)
                    os.Exit(1)
            }
            defer gosnmp.Default.Conn.Close()
    
            log.Println("Walking", oid)
            err = gosnmp.Default.BulkWalk(oid, printValue)
            if err != nil {
                    fmt.Printf("Walk Error: %v\n", err)
                    os.Exit(1)
            }
            log.Println("Walked", oid, "without error")
    }
    
    func printValue(pdu gosnmp.SnmpPDU) error {
            fmt.Printf("%s = ", pdu.Name)
    
            switch pdu.Type {
            case gosnmp.OctetString:
                    b := pdu.Value.([]byte)
                    fmt.Printf("STRING: %s\n", string(b))
            default:
                    fmt.Printf("TYPE %d: %d\n", pdu.Type, gosnmp.ToBigInt(pdu.Value))
            }
            return nil
    }
    

    To reproduce

    go run . myhost .1.3.6.1.4.1.2021.100

    Expected behavior

    All the OIDs and their values should be printed, OR an error should be returned.

    Observed behavior

    No OIDs nor values are printed, and the program hangs permanently.

GoSNMP is an SNMP client library fully written in Go.

GoSNMP is an SNMP client library fully written in Go. It provides Get, GetNext, GetBulk, Walk, BulkWalk, Set and Traps. It supports IPv4 and IPv6, using SNMPv1, SNMPv2c or SNMPv3. Builds are tested against linux/amd64 and linux/386.

Oct 28, 2021
Tool for monitoring network devices (mainly using SNMP) - monitoring check plugin
Tool for monitoring network devices (mainly using SNMP) - monitoring check plugin

Thola Description A tool for monitoring network devices written in Go. It features a check mode which complies with the monitoring plugins development

Dec 29, 2022
Demo of EdgeX Foundry Ireland (or Jakarta) release with real Modbus, SNMP and GPIO pin devices

Ireland Demo This demo shows the Ireland (or Jakarta - it works for both) release of EdgeX with the following devices: Comet Systems T0310 temperature

Nov 6, 2021
A Minecraft scanner written in Golang (first Golang project)

__ __/ \__ Gothyc A Minecraft port scanner written in Go. ?? / \__/ \__ \__/ \__/ \ Version 0.3.0 \__/ \__/ Author @toas

Nov 6, 2022
A simple TUN/TAP library written in native Go.

water water is a native Go library for TUN/TAP interfaces. water is designed to be simple and efficient. It wraps almost only syscalls and uses only G

Jan 7, 2023
Minecraft Server List Ping library written in Go

minequery Minecraft Server List Ping library written in Go. Features Modern Mine

Dec 28, 2022
A library for the MIGP (Might I Get Pwned) protocolA library for the MIGP (Might I Get Pwned) protocol

MIGP library This contains a library for the MIGP (Might I Get Pwned) protocol. MIGP can be used to build privacy-preserving compromised credential ch

Dec 3, 2022
The hotwire demo chat written in Golang

Hotwire Go Example This is a recreation of the Hotwire Rails Demo Chat with a Go backend. See the Hotwire docs for more information about Hotwire. Qui

Jan 4, 2023
High-performance PHP application server, load-balancer and process manager written in Golang
High-performance PHP application server, load-balancer and process manager written in Golang

RoadRunner is an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager. It supports running as a serv

Jan 1, 2023
An URL shortener service written in Golang

ggz An URL shortener service written in Golang. Features Support MySQL, Postgres or SQLite Database. Support RESTful or GraphQL API. Support Auth0 or

Dec 26, 2022
Squzy - is a high-performance open-source monitoring, incident and alert system written in Golang with Bazel and love.

Squzy - opensource monitoring, incident and alerting system About Squzy - is a high-performance open-source monitoring and alerting system written in

Dec 12, 2022
Centralized Configuration System written in Golang - Spring cloud compatible
Centralized Configuration System written in Golang - Spring cloud compatible

Centralized Configuration System What is Vecosy Vecosy is a configuration service exposed through REST/GRPC. Is Spring Cloud Conf compatible and also

Dec 13, 2022
EasyTCP is a light-weight and less painful TCP server framework written in Go (Golang) based on the standard net package.

EasyTCP is a light-weight TCP framework written in Go (Golang), built with message router. EasyTCP helps you build a TCP server easily fast and less painful.

Jan 7, 2023
The Jenkins client was written by Golang

jenkins-client Document How to get it go.mod require github.com/jenkins-zh/jenkins-client Configuration Examples of jcli configuration - name: dev

Oct 31, 2022
Bell is the simplest event system written in Go (Golang) which is based on the execution of handlers independent of the main channel.

Bell Bell is the simplest event system written in Go (Golang) which is based on the execution of handlers independent of the main channel. Written in

Nov 17, 2022
A socks5 server(tcp/udp) written in golang.

socks5-server A socks5 server(tcp/udp) written in golang. Usage Usage of /main: -l string local address (default "127.0.0.1:1080") -p stri

Nov 20, 2022
Minimalistic paste daemon written in golang

Minimalistic paste daemon written in golang

Dec 4, 2022
HttpRunner+ is the next generation of HttpRunner, written in golang
HttpRunner+ is the next generation of HttpRunner, written in golang

hrp (HttpRunner+) hrp is a golang implementation of HttpRunner. Ideally, hrp will be fully compatible with HttpRunner, including testcase format and u

Sep 28, 2022