Загрузить файлы в «/»

This commit is contained in:
2025-04-04 18:16:52 +00:00
commit e68296aa2d
5 changed files with 729 additions and 0 deletions

248
bAcpi.sh Normal file
View 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
View 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)
- 9699%: Синий (44)
- 9295%: Фиолетовый (45)
- 8891%: Красный (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

BIN
mAcpi Normal file
View File

Binary file not shown.

352
mAcpi.c Normal file
View File

File diff suppressed because it is too large Load Diff

65
mAcpiDescription.txt Normal file
View 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`)**:
- Пункты меню выводятся на заданных строках (69, 1224, 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` через удобный текстовый интерфейс с поддержкой русского языка.