260 lines
5 KiB
Bash
Executable file
260 lines
5 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
: <<'_EOS'
|
|
=pod
|
|
=cut
|
|
|
|
=head1 NAME
|
|
|
|
fanspeed - set fanspeed using IPMI
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
B<fanspeed> I<degrees>C
|
|
|
|
B<fanspeed> I<percent>
|
|
|
|
B<fanspeed> bios
|
|
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
B<fanspeed> will set the fanspeed using IPMI.
|
|
|
|
|
|
=head1 OPTIONS
|
|
|
|
=over 9
|
|
|
|
=item I<degrees>C
|
|
|
|
Run fans at 40% unless temperature goes above I<degrees>. When that
|
|
happens: Let BIOS control the fan for 30 seconds.
|
|
|
|
|
|
=item I<percent>
|
|
|
|
Run fans at I<percent> percent.
|
|
|
|
|
|
=item bios
|
|
|
|
Let BIOS control the fans.
|
|
|
|
|
|
=back
|
|
|
|
|
|
=head1 EXAMPLES
|
|
|
|
=head2 EXAMPLE:
|
|
|
|
Run fans at 40% unless temperature is above 60C. When temperature is
|
|
above 60C, let BIOS control fans.
|
|
|
|
fanspeed 60C
|
|
|
|
|
|
=head2 EXAMPLE: Run fans at 50%
|
|
|
|
fanspeed 50
|
|
|
|
|
|
=head2 EXAMPLE: Let BIOS control fans
|
|
|
|
fanspeed bios
|
|
|
|
|
|
=head1 REPORTING BUGS
|
|
|
|
Report bugs: https://gitlab.com/ole.tange/tangetools/-/issues
|
|
|
|
|
|
=head1 AUTHOR
|
|
|
|
Copyright (C) 2020 Ole Tange, http://ole.tange.dk and Free
|
|
Software Foundation, Inc.
|
|
|
|
|
|
=head1 LICENSE
|
|
|
|
Copyright (C) 2013 Free Software Foundation, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
at your option any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
=head2 Documentation license I
|
|
|
|
Permission is granted to copy, distribute and/or modify this documentation
|
|
under the terms of the GNU Free Documentation License, Version 1.3 or
|
|
any later version published by the Free Software Foundation; with no
|
|
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
|
|
Texts. A copy of the license is included in the file fdl.txt.
|
|
|
|
=head2 Documentation license II
|
|
|
|
You are free:
|
|
|
|
=over 9
|
|
|
|
=item B<to Share>
|
|
|
|
to copy, distribute and transmit the work
|
|
|
|
=item B<to Remix>
|
|
|
|
to adapt the work
|
|
|
|
=back
|
|
|
|
Under the following conditions:
|
|
|
|
=over 9
|
|
|
|
=item B<Attribution>
|
|
|
|
You must attribute the work in the manner specified by the author or
|
|
licensor (but not in any way that suggests that they endorse you or
|
|
your use of the work).
|
|
|
|
=item B<Share Alike>
|
|
|
|
If you alter, transform, or build upon this work, you may distribute
|
|
the resulting work only under the same, similar or a compatible
|
|
license.
|
|
|
|
=back
|
|
|
|
With the understanding that:
|
|
|
|
=over 9
|
|
|
|
=item B<Waiver>
|
|
|
|
Any of the above conditions can be waived if you get permission from
|
|
the copyright holder.
|
|
|
|
=item B<Public Domain>
|
|
|
|
Where the work or any of its elements is in the public domain under
|
|
applicable law, that status is in no way affected by the license.
|
|
|
|
=item B<Other Rights>
|
|
|
|
In no way are any of the following rights affected by the license:
|
|
|
|
=over 2
|
|
|
|
=item *
|
|
|
|
Your fair dealing or fair use rights, or other applicable
|
|
copyright exceptions and limitations;
|
|
|
|
=item *
|
|
|
|
The author's moral rights;
|
|
|
|
=item *
|
|
|
|
Rights other persons may have either in the work itself or in
|
|
how the work is used, such as publicity or privacy rights.
|
|
|
|
=back
|
|
|
|
=back
|
|
|
|
=over 9
|
|
|
|
=item B<Notice>
|
|
|
|
For any reuse or distribution, you must make clear to others the
|
|
license terms of this work.
|
|
|
|
=back
|
|
|
|
A copy of the full license is included in the file as cc-by-sa.txt.
|
|
|
|
=head1 DEPENDENCIES
|
|
|
|
B<fanspeed> uses IPMItool, and sensors.
|
|
|
|
|
|
=head1 SEE ALSO
|
|
|
|
B<ipmitool>(1), jq(1), and B<sensors>(1).
|
|
|
|
=cut
|
|
_EOS
|
|
|
|
setfanspeed() {
|
|
# 0..100 = manual control X%
|
|
# bios = BIOS control
|
|
ipmi() {
|
|
DRAC_USER=${DRAC_USER:-root}
|
|
DRAC_PASSWD=${DRAC_PASSWD:-calvin}
|
|
DRAC_HOST=${DRAC_HOST:-drac}
|
|
echo -n $(ipmitool -I lanplus -H "$DRAC_HOST" -U "$DRAC_USER" -P "$DRAC_PASSWD" raw "$@")
|
|
}
|
|
if [ "$1" == "bios" ] ; then
|
|
# Let BIOS run the fan
|
|
ipmi 0x30 0x30 0x01 0x01
|
|
else
|
|
# Manual control
|
|
ipmi 0x30 0x30 0x01 0x00
|
|
# Set speed 0..100
|
|
ipmi 0x30 0x30 0x02 0xff "$@"
|
|
fi
|
|
}
|
|
|
|
fanspeedthreshold() {
|
|
# fanspeedthreshold deg
|
|
# Turn on BIOS control when temperature reaches deg degrees
|
|
sensors -j |
|
|
jq -r '[.[]["temp1"]["temp1_input"]] |
|
|
if max < '$1' then 40 else "bios" end';
|
|
}
|
|
|
|
runthreshold() {
|
|
# runthreshold degrees
|
|
while true; do
|
|
printf " "$(sensors -j |
|
|
jq '[.[]["temp1"]["temp1_input"]] | max')
|
|
speed=$(fanspeedthreshold $@)
|
|
setfanspeed $speed
|
|
if [ $speed == "bios" ] ; then
|
|
# Do not change away from bios in less than 30 secs
|
|
sleep 30
|
|
fi
|
|
sleep 1
|
|
done
|
|
}
|
|
|
|
|
|
_fanspeed() {
|
|
# BIOS = 60 C => 40
|
|
# 0 C => 10, 55 C => 10, 65 C => 100
|
|
sensors -j |
|
|
jq '[.[]["temp1"]["temp1_input"]] |
|
|
(max-55)*(100/(65-55)) |
|
|
if . < 50 then 50 else if . > 100 then 100 else .|floor end end';
|
|
# if . < 25 then 25 else if . > 100 then 100 else .|floor end end';
|
|
}
|
|
|
|
degrees=$(echo "$@" | perl -ne '/(\d+)C/i and print $1')
|
|
|
|
if [ -z "$degrees" ] ; then
|
|
setfanspeed "$@"
|
|
else
|
|
runthreshold "$degrees"
|
|
fi
|