Tool for shell commands execution, visualization and alerting. Configured with a simple YAML file.

Overview

Sampler. Visualization for any shell command.

Build Status Go Report Card

Sampler is a tool for shell commands execution, visualization and alerting. Configured with a simple YAML file.

sampler

Why do I need it?

One can sample any dynamic process right from the terminal — observe changes in the database, monitor MQ in-flight messages, trigger a deployment script and get notification when it's done.

If there is a way to get a metric using a shell command, then it can be visualized with Sampler momentarily.

Installation

macOS

brew install sampler

or

sudo curl -Lo /usr/local/bin/sampler https://github.com/sqshq/sampler/releases/download/v1.1.0/sampler-1.1.0-darwin-amd64
sudo chmod +x /usr/local/bin/sampler

Linux

sudo wget https://github.com/sqshq/sampler/releases/download/v1.1.0/sampler-1.1.0-linux-amd64 -O /usr/local/bin/sampler
sudo chmod +x /usr/local/bin/sampler

Note: libasound2-dev system library is required to be installed for Sampler to play a trigger sound tone. Usually the library is in place, but if not - you can install it with your favorite package manager, e.g apt install libasound2-dev

Packaging status

  • Fedora sudo dnf install golang-github-sqshq-sampler (F31+)

Windows (experimental)

Recommended to use with advanced console emulators, e.g. Cmder

Via Chocolatey

choco install sampler

or

Download .exe

Docker

# Create a configuration file
vim config.yml

# Build the container image
docker build --tag sampler .

# Run a container
docker run --interactive --tty --volume $(pwd)/config.yml:/root/config.yml sampler --config /root/config.yml

Usage

You specify shell commands, Sampler executes them with a required rate. The output is used for visualization.

Using Sampler is basically a 3-step process:

  • Define your shell commands in a YAML configuration file
  • Run sampler -c config.yml
  • Adjust components size and location on UI

But there are so many monitoring systems already

Sampler is by no means an alternative to full-scale monitoring systems, but rather an easy to setup development tool.

If spinning up and configuring Prometheus with Grafana is complete overkill for you task, Sampler might be the right solution. No servers, no databases, no deploy - you specify shell commands, and it just works.

Then it should be installed on every server I monitor?

No, you can run Sampler on local, but still gather telemetry from multiple remote machines. Any visualization might have init command, where you can ssh to a remote server. See the SSH example

Contents

Components

The following is a list of configuration examples for each component type, with macOS compatible sampling scripts.

Runchart

runchart

runcharts:
  - title: Search engine response time
    rate-ms: 500        # sampling rate, default = 1000
    scale: 2            # number of digits after sample decimal point, default = 1
    legend:
      enabled: true     # enables item labels, default = true
      details: false    # enables item statistics: cur/min/max/dlt values, default = true
    items:
      - label: GOOGLE
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
        color: 178      # 8-bit color number, default one is chosen from a pre-defined palette
      - label: YAHOO
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com
      - label: BING
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.bing.com

Sparkline

sparkline

sparklines:
  - title: CPU usage
    rate-ms: 200
    scale: 0
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
  - title: Free memory pages
    rate-ms: 200
    scale: 0
    sample: memory_pressure | grep 'Pages free' | awk '{print $3}'

Barchart

barchart

barcharts:
  - title: Local network activity
    rate-ms: 500        # sampling rate, default = 1000
    scale: 0            # number of digits after sample decimal point, default = 1
    items:
      - label: UDP bytes in
        sample: nettop -J bytes_in -l 1 -m udp | awk '{sum += $4} END {print sum}'
      - label: UDP bytes out
        sample: nettop -J bytes_out -l 1 -m udp | awk '{sum += $4} END {print sum}'
      - label: TCP bytes in
        sample: nettop -J bytes_in -l 1 -m tcp | awk '{sum += $4} END {print sum}'
      - label: TCP bytes out
        sample: nettop -J bytes_out -l 1 -m tcp | awk '{sum += $4} END {print sum}'

Gauge

gauge

gauges:
  - title: Minute progress
    rate-ms: 500        # sampling rate, default = 1000
    scale: 2            # number of digits after sample decimal point, default = 1
    percent-only: false # toggle display of the current value, default = false
    color: 178          # 8-bit color number, default one is chosen from a pre-defined palette
    cur:
      sample: date +%S  # sample script for current value
    max:
      sample: echo 60   # sample script for max value
    min:
      sample: echo 0    # sample script for min value
  - title: Year progress
    cur:
      sample: date +%j
    max:
      sample: echo 365
    min:
      sample: echo 0

Textbox

textbox

textboxes:
  - title: Local weather
    rate-ms: 10000      # sampling rate, default = 1000
    sample: curl wttr.in?0ATQF
    border: false       # border around the item, default = true
    color: 178          # 8-bit color number, default is white
  - title: Docker containers stats
    rate-ms: 500
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"

Asciibox

asciibox

asciiboxes:
  - title: UTC time
    rate-ms: 500        # sampling rate, default = 1000
    font: 3d            # font type, default = 2d
    border: false       # border around the item, default = true    
    color: 43           # 8-bit color number, default is white
    sample: env TZ=UTC date +%r

Bells and whistles

Triggers

Triggers allow to perform conditional actions, like visual/sound alerts or an arbitrary shell command. The following examples illustrate the concept.

Clock gauge, which shows minute progress and announces current time at the beginning of each minute

gauges:
  - title: MINUTE PROGRESS
    position: [[0, 18], [80, 0]]  
    cur:
      sample: date +%S
    max:
      sample: echo 60
    min:
      sample: echo 0
    triggers:
      - title: CLOCK BELL EVERY MINUTE
        condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0'  # expects "1" as TRUE indicator
        actions:
          terminal-bell: true  # standard terminal bell, default = false
          sound: true    # NASA quindar tone, default = false
          visual: false  # notification with current value on top of the component area, default = false
          script: say -v samantha `date +%I:%M%p`  # an arbitrary script, which can use $cur, $prev and $label variables

Search engine latency chart, which alerts user when latency exceeds a threshold

runcharts:
  - title: SEARCH ENGINE RESPONSE TIME (sec)
    rate-ms: 200
    items:
      - label: GOOGLE
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
      - label: YAHOO
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com     
    triggers:
      - title: Latency threshold exceeded
        condition: echo "$prev < 0.3 && $cur > 0.3" |bc -l  # expects "1" as TRUE indicator
        actions:
          terminal-bell: true  # standard terminal bell, default = false
          sound: true   # NASA quindar tone, default = false
          visual: true  # visual notification on top of the component area, default = false
          script: 'say alert: ${label} latency exceeded ${cur} second' # an arbitrary script, which can use $cur, $prev and $label variables

Interactive shell support

In addition to the sample command, one can specify init command (executed only once before sampling) and transform command (to post-process sample command output). That covers interactive shell use case, e.g. to establish connection to a database only once, and then perform polling within interactive shell session.

Basic mode

textboxes:
  - title: MongoDB polling
    rate-ms: 500
    init: mongo --quiet --host=localhost test # executes only once to start the interactive session
    sample: Date.now();                       # executes with a required rate, in scope of the interactive session
    transform: echo result = $sample          # executes in scope of local session, $sample variable is available for transformation

PTY mode

In some cases interactive shell won't work, because its stdin is not a terminal. We can fool it, using PTY mode:

textboxes:
  - title: Neo4j polling
    pty: true  # enables pseudo-terminal mode, default = false
    init: cypher-shell -u neo4j -p pwd --format plain
    sample: RETURN rand();
    transform: echo "$sample" | tail -n 1
  - title: Top on a remote server
    pty: true  # enables pseudo-terminal mode, default = false
    init: ssh -i ~/user.pem [email protected]
    sample: top    

Multistep init

It is also possible to execute multiple init commands one after another, before you start sampling.

textboxes:
  - title: Java application uptime
    multistep-init:
      - java -jar jmxterm-1.0.0-uber.jar
      - open host:port # or local PID
      - bean java.lang:type=Runtime
    sample: get Uptime

Variables

If the configuration file contains repeated patterns, they can be extracted into the variables section. Also variables can be specified using -v/--variable flag on startup, and any system environment variables will also be available in the scripts.

variables:
    mongoconnection: mongo --quiet --host=localhost test
barcharts:
  - title: MongoDB documents by status
    items:
      - label: IN_PROGRESS
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'IN_PROGRESS'}).count()
      - label: SUCCESS
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'SUCCESS'}).count()
      - label: FAIL
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'FAIL'}).count()

Color theme

light-theme

theme: light # default = dark
sparklines:
  - title: CPU usage
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'

Real-world recipes

Databases

The following are different database connection examples. Interactive shell (init script) usage is recommended to establish connection only once and then reuse it during sampling.

MySQL
# prerequisite: installed mysql shell

variables:
  mysql_connection: mysql -u root -s --database mysql --skip-column-names
sparklines:  
  - title: MySQL (random number example)
    pty: true
    init: $mysql_connection
    sample: select rand();
PostgreSQL
# prerequisite: installed psql shell

variables:
  PGPASSWORD: pwd
  postgres_connection: psql -h localhost -U postgres --no-align --tuples-only
sparklines:
  - title: PostgreSQL (random number example)
    init: $postgres_connection
    sample: select random();
MongoDB
# prerequisite: installed mongo shell

variables:
  mongo_connection: mongo --quiet --host=localhost test
sparklines:
  - title: MongoDB (random number example)
    init: $mongo_connection
    sample: Math.random();
Neo4j
# prerequisite: installed cypher shell

variables:
  neo4j_connection: cypher-shell -u neo4j -p pwd --format plain
sparklines:
  - title: Neo4j (random number example)
    pty: true
    init: $neo4j_connection
    sample: RETURN rand();
    transform: echo "$sample" | tail -n 1

Kafka

Kafka lag per consumer group
variables:
  kafka_connection: $KAFKA_HOME/bin/kafka-consumer-groups --bootstrap-server localhost:9092
runcharts:
  - title: Kafka lag per consumer group
    rate-ms: 5000
    scale: 0
    items:
      - label: A->B
        sample: $kafka_connection --group group_a --describe | awk 'NR>1 {sum += $5} END {print sum}'
      - label: B->C
        sample: $kafka_connection --group group_b --describe | awk 'NR>1 {sum += $5} END {print sum}'
      - label: C->D
        sample: $kafka_connection --group group_c --describe | awk 'NR>1 {sum += $5} END {print sum}'

Docker

Docker containers stats (CPU, MEM, O/I)
textboxes:
  - title: Docker containers stats
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"

SSH

TOP command on a remote server
variables:
  sshconnection: ssh -i ~/my-key-pair.pem [email protected]
textboxes:
  - title: SSH
    pty: true
    init: $sshconnection
    sample: top

JMX

Java application uptime example
# prerequisite: download [jmxterm jar file](https://docs.cyclopsgroup.org/jmxterm)

textboxes:
  - title: Java application uptime
    multistep-init:
      - java -jar jmxterm-1.0.0-uber.jar
      - open host:port # or local PID
      - bean java.lang:type=Runtime
    sample: get Uptime
    transform: echo $sample | tr -dc '0-9' | awk '{printf "%.1f min", $1/1000/60}'
Issues
  • Cannot run sampler on MacOS Catalina [10.15 Beta (19A558d)]

    Cannot run sampler on MacOS Catalina [10.15 Beta (19A558d)]

    When I try to run sampler from shell (both ZSH and BASH) I get an error popup saying that "Application sampler-1.0.3-darwin-amd64 cannot be opened, because its identity cannot be verified".

    I suspect that it has to do something with Catalinas security improvements/enforcement.

    opened by xoores 9
  • SSH - Top doesn't work on Ubuntu to RPi connection

    SSH - Top doesn't work on Ubuntu to RPi connection

    textboxes:
      - title: SSH
        pty: false
        init: ssh -i /home/user/.ssh/id_rsa.pub -t [email protected]
        sample: top
    

    Text box reports the following:

    SAMPLING FAILURE
    exec: not started
    
    opened by e4c6 8
  • can't run on ubuntu server

    can't run on ubuntu server

    I get this on ubuntu server 18.04

    panic: oto: ALSA error: No such file or directory
    
    goroutine 1 [running]:
    github.com/sqshq/sampler/asset.NewAudioPlayer(0x0)
    	/home/sqshq/go/src/github.com/sqshq/sampler/asset/player.go:24 +0x188
    main.main()
    	/home/sqshq/go/src/github.com/sqshq/sampler/main.go:86 +0xf0
    
    bug 
    opened by 5ilvers 7
  • Where is your color palette defined?

    Where is your color palette defined?

    I'm trying to run your runcharts.yml example, but I'm not a fan of the color you chose for Google. It seems to me that it is closer to the color that should be used for Yahoo.

    So, this has sent me down the rathole of trying to figure out where your color palette is defined, so that I can find the appropriate Web-safe or HTML color that would most appropriately represent different entities, and then map that back to the closest matching 8-bit color.

    But I can't find anything anywhere in your repo that makes this mapping obvious.

    Can you help me out here? Is there a standard Go reference that I'm not aware of? Thanks!

    opened by bknowles 7
  • Unicode characters not rendering properly in WSL

    Unicode characters not rendering properly in WSL

    Hi there, nice product btw

    When I execute sampler with a sample config.yml file, the charts display a '?' inside a square where should be a point or a line to display the chart properly.

    I guess this should be because my computer doesn't have the font, or the correct character to display.

    Enviroment: Ubuntu 18.04.2 LTS Executing Ubuntu from windows throught WSL (not virtual machine!)

    opened by bakeiro 6
  • 2019/08/07 13:37:30 Failed to read config file: yaml: line 51: mapping values are not allowed in this context

    2019/08/07 13:37:30 Failed to read config file: yaml: line 51: mapping values are not allowed in this context

    Using the example.yml

    sampler --config example.yml
    2019/08/07 13:37:30 Failed to read config file: yaml: line 51: mapping values are not allowed in this context

    opened by jbunce 6
  • Allow nested components

    Allow nested components

    It'd be nice to have something like:

    --- My dashboard ----------------
    | Component:1     | Component:2 |
    |                               |
    | Component:3                   |
    ---------------------------------
    
    enhancement 
    opened by pjmp 6
  • Support for Raspberry PI

    Support for Raspberry PI

    I'm trying to set up sampler to work as a dashboard running on a Raspberry PI. I managed to get it to compile on the PI but when i try to run it i get the following error:

    # sampler --config conf.yml
    panic: non-positive interval for NewTicker [recovered]
            panic: non-positive interval for NewTicker
    
    goroutine 1 [running]:
    main.handleCrash(0x108e5a0, 0x10708a0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1075cc0)
            /root/sampler-1.0.3/main.go:127 +0x170
    panic(0x339418, 0x100e198)
            /usr/lib/go-1.11/src/runtime/panic.go:513 +0x194
    time.NewTicker(0xd964b800, 0xffffffff, 0x123a5a0)
            /usr/lib/go-1.11/src/time/tick.go:23 +0x1bc
    github.com/sqshq/sampler/data.NewSampler(0x1085310, 0x1085320, 0x3, 0x4, 0x650634, 0x0, 0x0, 0x10708a0, 0x0, 0x0, ...)
            /root/sampler-1.0.3/data/sampler.go:20 +0x2c
    main.(*Starter).start(0x10d7f30, 0x3eb490, 0x1183b80, 0x1085310, 0x107ad70, 0xb, 0x10759c0, 0x2, 0x2, 0x107bd88, ...)
            /root/sampler-1.0.3/main.go:68 +0x288
    main.(*Starter).startAll(0x10d7f30, 0x1202000, 0x1196060, 0x1196090)
            /root/sampler-1.0.3/main.go:49 +0x538
    main.main()
            /root/sampler-1.0.3/main.go:115 +0x26c
    
    opened by the-louie 5
  • Feature request - Multiple display

    Feature request - Multiple display "pages"

    Would it be possible to add some form of pages that can be switched between? Similar to how a security camera system has multiple cameras/ camera groupings that it flips through.

    If you would have it if i made it, I would love to work on this myself.

    opened by deefdragon 5
  • Typo in tag `dashboard`

    Typo in tag `dashboard`

    opened by NightMachinary 0
  • Textbox formatting question

    Textbox formatting question

    I created a shell script that outputs columns. When I run it is a normal shell everything aligns nicely. When I run the shell script with sampler the output looks different. Here is not output from bash

    Errors:                 Warnings:               Criticals:
    Current Hour     299    Current Hour     70     Current Hour     0
    1 Hour Ago       1367   1 Hour Ago       1022   1 Hour Ago       1
    2 Hours Ago      807    2 Hours Ago      426    2 Hours Ago      0
    3 Hours Ago      780    3 Hours Ago      0      3 Hours Ago      0
    Last 5 minutes   0      Last 5 minutes   0      Last 5 minutes   0
    

    When it runs inside Sampler I get this inside the textbox:

    image

    I created the textbox as such:

      - title: Log Error count
        position: [[35, 24], [45, 12]]
        pty: true
        rate-ms: 5000
        sample: /root/monitor_commands/error_count.bash
    

    I also noticed when I use bold characters with the following code the text that should be in bold is not. I'm sure that the 2 issues I experience is related.

    bold=$(tput bold)
    normal=$(tput sgr0)
    
    echo "this is ${bold}bold${normal} but this isn't"
    

    Should I find an alternative to my method or is this something that needs to be fixed inside Sampler?

    opened by daniejstriata 0
  • Installed but getting zsh: exec format error: sampler

    Installed but getting zsh: exec format error: sampler

    Installed but getting

    zsh: exec format error: sampler
    opened by cocoonkid 0
  • Feature request: Dynamic items or Dictionnary items

    Feature request: Dynamic items or Dictionnary items

    Supposedly you have something like :

        items:                                                                                                      
          - label: toots                                                                                            
            sample: systemd-cgtop -m -1 -b -r --depth=1| grep lxc.payload.toots | awk '{ print int($4/1024/1024) }' 
          - label: cloud                                                                                            
            sample: systemd-cgtop -m -1 -b -r --depth=1| grep lxc.payload.cloud | awk '{ print int($4/1024/1024) }' 
          - label: photos                                                                                           
            sample: systemd-cgtop -m -1 -b -r --depth=1| grep lxc.payload.photos | awk '{ print int($4/1024/1024) }'
    

    I would like to have ability to either dynamic get items and labels.

    systemd-cgtop -m -1 -b -r --depth=1| grep lxc.payload. | awk '{ print $1, int($4/1024/1024) }' 
    lxc.payload.toots 1394
    lxc.payload.cloud 375
    lxc.payload.git 347
    
    Automatically get label with $1, and value with $2.
    

    Or having a dict.

        items: ['toots', 'cloud', 'photos']                                                                                                   
          - label: {{ items }}                                                                                            
            sample: systemd-cgtop -m -1 -b -r --depth=1| grep lxc.payload.{{ items }} | awk '{ print int($4/1024/1024) }' 
    
    opened by benpro 0
  • Sampler freezes after spawing a lot of processes (on server)

    Sampler freezes after spawing a lot of processes (on server)

    image

    Is it error in config or bug?

    runcharts:
      - title: VK's response time
        position: [[42, 16], [38, 25]]
        rate-ms: 500
        triggers:
          - title: Latency threshold exceeded
            condition: echo "$prev < 0.3 && $cur > 0.3" |bc -l
            actions:
                terminal-bell: true
                sound: true
                visual: true
                script: 'say alert: ${label} latency exceeded ${cur} second'
        legend:
            enabled: true
            details: false
        scale: 2
        items:
          - label: VK
            color: 178
            sample: curl -o /dev/null -s -w '%{time_total}'  https://www.vk.com
    sparklines:
      - title: CPU Usage
        position: [[57, 9], [23, 8]]
        rate-ms: 200
        scale: 0
        sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
      - title: RAM Usage
        position: [[57, 0], [23, 9]]
        rate-ms: 200
        scale: 0
        sample: echo "scale=1; $(vmstat -s | grep 'used memory' | awk '{print $1}') /
            $( vmstat -s | grep 'total memory' | awk '{print $1}') * 100" | bc
    textboxes:
      - title: Docker containers stats
        position: [[0, 9], [57, 8]]
        rate-ms: 500
        sample: docker stats --no-stream --format "table {{.Name}} \t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"
      - title: Docker logs
        position: [[0, 16], [42, 25]]
        rate-ms: 500
        sample: cd ~/projects/choco; docker-compose logs --tail=0 --follow
    asciiboxes:
      - title: Current time (Europe/Moscow)
        position: [[0, 0], [31, 9]]
        rate-ms: 500
        color: 43
        sample: date +%H:%M:%S
    
    opened by dadyarri 0
  • Possible to disable or hide the bottom status line?

    Possible to disable or hide the bottom status line?

    Is there a way to hide or disable the status menu line at the bottom?

    opened by klundry 1
  • Changing label color

    Changing label color

    This program is fantastic, I love it. Is there any way to change the color of the axis & labels though? Looking at the code it seems it was hard-coded and I would like to make it brighter.

    This is how it looks for me: image

    opened by NikEyX 0
  • Feature Request - Button (mouse click) for on demand script or command execution

    Feature Request - Button (mouse click) for on demand script or command execution

    Would be nice to have a widget that is just a box with a title that can be clicked with a mouse (or tapped with a touchscreen) and executes a script or command.

    opened by klundry 0
  • Converter script to convert the raw values for the axis legend

    Converter script to convert the raw values for the axis legend

    Hi there,

    I use sampler to show what my mobile router is actually transmitting with a config like this:

    runcharts:
      - title: Net Statistics
        position: [[0, 0], [80, 40]]
        rate-ms: 1000
        legend:
            enabled: true
            details: false
        scale: 2
        items:
          - label: Downloadrate
            sample: curl --cookie SessionID=$(curl --silent --cookie-jar - 'http://www.huaweimobilewifi.com/html/index.html'
                | tail -n 1 | cut -f 7) 'http://www.huaweimobilewifi.com/api/monitoring/traffic-statistics'
                | xpath '//response/CurrentDownloadRate/text()' 2>/dev/null
            transform: numfmt --to=iec
          - label: Uploadloadrate
            sample: curl --cookie SessionID=$(curl --silent --cookie-jar - 'http://www.huaweimobilewifi.com/html/index.html'
                | tail -n 1 | cut -f 7) 'http://www.huaweimobilewifi.com/api/monitoring/traffic-statistics'
                | xpath '//response/CurrentUploadRate/text()' 2>/dev/null
            transform: numfmt --to=iec
    

    Now I would really like to convert the numbers that are shown in the x axis of the graph so that instead of the 3333.323 I could have something like 30k / 40k / 40k …

    I haven't been able to find a way to achieve this - but maybe I overlooked something? If not, I would like to promote a key like transform_display: $some_shell_command that would allow this.

    opened by dwt 1
  • warning 'fork/exec /bin/sh: too many open files'

    warning 'fork/exec /bin/sh: too many open files'

    The config file try to get CPU info from multiple server.

        sample: ssh <name>@<ip>   "ps --no-headers -A -o  %cpu  | awk '{ s+=\$1 } END {print s}'"
    

    It's sometimes display ok, and some time there is warning display as below

    SAMPLING FAILURE
    fork/exec /bin/sh: too many open files
    
    opened by lwx5924 0
Releases(v1.1.0)
Owner
Alexander Lukyanchikov
Alexander Lukyanchikov
YAML support for the Go language

YAML support for the Go language Why a new library? As of this writing, there already exists a de facto standard library for YAML processing for Go: h

Masaaki Goshima 493 Jul 24, 2021
Query, update and convert data structures from the command line. Comparable to jq/yq but supports JSON, TOML, YAML, XML and CSV with zero runtime dependencies.

dasel Dasel (short for data-selector) allows you to query and modify data structures using selector strings. Comparable to jq / yq, but supports JSON,

Tom Wright 955 Jul 24, 2021
A Commander for modern Go CLI interactions

Cobra is both a library for creating powerful modern CLI applications as well as a program to generate applications and command files. Cobra is used i

Steve Francia 22.5k Jul 26, 2021
The blackbean is a command tool for elasticsearch operations by using cobra.

The blackbean is a command tool for elasticsearch operations by using cobra. Besides, blackbean is the name of my lovely French bulldog.

null 11 Jul 18, 2021
Simple application watcher

Anko Simple Application watcher The Anko project aims to be a command line used to watch files of different extensions, executing actions previously c

Guilherme Caruso 16 Jun 18, 2021
cTRL is a server for remote execution of pending tasks and commands in real time, supporting a queue with continuous thread limiting and throttling.

Документация на русском: https://github.com/eltaline/ctrl/blob/master/README-RUS.md cTRL is a server written in Go language that uses a modified versi

Eltaline 22 Jun 23, 2021
CONTRIBUTIONS ONLY: A Go (golang) command line and flag parser

CONTRIBUTIONS ONLY What does this mean? I do not have time to fix issues myself. The only way fixes or new features will be added is by people submitt

Alec Thomas 3.1k Jul 26, 2021
Integrated console application library, using Go structs as commands, with menus, completions, hints, history, Vim mode, $EDITOR usage, and more ...

Gonsole - Integrated Console Application library This package rests on a readline console library, (giving advanced completion, hint, input and histor

null 12 Jun 28, 2021
An open-source GitLab command line tool bringing GitLab's cool features to your command line

GLab is an open source GitLab CLI tool bringing GitLab to your terminal next to where you are already working with git and your code without switching

Clement Sam 1.4k Jul 23, 2021
Kong is a command-line parser for Go

Kong is a command-line parser for Go Introduction Help Help as a user of a Kong application Defining help in Kong Command handling Switch on the comma

Alec Thomas 589 Jul 24, 2021
Business Process eXecution Engine

Problem: creating and maintaining robust business systems Creating a proof-of-concept business system is relatively easy. Happy execution path, no cat

BPXE 18 Jul 13, 2021
Commando - run commands against networking devices in batch mode

Commando is a tiny tool that enables users to collect command outputs from a single or a multiple networking devices defined in an inventory file.

Roman Dodin 22 Jul 10, 2021
Teller - the open-source universal secret manager for developers

A secrets management tool for developers built in Go - never leave your command line for secrets.

null 429 Jul 25, 2021
git-xargs is a command-line tool (CLI) for making updates across multiple Github repositories with a single command.

Table of contents Introduction Reference Contributing Introduction Overview git-xargs is a command-line tool (CLI) for making updates across multiple

Gruntwork 447 Jul 16, 2021