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

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}'
Comments
  • 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.

  • 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 user@host
        sample: top
    

    Text box reports the following:

    SAMPLING FAILURE
    exec: not started
    
  • 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
    
  • 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!

  • 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!)

  • 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

  • Allow nested components

    Allow nested components

    It'd be nice to have something like:

    --- My dashboard ----------------
    | Component:1     | Component:2 |
    |                               |
    | Component:3                   |
    ---------------------------------
    
  • 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
    
  • 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.

  • merge macosDir & linuxDir into unixDir

    merge macosDir & linuxDir into unixDir

    In some condition, we work on macOS and linux together, maybe it's nice to put storage path together in unix system.

    sorry for my poor English.

    relate issue: #14

  • Save config in user's home, not root directory

    Save config in user's home, not root directory

    The default case for the getPlatformStoragePath tries to use /.config/Sampler on Linux and other Unixes, rather than $HOME/.config/Sampler as it should.

    I had to temporarily comment out the code related to the alsa issue, but after doing so I was able to run on Linux (only tested on Ubuntu) and confirm this does write to the correct directory now.

    chris@<REDACTED>:~/.config/Sampler$ pwd
    /home/chris/.config/Sampler
    chris@<REDACTED>:~/.config/Sampler$ ls -al
    total 0
    drwxrwxrwx 1 chris chris 4096 Aug  2 22:12 .
    drwx------ 1 chris chris 4096 Aug  2 22:12 ..
    -rwxrwxrwx 1 chris chris  157 Aug  2 22:12 statistics.yml
    

    I didn't see any tests, so I didn't add any for this. If I overlooked them please point me at the right location and I'll add a new one or update whatever is there to cover this case.

  • textbox keeps previous output after getting empty result from jq

    textbox keeps previous output after getting empty result from jq

    Hi, I'm getting weird behaviour with jq, which looks like a bug. sampler config yaml

    textboxes:
      - title: Running Jobs
        rate-ms: 2000
        sample: cat example.json | jq -r '.[] | select (.status == "running") | .ID'
    

    example.json

    [
      {
        "ID": 1,
        "status": "stopped"
      },
      {
        "ID": 2,
        "status": "running"
      }
    ]
    

    Scenario

    1. When running sampler the textbox shows "2" as expected.
    2. Change 2nd status "running" to "stopped" and save example.json.
    3. The textbox keeps showing "2".
    4. Expected: empty textbox
  • wrong results of sample commands

    wrong results of sample commands

    Hi,

    the following sample commands yield wrong results in sampler:

    • /usr/bin/ps -ef | grep mbatchd | grep -v grep | wc -l consistently results in one more than the number of mbatchd processes
    • /usr/bin/ps -eLf | grep 'mbatchd' | grep -v 'grep' | wc -l results in around 20 to 30 more than the number of mbatchd threads

    The whole configuration block looks like

    runcharts:
      - title: mbatchd processes and threads
        position: [[0, 0], [45, 19]]
        rate-ms: 2000
        legend:
            enabled: true
            details: true
        scale: 0
        items:
          - label: mbatchd processes
            sample: /usr/bin/ps -ef | grep mbatchd | grep -v grep | wc -l
          - label: mbatchd threads
            sample: /usr/bin/ps -eLf | grep 'mbatchd' | grep -v 'grep' | wc -l
    

    Any idea what could be the problem? Is there a way to see, how sampler evaluates the sample commands?

  • :grey_question:  Layout question (jq | column) inside textboxes (deal with t ad \t)

    :grey_question: Layout question (jq | column) inside textboxes (deal with t ad \t)

    :point_right: Context

    I'm preparing of ready to use sample dashboards. At the end i'll create a dedicated & public GH repo.

    :grey_question: Question about alignement

    I would like to get the following command in a nice looking way in sampler.

    Everything looks fine from the terminal :

    curl -s https://hub.docker.com/v2/repositories/optnc | jq -r '"Image\tStars\tPulls", "-----------------------\t-------\t------", ( .results | sort_by(.pull_count) | reverse | .[] | "\(.name)\t\(.star_count)\t\(.pull_count)")' | column -t -s $'\t'
    

    see below :

    image

    ... but when I put the same commad in the following conf (inspired by code sample) :

    textboxes:
      - title: OPT-NC Docker image stats
        rate-ms: 15000
        sample: curl -s https://hub.docker.com/v2/repositories/optnc | jq -r '"Image\tStars\tPulls", "-----------------------\t-------\t------", ( .results | sort_by(.pull_count) | reverse | .[] | "\(.name)\t\(.star_count)\t\(.pull_count)")' | column -t -s $'\t'
    

    I get the following render (something weird appears with t and \t) :

    image

    :point_right: I guess it has to deal with special characters... but in your sample I did not see any special tricks

    Any idea about what I'm doing wrong ?... or am missing in formating options ?

    Thank you in advance for any help or feedback.

  • Macos ssh pty error

    Macos ssh pty error

    Running sampler on darwin. Installed via homebrew.

    Attempting to include a box that connects to local server via ssh. Copied config from github page as follows.

    textboxes:
      - title: SSH
        pty: true
        init: ssh -i ~/.ssh/id_rsa [email protected]
        sample: top
    

    With the server address replaced with the appropriate username and address.

    This returns the error:

    ┌──────────────────────────────────────────────────────────────────┐     │
    │     │                         SAMPLING FAILURE                         │     │
    │     │    fork/exec /bin/sh: Setctty set but Ctty not valid in child    │     │
    │     └──────────────────────────────────────────────────────────────────┘panic: runtime error: invalid memory address or nil pointer dereference              │
    [signal SIGSEGV: segmentation violation code=0x2 addr=0x18 pc=0x102505a98]     │
    │                                                                              │
    goroutine 37 [running]:                                                        │
    io.WriteString(0x0, 0x0, 0x140001c4098, 0x5, 0x0, 0x140001c4098, 0x5)──────────┘
    	/opt/homebrew/Cellar/go/1.15.6/libexec/src/io/io.go:311 +0xa8
    github.com/sqshq/sampler/data.(*PtyInteractiveShell).execute(0x140001dc190, 0x0, 0x0, 0x0, 0x0)
    	/private/tmp/sampler-20201225-38055-jays8r/sampler-1.1.0/data/int_pty.go:70 +0xdc
    github.com/sqshq/sampler/data.(*Item).nextValue(0x14000192080, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)config.ymlet alerts   (<->) selection   (p) pause   (q) quit
    	/private/tmp/sampler-20201225-38055-jays8r/sampler-1.1.0/data/item.go:57 +0x58
    github.com/sqshq/sampler/data.(*Sampler).sample(0x140000bc7e0, 0x14000192080, 0x140000a0720, 0x0, 0x0, 0x0, 0x0)
    	/private/tmp/sampler-20201225-38055-jays8r/sampler-1.1.0/data/sampler.go:59 +0x44
    created by github.com/sqshq/sampler/data.NewSampler.func1
    	/private/tmp/sampler-20201225-38055-jays8r/sampler-1.1.0/data/sampler.go:35 +0x78
    
    

    My terminal also does not accept scrolling or clicking after this error, instead writing the codes for those actions to the prompt. This continues until I reload or switch my shell.

    This error does not occur if i remove pty: true, however, if i do so it instead brings up the wake text of the server.

    I believe this is caused by some issue with the pseudoterminal, But I am not experienced enough on that subject to provide any more meaningful analysis. If you need any more information please let me know.

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

Mar 3, 2022
cTRL: a server for remote execution of pending tasks and commands in real time

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

Mar 3, 2022
Testing local and remote shell commands in Go

Testing local and remote shell commands in Go. This is an (intentionally simplified) example of how unix shell commands can be unit-tested in Go. The

Nov 30, 2021
ap 是一个 shell 工具,可以让其它 shell 命令的输出能够自动进入交互翻页模式

ap -- auto-pager ap 是一个 shell 工具,可以让其它 shell 命令的输出能够自动进入交互翻页模式。 ap 由两部分组成,一个 Go 语言编写的二进制程序,负责捕获命令的输出并支持翻页, 和一组 shell 脚本,负责为用户指定的命令清单创建与之同名的 wrapper。 经

Apr 12, 2022
🧑‍💻📊 Show off your most used shell commands
🧑‍💻📊 Show off your most used shell commands

tsukae ??‍?? ?? Tsukae, 使え - means use in Japanese (so it refers to commands that you use) Built on top of termui and cobra Big shoutout to jokerj40 f

Dec 17, 2022
Go package for running Linux distributed shell commands via SSH.
Go package for running Linux distributed shell commands via SSH.

Go package for running Linux distributed shell commands via SSH.

Dec 7, 2022
Create new commands from your shell history or terminal.

overdub Create new commands from your shell history or terminal. TODO list for initial release Filter out unlikely commands (e.g. package managers) fr

Aug 9, 2022
This utility verifies all commands used by a shell script against an allow list

Find external commands required by shell scripts When writing shell scripts that need to run portably across multiple hosts and platforms, it's useful

Aug 15, 2022
A simple visualization from the terminal of tintin++ bot status.
A simple visualization from the terminal of tintin++ bot status.

Kalterm A simple visualization from the terminal of tintin++ bot status. It uses kalterm.tin (in the tintin directory) to create a #port session on 95

Oct 27, 2022
Stack Up is a simple deployment tool that performs given set of commands on multiple hosts in parallel.
Stack Up is a simple deployment tool that performs given set of commands on multiple hosts in parallel.

Stack Up is a simple deployment tool that performs given set of commands on multiple hosts in parallel. It reads Supfile, a YAML configuration file, which defines networks (groups of hosts), commands and targets.

Jan 1, 2023
Command-line tool to load csv and excel (xlsx) files and run sql commands
Command-line tool to load csv and excel (xlsx) files and run sql commands

csv-sql supports loading and saving results as CSV and XLSX files with data processing with SQLite compatible sql commands including joins.

Nov 2, 2022
A shell tool to create counting semaphores, acquire them and release them.

A shell tool to create counting semaphores, acquire them and release them. This is useful if you want to e.g. run no more than N out of M commands in parallel.

Oct 12, 2021
A CLI command to parse Terraform execution result and notify it to Backlog
A CLI command to parse Terraform execution result and notify it to Backlog

tf2b Fork of mercari/tfnotify tf2b parses Terraform commands' execution result and applies it to an arbitrary template and then notifies it to Backlog

Oct 15, 2021
OS Command Execution and Gets the output

OS Command Execution and Gets the output https://stackoverflow.com/questions/24095661/os-exec-sudo-command-in-go/24095983#24095983 https://stackoverfl

Dec 24, 2021
Cobra CLI tool to generate applications and commands

Cobra Generator Cobra provides its own program that will create your application and add any commands you want. It's the easiest way to incorporate Co

Jan 3, 2023
Blocking CMD shell interaction tool.

CliToolkit Blocking command line shell interaction tool. CliToolkit is a small cmd package for Go cmd shell interaction application. Installation # do

Oct 28, 2021
Go Coverage in Shell: a tool for exploring Go Coverage reports from the command line
Go Coverage in Shell: a tool for exploring Go Coverage reports from the command line

Go Coverage in Shell: a tool for exploring Go Coverage reports from the command line

Dec 31, 2022
A CLI tool which loads data from yaml files into the Google Cloud Spanner tables

splanter A CLI tool which loads data from yaml files into the Google Cloud Spanner tables (mainly for the development).

Oct 27, 2022
A simple posix shell created in golang

Fox-Shell Description Fox-Shell is a simple posix shell builded with golang Features - chdir works perfectly - mkdir works, but need bug fix To-Do Li

Dec 13, 2021