All checks were successful
learn org at code.softwareshinobi.com/linux.softwareshinobi.com/pipeline/head This commit looks good
266 lines
5.2 KiB
Markdown
266 lines
5.2 KiB
Markdown
# Interactive Menu
|
|
|
|
Build interactive Bash menus. This guide shows you how to create a menu where users choose which actions to run, leveraging previously defined functions for server status checks:
|
|
|
|
* Memory usage
|
|
* CPU load
|
|
* TCP connections
|
|
* Kernel version
|
|
|
|
Here's the base script containing these functions:
|
|
|
|
```bash
|
|
#!/usr/bin/env bash
|
|
|
|
##
|
|
# Server status script:
|
|
# - Memory usage
|
|
# - CPU load
|
|
# - Number of TCP connections
|
|
# - Kernel version
|
|
##
|
|
|
|
server_name=$(hostname)
|
|
|
|
function memory_check() {
|
|
echo ""
|
|
echo "Memory usage on ${server_name}: "
|
|
free -h
|
|
echo ""
|
|
}
|
|
|
|
function cpu_check() {
|
|
echo ""
|
|
echo "CPU load on ${server_name}: "
|
|
echo ""
|
|
uptime
|
|
echo ""
|
|
}
|
|
|
|
function tcp_check() {
|
|
echo ""
|
|
echo "TCP connections on ${server_name}: "
|
|
echo ""
|
|
cat /proc/net/tcp | wc -l
|
|
echo ""
|
|
}
|
|
|
|
function kernel_check() {
|
|
echo ""
|
|
echo "Kernel version on ${server_name}: "
|
|
echo ""
|
|
uname -r
|
|
echo ""
|
|
}
|
|
|
|
function all_checks() {
|
|
memory_check
|
|
cpu_check
|
|
tcp_check
|
|
kernel_check
|
|
}
|
|
```
|
|
|
|
We'll now integrate this with a menu, allowing users to select a function to execute.
|
|
|
|
---
|
|
|
|
### Add Color for Readability
|
|
|
|
Enhance your menu's readability with simple color functions. Add these variables and functions to your script:
|
|
|
|
```bash
|
|
##
|
|
# Color Variables
|
|
##
|
|
green='\e[32m'
|
|
blue='\e[34m'
|
|
red='\e[31m'
|
|
clear='\e[0m'
|
|
|
|
##
|
|
# Color Functions
|
|
##
|
|
|
|
ColorGreen(){
|
|
echo -ne $green$1$clear
|
|
}
|
|
ColorBlue(){
|
|
echo -ne $blue$1$clear
|
|
}
|
|
ColorRed(){
|
|
echo -ne $red$1$clear
|
|
}
|
|
```
|
|
|
|
Use them like: `$(ColorBlue 'Your text')`.
|
|
|
|
---
|
|
|
|
### Build the Interactive Menu
|
|
|
|
Create a `menu` function containing the display logic, user input, and a `case` statement for selection.
|
|
|
|
```bash
|
|
menu(){
|
|
echo -ne "
|
|
My Server Status Menu
|
|
$(ColorGreen '1)') Memory usage
|
|
$(ColorGreen '2)') CPU load
|
|
$(ColorGreen '3)') TCP connections
|
|
$(ColorGreen '4)') Kernel version
|
|
$(ColorGreen '5)') Check All
|
|
$(ColorGreen '0)') Exit
|
|
$(ColorBlue 'Choose an option:') "
|
|
read -r a
|
|
case $a in
|
|
1) memory_check ; menu ;;
|
|
2) cpu_check ; menu ;;
|
|
3) tcp_check ; menu ;;
|
|
4) kernel_check ; menu ;;
|
|
5) all_checks ; menu ;;
|
|
0) exit 0 ;;
|
|
*) echo -e $(ColorRed 'Invalid option.') ; menu ;;
|
|
esac
|
|
}
|
|
```
|
|
|
|
Here's how it works:
|
|
* The `echo -ne` block prints the menu options, applying colors.
|
|
* `read -r a` captures user input into variable `a`.
|
|
* The `case` statement executes the corresponding function. After each function, `menu` is called again to display the menu for another choice, creating a loop. `exit 0` handles the exit option.
|
|
|
|
Finally, call the `menu` function at the end of your script to start the interaction:
|
|
|
|
```bash
|
|
menu
|
|
```
|
|
|
|
---
|
|
|
|
### Complete Script and Testing
|
|
|
|
Here's the entire script, `menu.sh`, combining all components:
|
|
|
|
```bash
|
|
#!/usr/bin/env bash
|
|
|
|
##
|
|
# BASH menu script that checks:
|
|
# - Memory usage
|
|
# - CPU load
|
|
# - Number of TCP connections
|
|
# - Kernel version
|
|
##
|
|
|
|
server_name=$(hostname)
|
|
|
|
function memory_check() {
|
|
echo ""
|
|
echo "Memory usage on ${server_name}: "
|
|
free -h
|
|
echo ""
|
|
}
|
|
|
|
function cpu_check() {
|
|
echo ""
|
|
echo "CPU load on ${server_name}: "
|
|
echo ""
|
|
uptime
|
|
echo ""
|
|
}
|
|
|
|
function tcp_check() {
|
|
echo ""
|
|
echo "TCP connections on ${server_name}: "
|
|
echo ""
|
|
cat /proc/net/tcp | wc -l
|
|
echo ""
|
|
}
|
|
|
|
function kernel_check() {
|
|
echo ""
|
|
echo "Kernel version on ${server_name}: "
|
|
echo ""
|
|
uname -r
|
|
echo ""
|
|
}
|
|
|
|
function all_checks() {
|
|
memory_check
|
|
cpu_check
|
|
tcp_check
|
|
kernel_check
|
|
}
|
|
|
|
##
|
|
# Color Variables
|
|
##
|
|
green='\e[32m'
|
|
blue='\e[34m'
|
|
red='\e[31m'
|
|
clear='\e[0m'
|
|
|
|
##
|
|
# Color Functions
|
|
##
|
|
|
|
ColorGreen(){
|
|
echo -ne $green$1$clear
|
|
}
|
|
ColorBlue(){
|
|
echo -ne $blue$1$clear
|
|
}
|
|
ColorRed(){
|
|
echo -ne $red$1$clear
|
|
}
|
|
|
|
menu(){
|
|
echo -ne "
|
|
My Server Status Menu
|
|
$(ColorGreen '1)') Memory usage
|
|
$(ColorGreen '2)') CPU load
|
|
$(ColorGreen '3)') TCP connections
|
|
$(ColorGreen '4)') Kernel version
|
|
$(ColorGreen '5)') Check All
|
|
$(ColorGreen '0)') Exit
|
|
$(ColorBlue 'Choose an option:') "
|
|
read -r a
|
|
case $a in
|
|
1) memory_check ; menu ;;
|
|
2) cpu_check ; menu ;;
|
|
3) tcp_check ; menu ;;
|
|
4) kernel_check ; menu ;;
|
|
5) all_checks ; menu ;;
|
|
0) exit 0 ;;
|
|
*) echo -e $(ColorRed 'Invalid option.') ; menu ;;
|
|
esac
|
|
}
|
|
|
|
# Call the menu function
|
|
menu
|
|
```
|
|
|
|
Save this code as `menu.sh`:
|
|
|
|
```bash
|
|
touch menu.sh
|
|
```
|
|
|
|
Open `menu.sh` and paste the script. Save and close. Then, make it executable and run:
|
|
|
|
```bash
|
|
chmod +x menu.sh
|
|
./menu.sh
|
|
```
|
|
|
|
You'll see the colored menu, prompting for input. Select an option (e.g., `1` for memory check), and the corresponding information will display before the menu reappears, ready for another choice.
|
|
|
|
---
|
|
|
|
### Conclusion
|
|
|
|
You've built an interactive Bash menu, allowing users to effortlessly navigate script functionalities. This enhances user experience for your automation tools.
|
|
|
|
> {notice} This content was inspired by a piece by softwareshinobi on Dev Team Six.
|