From a87a3d2ddf4f4c427383b252f4f4cb00f5698b32 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 8 Jul 2020 14:40:47 -0500 Subject: [PATCH] First version --- README.md | 14 +++++++++ __pycache__/run_cmd.cpython-37.pyc | Bin 0 -> 1476 bytes asrock-pwm-ipmi | 2 ++ pwm.py | 37 ++++++++++++++++++++++ run_cmd.py | 48 +++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+) create mode 100644 __pycache__/run_cmd.cpython-37.pyc create mode 100755 asrock-pwm-ipmi create mode 100755 pwm.py create mode 100644 run_cmd.py diff --git a/README.md b/README.md index 7d194f3..c7a3152 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,16 @@ # asrock-pwm-ipmi +This is a script to control 4-pin PWM fans on ASRock Rack motherboards with IPMI. The BMC does not properly expose fan control, so they must be controlled using raw IPMI commands. This script is a user-friendly way to do that. + + +usage: asrock-pwm-ipmi [-h] [-i] [FAN:SPEED [FAN:SPEED ...]] + +Read information about and control fans on ASRock boards with IPMI. + +positional arguments: + FAN:SPEED Fan to change the speed of, and the speed, separated by ':'. Set + to 0 for auto. + +optional arguments: + -h, --help show this help message and exit + -i, --info Read fan information diff --git a/__pycache__/run_cmd.cpython-37.pyc b/__pycache__/run_cmd.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e83be714c0ab3140d845e0393d49e9543032e2e5 GIT binary patch literal 1476 zcmZ8h%WfP+6s=c3rv1P~192ck-UMlYU;~R}VIdqKQZ^$CFCw)-(PXM^2G4YNs%qo` zb!RiMW)$RV)vbH$*7KZG{di|5V<;cX`1z}dvA-$U6anWe zRQm~xW|~h~&b83;SC$K{bc9ywSSM(ePIV7$r1=>eWNXY|!!fNuB|%lFU!&R@#<3;) zUbLc>I;^PGg=*E}!$y9?ez@00I%?x4cD#v}{2_y{R-%coIcG2LK4TQ=5WVr7Z1|El zs$n|0&5oHlLo=Kx9r|=q&nB*_re2!Sl~+fLFGe}+(Pz0hS_JQCEpfO(?6)rp zcQT!x)kUGLm)02{kLtQ8wU<8@3omS)tMO<$9VA|!kIFo?g|jr;$Dy&l*R|h`u8^e6 zc&2?6ygbDk!TW=mx3J^ugF{nQ?r>yHHNJdMU(FuSVGqr`e2!_K)<1jN;Ea|b9Bm(l z@r-YyD%f4L8Q&A;ZS;>RNd<(m7&XBD0*+%p@i%}Y5<2=_w5(w(c};}yRyajK60N_9 zJ8TtQvzA}5Rxa)~9OU#{)yP%sk_MD7MWEy{C;|NE0zmhMhFCWQq@lA0U_T#l0ONEu zcZN>2rVFh1UrBUcy_4*@rwIFphuC#4%iz6WHm zUX3MpLU&<|*@kC!$q=rcp=}J|K;T$PGQJPc`hYHj4Y@I=eiS-5)d1SNaQ@ROplLYN z#rN4AQj{33Y099RK9FV$QMW%G=f?g%g`xs~?;&Xk7~;=-fObp)6}lbWHf;SDoDE+W zB5);daz(s26`qo6qs2!JC%(cHinVfhLQ8%bn@37u~bqi1aK%B7855~BvZCvDv2 zb);kB9egIo!A7{QP96di#HvXUrI*6|Nh3n8*X3U7O%GNIr^ z$)(i>INrjIbNS?CxF!Xy|3Udh9yAAraL(1q+*Pmn{Xs7X#=L`0L;RTAWQbp%1(i%E zWnqJCI=%FYay}~zv;?sc{CQ@J(pF|to>%65>PYa0LlpEA MAXFAN: + print("Improper format!") + continue + fan, speed = fanopt.split(":") + run_cmd.setSpeed(int(fan), int(speed)) + if int(speed) == 0: + print("Set speed of FAN" + fan + " to Auto.") + else: + print("Set speed of FAN" + fan + " to " + speed + "%.") +if args.info is True: + print("\nRetrieving fan speeds...\n") + for line in run_cmd.getFanInfo(): + print(line) diff --git a/run_cmd.py b/run_cmd.py new file mode 100644 index 0000000..9f55939 --- /dev/null +++ b/run_cmd.py @@ -0,0 +1,48 @@ +#!/usr/bin/python3 +import subprocess as sp + +def setSpeed(fan, setspeed): + speeds, speedsRaw = getAllSpeeds() + speedcmd = ["ipmitool", "raw", "0x3a", "0x01"] + for speed in speedsRaw: + hexspeed = "0x" + hexspeed += str(speed) + speedcmd.append(hexspeed) + speedcmd.append("0x00") # append the mystery (unused) extra values + speedcmd.append("0x00") + speedcmd[fan + 3] = hex(setspeed) # index + 3 because the array already has the beginning of the command + #print(speeds) + sp.call(speedcmd) + +def getAllSpeeds(): + cmdoutput = sp.Popen(["ipmitool", "raw", "0x3a", "0x02"], stdout=sp.PIPE) + speedsRaw, err = cmdoutput.communicate() + speedsRaw = str(speedsRaw)[3:20].split() + speeds = [] + for speed in speedsRaw: + speeds.append(int(speed, 16)) + return speeds, speedsRaw + +def getSpeed(fan): + speeds, speedsRaw = getAllSpeeds() + return speeds[fan - 1] + +def getFanInfo(): + cmdoutput = sp.Popen(["ipmitool", "sdr"], stdout=sp.PIPE) + sensorinfo, err = cmdoutput.communicate() + #print(sensorinfo.splitlines()) + faninfo = [] + speeds, speedsRaw= getAllSpeeds() + for line in sensorinfo.splitlines(): + if "FAN" in str(line): + faninfo.append(str(line)) + for index, line in enumerate(faninfo): + faninfo[index] = str(line)[2:-1] + faninfo[index] += " | " + if speeds[index] == 0: + faninfo[index] += "Auto" + else: + faninfo[index] += str(speeds[index]) + faninfo[index] += "%" + #print(faninfo[index]) + return faninfo