Skip to main content

Sampler - A Tool For Shell Commands Execution (How to install)

Sampler - A Tool For Shell Commands Execution (How To Install)

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

Installation

macOS

brew cask install sampler

oR

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

Linux

wget https://github.com/sqshq/sampler/releases/download/v1.0.1/sampler-1.0.1-linux-amd64 -O /usr/local/bin/sampler
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 do it with your favorite package manager, e.g apt install libasound2-dev

Windows (experimental)
Recommended to use with advanced console emulators, e.g. Cmder

Usage

You specify shell commands, Sampler executes them with a required rate. The output is used for visualization.
One can sample any dynamic process right from the terminal - observe changes in the database, monitor MQ in-flight messages, trigger deployment process and get notification when it's done.
Using Sampler is basically a 3-step process:
  • Define your configuration in a YAML file
  • Run sampler -c config.yml
  • Adjust components size and location on UI

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

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


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


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


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


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 \t\t\t"

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 an 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 ec2-user@1.2.3.4
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


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 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 containers stats (CPU, MEM, O/I)
textboxes:
- title: Docker containers stats
sample: docker stats --no-stream --format "table \t\t\t\t\t\t"

SSH

TOP command on a remote server
variables:
sshconnection: ssh -i ~/my-key-pair.pem ec2-user@1.2.3.4
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}'


Popular posts from this blog

[Apk Setup] Alpine-term App | without using termux

Install and Setup Alpine Term in Android App Welcome to the world of terminal and Linux environment on your Android device! 📲 In this blog post, we will guide you through the installation and setup process of Alpine Term, an amazing application that brings the power of Alpine Linux to your fingertips. Let's get started! 🚀 What is Alpine Term App? 🏔️ Alpine Term is a terminal and Linux environment application for Android. It utilizes Alpine Linux, running inside a headless x86_64 machine emulated with QEMU. The interaction with the operating system is done through terminals attached to the serial consoles of the virtual machine. This allows you to run commands, execute scripts, and experience a Linux environment on your Android device. System Requirements 📋 To install and use Alpine Term, make sure your device meets the following requirements: 📱 AArch64-based device. 🆙 Android 7.0 or higher. 💾 At least 500 MB of free space on the internal storage. 🌐 ...

Cloudflared in Termux to Create tunnels, Port Forwding

Step-by-Step Guide: Installing Cloudflared in Termux for Android (Alternative to ngrok) | 2024" J Link updated https://github.com/rajbhx/cloudflared-termux What is cloudflare Cloudflare, Inc. is an American content delivery network and DDoS mitigation company, founded in 2010. It acts as a reverse proxy between a website's visitor and the Cloudflare customer's hosting provider. Its headquarters are in San Francisco, California Usages cloudflared -url [localhost]:port_number] example : cloudflared -url localhost:8000 cloudflared tunnel localhost:[port_number] Installation Make sure your Termux app updated The commands you provided are the steps to install Cloudflared in Termux using the `rajbhx/cloudflared-termux` repository. Here's a breakdown of each command: 1. Update and upgrade packages:    ```    pkg update && pkg upgrade && pkg install git    ``` 2...

How to install and setup vShell in android app |कैसे इनस्टॉल करें

How to install and setup android vShell(Virtual Shell) app (no root) कैसे इनस्टॉल करें YouTube video link What is Android-vShell app vShell is a  virtual shell environment application  for the Android OS. A virtual Linux shell environment application for Android OS. Runs Alpine Linux in QEMU system emulator.  It provides a virtual machine running small Linux distribution ready for the use out-of-box. Application implements my view on how Linux terminal environments can look like on Android OS. As operating system security is getting more and more hardened over time (which is good btw), it become impossible to abuse design flaws such as executable user data to run Linux native executables. Ability to...

How to extract Details from any mobile number Using termux | rajbhx

How to extract Details from any mobile number | termux | jarvisstaraq.blogspot.com What is truecallerjs Truecallerjs : A simple package to search phone number details.this tool also work in android and Termux app jarvisstaraq.blogspot.com Requirements Android phone Termux Proper valid Mobile Number(Phone number verification for truecaller) Truecaller InstallationId jarvisstaraq.blogspot.com Installation in Termux Installing Node.js, Git, and Wget in Termux:  To install Node.js, Git, and Wget in Termux, follow these steps: 1. Open your Termux app. 2. Run the following command to update the package lists:     ```    pkg update    ``` 3. Next, install Node.js using the following command:    ```    pkg install nodejs    ``` 4. Install Git using the command:    ```    pkg install git    ``` 5. Lastly...

My Termux | How to install Lazymux in Termux #rajbhx

My Termux | How to install Lazymux in Termux Lazymux t00ls !nstaller !s very easy t0 use, 0nly pr0v!ded f0r lazy Termux users, just k!dd!ng. Lazymux !s a t00l that !s spec!ally made f0r Termux user wh!ch pr0v!des a l0t 0f t00l ma!nly used t00ls !n Termux, Lazymux !nstall any 0f the g!ven t00ls pr0v!ded by !t fr0m !tself w!th just 0ne cl!ck, and Lazymux always get updated.  What !s Python 3?   My Termux | How to install Lazymux in Termux @rajbhx How to Install Oh My Zsh How to download copyright free GAME PLAY CODM/PUBG/BGMI/FreeFire Call of duty mobile 60fps   How to install FacebookToolkit in Termux + linux + windows 10/11 Download any video with termux using youtube-dl | #rajbhx HOw to install Raspbian 9 (Stretch) in Termux #rajbhx On Decembe...

How to install & use report-fb-account-termux tool in termux

report-fb-account-termux   [+]  Disclaimer : This tool is only for educational purpose. The developer is not responsible for any abuse of it.   [+] Installation apt update && apt upgrade -y apt install git python -y git clone https://github.com/jarvisstar/report-fb-account-termux.git cd autoreport python3 ar.py Or, Use Single Command apt install git python -y && git clone https://github.com/KasRoudra/autoreport && cd autoreport && python3 ar.py Screenshots:   Usage: Search "findfbid" in google to get victim's profile link. Such as Website1 , Website2 , Website3 , Website4 . Enter the victim's facebook profile link in the website, generate and copy the numeric id in clipboard. Run the script and enter or paste that id when asked! [+] Note: AUTOREPORT DOES NOT DISABLE ACCOUNT UNLESS THERE IS SPECIFIC POST(S)...

How to install | instagram reporting 2 tool termux by jarvisstaraq

How to install | instagram reporting 2 tool termux by jarvisstaraq Assuming the client truly breaks the instagram rule then their is more opportunities to get prohibited. Instagram limits the reports per unit time, apparatus will auto quit revealing later arrived at limit at very nearly 40 reports. Shows "Detailed Succesfully" later Each Request. You can Report target again later some time (later 2-3 min). Use IP of same district for high effecivity. In the event that you enter invalid username it will in any case send report demand. Assuming that you getting mistake on utilizing intermediaries then, at that point, don't. Requirements Python3 Or Above  Need to install git in linux or termux Download GIT Usage Instagram mass reporter [ TERMUX ]  How to delete Instagram Account by mrwn007 Report tool Termux   [ TERMUX ]

How to Install Java (Open-JDK-8) in Termux | two Methods

How to Install Java (Open-JDK-8) in Termux Method 1: Java 8 Installation Introduction Install Java (Open-JDK-8) in Termux without rooting your Android device. Follow these steps to get Java up and running in your Termux environment. Step-by-Step Guide Step 1: Install Kali Linux in Termux (Optional) pkg install wget proot -y && wget https://raw.githubusercontent.com/MasterDevX/KaliTermux/master/InstallKali.sh && bash InstallKali.sh Step 2: Download OpenJDK-8-JRE Deb Package Visit ftp.debian and copy the link to the OpenJDK-8-JRE deb package. Step 3: Download Deb Package in Kali Machine wget http://ftp.debian.org/debian/pool/main/o/openjdk-8/openjdk-8-jre-headless_8u275-b01-1_arm64.deb Step 4: Install Deb Package Manually dpkg -i openjdk-8-jre-headless_8u275-b01-1_arm64.deb Step 5: Change Java Version (Optional) sudo update-alternatives --config java Final Step: Verify Java Version Select the desired Java version (in this case, Java 8) by typ...

How to delete Instagram Account by mrwn007 Report tool Termux

How to delete Instagram Account by mrwn007 Report tool Termux(Android) What is termux Termux is an Android terminal emulator and Linux environment app that works directly with no rooting or setup required. A minimal base system is installed automatically - additional packages are available using the APT package manager. mrwn007 / 007spam-BOT Check out new updated repository Instagram mass reporter [ TERMUX ] Instagram Reporting 2 [ TERMUX ] Instagram delete new method by crevils [Termux] Why this tool not working:( Because this tool author removed all files and reposiory also just because this tool no working @__@ Installation  pkg install git pkg install python git clone https://github.com/mrwn007/007spam-BOT.git cd 007spam-BOT python3 -m pip install requests python3 bot.py this repo is dead for normal users to report in Ins...

🚀 The 2024 Java Developer Roadmap [UPDATED] 🚀

🚀 The 2024 Java Developer Roadmap [UPDATED] 🚀 Hello aspiring Java developers! 🌟 Welcome to the 2023 Java Developer Roadmap, a comprehensive guide designed to help you navigate your journey towards becoming a proficient Java professional. Whether you're just starting or looking to level up your Java skills, this roadmap will provide you with a clear path to success in the Java ecosystem. 🎉 Introduction Java, as a robust and versatile programming language, continues to be a leading choice for building enterprise-level applications, web services, mobile apps, and more. As we step into 2023, the Java landscape evolves, presenting exciting opportunities for developers like you. This updated Java Developer Roadmap encompasses years of expertise and industry insights to outline the key skills, tools, frameworks, libraries, and APIs that you should master to excel as a Java developer in 2023. 🔍 The Essentials Before diving into Java-specific to...