File system event notification library on steroids.

Overview
Issues
  • Life is not easy - rework Event type

    Life is not easy - rework Event type

    This commit changes Event type and makes it quite similar to Signal types/interface from std library:

    os - defines a Signal interface.
    os/signal - uses os.Signal interface.
    syscall - defines and declares Signal type which fulfills os.Signal interface. The syscall.Signal type has different impl for each platform.
    
    os - should define an Event (Notify) interface
    os/notify - should contain the rjmagicwtf implementation which uses os.Event interface + platform dependent impl for watchers.
    syscall - defines Event type per each platform...
    

    I didn't create an Event interface because I'm too lazy to fix @rjeczalik 's code which will break after such changes xD

    opened by ppknap 17
  • epoll_wait syscall doesn't exist on arm64.

    epoll_wait syscall doesn't exist on arm64.

    Implement it with by calling epoll_pwait(). According to man epoll_pwait, calling epoll_pwait with sigmask of NULL is identical to epoll_wait.

    Bring the fixes from golang.org/x/sys/unix to support these transparently on arm64.

    This is needed to fix https://github.com/minio/mc/issues/2047

    opened by harshavardhana 14
  • Error handling

    Error handling

    1. Close channel and then notify.Error(ch) error:
    ch := make(chan notify.EventInfo)
    notify.Watch("/home/pknap/.secretporndir", ch, notify.Delete)
    switch ei, ok := <-ch; {
      case ei.Event() == notify.Delete:
        fmt.Printf("Who deleted my %s file?;/\n", ei.Name())
      case !ok:
       fmt.Println("wtf: %v", notify.Error(ch))
    }
    

    [edit] The 1 option can look better:

    ch := make(chan notify.EventInfo)
    notify.Watch("/home/pknap/.secretporndir", ch, notify.Delete)
    switch ei, ok := <-ch; ei.Event() {
      case notify.Delete:
        fmt.Printf("Who deleted my %s file?;/\n", ei.Name())
      default:
        if !ok {
           fmt.Println("wtf: %v", notify.Error(ch))
        }
    
    }
    
    1. Magic unexported event info + close chan(?):
    type notifyError error
    func (e *notifyError) Event() Event     { ... }
    func (e *notifyError) IsDir() bool       { ... }
    func (e *notifyError) Name() string     { ... }
    func (e *notifyError) Sys() interface{}  { ... } 
    func (e *notifyError) Err() error { ... } // Extra method:>
    

    then:

    ch := make(chan notify.EventInfo)
    notify.Watch("/home/pknap/rottenbodies", ch, notify.Delete)
    switch ei := <-ch; ei.Event() {
      case notify.Delete:
        fmt.Printf("Who deleted my %s file?;/\n", ei.Name())
      default: // need to have all registered events in case statement or check `ei.Err() != nil` after `default`
       fmt.Println("wtf: %v", ei.Err())
    }
    

    Other ideas?

    question 
    opened by ppknap 13
  • incompatible with Go 1.6 cgo/GC rules

    incompatible with Go 1.6 cgo/GC rules

    See https://tip.golang.org/doc/go1.6#cgo for background.

    Using Go 1.6rc2 with github.com/cortesi/modd immediately generates a panic from within this library. To reproduce:

    • Use Go 1.6rc2.
    • go get -u github.com/cortesi/modd/cmd/modd
    • Write a file called modd.conf that contains * {}.
    • Execute modd.

    Result:

    panic: runtime error: cgo argument has Go pointer to Go pointer
    
    goroutine 1 [running]:
    github.com/rjeczalik/notify.(*stream).Start(0xc820012700, 0x0, 0x0)
        $GOPATH/src/github.com/rjeczalik/notify/watcher_fsevents_cgo.go:131 +0x270
    github.com/rjeczalik/notify.(*fsevents).watch(0xc8200742c0, 0xc82000e7e0, 0x17, 0x100001b00, 0x0, 0x0)
        $GOPATH/src/github.com/rjeczalik/notify/watcher_fsevents.go:206 +0x313
    github.com/rjeczalik/notify.(*fsevents).RecursiveWatch(0xc8200742c0, 0xc82000e7e0, 0x17, 0x1b0000001b00, 0x0, 0x0)
        $GOPATH/src/github.com/rjeczalik/notify/watcher_fsevents.go:258 +0x51
    go.(*struct { github.com/rjeczalik/notify.watcher; github.com/rjeczalik/notify.recursiveWatcher }).RecursiveWatch(0xc820086140, 0xc82000e7e0, 0x17, 0xc800001b00, 0x0, 0x0)
        <autogenerated>:50 +0x7c
    github.com/rjeczalik/notify.(*recursiveTree).Watch(0xc8200880a0, 0xc82000e7e0, 0x17, 0xc8200a86c0, 0xc82000aaa8, 0x1, 0x1, 0x0, 0x0)
        $GOPATH/src/github.com/rjeczalik/notify/tree_recursive.go:286 +0xad6
    github.com/rjeczalik/notify.Watch(0xc82000aaa0, 0x5, 0xc8200a86c0, 0xc82000aaa8, 0x1, 0x1, 0x0, 0x0)
        $GOPATH/src/github.com/rjeczalik/notify/notify.go:64 +0x7d
    github.com/cortesi/modd/watch.Watch(0xc82000e780, 0x2, 0x2, 0x5f5e100, 0xc8200a84e0, 0xc82000e780, 0x0, 0x0)
        $GOPATH/src/github.com/cortesi/modd/watch/watch.go:301 +0x145
    github.com/cortesi/modd.runOnChan(0xc8200a84e0, 0x4383390, 0x4b002f0, 0xc820012600, 0xc82000e680, 0x4307bb0, 0xb, 0xc82004fdb8, 0x0, 0x0, ...)
        $GOPATH/src/github.com/cortesi/modd/modd.go:89 +0x4d6
    github.com/cortesi/modd.Run(0x4b002f0, 0xc820012600, 0xc82000e680, 0x4307bb0, 0xb, 0xc82004fdb8, 0x0, 0x0, 0x4013277, 0x0, ...)
        $GOPATH/src/github.com/cortesi/modd/modd.go:141 +0xbe
    main.main()
        $GOPATH/src/github.com/cortesi/modd/cmd/modd/main.go:102 +0x9a2
    
    bug 
    opened by josharian 9
  • Missing events when creating files by bulk

    Missing events when creating files by bulk

    Hey Rafal, I'm running into a weird issue with watching, where lot of events are dropped when the files are created in a rapid succession, ie using for f in {0..10}; do echo $f > "$f.txt"; done

    Here's the code I'm using:

    package main
    
    import (
            "github.com/rjeczalik/notify"
            "log"
    )
    
    func main() {
           c := make(chan notify.EventInfo)
            if err := notify.Watch("<folder>", c, notify.All); err != nil {
                log.Fatal(err)
            }
            defer notify.Stop(c)
    
            var index = 0
            for {
                    ei := <-c
                    index += 1
                    if ei.Event() == notify.Create{
                            log.Println("Got event:", ei, index)
                    }
            }
    }
    

    I tried the same with fsnotify and I'm not noticing any drop there:

    package main
    
    import (
            "gopkg.in/fsnotify.v1"
            "log"
    )
    
    func main() {
            watcher, err := fsnotify.NewWatcher()
            if err != nil {
                log.Fatal(err)
            }
            defer watcher.Close()
    
            var index = 0
            done := make(chan bool)
            go func() {
                for {
                    select {
                    case event := <-watcher.Events:
                        if event.Op&fsnotify.Write == fsnotify.Write {
                            index += 1
                            log.Println("modified file:", event.Name, index)
                        }
                    case err := <-watcher.Errors:
                        log.Println("error:", err)
                    }
                }
            }()
    
            if err = watcher.Add("<folder>"); err != nil {
                log.Fatal(err)
            }
            <-done
    }
    

    If I added a bit of sleep (0.1s) between file creation, all the events are received. I tested it on Ubuntu (Koding VM).

    Regards.

    doc 
    opened by sent-hil 9
  • Refactor inotify globals to be a part of struct

    Refactor inotify globals to be a part of struct

    The issue is incomming integration tests would need to instantiate and terminate multiple watcher instances via NewWatcher. As long as inotify is implemented using single global and single syscall.InotifyInit this would break those tests.

    There is no guarantee that integration tests for error handling would be capable to do full and proper cleanup of the global inotify instance, and it's obvious what happens next when a test is not idempotent to a Watcher.

    Moreover running tests in parallel would not be possible without it.

    enhancement help wanted 
    opened by rjeczalik 9
  • FSEvents: lock the CF run loop goroutine to its thread

    FSEvents: lock the CF run loop goroutine to its thread

    CoreFoundation run loops are tied to a particular thread. The goroutine that sets up the run loop may get rescheduled on a different thread just after adding the source. In that case the run loop that's started wouldn't have any sources and thus exit immediately.

    Fix this by locking the goroutine to its thread. The thread is wasted on the run loop anyway, so we might as well claim it earlier.

    Should help with #139

    opened by fjl 7
  • Some fixes regarding unwatching and rewatching a path

    Some fixes regarding unwatching and rewatching a path

    This started in issue #124 and replaces the previously split up PRs. This is bundled as the fixed problems come up in the same tests, but are in separate commits to make each change-diff about a single problem. The commits should explain what is going on.

    opened by imsodin 7
  • FreeBSD - ZFS mounted drive

    FreeBSD - ZFS mounted drive

    Hi, I am trying to use notify to listen to CREATE events in a volume mounted over ZFS in a server running FreeBSD.

    But the event does not get captured at all. The code works fine in my Ubuntu distribution.

    Any idea why? Thanks!

    bug 
    opened by steverob 7
  • Watcher: extend Unwatch arguments with `Event` to be unwatched.

    Watcher: extend Unwatch arguments with `Event` to be unwatched.

    This way you can stop watching only specified events, what is necessary and makes it work as comment says.

    It does not change how current implementations work (they ignore the value, and passed is always All), but allows it to be utilized.

    opened by ghost 7
  • Revert

    Revert "Handle pointers that are now integers in Go 1.10 (fixes #135)"

    The thing I did to fix compatibility for Go 1.10 has been changed again on the Go tree since. To actually build with go1.10rc1 we need to revert my thing. Sorry.

    This reverts commit ff2d4d2cedc09db23cc46d3eeb8b402bca6d819d.

    opened by calmh 6
  • Fixes for recursive tree watcher

    Fixes for recursive tree watcher

    Hello! This PR fixes 3 problems we encountered in the recursive tree watcher implementation and adds 2 new tests:

    • In the recursive tree implementation stopping a child watch will actually unwatch the parent as well, this can be reproduced with the following snippet on MacOS or Windows which uses the recursive tree implementation:
    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"os"
    
    	"github.com/rjeczalik/notify"
    )
    
    func watch(path string) chan notify.EventInfo {
    	c := make(chan notify.EventInfo, 1)
    	if err := notify.Watch(path+"...", c, notify.All); err != nil {
    		panic(err)
    	}
    	return c
    }
    
    func main() {
    	os.MkdirAll("./a/b/c", 0775)
    	defer os.RemoveAll("./a")
    
    	// watch a child and parent path across multiple channels. This can happen in any order.
    	ch1 := watch("./a/b")
    	ch2 := watch("./a/b/c")
    
    	// unwatch ./a/b/c -- this is what triggers unwatching of ./a/b as well
    	notify.Stop(ch2)
    
    	// fire an event that will never show up because the path a/b is now unwatched
    	go func() { ioutil.WriteFile("a/b/c/d", []byte("X"), 0664) }()
    
    	// Never terminates
    	fmt.Println(<-ch1)
    }
    

    I added a new test called TestStopChild that tests explicitly for this problem.

    • The second problem was already described in #155, but is as well a problem in the recursive tree watcher implementation that does not correctly check children nodes for inactive watchpoints. I added a new test called TestAddParentAfterStop that tests explicitly for this problem. With the fixes introduced in this PR, the code snippet in #155 runs fine without any panics
    • The third problem is that on calling Stop(), RecursiveUnwatch is never called, because watchIsRecursive(nd) is called after the watchpoint was already removed and hence the check always returns that the watch is not recursive
    opened by FabianKramm 0
  • Still

    Still "under active development"?

    The README for this project says it is "under active development", and positions it as "on steroids" (presumably as opposed to the more widely used fsnotify package). Is it still under active development?

    opened by egnor 0
  • FILE_TRUNC does not exist on Solaris

    FILE_TRUNC does not exist on Solaris

    This does not compile on Solaris due to C.FILE_TRUNC missing.

    .../go/pkg/mod/github.com/syncthing/[email protected]/watcher_fen_cgo.go:30:25: could not determine kind of name for C.FILE_TRUNC

    opened by gco 0
  • build error from mac osx 10.15 fatal error: 'CoreServices/CoreServices.h' file not found

    build error from mac osx 10.15 fatal error: 'CoreServices/CoreServices.h' file not found

    hi, when I build a project which depends on notify in mac osx 10.15 , it gets below error

    the detail step is described here: would you please to check: https://github.com/ethereum/go-ethereum/issues/21835

    error info

    # github.com/rjeczalik/notify
    ../../pkg/mod/github.com/rjeczalik/[email protected]/watcher_fsevents_cgo.go:10:10: fatal error: 'CoreServices/CoreServices.h' file not found
    #include <CoreServices/CoreServices.h>
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ../../pkg/mod/github.com/rjeczalik/[email protected]/watcher_fsevents_cgo.go:10:10: note: did not find header 'CoreServices.h' in framework 'CoreServices' (loaded from '/System/Library/Frameworks')
    1 error generated.
    
    opened by huahuayu 8
  • Missing events: Not getting any event for the recreated directory

    Missing events: Not getting any event for the recreated directory

    I have set a watch on directory /home/mydir and created a subdirectory (tmp) under it. I dropped some files in directory /home/mydir/tmp and I got the file create events. Then I deleted the directory (/home/mydir/tmp) and recreated it. Again I dropped some files in the directory (/home/mydir/tmp), but this time I am not getting any events in this directory. Seems a probable bug. Any help is much appreciated.

    bug 
    opened by vivek-bansal-VB 10
  • Test suite fails on OpenBSD

    Test suite fails on OpenBSD

    On OpenBSD, I non-deterministically get this failure:

    runtime: kevent on fd 18 failed with 9
    fatal error: runtime: netpoll failed
    
    runtime stack:
    runtime.throw(0x5bee6f, 0x17)
    	/usr/local/go/src/runtime/panic.go:774 +0x72
    runtime.netpoll(0x95539be4f00, 0xd00000000)
    	/usr/local/go/src/runtime/netpoll_kqueue.go:77 +0x253
    runtime.sysmon()
    	/usr/local/go/src/runtime/proc.go:4337 +0x298
    runtime.mstart1()
    	/usr/local/go/src/runtime/proc.go:1201 +0xd9
    runtime.mstart()
    	/usr/local/go/src/runtime/proc.go:1167 +0x6e
    
    goroutine 1 [chan receive]:
    testing.(*T).Run(0xc0003b4200, 0x5be37e, 0x15, 0x5c6b48, 0x47e001)
    	/usr/local/go/src/testing/testing.go:961 +0x377
    testing.runTests.func1(0xc00008e000)
    	/usr/local/go/src/testing/testing.go:1202 +0x78
    testing.tRunner(0xc00008e000, 0xc000068dc0)
    	/usr/local/go/src/testing/testing.go:909 +0xc9
    testing.runTests(0xc00000c0c0, 0x702180, 0x18, 0x18, 0x0)
    	/usr/local/go/src/testing/testing.go:1200 +0x2a7
    testing.(*M).Run(0xc00008c000, 0x0)
    	/usr/local/go/src/testing/testing.go:1117 +0x176
    main.main()
    	_testmain.go:92 +0x135
    
    goroutine 6 [syscall]:
    syscall.Syscall6(0x48, 0x3, 0x0, 0x0, 0xc000030740, 0x1, 0x0, 0x705e00, 0x28ddb1008, 0x0)
    	/usr/local/go/src/syscall/asm_unix_amd64.s:42 +0x5
    syscall.kevent(0x3, 0x0, 0x0, 0xc000030740, 0x1, 0x0, 0x58c9c0, 0xc000046190, 0xc0000306f0)
    	/usr/local/go/src/syscall/zsyscall_openbsd_amd64.go:202 +0x9a
    syscall.Kevent(0x3, 0x0, 0x0, 0x0, 0xc000030740, 0x1, 0x1, 0x0, 0x8, 0xc000030750, ...)
    	/usr/local/go/src/syscall/syscall_bsd.go:447 +0x71
    github.com/rjeczalik/notify.(*kq).Wait(0xc00005e300, 0x0, 0x100000000000000, 0x0, 0x8)
    	/home/edd/source/notify2/watcher_kqueue.go:133 +0x8d
    github.com/rjeczalik/notify.(*trg).monitor(0xc00005e2a0)
    	/home/edd/source/notify2/watcher_trigger.go:401 +0x38
    created by github.com/rjeczalik/notify.newWatcher
    	/home/edd/source/notify2/watcher_trigger.go:112 +0x224
    
    goroutine 7 [chan receive]:
    github.com/rjeczalik/notify.(*nonrecursiveTree).dispatch(0xc0000522a0, 0xc0000521e0)
    	/home/edd/source/notify2/tree_nonrecursive.go:36 +0xb6
    created by github.com/rjeczalik/notify.newNonrecursiveTree
    	/home/edd/source/notify2/tree_nonrecursive.go:29 +0xdc
    
    goroutine 8 [chan receive]:
    github.com/rjeczalik/notify.(*nonrecursiveTree).internal(0xc0000522a0, 0xc000052240)
    	/home/edd/source/notify2/tree_nonrecursive.go:81 +0x58
    created by github.com/rjeczalik/notify.newNonrecursiveTree
    	/home/edd/source/notify2/tree_nonrecursive.go:30 +0x108
    
    goroutine 221 [runnable]:
    syscall.Syscall6(0x48, 0x6, 0xc000103a98, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0)
    	/usr/local/go/src/syscall/asm_unix_amd64.s:42 +0x5
    syscall.kevent(0x6, 0xc000103a98, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    	/usr/local/go/src/syscall/zsyscall_openbsd_amd64.go:202 +0x9a
    syscall.Kevent(0x6, 0xc000103a98, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
    	/usr/local/go/src/syscall/syscall_bsd.go:447 +0x71
    github.com/rjeczalik/notify.(*kq).Watch(0xc00005f290, 0x5f42c0, 0xc000498240, 0xc0003e6600, 0x23, 0x1, 0x30)
    	/home/edd/source/notify2/watcher_kqueue.go:122 +0x9a
    github.com/rjeczalik/notify.(*trg).singlewatch(0xc00005f230, 0xc000430d90, 0x62, 0xf00, 0x1, 0x5f42c0, 0xc000498240, 0x5f11e0, 0xc0000463b0)
    	/home/edd/source/notify2/watcher_trigger.go:166 +0x10b
    github.com/rjeczalik/notify.(*trg).singleunwatch(0xc00005f230, 0xc000430d90, 0x62, 0x0, 0x584a40, 0xc0004bc9d8)
    	/home/edd/source/notify2/watcher_trigger.go:385 +0x112
    github.com/rjeczalik/notify.(*trg).unwatch(0xc00005f230, 0xc000430d90, 0x62, 0x5f42c0, 0xc000498240, 0x0, 0x0)
    	/home/edd/source/notify2/watcher_trigger.go:248 +0x6a
    github.com/rjeczalik/notify.(*trg).Close(0xc00005f230, 0x5f39e0, 0xc00005f230)
    	/home/edd/source/notify2/watcher_trigger.go:126 +0x17b
    github.com/rjeczalik/notify.(*W).Close(0xc000112180, 0x0, 0x0)
    	/home/edd/source/notify2/testing_test.go:299 +0xa3
    panic(0x58bd40, 0xc000188210)
    	/usr/local/go/src/runtime/panic.go:679 +0x1b2
    github.com/rjeczalik/notify.TestStopPathNotExists(0xc0003b4200)
    	/home/edd/source/notify2/watcher_test.go:46 +0x333
    testing.tRunner(0xc0003b4200, 0x5c6b48)
    	/usr/local/go/src/testing/testing.go:909 +0xc9
    created by testing.(*T).Run
    	/usr/local/go/src/testing/testing.go:960 +0x350
    
    goroutine 19 [chan receive]:
    github.com/rjeczalik/notify.(*nonrecursiveTree).internal(0xc0000a4120, 0xc0000a40c0)
    	/home/edd/source/notify2/tree_nonrecursive.go:81 +0x58
    created by github.com/rjeczalik/notify.newNonrecursiveTree
    	/home/edd/source/notify2/tree_nonrecursive.go:30 +0x108
    
    goroutine 16 [chan receive]:
    github.com/rjeczalik/notify.(*nonrecursiveTree).internal(0xc0001e5f20, 0xc0001e5ec0)
    	/home/edd/source/notify2/tree_nonrecursive.go:81 +0x58
    created by github.com/rjeczalik/notify.newNonrecursiveTree
    	/home/edd/source/notify2/tree_nonrecursive.go:30 +0x108
    
    goroutine 97 [chan receive]:
    github.com/rjeczalik/notify.(*nonrecursiveTree).internal(0xc0000a54a0, 0xc0000af0e0)
    	/home/edd/source/notify2/tree_nonrecursive.go:81 +0x58
    created by github.com/rjeczalik/notify.newNonrecursiveTree
    	/home/edd/source/notify2/tree_nonrecursive.go:30 +0x108
    
    goroutine 81 [chan receive]:
    github.com/rjeczalik/notify.NewNonrecursiveTreeTestC.func1(0xc0000af080, 0xc0000af0e0, 0xc0003b4000, 0xc0000af140)
    	/home/edd/source/notify2/testing_test.go:736 +0x41
    created by github.com/rjeczalik/notify.NewNonrecursiveTreeTestC
    	/home/edd/source/notify2/testing_test.go:735 +0xc5
    exit status 2
    FAIL	github.com/rjeczalik/notify	18.054s
    

    Any ideas?

    opened by vext01 1
Releases(v0.9.2)
Owner
Rafal Jeczalik
Rafal Jeczalik
Notification library for gophers and their furry friends.

Shoutrrr Notification library for gophers and their furry friends. Heavily inspired by caronc/apprise. Quick Start As a package Using shoutrrr is easy

containrrr 379 Jun 22, 2022
Apple Push Notification (APN) Provider library for Go 1.6 and HTTP/2.

Apple Push Notification (APN) Provider library for Go 1.6 and HTTP/2. Send remote notifications to iOS, macOS, tvOS and watchOS. Buford can also sign push packages for Safari notifications and Wallet passes.

null 0 Dec 6, 2021
Monitor star changes of GitHub repo, and send the notification to slack or lark.

stargazers Features monitor the star events of the GitHub repo send the notifications to Slack or Lark How to use For Lark, create a bot called like s

Kevin Wan 11 May 31, 2022
FreeSWITCH Event Socket library for the Go programming language.

eventsocket FreeSWITCH Event Socket library for the Go programming language. It supports both inbound and outbound event socket connections, acting ei

Alexandre Fiori 106 Jun 24, 2022
Idiomatic Event Sourcing in Go

Event Sourcing for Go Idiomatic library to help you build Event Sourced application in Go. Please note The library is currently under development and

eventually 76 Apr 30, 2022
An example event-driven application using Atmo and NATS

Atmo + NATS Example Project This repo is an example of using Atmo with NATS as a streaming messaging layer. In this example, Atmo connects to NATS and

Connor Hicks 2 Oct 27, 2021
The kprobe package allows construction of dynamic struct based on kprobe event format descriptions.

The kprobe package allows construction of dynamic struct based on kprobe event format descriptions.

Dan Kortschak 4 Oct 27, 2021
Eye - An easy-use lib for event-driven pattern

?? Eye Eye 是一个简单易用的事件驱动模式库。 Read me in English ?? 功能特性 敬请期待。。。 历史版本的特性请查看 HISTOR

水不要鱼 1 Jan 17, 2022
Cross-platform file system notifications for Go.

File system notifications for Go fsnotify utilizes golang.org/x/sys rather than syscall from the standard library. Ensure you have the latest version

fsnotify 7k Jul 2, 2022
Simple Golang API to demonstrate file upload to fireabase storage and retrieving url of uploaded file.

go-firebase-storage -Work in progress ??️ Simple Golang API that uses Firebase as its backend to demonstrate various firebase services using Go such a

Victor Kabata 4 Oct 4, 2021
Works with HashiCorp HCL. Allows to append the input file with blocks and attributes from the template file

About hclmergetool Works with HashiCorp HCL. Allows to append the input file with blocks and attributes from the template file Installation Binary Rel

Max Fedorov 0 Feb 6, 2022
:chart_with_upwards_trend: Monitors Go MemStats + System stats such as Memory, Swap and CPU and sends via UDP anywhere you want for logging etc...

Package stats Package stats allows for gathering of statistics regarding your Go application and system it is running on and sent them via UDP to a se

Go Playgound 161 May 20, 2022
Real-time Charging System for Telecom & ISP environments

Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments Features Real-time Online/Offline Charging System (OCS). Account Balance

null 353 Jun 23, 2022
go language generics system

Gotgo This document describes the third iteration of my attempt at a reasonable implementation of generics for go based on the idea of template packag

David Roundy 119 Dec 4, 2021
Mobile Blogging System

Mobile Blogging System

mattn 18 Mar 3, 2022
An unified key management system to make life easier.

Safebox An unified key management system to make life easier. The main goal of safebox is to make key backup easier with single main key to derive the

xtaci 52 May 28, 2022
Entitas-Go is a fast Entity Component System Framework (ECS) Go 1.17 port of Entitas v1.13.0 for C# and Unity.

Entitas-Go Entitas-GO is a fast Entity Component System Framework (ECS) Go 1.17 port of Entitas v1.13.0 for C# and Unity. Code Generator Install the l

Vladislav Fedotov 19 Jun 15, 2022
Lithia is an experimental functional programming language with an implicit but strong and dynamic type system.

Lithia is an experimental functional programming language with an implicit but strong and dynamic type system. Lithia is designed around a few core concepts in mind all language features contribute to.

Valentin Knabel 6 Jun 14, 2022
A golang application to mock the billing system

mock-billing-cli A golang application to mock the billing system in super markets Features View all items & items with filter Refill items with admin

Ramya D 0 Jan 13, 2022