From 5144c209d3b7f0d405064d2c503f6c12cc9b6eae Mon Sep 17 00:00:00 2001 From: mcgillij Date: Fri, 19 Feb 2021 16:10:45 -0400 Subject: [PATCH 1/3] add functionality for configuration and service --- .SRCINFO | 4 +-- PKGBUILD | 2 +- README.md | 39 ++++++++++++++++++--- amdfan/amdfan.py | 84 ++++++++++++++++++++++++++++++---------------- images/manual.png | Bin 0 -> 36903 bytes pyproject.toml | 2 +- tests/test_cli.py | 6 ++++ 7 files changed, 99 insertions(+), 38 deletions(-) create mode 100644 images/manual.png diff --git a/.SRCINFO b/.SRCINFO index dc13e8f..10892d2 100644 --- a/.SRCINFO +++ b/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = amdfan pkgdesc = Python daemon for controlling the fans on amdgpu cards - pkgver = 0.1.5 + pkgver = 0.1.6 pkgrel = 1 url = https://github.com/mcgillij/amdfan arch = any @@ -11,7 +11,7 @@ pkgbase = amdfan depends = python-numpy depends = python-rich depends = python-click - source = https://github.com/mcgillij/amdfan/archive/0.1.5.tar.gz + source = https://github.com/mcgillij/amdfan/archive/0.1.6.tar.gz md5sums = SKIP pkgname = amdfan diff --git a/PKGBUILD b/PKGBUILD index 03e8f9a..d21c735 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -3,7 +3,7 @@ pkgname=amdfan pkgdesc="Python daemon for controlling the fans on amdgpu cards" -pkgver=0.1.5 +pkgver=0.1.6 pkgrel=1 arch=('any') license=('GPL2') diff --git a/README.md b/README.md index 33361fa..2e93f2f 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,12 @@ These are all addressed in Amdfan, and as long as I’ve still got some AMD card Usage: amdfan.py [OPTIONS] Options: - --daemon Run as daemon applying the fan curve - --monitor Run as a monitor showing temp and fan speed - --manual Manually set the fan speed value of a card - --help Show this message and exit. + --daemon Run as daemon applying the fan curve + --monitor Run as a monitor showing temp and fan speed + --manual Manually set the fan speed value of a card + --configuration Prints out the default configuration for you to use + --service Prints out the amdfan.service file to use with systemd + --help Show this message and exit. ``` ## Daemon @@ -56,7 +58,18 @@ You can use Amdfan to monitor your AMD video cards using the ```--monitor``` fla ## Manual -Alternatively if you don't want to set a fan curve, you can just apply a fan setting manually. Also allows you to revert the fan control to the systems default behavior by using the "auto" parameter. +Alternatively if you don't want to set a fan curve, you can just apply a fan setting manually. +Also allows you to revert the fan control to the systems default behavior by using the "auto" parameter. +![screenshot](https://raw.githubusercontent.com/mcgillij/amdfan/main/images/manual.png) + +## Configuration + +This will dump out the default configuration that would get generated for `/etc/amdfan.yml` when you first run it as a service. This allows you to configure the settings prior to running it as a daemon if you wish. + +## Service + +This is just a convenience method for dumping out the `amdfan.service` that would get installed if you used a package manager to install amdfan. Useful if you installed the module via `pip`, `pipenv` or `poetry` vs using the package manager version. + ## Note @@ -92,6 +105,22 @@ speed_matrix: # - card0 ``` +## Running the systemd service + +To run the service, if you installed amdfan using the AUR package, you can run the following commands to **start/enable** the service. + +``` bash +sudo ystemctl start amdfan +sudo systemctl enable amdfan +``` + +## Checking the status +You can check the systemd service status with the following command: + +``` bash +systemctl status amdfan +``` + ## Building Python package Requires Poetry to be installed diff --git a/amdfan/amdfan.py b/amdfan/amdfan.py index 2dab9ca..351e7e8 100755 --- a/amdfan/amdfan.py +++ b/amdfan/amdfan.py @@ -29,6 +29,43 @@ HWMON_DIR = "device/hwmon" LOGGER = logging.getLogger("rich") +DEFAULT_FAN_CONFIG = """#Fan Control Matrix. +# [,] +speed_matrix: +- [4, 4] +- [30, 33] +- [45, 50] +- [60, 66] +- [65, 69] +- [70, 75] +- [75, 89] +- [80, 100] + +# Current Min supported value is 4 due to driver bug +# +# Optional configuration options +# +# Allows for some leeway +/- temp, as to not constantly change fan speed +# threshold: 2 +# +# Frequency will chance how often we probe for the temp +# frequency: 5 +# +# cards: +# can be any card returned from `ls /sys/class/drm | grep "^card[[:digit:]]$"` +# - card0 +""" + +SYSTEMD_SERVICE = """[Unit] +Description=amdfan controller + +[Service] +ExecStart=/usr/bin/amdfan --daemon +Restart=always + +[Install] +WantedBy=multi-user.target +""" logging.basicConfig( level=logging.DEBUG if DEBUG else logging.INFO, @@ -276,45 +313,34 @@ def load_config(path): default=False, help="Manually set the fan speed value of a card", ) -def cli(daemon, monitor, manual): +@click.option( + "--configuration", + is_flag=True, + default=False, + help="Prints out the default configuration for you to use" +) +@click.option( + "--service", + is_flag=True, + default=False, + help="Prints out the amdfan.service file to use with systemd" +) +def cli(daemon, monitor, manual, configuration, service): if daemon: run_as_daemon() elif monitor: monitor_cards() elif manual: set_fan_speed() + elif configuration: + print(DEFAULT_FAN_CONFIG) + elif service: + print(SYSTEMD_SERVICE) else: c.print("Try: --help to see the options") def run_as_daemon(): - - default_fan_config = """#Fan Control Matrix. -# [,] -speed_matrix: -- [4, 4] -- [30, 33] -- [45, 50] -- [60, 66] -- [65, 69] -- [70, 75] -- [75, 89] -- [80, 100] - -# Current Min supported value is 4 due to driver bug -# -# Optional configuration options -# -# Allows for some leeway +/- temp, as to not constantly change fan speed -# threshold: 2 -# -# Frequency will chance how often we probe for the temp -# frequency: 5 -# -# cards: -# can be any card returned from `ls /sys/class/drm | grep "^card[[:digit:]]$"` -# - card0 -""" config = None for location in CONFIG_LOCATIONS: if os.path.isfile(location): @@ -324,7 +350,7 @@ def run_as_daemon(): if config is None: LOGGER.info("No config found, creating one in %s", CONFIG_LOCATIONS[-1]) with open(CONFIG_LOCATIONS[-1], "w") as config_file: - config_file.write(default_fan_config) + config_file.write(DEFAULT_FAN_CONFIG) config_file.flush() config = load_config(CONFIG_LOCATIONS[-1]) diff --git a/images/manual.png b/images/manual.png new file mode 100644 index 0000000000000000000000000000000000000000..c55852d38e46d5a6c7978a6b2e595b3edb7e669c GIT binary patch literal 36903 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"] license = "GPL-2.0-only" diff --git a/tests/test_cli.py b/tests/test_cli.py index c6a0063..1dff60b 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -14,6 +14,12 @@ def test_params(self): help_param = "--help" result = runner.invoke(cli, help_param) assert result.exit_code == 0 + config_param = "--configuration" + result = runner.invoke(cli, config_param) + assert result.exit_code == 0 + service_param = "--service" + result = runner.invoke(cli, service_param) + assert result.exit_code == 0 manual_param = "--manual" result = runner.invoke(cli, manual_param, input='\n'.join(['card0', "25"])) assert result.exception From cf9c3a06856781ae5fe51df5127a82fc3a4ed50d Mon Sep 17 00:00:00 2001 From: mcgillij Date: Fri, 19 Feb 2021 16:13:23 -0400 Subject: [PATCH 2/3] fix typo and update directions for restart --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e93f2f..13eacd0 100644 --- a/README.md +++ b/README.md @@ -110,10 +110,16 @@ speed_matrix: To run the service, if you installed amdfan using the AUR package, you can run the following commands to **start/enable** the service. ``` bash -sudo ystemctl start amdfan +sudo systemctl start amdfan sudo systemctl enable amdfan ``` +After you've started it, you may want to edit the settings found in `/etc/amdfan.yml`. Once your happy with those, you can restart amdfan with the following command. + +``` bash +sudo systemctl restart amdfan +``` + ## Checking the status You can check the systemd service status with the following command: From 09ba43c267169566a3c342008a32edbc0584ad3e Mon Sep 17 00:00:00 2001 From: mcgillij Date: Fri, 19 Feb 2021 16:16:46 -0400 Subject: [PATCH 3/3] update configuration recommendation --- amdfan/amdfan.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/amdfan/amdfan.py b/amdfan/amdfan.py index 351e7e8..059e892 100755 --- a/amdfan/amdfan.py +++ b/amdfan/amdfan.py @@ -46,11 +46,14 @@ # Optional configuration options # # Allows for some leeway +/- temp, as to not constantly change fan speed -# threshold: 2 +# threshold: 4 # # Frequency will chance how often we probe for the temp # frequency: 5 # +# While frequency and threshold are optional, I highly recommend finding +# settings that work for you. I've included the defaults I use above. +# # cards: # can be any card returned from `ls /sys/class/drm | grep "^card[[:digit:]]$"` # - card0