Загрузить файлы в «/»
This commit is contained in:
248
bAcpi.sh
Normal file
248
bAcpi.sh
Normal file
@@ -0,0 +1,248 @@
|
||||
#!/bin/bash
|
||||
|
||||
clear_box() {
|
||||
echo -en "\e[?25l"
|
||||
clear
|
||||
}
|
||||
|
||||
double_line_box() {
|
||||
# Получаем уровень заряда батареи
|
||||
battery_level=$(acpi -b | grep -oP '\d+%' | tr -d '%')
|
||||
|
||||
# Задаём цвет фона в зависимости от процента
|
||||
if [ "$battery_level" -eq 100 ]; then
|
||||
bf=43 # Жёлтый фон для 100%
|
||||
elif [ "$battery_level" -ge 96 ]; then
|
||||
bf=44 # Синий фон для 96% и выше (но меньше 100%)
|
||||
elif [ "$battery_level" -ge 92 ]; then
|
||||
bf=45 # Фиолетовый фон для 92% и выше (но меньше 96%)
|
||||
elif [ "$battery_level" -ge 88 ]; then
|
||||
bf=41 # Красный фон для 88% и выше (но меньше 92%)
|
||||
else
|
||||
bf=43 # По умолчанию жёлтый фон для всех значений ниже 88%
|
||||
fi
|
||||
# bf=44
|
||||
echo -en "\e[1;1H\e[${bf};33m╔═════════════════════════════════════════════════════════════════════════════════╗\e[0m"
|
||||
for (( a=2; a<=41; a++ )); do
|
||||
echo -en "\e[${a};1H\e[${bf};33m║\e[0m \e[${bf};33m║\e[0m"
|
||||
done
|
||||
echo -en "\e[42;1H\e[${bf};33m╚═════════════════════════════════════════════════════════════════════════════════╝\e[0m"
|
||||
echo -en "\e[5;0H\e[${bf};33m╠\e[0m\e[33m═════════════════════════════════════════════════════════════════════════════════\e[${bf};33m╣\e[0m"
|
||||
echo -en "\e[7;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
echo -en "\e[9;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
echo -en "\e[11;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
echo -en "\e[13;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
echo -en "\e[15;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
echo -en "\e[17;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
echo -en "\e[29;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
echo -en "\e[35;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
echo -en "\e[39;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m"
|
||||
}
|
||||
|
||||
ifo_box() {
|
||||
echo -en "\e[3;5H\e[1;33m Linux OS acpi The state of the battery\e[0m"
|
||||
echo -en "\e[40;6H\e[33m Нажмите 'ctrl+c' для выхода\e[0m"
|
||||
}
|
||||
|
||||
acpi_box() {
|
||||
if command -v acpi &> /dev/null; then
|
||||
ACPI_VERSION=$(acpi -v | grep "acpi" | awk '{print $2}') # Берем версию из строки с "acpi"
|
||||
echo -en "\e[6;5H \e[32macpi \e[0m \e[90mACPI version: \e[97m${ACPI_VERSION}\e[0m \e[0m"
|
||||
else
|
||||
echo -en "\e[6;5H \e[31macpi \e[0m \e[90mUtility not found, install: \e[97msudo apt install acpi\e[0m \e[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
bat_box() {
|
||||
if acpi -b &> /dev/null && [ -n "$(acpi -b)" ]; then
|
||||
echo -en "\e[8;5H \e[32mBattery:\e[0m\e[90m\e[97m Detected\e[0m"
|
||||
else
|
||||
echo -en "\e[8;5H \e[31mBattery:\e[0m\e[90m\e[97m Undetected\e[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
line_box() {
|
||||
BATTERY_STATE=$(acpi -b | awk '{print $3}' | tr -d ',')
|
||||
case "$BATTERY_STATE" in
|
||||
"Charging")
|
||||
echo -en "\e[8;28H\e[32m Battery State \e[0m Charging\e[0m"
|
||||
;;
|
||||
"Discharging")
|
||||
echo -en "\e[8;20H\e[32m Battery State \e[31m Discharging\e[0m"
|
||||
;;
|
||||
"Full")
|
||||
echo -en "\e[8;20H\e[32m Battery State \e[0m Running on AC power / Plugged in\e[0m"
|
||||
;;
|
||||
*)
|
||||
echo -en "\e[8;20H\e[31m Battery State \e[0m Unknown state\e[0m"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
time_box() {
|
||||
BATTERY_TIME=$(acpi -b | grep -o '[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}' || echo "N/A")
|
||||
echo -en "\e[10;5H \e[32mBattery Time \e[0m \e[90mОставшееся время: \e[97m${BATTERY_TIME}\e[0m \e[0m"
|
||||
}
|
||||
|
||||
battery_progress_bar() {
|
||||
battery_level=$(acpi -b | grep -oP '\d+%' | tr -d '%') # Получаем уровень заряда
|
||||
# Округляем вверх до ближайшего целого
|
||||
rounded_level=$(( (battery_level + 1) ))
|
||||
if [ $rounded_level -gt 100 ]; then
|
||||
rounded_level=100
|
||||
fi
|
||||
# Вычисляем количество заполненных символов (полоса из 50 символов)
|
||||
filled=$(( (rounded_level * 50) / 100 ))
|
||||
empty=$(( 50 - filled ))
|
||||
# Создаём строку прогресс-бара
|
||||
progress=""
|
||||
for ((i=0; i<filled; i++)); do
|
||||
progress="${progress}▓"
|
||||
done
|
||||
for ((i=0; i<empty; i++)); do
|
||||
progress="${progress}░"
|
||||
done
|
||||
# Выводим прогресс-бар с цветами и процентом
|
||||
echo -en "\e[12;5H\e[32m Battery level: \e[33m[\e[0m${progress}\e[33m]\e[0m $battery_level%\e[0m"
|
||||
}
|
||||
|
||||
check_battery_rate() {
|
||||
BATTERY_RATE=$(acpi -b | grep -o 'rate information unavailable')
|
||||
|
||||
if [ -n "$BATTERY_RATE" ]; then
|
||||
echo -e "\e[14;5H\e[32m Battery rate: \e[0m \e[90mRate information unavailable\e[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
get_adapter_status() {
|
||||
local adapter_status=$(acpi -a)
|
||||
echo -en "\e[16;5H\e[32m Battery \e[0m $adapter_status"
|
||||
}
|
||||
|
||||
get_thermal1_status() {
|
||||
local thermal1=$(acpi -t | grep "Thermal 0:" | awk '{print $4, $5, $6}')
|
||||
echo -en "\e[18;5H\e[32m Battery\e[90m thermal 1:\e[0m $thermal1"
|
||||
}
|
||||
|
||||
get_thermal2_status() {
|
||||
local thermal2=$(acpi -t | grep "Thermal 1:" | awk '{print $4, $5, $6}')
|
||||
echo -en "\e[18;40H \e[90m Thermal 2:\e[0m $thermal2"
|
||||
}
|
||||
|
||||
get_cooling() {
|
||||
# Получаем вывод acpi -c
|
||||
local cooling_lines=$(acpi -c)
|
||||
|
||||
# Принимаем начальную позицию от пользователя (по умолчанию 22 строка, 5 колонка)
|
||||
local start_line=${1:-19}
|
||||
local start_col=${2:-5}
|
||||
|
||||
# Флаг для первой строки
|
||||
local first_line=true
|
||||
|
||||
# Читаем вывод построчно
|
||||
while IFS= read -r line; do
|
||||
# Проверяем, что строка начинается с "Cooling"
|
||||
if [[ "$line" =~ ^Cooling\ [0-9]+: ]]; then
|
||||
if [ "$first_line" = true ]; then
|
||||
# Первая строка: "Battery" слева, "Cooling" с нужным отступом
|
||||
echo -en "\e[${start_line};$((start_col + 1))H\e[32mBattery \e[0m\e[${start_line};$((start_col + 9))H$line"
|
||||
first_line=false
|
||||
else
|
||||
# Последующие строки с "Cooling" выровнены по той же позиции
|
||||
echo -en "\e[${start_line};$((start_col + 9))H$line"
|
||||
fi
|
||||
((start_line++)) # Увеличиваем номер строки для следующей записи
|
||||
fi
|
||||
done <<< "$cooling_lines"
|
||||
}
|
||||
|
||||
get_battery_health() {
|
||||
local line=$(acpi --details | grep -i "design capacity")
|
||||
local design=$(echo "$line" | awk '{print $5}')
|
||||
local full=$(echo "$line" | awk '{print $10}')
|
||||
local percent=$(echo "$line" | awk -F '=' '{print $2}' | tr -d ' %')
|
||||
local wear=$((100 - percent))
|
||||
echo -en "\e[30;5H Design capacity: ${design} mAh — original factory battery capacity"
|
||||
echo -en "\e[31;5H Last full capacity: ${full} mAh — current maximum capacity after wear"
|
||||
echo -en "\e[32;5H Current capacity: ${percent}% — remaining capacity relative to original"
|
||||
echo -en "\e[33;5H Battery wear: ${wear}% — battery has lost ${wear}% of original capacity"
|
||||
}
|
||||
|
||||
progress_bar() {
|
||||
# Получаем процент здоровья из вывода acpi --details
|
||||
local line=$(acpi --details | grep -i "design capacity")
|
||||
local percent=$(echo "$line" | awk -F '=' '{print $2}' | tr -d ' %')
|
||||
# Округляем здоровье вверх (если есть десятые, хотя здесь всегда целое — добавим +1, если остаток)
|
||||
rounded_health=$((percent))
|
||||
if [ $((percent % 1)) -ne 0 ]; then
|
||||
rounded_health=$((rounded_health + 1))
|
||||
fi
|
||||
# Принудительное округление вверх, если не 100
|
||||
if [ "$percent" -lt 100 ]; then
|
||||
rounded_health=$((rounded_health + 1))
|
||||
fi
|
||||
if [ "$rounded_health" -gt 100 ]; then
|
||||
rounded_health=100
|
||||
fi
|
||||
# Вычисляем заполненные и пустые блоки
|
||||
filled=$(( (rounded_health * 50) / 100 ))
|
||||
empty=$(( 50 - filled ))
|
||||
# Создаём прогресс-бар
|
||||
progress=""
|
||||
for ((i=0; i<filled; i++)); do
|
||||
progress+="▓"
|
||||
done
|
||||
for ((i=0; i<empty; i++)); do
|
||||
progress+="░"
|
||||
done
|
||||
# Выводим прогресс-бар с процентом здоровья
|
||||
echo -en "\e[34;5H\e[32m Battery health: \e[33m[\e[0m${progress}\e[33m] \e[0m${rounded_health}%\e[0m"
|
||||
}
|
||||
|
||||
|
||||
alert_box() {
|
||||
# Получаем уровень заряда батареи
|
||||
battery_level=$(acpi -b | grep -oP '\d+%' | tr -d '%')
|
||||
# Цвета: чёрный текст всегда, фон зависит от уровня заряда
|
||||
if [ "$battery_level" -le 91 ]; then
|
||||
bf=41 # красный фон
|
||||
else
|
||||
bf=40 # чёрный фон
|
||||
fi
|
||||
echo -en "\e[36;6H\e[30;${bf}m╔════════════════════════════════════════════════════════════════════════╗"
|
||||
echo -en "\e[37;6H║ The computer is about to shut down! ║"
|
||||
echo -en "\e[38;6H╚════════════════════════════════════════════════════════════════════════╝\e[0m"
|
||||
}
|
||||
|
||||
THRESHOLD=84
|
||||
|
||||
trap 'echo -en "\e[?25h"; clear; exit' SIGINT
|
||||
|
||||
# Начальная отрисовка
|
||||
clear_box
|
||||
|
||||
# Основной цикл отрисовки каждые 5 минут
|
||||
while true; do
|
||||
double_line_box
|
||||
ifo_box
|
||||
acpi_box
|
||||
bat_box
|
||||
line_box
|
||||
time_box
|
||||
battery_progress_bar
|
||||
check_battery_rate
|
||||
get_adapter_status
|
||||
get_thermal1_status
|
||||
get_thermal2_status
|
||||
get_cooling
|
||||
get_battery_health
|
||||
progress_bar
|
||||
alert_box
|
||||
|
||||
BATTERY_LEVEL=$(acpi -b | grep -P -o '[0-9]+(?=%)')
|
||||
if [ -n "$BATTERY_LEVEL" ] && [ "$BATTERY_LEVEL" -le "$THRESHOLD" ]; then
|
||||
systemctl poweroff
|
||||
fi
|
||||
sleep 300
|
||||
done
|
64
bAcpiDescription.txt
Normal file
64
bAcpiDescription.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
Техническое описание скрипта мониторинга батареи
|
||||
|
||||
Этот Bash-скрипт предоставляет удобный интерфейс в терминале для мониторинга состояния батареи, температуры и охлаждения на системах Linux с использованием утилиты `acpi`. Он отображает информацию в реальном времени в структурированном виде с двойной рамкой, цветовым кодированием и полосами прогресса, обновляясь каждые 5 минут. Ниже приведено подробное описание его функциональности:
|
||||
|
||||
1. **Инициализация и настройка**:
|
||||
- Скрипт очищает терминал и скрывает курсор (функция `clear_box`).
|
||||
- Использует ANSI-коды для позиционирования, окрашивания и форматирования текста.
|
||||
- Установлена ловушка для восстановления курсора и очистки экрана при нажатии `Ctrl+C` (SIGINT).
|
||||
|
||||
2. **Основной макет отображения (`double_line_box`)**:
|
||||
- Создаёт рамку с двойными линиями (42 строки, 83 столбца) с использованием Unicode-символов (╔, ═, ║ и т.д.).
|
||||
- Цвет фона зависит от уровня заряда батареи:
|
||||
- 100%: Жёлтый (43)
|
||||
- 96–99%: Синий (44)
|
||||
- 92–95%: Фиолетовый (45)
|
||||
- 88–91%: Красный (41)
|
||||
- Ниже 88%: Жёлтый (43)
|
||||
- Горизонтальные разделители разбивают рамку на секции для разных типов данных.
|
||||
|
||||
3. **Секции информации**:
|
||||
- **Заголовок (`ifo_box`)**: Отображает "Linux OS acpi Состояние батареи" и инструкцию для выхода ("Нажмите 'ctrl+c' для выхода").
|
||||
- **Информация ACPI (`acpi_box`)**: Показывает версию `acpi`, если утилита установлена, или ошибку с инструкцией по установке, если нет.
|
||||
- **Обнаружение батареи (`bat_box`)**: Указывает, обнаружена ли батарея ("Detected" или "Undetected").
|
||||
- **Состояние батареи (`line_box`)**: Показывает состояние зарядки ("Charging", "Discharging", "Full" или "Unknown") с цветовым кодированием.
|
||||
- **Оставшееся время (`time_box`)**: Отображает примерное оставшееся время работы батареи (например, "02:30:00" или "N/A").
|
||||
- **Уровень заряда (`battery_progress_bar`)**: Рисует полосу прогресса из 50 символов (▓ для заполненной части, ░ для пустой) с процентом.
|
||||
- **Скорость разряда (`check_battery_rate`)**: Указывает, если информация о скорости недоступна.
|
||||
- **Состояние адаптера (`get_adapter_status`)**: Показывает состояние адаптера питания (например, "on-line" или "off-line").
|
||||
- **Температура (`get_thermal1_status`, `get_thermal2_status`)**: Отображает температуру для зон Thermal 0 и Thermal 1.
|
||||
- **Состояние охлаждения (`get_cooling`)**: Перечисляет состояния устройств охлаждения (например, "Cooling 0: intel_powerclamp 0 of 100") с префиксом "Battery" для первой строки, выровненные в столбец.
|
||||
- **Здоровье батареи (`get_battery_health`)**: Указывает проектную ёмкость, последнюю полную ёмкость, текущий процент ёмкости и износ.
|
||||
- **Полоса здоровья (`progress_bar`)**: Показывает здоровье батареи в виде полосы прогресса из 50 символов с процентом.
|
||||
|
||||
4. **Система предупреждений (`alert_box`)**:
|
||||
- Отображает рамку с предупреждением ("Компьютер скоро выключится!"), если уровень заряда ≤91%.
|
||||
- Цвет фона: Красный (41) для ≤91%, чёрный (40) для остальных случаев.
|
||||
|
||||
5. **Управление питанием**:
|
||||
- Проверяет уровень заряда каждые 5 минут (`sleep 300`).
|
||||
- Если уровень падает ниже порога (по умолчанию 70%), вызывает выключение системы через `systemctl poweroff`.
|
||||
|
||||
6. **Ключевые особенности**:
|
||||
- Динамическое цветовое кодирование для визуальной обратной связи (зелёный для активных состояний, красный для ошибок).
|
||||
- Настраиваемая начальная позиция для состояний охлаждения (по умолчанию: строка 19, столбец 5).
|
||||
- Полосы прогресса для уровня заряда и здоровья обеспечивают интуитивное представление.
|
||||
- Непрерывный цикл обеспечивает обновление данных в реальном времени.
|
||||
|
||||
7. **Зависимости**:
|
||||
- Требуется утилита `acpi` для данных о батарее, температуре и охлаждении.
|
||||
- Использует стандартные инструменты Linux: `awk`, `grep`, `tr`, `systemctl`.
|
||||
|
||||
8. **Использование**:
|
||||
- Запустите скрипт в терминале: `./имя_скрипта.sh`.
|
||||
- Выход с помощью `Ctrl+C` для восстановления состояния терминала.
|
||||
|
||||
Этот скрипт предназначен для системных администраторов или пользователей, которым нужен детальный мониторинг батареи и температуры в Linux с акцентом на ясность и эстетику.
|
||||
|
||||
asciinema: https://asciinema.org/a/711722
|
||||
codeberg: https://codeberg.org/Grannik/bAcpi
|
||||
github: https://github.com/Grannik/bAcpi
|
||||
gitlab: https://gitlab.com/grannik/bacpi
|
||||
sourceforge: https://sourceforge.net/projects/bacpi/
|
||||
notabug: https://notabug.org/Grannik/bAcpi
|
65
mAcpiDescription.txt
Normal file
65
mAcpiDescription.txt
Normal file
@@ -0,0 +1,65 @@
|
||||
|
||||
Техническое описание программы acpi_menu
|
||||
|
||||
Команда для компиляции: gcc -o mAcpi mAcpi.c -lncursesw
|
||||
|
||||
Эта программа на языке C использует библиотеку ncurses для создания интерактивного меню в терминале, предоставляющего информацию о утилите `acpi` в Linux. Она отображает список опций и описаний, связанных с `acpi`, с поддержкой навигации и выбора пунктов. Ниже приведено подробное описание её функциональности:
|
||||
|
||||
1. **Компиляция и зависимости**:
|
||||
- Для компиляции требуется библиотека `ncursesw` (широкие символы для поддержки UTF-8).
|
||||
- Команда: `gcc -o acpi_menu acpi_menu.c -lncursesw`.
|
||||
|
||||
2. **Инициализация**:
|
||||
- Устанавливает локаль `ru_RU.UTF-8` для поддержки русского языка.
|
||||
- Инициализирует ncurses (`initscr`), проверяет поддержку цветов и отключает эхо ввода, активирует клавиши управления (стрелки).
|
||||
- Скрывает курсор и устанавливает обработчик SIGINT для корректного завершения (`cleanup`).
|
||||
|
||||
3. **Цветовые пары**:
|
||||
- Определяет 6 цветовых пар:
|
||||
- 1: Чёрный текст на жёлтом фоне (рамки, выделение).
|
||||
- 2: Жёлтый текст на чёрном фоне (заголовки, линии).
|
||||
- 3: Голубой текст (для "Git").
|
||||
- 4: Зелёный текст (пункты меню).
|
||||
- 5: Белый текст (основной текст).
|
||||
- 6: Тёмно-белый текст (дополнительный).
|
||||
|
||||
4. **Меню**:
|
||||
- Содержит 19 пунктов, включая "Установка", "Краткий обзор", "Описание", "Автор", опции `acpi` (например, `-b --battery`, `-t --thermal`), "Git" и "Exit".
|
||||
- Пункты хранятся в массиве `items` как широкие строки (`wchar_t`) для поддержки UTF-8.
|
||||
|
||||
5. **Интерфейс (`draw_menu`)**:
|
||||
- Рисует рамку с одинарными линиями (80 столбцов, 31 строка) с жёлтыми краями.
|
||||
- Добавляет горизонтальные разделители на строках 3, 5, 10, 25.
|
||||
- Заголовок "*** acpi ***" (жирный белый), подзаголовок "Shows battery status and other ACPI information" (тусклый).
|
||||
- Подсказка навигации ("↑ Up ─ ↓ Down ─ ↵ Select Enter") внизу жёлтым цветом.
|
||||
|
||||
6. **Отображение пунктов (`print_menu_items`)**:
|
||||
- Пункты меню выводятся на заданных строках (6–9, 12–24, 26, 28).
|
||||
- Выбранный пункт выделяется чёрным текстом на жёлтом фоне.
|
||||
- Остальные пункты — зелёным текстом, с выравниванием описания и опции.
|
||||
|
||||
7. **Навигация и выбор**:
|
||||
- Стрелки вверх/вниз изменяют `selected` (циклически от 0 до 18).
|
||||
- Enter (код 10) очищает экран и показывает информацию о выбранном пункте:
|
||||
- "Установка": "Утилита предустановлена."
|
||||
- "Краткий обзор": "acpi [options]".
|
||||
- "Описание": Информация о выводе ACPI из файловой системы.
|
||||
- "Автор": Сведения об авторах и лицензии GNU GPL.
|
||||
- Опции `acpi`: Краткие описания и команды (например, `acpi -b`, `acpi --battery`).
|
||||
- "Git": Пустой список репозиториев (заглушка).
|
||||
- "Exit": Завершает программу.
|
||||
- После вывода появляется кнопка "ENTER = Main Menu" для возврата.
|
||||
|
||||
8. **Завершение (`cleanup`)**:
|
||||
- Вызывается при SIGINT или выборе "Exit", завершает ncurses (`endwin`) и выходит.
|
||||
|
||||
9. **Особенности**:
|
||||
- Поддержка русского языка через UTF-8 и `ncursesw`.
|
||||
- Цветовое выделение для улучшения читаемости.
|
||||
- Интерактивная навигация с помощью стрелок и Enter.
|
||||
|
||||
10. **Использование**:
|
||||
- После компиляции запустите: `./acpi_menu`.
|
||||
- Навигация: стрелки вверх/вниз, выбор — Enter, выход — выбор "Exit" или `Ctrl+C`.
|
||||
|
||||
Программа предназначена для пользователей Linux, желающих изучить возможности `acpi` через удобный текстовый интерфейс с поддержкой русского языка.
|
Reference in New Issue
Block a user