From 37c1089fc52ab98ba3262e5466204da7d9651d94 Mon Sep 17 00:00:00 2001 From: tigerblue77 <37409593+tigerblue77@users.noreply.github.com> Date: Tue, 12 Apr 2022 17:08:31 +0200 Subject: [PATCH] Remove usage of CRONTAB --- Dell_iDRAC_fan_controller.sh | 72 ++++++++++++++++++++++++++++++++++++ Dockerfile | 23 ++++-------- README.md | 1 + check_temp.sh | 56 ---------------------------- crontab | 1 - startup.sh | 27 -------------- 6 files changed, 80 insertions(+), 100 deletions(-) create mode 100644 Dell_iDRAC_fan_controller.sh delete mode 100755 check_temp.sh delete mode 100644 crontab delete mode 100644 startup.sh diff --git a/Dell_iDRAC_fan_controller.sh b/Dell_iDRAC_fan_controller.sh new file mode 100644 index 0000000..b863a71 --- /dev/null +++ b/Dell_iDRAC_fan_controller.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +if [[ $FAN_SPEED == 0x* ]] +then + DECIMAL_FAN_SPEED=$(printf '%d' $FAN_SPEED) + HEXADECIMAL_FAN_SPEED=$FAN_SPEED +else + DECIMAL_FAN_SPEED=$FAN_SPEED + HEXADECIMAL_FAN_SPEED=$(printf '0x%02x' $FAN_SPEED) +fi + +echo "Idrac/IPMI host: $IDRAC_HOST" +if [[ $IDRAC_HOST != "local" ]] +then + echo "Idrac/IPMI username: $IDRAC_USERNAME" + echo "Idrac/IPMI password: $IDRAC_PASSWORD" +fi +echo "Fan speed objective: $DECIMAL_FAN_SPEED%" +echo "CPU temperature treshold: $CPU_TEMPERATURE_TRESHOLD°C" +echo "Check interval: ${CHECK_INTERVAL}s" + +readonly DELL_FRESH_AIR_COMPLIANCE=45 + +while true; do + if [[ $IDRAC_HOST == "local" ]] + then + LOGIN_STRING='open' + else + LOGIN_STRING="lanplus -H $IDRAC_HOST -U $IDRAC_USERNAME -P $IDRAC_PASSWORD" + fi + + DATA=$(ipmitool -I $LOGIN_STRING sdr type temperature | grep degrees) + INLET_TEMPERATURE=$(echo "$DATA" | grep Inlet | grep -Po '\d{2}' | tail -1) + EXHAUST_TEMPERATURE=$(echo "$DATA" | grep Exhaust | grep -Po '\d{2}' | tail -1) + CPU_DATA=$(echo "$DATA" | grep "3\." | grep -Po '\d{2}') + CPU1_TEMPERATURE=$(echo $CPU_DATA | awk '{print $1;}') + CPU2_TEMPERATURE=$(echo $CPU_DATA | awk '{print $2;}') + + RED='\033[0;31m' + GREEN='\033[0;32m' + NC='\033[0m' # No Color + + echo "------------------------------------" + echo "Current" + echo "- inlet temperature is $INLET_TEMPERATURE°C" + echo "- CPU 1 temperature is $CPU1_TEMPERATURE°C" + echo "- CPU 2 temperature is $CPU2_TEMPERATURE°C" + echo "- Exhaust temperature is $EXHAUST_TEMPERATURE°C" + + CPU1_OVERHEAT () { [ $CPU1_TEMPERATURE -gt $CPU_TEMPERATURE_TRESHOLD ]; } + CPU2_OVERHEAT () { [ $CPU2_TEMPERATURE -gt $CPU_TEMPERATURE_TRESHOLD ]; } + + if CPU1_OVERHEAT + then + if CPU2_OVERHEAT + then + printf "CPU 1 and CPU 2 temperatures are ${RED}too high${NC}. Activating default dynamic fan control." + else + printf "CPU 1 temperature is ${RED}too high${NC}. Activating default dynamic fan control." + fi + ipmitool -I $LOGIN_STRING raw 0x30 0x30 0x01 0x01 + elif CPU2_OVERHEAT + then + printf "CPU 2 temperature is ${RED}too high${NC}. Activating default dynamic fan control." + ipmitool -I $LOGIN_STRING raw 0x30 0x30 0x01 0x01 + else + printf "CPUs temperatures are ${GREEN}OK${NC}. Using manual fan control with ${DECIMAL_FAN_SPEED}%% fan speed." + ipmitool -I $LOGIN_STRING raw 0x30 0x30 0x01 0x00 + ipmitool -I $LOGIN_STRING raw 0x30 0x30 0x02 0xff $HEXADECIMAL_FAN_SPEED + fi + sleep $CHECK_INTERVAL +done diff --git a/Dockerfile b/Dockerfile index c8763af..b8b7629 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,24 +1,14 @@ FROM ubuntu:latest +MAINTAINER tigerblue77 + RUN apt-get update -RUN apt-get install ipmitool cron -y +RUN apt-get install ipmitool -y -COPY crontab /etc/cron.d/dell_idrac_fan_control +ADD Dell_iDRAC_fan_controller.sh /Dell_iDRAC_fan_controller.sh -RUN chmod 0777 /etc/cron.d/dell_idrac_fan_control - -RUN touch /var/log/cron.log - -ADD check_temp.sh /opt/check_temp.sh - -ADD startup.sh /startup.sh - -RUN chmod 0777 /opt/check_temp.sh - -RUN chmod 0777 /startup.sh - -RUN /usr/bin/crontab /etc/cron.d/dell_idrac_fan_control +RUN chmod 0777 /Dell_iDRAC_fan_controller.sh # you should override these default values when running. See README.md #ENV IDRAC_HOST 192.168.1.100 @@ -27,5 +17,6 @@ ENV IDRAC_HOST local #ENV IDRAC_PASSWORD calvin ENV FAN_SPEED 5 ENV CPU_TEMPERATURE_TRESHOLD 50 +ENV CHECK_INTERVAL 60 -CMD /startup.sh && /opt/check_temp.sh && cron && tail -f /var/log/cron.log +CMD /Dell_iDRAC_fan_controller.sh diff --git a/README.md b/README.md index 53ac9e1..b2be0d5 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ - `IDRAC_PASSWORD` parameter is only necessary if you're adressing a distant iDRAC. Default value is "calvin". - `FAN_SPEED` parameter can be set as a decimal (from 0 to 100%) or hexadecimal value (from 0x00 to 0x64) you want to set the fans to. Default value is 5(%). - `CPU_TEMPERATURE_TRESHOLD` parameter is the T°junction (junction temperature) threshold beyond which the Dell fan mode defined in your BIOS will become active again (to protect the server hardware against overheat). Default value is 50(°C). +- `CHECK_INTERVAL` parameter is the time (in seconds) between each temperature check. Default value is 60(s). To use: diff --git a/check_temp.sh b/check_temp.sh deleted file mode 100755 index 7d694de..0000000 --- a/check_temp.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -IPMI_HOST=`cat /idrac_host.txt` -IPMI_USERNAME=`cat /idrac_username.txt` -IPMI_PASSWORD=`cat /idrac_password.txt` -DECIMAL_FAN_SPEED=`cat /decimal_fan_speed.txt` -HEXADECIMAL_FAN_SPEED=`cat /hexadecimal_fan_speed.txt` -CPU_TEMPERATURE_TRESHOLD=`cat /cpu_temperature_treshold.txt` -readonly DELL_FRESH_AIR_COMPLIANCE=45 - -if [[ $IPMI_HOST == "local" ]] -then - LOGIN_STRING='open' -else - LOGIN_STRING="lanplus -H $IPMI_HOST -U $IPMI_USERNAME -P $IPMI_PASSWORD" -fi - -DATA=$(ipmitool -I $LOGIN_STRING sdr type temperature | grep degrees) -INLET_TEMPERATURE=$(echo "$DATA" | grep Inlet | grep -Po '\d{2}' | tail -1) -EXHAUST_TEMPERATURE=$(echo "$DATA" | grep Exhaust | grep -Po '\d{2}' | tail -1) -CPU_DATA=$(echo "$DATA" | grep "3\." | grep -Po '\d{2}') -CPU1_TEMPERATURE=$(echo $CPU_DATA | awk '{print $1;}') -CPU2_TEMPERATURE=$(echo $CPU_DATA | awk '{print $2;}') - -RED='\033[0;31m' -GREEN='\033[0;32m' -NC='\033[0m' # No Color - -echo "------------------------------------" -echo "Current" -echo "- inlet temperature is $INLET_TEMPERATURE°C" -echo "- CPU 1 temperature is $CPU1_TEMPERATURE°C" -echo "- CPU 2 temperature is $CPU2_TEMPERATURE°C" -echo "- Exhaust temperature is $EXHAUST_TEMPERATURE°C" - -CPU1_OVERHEAT () { [ $CPU1_TEMPERATURE -gt $CPU_TEMPERATURE_TRESHOLD ]; } -CPU2_OVERHEAT () { [ $CPU2_TEMPERATURE -gt $CPU_TEMPERATURE_TRESHOLD ]; } - -if CPU1_OVERHEAT -then - if CPU2_OVERHEAT - then - printf "CPU 1 and CPU 2 temperatures are ${RED}too high${NC}. Activating default dynamic fan control." - else - printf "CPU 1 temperature is ${RED}too high${NC}. Activating default dynamic fan control." - fi - ipmitool -I $LOGIN_STRING raw 0x30 0x30 0x01 0x01 -elif CPU2_OVERHEAT -then - printf "CPU 2 temperature is ${RED}too high${NC}. Activating default dynamic fan control." - ipmitool -I $LOGIN_STRING raw 0x30 0x30 0x01 0x01 -else - printf "CPUs temperatures are ${GREEN}OK${NC}. Using manual fan control with ${DECIMAL_FAN_SPEED}%% fan speed." - ipmitool -I $LOGIN_STRING raw 0x30 0x30 0x01 0x00 - ipmitool -I $LOGIN_STRING raw 0x30 0x30 0x02 0xff $HEXADECIMAL_FAN_SPEED -fi diff --git a/crontab b/crontab deleted file mode 100644 index 331bd43..0000000 --- a/crontab +++ /dev/null @@ -1 +0,0 @@ -* * * * * /bin/bash -c "/opt/check_temp.sh &> /var/log/cron.log" diff --git a/startup.sh b/startup.sh deleted file mode 100644 index adce99a..0000000 --- a/startup.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -echo $IDRAC_HOST >> /idrac_host.txt -echo $IDRAC_USERNAME >> /idrac_username.txt -echo $IDRAC_PASSWORD >> /idrac_password.txt - -if [[ $FAN_SPEED == 0x* ]] -then - DECIMAL_FAN_SPEED=$(printf '%d' $FAN_SPEED) - HEXADECIMAL_FAN_SPEED=$FAN_SPEED -else - DECIMAL_FAN_SPEED=$FAN_SPEED - HEXADECIMAL_FAN_SPEED=$(printf '0x%02x' $FAN_SPEED) -fi - -echo $DECIMAL_FAN_SPEED >> /decimal_fan_speed.txt -echo $HEXADECIMAL_FAN_SPEED >> /hexadecimal_fan_speed.txt -echo $CPU_TEMPERATURE_TRESHOLD >> /cpu_temperature_treshold.txt - -echo "Idrac/IPMI host: `cat /idrac_host.txt`" -if [[ $IDRAC_HOST != "local" ]] -then - echo "Idrac/IPMI user: `cat /idrac_username.txt`" - echo "Idrac/IPMI password: `cat /idrac_password.txt`" -fi -echo "Fan speed objective: `cat /decimal_fan_speed.txt`%" -echo "CPU temperature treshold: `cat /cpu_temperature_treshold.txt`°C"