From eed538e59a63eaacae67d7bfdd95a19e18dad1a5 Mon Sep 17 00:00:00 2001 From: Thomas Deutschmann Date: Tue, 9 Aug 2016 01:19:16 +0200 Subject: [PATCH 1/3] sensors-detect: Add sd_boot detection We need to know in write_config function wether the system is using systemd or not. Signed-off-by: Thomas Deutschmann --- prog/detect/sensors-detect | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/prog/detect/sensors-detect b/prog/detect/sensors-detect index 5c771485..ea1c0d53 100755 --- a/prog/detect/sensors-detect +++ b/prog/detect/sensors-detect @@ -2976,7 +2976,7 @@ sub isa_read_i5d6 # AUTODETECTION # ################# -use vars qw($dev_i2c $sysfs_root $systemd_systemctl $systemd_system_dir); +use vars qw($dev_i2c $sysfs_root $systemd_is_booted $systemd_systemctl $systemd_system_dir); sub initialize_conf { @@ -3050,6 +3050,10 @@ sub initialize_conf } elsif (-d "/lib/systemd/system") { $systemd_system_dir = "/lib/systemd/system"; } + + # Check whether the system was booted using systemd. + # See: man sd_booted + $systemd_is_booted = -d '/run/systemd/system'; } # [0] -> VERSION -- 2.21.0 From bad0d73c98c9167ec4ade01c6b75159643d237f1 Mon Sep 17 00:00:00 2001 From: Thomas Deutschmann Date: Tue, 9 Aug 2016 01:25:52 +0200 Subject: [PATCH 2/3] sensors-detect: write_config function adjusted for Gentoo environment Bug: https://bugs.gentoo.org/480018 Signed-off-by: Thomas Deutschmann --- prog/detect/sensors-detect | 133 +++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 71 deletions(-) diff --git a/prog/detect/sensors-detect b/prog/detect/sensors-detect index ea1c0d53..1e8ac00d 100755 --- a/prog/detect/sensors-detect +++ b/prog/detect/sensors-detect @@ -7338,6 +7338,9 @@ sub write_config { my ($configfile, $bus_modules, $hwmon_modules) = @_; + my $have_conffiles_created = 0; + + # /etc/modprobe.d handling if (defined $configfile) { my $have_modprobe_d = -d '/etc/modprobe.d'; printf "Do you want to \%s /etc/modprobe.d/lm_sensors.conf? (\%s): ", @@ -7346,96 +7349,84 @@ sub write_config $_ = read_answer(); if (($have_modprobe_d and not m/^\s*n/i) or m/^\s*y/i) { unless ($have_modprobe_d) { - mkdir('/etc/modprobe.d', 0777) + mkdir('/etc/modprobe.d', 0755) or die "Sorry, can't create /etc/modprobe.d ($!)"; } - open(local *MODPROBE_D, ">/etc/modprobe.d/lm_sensors.conf") + open(local *MODPROBE_D, ">", $have_modprobe_d . '/lm_sensors.conf') or die "Sorry, can't create /etc/modprobe.d/lm_sensors.conf ($!)"; print MODPROBE_D "# Generated by sensors-detect on " . scalar localtime() . "\n"; print MODPROBE_D $configfile; close(MODPROBE_D); + $have_conffiles_created++; } else { print "To make the sensors modules behave correctly, add these lines to\n". - "/etc/modprobe.conf:\n\n"; + "/etc/modprobe.d/lm_sensors.conf:\n\n"; print "#----cut here----\n". $configfile. "#----cut here----\n\n"; } } - my $have_sysconfig = -d '/etc/sysconfig'; - printf "Do you want to \%s /etc/sysconfig/lm_sensors? (\%s): ", - (-e '/etc/sysconfig/lm_sensors' ? 'overwrite' : 'generate'), - ($have_sysconfig ? 'YES/no' : 'yes/NO'); - $_ = read_answer(); - if (($have_sysconfig and not m/^\s*n/i) or m/^\s*y/i) { - unless ($have_sysconfig) { - mkdir('/etc/sysconfig', 0777) - or die "Sorry, can't create /etc/sysconfig ($!)"; - } - open(local *SYSCONFIG, ">/etc/sysconfig/lm_sensors") - or die "Sorry, can't create /etc/sysconfig/lm_sensors ($!)"; - print SYSCONFIG "# Generated by sensors-detect on " . scalar localtime() . "\n"; - print SYSCONFIG <<'EOT'; -# This file is sourced by /etc/init.d/lm_sensors and defines the modules to -# be loaded/unloaded. -# -# The format of this file is a shell script that simply defines variables: -# HWMON_MODULES for hardware monitoring driver modules, and optionally -# BUS_MODULES for any required bus driver module (for example for I2C or SPI). - -EOT - print SYSCONFIG "BUS_MODULES=\"", join(" ", @{$bus_modules}), "\"\n" - if @{$bus_modules}; - print SYSCONFIG "HWMON_MODULES=\"", join(" ", @{$hwmon_modules}), "\"\n"; - close(SYSCONFIG); - - if ($systemd_systemctl && $systemd_system_dir) { - if (-f "$systemd_system_dir/lm_sensors.service") { - system($systemd_systemctl, "enable", "lm_sensors.service"); - system($systemd_systemctl, "start", "lm_sensors.service"); - # All done, don't check for /etc/init.d/lm_sensors - } else { - print "Copy prog/init/lm_sensors.service to $systemd_system_dir\n". - "and run 'systemctl enable lm_sensors.service'\n". - "for initialization at boot time.\n"; - } - return; + # /etc/modules-load.d handling + my $modulesload_filedir = '/etc/modules-load.d'; + my $modulesload_file = $modulesload_filedir . '/lm_sensors.conf'; + my $modulesload_cfg = "# Generated by sensors-detect on " . scalar localtime() . "\n" + . join("\n", (@{$bus_modules}, @{$hwmon_modules})) . "\n"; + + my $have_modulesload_file = -f $modulesload_file; + printf "Do you want to \%s '$modulesload_file'? (\%s): ", + ($have_modulesload_file ? 'overwrite' : 'generate'), + ($have_modulesload_file ? 'yes/NO' : 'YES/no'); + + my $input = read_answer(); + chomp($input); + if ($input eq '' && $have_modulesload_file) { + $input = 'no'; + } + elsif ($input eq '' && !$have_modulesload_file) { + $input = 'yes'; + } + + if ($input =~ m/^\s*y/i) { + unless (-d $modulesload_filedir) { + mkdir($modulesload_filedir, 0755) + or die "Sorry, can't create '$modulesload_filedir' ($!)"; } - print "Copy prog/init/lm_sensors.init to /etc/init.d/lm_sensors\n". - "for initialization at boot time.\n" - unless -f "/etc/init.d/lm_sensors"; + open(my $fh, '>', $modulesload_file) + or die "Sorry, can't open '$modulesload_file' for writing! ($!)"; - if (-x "/sbin/insserv" && -f "/etc/init.d/lm_sensors") { - system("/sbin/insserv", "/etc/init.d/lm_sensors"); - } elsif (-x "/sbin/chkconfig" && -f "/etc/init.d/lm_sensors") { - system("/sbin/chkconfig", "lm_sensors", "on"); - if (-x "/sbin/service") { - system("/sbin/service", "lm_sensors", "start"); - } + print $fh $modulesload_cfg; + close($fh); + + $have_conffiles_created++; + } + else { + print "\nPlease create '$modulesload_file' with the following content\n" + . "to allow modules-load service to autoload modules on boot:\n\n"; + print "#----cut here----\n" + . "# Generated by sensors-detect on " . scalar localtime() . "\n" + . join("\n", (@{$bus_modules}, @{$hwmon_modules})) . "\n" + . "#----cut here----\n\n"; + } + + if ($have_conffiles_created) { + printf "\nNote: You only have created the required configuration to autoload the\n" + . "required modules to use your sensors on boot. If you want to start using\n" + . "your sensors right now you have to either load them now once manually, to\n" + . "reboot this system or to execute the following command(s):\n\n"; + + if ($systemd_is_booted) { + print " # systemctl restart systemd-modules-load\n\n" } else { - print "You should now start the lm_sensors service to load the required\n". - "kernel modules.\n\n"; - } - } else { - print "To load everything that is needed, add this to one of the system\n". - "initialization scripts (e.g. /etc/rc.d/rc.local):\n\n"; - print "#----cut here----\n"; - if (@{$bus_modules}) { - print "# Adapter drivers\n"; - print "modprobe $_\n" foreach (@{$bus_modules}); + print " # /etc/init.d/modules restart\n\n" } - print "# Chip drivers\n"; - print "modprobe $_\n" foreach (@{$hwmon_modules}); - print((-e '/usr/bin/sensors' ? - "/usr/bin/sensors -s\n" : - "/usr/local/bin/sensors -s\n"). - "#----cut here----\n\n"); - - print "You really should try these commands right now to make sure everything\n". - "is working properly. Monitoring programs won't work until the needed\n". - "modules are loaded.\n\n"; + } + else { + print "\nNote: Please make sure the following modules are loaded when you\n" + . "want to make use of your sensors:\n\n"; + + print " " . join(" ", (@{$bus_modules}, @{$hwmon_modules})) . "\n\n"; } } -- 2.21.0 From c1d471a8be4840a38fe82464e0756a243e158a30 Mon Sep 17 00:00:00 2001 From: Thomas Deutschmann Date: Mon, 29 Aug 2016 12:47:50 +0200 Subject: [PATCH 3/3] sensors-detect: Add Gentoo config file protection Per default we don't modify live config file. Instead we create "._cfg0000_" files known from emerge when using CONFIG PROTECT. See CONFIGURATION FILES section of emerge(1) man page for details. Can be disabled using the "--no-gentoo-config-protect" parameter. Signed-off-by: Thomas Deutschmann --- prog/detect/sensors-detect | 51 +++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/prog/detect/sensors-detect b/prog/detect/sensors-detect index 1e8ac00d..e548bfaf 100755 --- a/prog/detect/sensors-detect +++ b/prog/detect/sensors-detect @@ -7352,7 +7352,7 @@ sub write_config mkdir('/etc/modprobe.d', 0755) or die "Sorry, can't create /etc/modprobe.d ($!)"; } - open(local *MODPROBE_D, ">", $have_modprobe_d . '/lm_sensors.conf') + open(local *MODPROBE_D, ">", gentoo_get_protected_file($have_modprobe_d . '/lm_sensors.conf')) or die "Sorry, can't create /etc/modprobe.d/lm_sensors.conf ($!)"; print MODPROBE_D "# Generated by sensors-detect on " . scalar localtime() . "\n"; print MODPROBE_D $configfile; @@ -7393,7 +7393,7 @@ sub write_config or die "Sorry, can't create '$modulesload_filedir' ($!)"; } - open(my $fh, '>', $modulesload_file) + open(my $fh, '>', gentoo_get_protected_file($modulesload_file)) or die "Sorry, can't open '$modulesload_file' for writing! ($!)"; print $fh $modulesload_cfg; @@ -7411,10 +7411,17 @@ sub write_config } if ($have_conffiles_created) { + if (!$opt{no_gentoo_config_protect}) { + print "\n * IMPORTANT: At least $have_conffiles_created config file(s) in '/etc' need updating.\n" + . " * See the CONFIGURATION FILES and CONFIGURATION FILES UPDATE TOOLS\n" + . " * sections of the emerge man page to learn how to update config files.\n"; + } + printf "\nNote: You only have created the required configuration to autoload the\n" . "required modules to use your sensors on boot. If you want to start using\n" . "your sensors right now you have to either load them now once manually, to\n" - . "reboot this system or to execute the following command(s):\n\n"; + . "reboot this system or to execute the following command(s)\%s:\n\n", + ($opt{no_gentoo_config_protect} ? "" : " _AFTER_\nyou have updated your config files"); if ($systemd_is_booted) { print " # systemctl restart systemd-modules-load\n\n" @@ -7430,6 +7437,32 @@ sub write_config } } +sub gentoo_get_protected_file +{ + my ($file) = @_; + + if ($opt{no_gentoo_config_protect}) { + return $file; + } + + my $basename = basename($file); + my $dirname = dirname($file); + + my $protected_file; + for (my $prot_num = 0; $prot_num <= 9999; $prot_num++) { + $protected_file = sprintf('%s/._cfg%s_%s', + $dirname, + sprintf("%0*d", 4, $prot_num), + $basename); + + if (! -f $protected_file) { + return $protected_file; + } + } + + die "Running out of files -- cannot create protected file '$file'" +} + sub main { my ($input, $superio_features); @@ -7440,6 +7473,8 @@ sub main $opt{stat} = 1; } elsif ($ARGV[0] eq "--auto") { $opt{auto} = 1; + } elsif ($ARGV[0] eq "--no-gentoo-config-protect") { + $opt{no_gentoo_config_protect} = 1; } else { print STDERR "Error: unknown option $ARGV[0]\n"; exit 1; @@ -7493,6 +7528,16 @@ sub main "unless you know what you're doing.\n\n"; } + if (!$opt{no_gentoo_config_protect}) { + print "Gentoo config file protection is active. Every file this program will\n", + "modify must be merged before the change will become active using\n", + "default Gentoo tools such as dispatch-conf, cfg-update, and etc-update.\n\n"; + } + else { + print "Gentoo config file protection is _disabled_. This program will modify\n", + "your active configuration without backups.\n\n"; + } + print "Some south bridges, CPUs or memory controllers contain embedded sensors.\n". "Do you want to scan for them? This is totally safe. (YES/no): "; $input = read_answer(); -- 2.21.0