Hello community,

here is the log from the commit of package laptop-mode-tools for 
openSUSE:Factory checked in at 2020-05-26 17:19:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/laptop-mode-tools (Old)
 and      /work/SRC/openSUSE:Factory/.laptop-mode-tools.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "laptop-mode-tools"

Tue May 26 17:19:04 2020 rev:42 rq:807970 version:1.73.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/laptop-mode-tools/laptop-mode-tools.changes      
2020-02-04 19:57:13.353457006 +0100
+++ 
/work/SRC/openSUSE:Factory/.laptop-mode-tools.new.2738/laptop-mode-tools.changes
    2020-05-26 17:19:13.879963324 +0200
@@ -1,0 +2,22 @@
+Tue May 12 11:50:51 UTC 2020 - Paolo Stivanin <i...@paolostivanin.com>
+
+- Update to 1.73.1:
+  * Respect black/white lists when disabling autosuspend
+  * Add newer power supply names
+  * Fix crash due external battery of mouse
+  * Honor configuration setting for battery level polling
+  * cpufreq: intel_pstate should use performance governors
+  * runtime-pm: Speed up by avoiding fork in echo_to_file
+  * runtime-pm: Inline echo_to_file_do
+  * runtime-pm: Fix echo_to_file* indentation
+  * runtime-pm: Speed up by avoiding fork in listed_by_{id,type}
+  * runtime-pm: Simplify vendor/product match
+  * add help and verison user commands
+  * Add a power-stats status command
+  * Separate power sysfs attributes and add sysfs status attribute
+  * Add device type 'sd' to default blacklist
+  * Fix rpm spec file for new installable files
+  * Return the cpu governor string from the function
+- Remove laptop-mode-tools-1.72.2-fix-name-gui.patch
+
+-------------------------------------------------------------------

Old:
----
  laptop-mode-tools-1.72.2-fix-name-gui.patch
  laptop-mode-tools-1.72.2.tar.gz

New:
----
  laptop-mode-tools-1.73.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ laptop-mode-tools.spec ++++++
--- /var/tmp/diff_new_pack.tChoKw/_old  2020-05-26 17:19:14.683965053 +0200
+++ /var/tmp/diff_new_pack.tChoKw/_new  2020-05-26 17:19:14.687965061 +0200
@@ -20,7 +20,7 @@
 %{!?_udevdir:%global _udevdir  %{_libexecdir}/udev}
 
 Name:           laptop-mode-tools
-Version:        1.72.2
+Version:        1.73.1
 Release:        0
 Summary:        The Laptop Mode Tools
 License:        GPL-2.0-or-later
@@ -31,8 +31,6 @@
 Patch0:         laptop-mode-1.53_conf.diff
 Patch1:         laptop-mode-1.49-new-dirty-ratio-defaults.diff
 Patch2:         laptop-mode-1.53-moblin-enable-intel-hda-powersave.patch
-# PATCH-FIX-UPSTREAM laptop-mode-tools-1.72.2-fix-name-gui.patch -- 
gh#rickysarraf/laptop-mode-tools#124
-Patch3:         laptop-mode-tools-1.72.2-fix-name-gui.patch
 BuildRequires:  systemd-rpm-macros
 BuildRequires:  pkgconfig(systemd)
 BuildRequires:  pkgconfig(udev)

++++++ laptop-mode-tools-1.72.2.tar.gz -> laptop-mode-tools-1.73.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/.github/ISSUE_TEMPLATE/laptop-mode-tools-bug-report.md
 
new/laptop-mode-tools-1.73.1/.github/ISSUE_TEMPLATE/laptop-mode-tools-bug-report.md
--- 
old/laptop-mode-tools-1.72.2/.github/ISSUE_TEMPLATE/laptop-mode-tools-bug-report.md
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/laptop-mode-tools-1.73.1/.github/ISSUE_TEMPLATE/laptop-mode-tools-bug-report.md
 2020-01-11 12:47:05.000000000 +0100
@@ -0,0 +1,35 @@
+---
+name: Laptop Mode Tools Bug Report
+about: Laptop Mode Tools Bug Report
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Important Information:**
+ - Distribution
+ - Linux Kernel
+ - Laptop Mode Tools version
+ - Desktop Environment, if any
+ - Relevant System Logs
+ - Laptop Mode Tools verbose logs
+
+**Additional context**
+Add any other context about the problem here.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/Documentation/revision-history.txt 
new/laptop-mode-tools-1.73.1/Documentation/revision-history.txt
--- old/laptop-mode-tools-1.72.2/Documentation/revision-history.txt     
2018-02-03 17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/Documentation/revision-history.txt     
2020-01-11 12:47:05.000000000 +0100
@@ -1,3 +1,20 @@
+1.73 - Sat Jan 11 14:52:11 IST 2020
+    * Respect black/white lists when disabling autosuspend
+    * Add newer power supply names
+    * Fix crash due external battery of mouse
+    * Honor configuration setting for battery level polling
+    * cpufreq: intel_pstate should use performance governors
+    * runtime-pm: Speed up by avoiding fork in echo_to_file
+    * runtime-pm: Inline echo_to_file_do
+    * runtime-pm: Fix echo_to_file* indentation
+    * runtime-pm: Speed up by avoiding fork in listed_by_{id,type}
+    * runtime-pm: Simplify vendor/product match
+    * add help and verison user commands
+    * Add a power-stats status command
+    * Separate power sysfs attributes and add sysfs status attribute
+    * Add device type 'sd' to default blacklist
+    * Fix rpm spec file for new installable files
+
 1.72 - Thu Feb  1 21:59:24 IST 2018
     * Switch to PyQt5 and Python3
     * Add btrfs to list of filesystems for which we can set commit interval
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/etc/laptop-mode/conf.d/cpufreq.conf 
new/laptop-mode-tools-1.73.1/etc/laptop-mode/conf.d/cpufreq.conf
--- old/laptop-mode-tools-1.72.2/etc/laptop-mode/conf.d/cpufreq.conf    
2018-02-03 17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/etc/laptop-mode/conf.d/cpufreq.conf    
2020-01-11 12:47:05.000000000 +0100
@@ -40,22 +40,25 @@
 # "medium" for some value in the middle, or any value listed in
 # /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies.
 # The "governor" can be any governor installed on your system, this usually
-# includes "ondemand", "conservative", and "performance". The
-# "IGNORE_NICE_LOAD" setting specifies that background programs that have
+# includes "ondemand", "conservative", and "performance". And it can also be
+# a speical value "auto" which is the default case meaning that the governor
+# is picked automatically by LMT, that is try to use governors provided by
+# intel_pstate driver first and fallback to ondemand if that's not possible.
+# The "IGNORE_NICE_LOAD" setting specifies that background programs that have
 # a low priority ("nice level") should not cause the CPU frequency to
 # be increased. (You generally want this to be enabled in battery mode.)
 #
 BATT_CPU_MAXFREQ=fastest
 BATT_CPU_MINFREQ=slowest
-BATT_CPU_GOVERNOR=ondemand
+BATT_CPU_GOVERNOR=auto
 BATT_CPU_IGNORE_NICE_LOAD=1
 LM_AC_CPU_MAXFREQ=fastest
 LM_AC_CPU_MINFREQ=slowest
-LM_AC_CPU_GOVERNOR=ondemand
+LM_AC_CPU_GOVERNOR=auto
 LM_AC_CPU_IGNORE_NICE_LOAD=1
 NOLM_AC_CPU_MAXFREQ=fastest
 NOLM_AC_CPU_MINFREQ=slowest
-NOLM_AC_CPU_GOVERNOR=ondemand
+NOLM_AC_CPU_GOVERNOR=auto
 NOLM_AC_CPU_IGNORE_NICE_LOAD=0
 
 
@@ -63,7 +66,7 @@
 # Should laptop mode tools control the CPU throttling? This is only useful
 # on processors that don't have frequency scaling.
 # (Only works when you have /proc/acpi/processor/CPU*/throttling.)
-# 
+#
 # This is only useful on older P4 processors that do not support frequency
 # scaling. On such processors, this is the only way to reduce power consumption
 # but at the cost of higher performance penalty.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/etc/laptop-mode/conf.d/runtime-pm.conf 
new/laptop-mode-tools-1.73.1/etc/laptop-mode/conf.d/runtime-pm.conf
--- old/laptop-mode-tools-1.72.2/etc/laptop-mode/conf.d/runtime-pm.conf 
2018-02-03 17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/etc/laptop-mode/conf.d/runtime-pm.conf 
2020-01-11 12:47:05.000000000 +0100
@@ -55,7 +55,7 @@
 # Example: AUTOSUSPEND_RUNTIME_DEVTYPE_WHITELIST="usbhid usb-storage"
 AUTOSUSPEND_RUNTIME_DEVTYPE_WHITELIST=""
 
-# Trigger auto-suspension of the deivce under conditional circumstances
+# Trigger auto-suspension of the device under conditional circumstances
 # Warning: DO NOT CHANGE THESE DEFAUTLS UNLESS YOU KNOW
 BATT_SUSPEND_RUNTIME=1
 LM_AC_SUSPEND_RUNTIME=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/etc/rules/99-laptop-mode.rules 
new/laptop-mode-tools-1.73.1/etc/rules/99-laptop-mode.rules
--- old/laptop-mode-tools-1.72.2/etc/rules/99-laptop-mode.rules 2018-02-03 
17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/etc/rules/99-laptop-mode.rules 2020-01-11 
12:47:05.000000000 +0100
@@ -1,4 +1,4 @@
-ACTION=="change", SUBSYSTEM=="power_supply", 
ENV{POWER_SUPPLY_NAME}=="|AC|ACAD", RUN+="lmt-udev auto"
+ACTION=="change", SUBSYSTEM=="power_supply", 
ENV{POWER_SUPPLY_NAME}=="|AC|ACAD|ADP*", RUN+="lmt-udev auto"
 ACTION=="add|remove", SUBSYSTEM=="machinecheck", RUN+="lmt-udev auto"
 ACTION=="add", SUBSYSTEM=="usb", RUN+="lmt-udev force"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/etc/systemd/lmt-poll.service 
new/laptop-mode-tools-1.73.1/etc/systemd/lmt-poll.service
--- old/laptop-mode-tools-1.72.2/etc/systemd/lmt-poll.service   2018-02-03 
17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/etc/systemd/lmt-poll.service   2020-01-11 
12:47:05.000000000 +0100
@@ -6,8 +6,10 @@
 [Service]
 Type=oneshot
 RemainAfterExit=no
-ExecStart=/lib/udev/lmt-udev auto
-ExecReload=/lib/udev/lmt-udev auto
+Environment=CONTROL_BATTERY_LEVEL_POLLING=1
+EnvironmentFile=-/etc/laptop-mode/conf.d/battery-level-polling.conf
+ExecStart=-/bin/sh -c '[ x"$CONTROL_BATTERY_LEVEL_POLLING" = "x1" ] && 
/lib/udev/lmt-udev auto || echo "laptop-mode: Battery polling disabled"'
+ExecReload=-/bin/sh -c '[ x"$CONTROL_BATTERY_LEVEL_POLLING" = "x1" ] && 
/lib/udev/lmt-udev auto || echo "laptop-mode: Battery polling disabled"'
 StandardOutput=journal
 StandardError=journal
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/laptop-mode-tools-1.72.2/gui/LMT.py 
new/laptop-mode-tools-1.73.1/gui/LMT.py
--- old/laptop-mode-tools-1.72.2/gui/LMT.py     2018-02-03 17:08:43.000000000 
+0100
+++ new/laptop-mode-tools-1.73.1/gui/LMT.py     1970-01-01 01:00:00.000000000 
+0100
@@ -1,262 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-
-
-""" Laptop Mode Tools """
-
-
-import sys
-from getpass import getuser
-from os import access, F_OK, geteuid, listdir, path, putenv
-from shutil import move
-from webbrowser import open_new_tab
-
-from PyQt5.QtWidgets import (QWidget, QMessageBox, QVBoxLayout, QHBoxLayout,
-        QGroupBox, QScrollArea, QCheckBox, QPushButton,
-        QApplication, QMainWindow, QDialogButtonBox,
-        QGraphicsDropShadowEffect, QShortcut)
-from PyQt5.QtGui import (QIcon, QColor)
-
-
-# This seems to be needed, atleast of Debian
-putenv('QT_X11_NO_MITSHM', "1")
-
-# constants
-COMMENT_IDENTIFIER = "#__COMMENT"
-CONTROL_IDENTIFIER = "CONTROL_"
-CONFIG_DIR = "/etc/laptop-mode/conf.d"
-WEBPAGE_URL = "http://github.com/rickysarraf/laptop-mode-tools";
-
-
-###############################################################################
-
-
-class Log():
-    def debug(self, string_to_log):
-        sys.stderr.write(string_to_log + "\n")
-
-    def msg(self, string_to_log):
-        sys.stdout.write(string_to_log + "\n")
-
-    def err(self, string_to_log):
-        sys.stderr.write(string_to_log + "\n")
-
-
-class MainWidget(QMainWindow):
-    def __init__(self, parent=None):
-        QMainWindow.__init__(self, parent)
-        self.configOptions, self.checkBoxList, self.configBool = {}, {}, None
-        # Check for root privileges
-        if geteuid() != 0:
-            msg = ("{} is not root. You need to run with root priviliges\n"
-                   "Please use kdesudo, gksu or sudo/sux.").format(getuser())
-            QMessageBox.critical(self, __doc__ + "- Error", msg)
-            sys.exit(1)
-        else:
-            msg = "This tool is running with root priviliges."
-            QMessageBox.warning(self, __doc__ + "- Warning", msg)
-        # title, icon and sizes
-        self.setWindowTitle(__doc__)
-        self.setMinimumSize(400, 400)
-        self.setMaximumSize(2048, 2048)
-        self.resize(600, 600)
-        self.setWindowIcon(QIcon.fromTheme("preferences-system"))
-        self.menuBar().addMenu("&File").addAction("Exit", exit)
-        QShortcut("Ctrl+q", self, activated=lambda: self.close())
-        # main group
-        main_group = QGroupBox("Module configuration")
-        self.setCentralWidget(main_group)
-        self.layout = QVBoxLayout(main_group)
-        # scrollarea widgets
-        self.scrollArea, self.window = QScrollArea(), QWidget()
-        self.layout.addWidget(self.scrollArea)
-        self.vbox = QVBoxLayout(self.window)
-        # Graphic effect
-        glow = QGraphicsDropShadowEffect(self)
-        glow.setOffset(0)
-        glow.setBlurRadius(99)
-        glow.setColor(QColor(99, 255, 255))
-        self.scrollArea.setGraphicsEffect(glow)
-        glow.setEnabled(True)
-        # config loading stuff
-        self.findConfig(CONFIG_DIR)
-        for eachOption in tuple(self.configOptions.keys()):
-
-            self.readConfig(eachOption, self.configOptions)
-            self.subLayout = QHBoxLayout()
-
-            self.checkBoxName = "checkBox_" + eachOption
-            checkBoxList = QCheckBox(self.checkBoxName, self)
-            self.checkBoxList[self.checkBoxName] = checkBoxList
-            checkBoxList.setObjectName(self.checkBoxName)
-            checkBoxList.setText("Enable module {}".format(eachOption))
-
-            if self.tooltip is not '':
-                checkBoxList.setToolTip(self.tooltip)
-            else:
-                tooltip = "Configuration settings for {}".format(eachOption)
-                checkBoxList.setToolTip(tooltip)
-
-            if self.configBool:
-                checkBoxList.setChecked(True)
-
-            self.subLayout.addWidget(checkBoxList)
-            self.vbox.addLayout(self.subLayout)
-        self.scrollArea.setWidget(self.window)
-
-        # Bottom Buttons Bar
-        self.pushButtonSleep = QPushButton("Sleep")
-        self.pushButtonSleep.setToolTip("Trigger Suspend to RAM aka Sleep")
-        self.pushButtonSleep.clicked.connect(self.sleep)
-        self.pushButtonHibernate = QPushButton("Hibernate")
-        self.pushButtonHibernate.setToolTip("Trigger Suspend to Disk 
Hibernate")
-        self.pushButtonHibernate.clicked.connect(self.hibernate)
-        self.buttonBox = QDialogButtonBox()
-        self.buttonBox.setStandardButtons(
-            QDialogButtonBox.Ok | QDialogButtonBox.Close |
-            QDialogButtonBox.Help)
-        self.buttonBox.addButton(self.pushButtonHibernate,
-                                 QDialogButtonBox.ActionRole)
-        self.buttonBox.addButton(self.pushButtonSleep,
-                                 QDialogButtonBox.ActionRole)
-        self.layout.addWidget(self.buttonBox)
-        self.buttonBox.rejected.connect(exit)
-        self.buttonBox.accepted.connect(self.writeConfig)
-        self.buttonBox.helpRequested.connect(lambda: open_new_tab(WEBPAGE_URL))
-
-    def closeEvent(self, event):
-        ' Ask to Quit '
-        the_conditional_is_true = QMessageBox.question(
-            self, __doc__.title(), 'Quit ?.', QMessageBox.Yes | QMessageBox.No,
-            QMessageBox.No) == QMessageBox.Yes
-        event.accept() if the_conditional_is_true else event.ignore()
-
-    def sleep(self):
-        """Method to make the computer Sleep."""
-        try:
-            sysfsFP = open("/sys/power/state", 'w')
-        except:
-            log.err("Couldn't open kernel interface")
-            return False
-        else:
-            try:
-                sysfsFP.write("mem")
-            except:
-                log.err("Couldn't write to kernel interface")
-                return False
-
-    def hibernate(self):
-        """Method to make the computer Hibernate."""
-        try:
-            sysfsFP = open("/sys/power/state", 'w')
-        except:
-            log.err("Couldn't open kernel interface")
-            return False
-        else:
-            try:
-                sysfsFP.write("disk")
-            except:
-                log.err("Couldn't write to kernel interface")
-                return False
-
-    def writeConfig(self):
-        """Method to get a configuration for the App."""
-        finalResult = True
-        for eachWriteOption in tuple(self.configOptions.keys()):
-            checkBoxName = "checkBox_" + eachWriteOption
-            if self.checkBoxList[checkBoxName].isChecked() is True:
-                val = 1
-            else:
-                val = 0
-            ret = self.populateValues(self.configOptions[eachWriteOption], val)
-
-            if ret is False:
-                log.debug("Couldn't apply setting for %s" % checkBoxName)
-                finalResult = False
-
-        if finalResult is False:
-            QMessageBox.critical(self, "Error",
-                                       "Couldn't apply all requested settings")
-        else:
-            QMessageBox.information(self, "Success",
-                                          "Applied all requested settings")
-
-    def populateValues(self, _path, value):
-        """Method to populate values from a file path."""
-        try:
-            readHandle = open(_path, 'r')
-            writeHandle = open(_path + ".tmp", 'w')
-            for line in readHandle.readlines():
-                if line.startswith(CONTROL_IDENTIFIER):
-                    newline = line.split("=")[0] + "=" + str(value)
-                    writeHandle.write(newline)
-                    # You need this newline, otherwise the next line gets
-                    # overlapped here
-                    writeHandle.write("\n")
-                else:
-                    writeHandle.write(line)
-            readHandle.close()
-            writeHandle.close()
-            move(_path + ".tmp", _path)
-            return True
-        except:
-            log.debug("Failed in populateValues() when operating on %s" % 
_path)
-            return False
-
-    def findConfig(self, configDir):
-        """Take a configDir and find the configuration for the App."""
-        if configDir is None:
-            return False
-
-        # TODO: Do we need to take care of the vendor specific overrides ???
-        for configFile in listdir(configDir):
-            if access(path.join(configDir, configFile), F_OK) is True:
-                fn = path.join(configDir, configFile)
-                self.configOptions[configFile.split(".")[0]] = fn
-            else:
-                pass
-
-    def readConfig(self, key, configOptionsDict):
-        """Take a key and dict and read the configurations for the App."""
-        self.tooltip = ''
-
-        if key is None or configOptionsDict is None:
-            return False
-
-        try:
-            fileHandle = open(configOptionsDict[key], 'r')
-        except:
-            return False
-
-        for line in fileHandle.readlines():
-            if line.startswith(COMMENT_IDENTIFIER):
-                self.tooltip = self.tooltip + line.lstrip(COMMENT_IDENTIFIER)
-            elif line.startswith(CONTROL_IDENTIFIER):
-                boolValue = line.split("=")[1]
-                # Bloody boolValue could inherit the '\n' new line
-                boolValue = boolValue.rstrip("\n")
-
-                if boolValue == str(1) or "\"auto\"" in boolValue:
-                    self.configBool = True
-                else:
-                    self.configBool = False
-
-        # This will ensure that even if we don't read any string, tooltip
-        # doesn't fail
-        self.tooltip = self.tooltip + ''
-
-
-###############################################################################
-
-
-if __name__ == "__main__":
-    log = Log()
-    application = QApplication(sys.argv)
-    application.setApplicationName(__doc__.strip().lower())
-    application.setOrganizationName(__doc__.strip().title())
-    application.setOrganizationDomain(__doc__.strip().title())
-    application.setWindowIcon(QIcon.fromTheme("preferences-system"))
-    window = MainWidget()
-    window.show()
-    window.raise_()
-    sys.exit(application.exec_())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/laptop-mode-tools-1.72.2/gui/lmt.py 
new/laptop-mode-tools-1.73.1/gui/lmt.py
--- old/laptop-mode-tools-1.72.2/gui/lmt.py     1970-01-01 01:00:00.000000000 
+0100
+++ new/laptop-mode-tools-1.73.1/gui/lmt.py     2020-01-11 12:47:05.000000000 
+0100
@@ -0,0 +1,262 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+
+""" Laptop Mode Tools """
+
+
+import sys
+from getpass import getuser
+from os import access, F_OK, geteuid, listdir, path, putenv
+from shutil import move
+from webbrowser import open_new_tab
+
+from PyQt5.QtWidgets import (QWidget, QMessageBox, QVBoxLayout, QHBoxLayout,
+        QGroupBox, QScrollArea, QCheckBox, QPushButton,
+        QApplication, QMainWindow, QDialogButtonBox,
+        QGraphicsDropShadowEffect, QShortcut)
+from PyQt5.QtGui import (QIcon, QColor)
+
+
+# This seems to be needed, atleast of Debian
+putenv('QT_X11_NO_MITSHM', "1")
+
+# constants
+COMMENT_IDENTIFIER = "#__COMMENT"
+CONTROL_IDENTIFIER = "CONTROL_"
+CONFIG_DIR = "/etc/laptop-mode/conf.d"
+WEBPAGE_URL = "http://github.com/rickysarraf/laptop-mode-tools";
+
+
+###############################################################################
+
+
+class Log():
+    def debug(self, string_to_log):
+        sys.stderr.write(string_to_log + "\n")
+
+    def msg(self, string_to_log):
+        sys.stdout.write(string_to_log + "\n")
+
+    def err(self, string_to_log):
+        sys.stderr.write(string_to_log + "\n")
+
+
+class MainWidget(QMainWindow):
+    def __init__(self, parent=None):
+        QMainWindow.__init__(self, parent)
+        self.configOptions, self.checkBoxList, self.configBool = {}, {}, None
+        # Check for root privileges
+        if geteuid() != 0:
+            msg = ("{} is not root. You need to run with root privileges\n"
+                   "Please use kdesudo, gksu or sudo/sux.").format(getuser())
+            QMessageBox.critical(self, __doc__ + "- Error", msg)
+            sys.exit(1)
+        else:
+            msg = "This tool is running with root privileges."
+            QMessageBox.warning(self, __doc__ + "- Warning", msg)
+        # title, icon and sizes
+        self.setWindowTitle(__doc__)
+        self.setMinimumSize(400, 400)
+        self.setMaximumSize(2048, 2048)
+        self.resize(600, 600)
+        self.setWindowIcon(QIcon.fromTheme("preferences-system"))
+        self.menuBar().addMenu("&File").addAction("Exit", exit)
+        QShortcut("Ctrl+q", self, activated=lambda: self.close())
+        # main group
+        main_group = QGroupBox("Module configuration")
+        self.setCentralWidget(main_group)
+        self.layout = QVBoxLayout(main_group)
+        # scrollarea widgets
+        self.scrollArea, self.window = QScrollArea(), QWidget()
+        self.layout.addWidget(self.scrollArea)
+        self.vbox = QVBoxLayout(self.window)
+        # Graphic effect
+        glow = QGraphicsDropShadowEffect(self)
+        glow.setOffset(0)
+        glow.setBlurRadius(99)
+        glow.setColor(QColor(99, 255, 255))
+        self.scrollArea.setGraphicsEffect(glow)
+        glow.setEnabled(True)
+        # config loading stuff
+        self.findConfig(CONFIG_DIR)
+        for eachOption in tuple(self.configOptions.keys()):
+
+            self.readConfig(eachOption, self.configOptions)
+            self.subLayout = QHBoxLayout()
+
+            self.checkBoxName = "checkBox_" + eachOption
+            checkBoxList = QCheckBox(self.checkBoxName, self)
+            self.checkBoxList[self.checkBoxName] = checkBoxList
+            checkBoxList.setObjectName(self.checkBoxName)
+            checkBoxList.setText("Enable module {}".format(eachOption))
+
+            if self.tooltip is not '':
+                checkBoxList.setToolTip(self.tooltip)
+            else:
+                tooltip = "Configuration settings for {}".format(eachOption)
+                checkBoxList.setToolTip(tooltip)
+
+            if self.configBool:
+                checkBoxList.setChecked(True)
+
+            self.subLayout.addWidget(checkBoxList)
+            self.vbox.addLayout(self.subLayout)
+        self.scrollArea.setWidget(self.window)
+
+        # Bottom Buttons Bar
+        self.pushButtonSleep = QPushButton("Sleep")
+        self.pushButtonSleep.setToolTip("Trigger Suspend to RAM aka Sleep")
+        self.pushButtonSleep.clicked.connect(self.sleep)
+        self.pushButtonHibernate = QPushButton("Hibernate")
+        self.pushButtonHibernate.setToolTip("Trigger Suspend to Disk 
Hibernate")
+        self.pushButtonHibernate.clicked.connect(self.hibernate)
+        self.buttonBox = QDialogButtonBox()
+        self.buttonBox.setStandardButtons(
+            QDialogButtonBox.Ok | QDialogButtonBox.Close |
+            QDialogButtonBox.Help)
+        self.buttonBox.addButton(self.pushButtonHibernate,
+                                 QDialogButtonBox.ActionRole)
+        self.buttonBox.addButton(self.pushButtonSleep,
+                                 QDialogButtonBox.ActionRole)
+        self.layout.addWidget(self.buttonBox)
+        self.buttonBox.rejected.connect(exit)
+        self.buttonBox.accepted.connect(self.writeConfig)
+        self.buttonBox.helpRequested.connect(lambda: open_new_tab(WEBPAGE_URL))
+
+    def closeEvent(self, event):
+        ' Ask to Quit '
+        the_conditional_is_true = QMessageBox.question(
+            self, __doc__.title(), 'Quit ?.', QMessageBox.Yes | QMessageBox.No,
+            QMessageBox.No) == QMessageBox.Yes
+        event.accept() if the_conditional_is_true else event.ignore()
+
+    def sleep(self):
+        """Method to make the computer Sleep."""
+        try:
+            sysfsFP = open("/sys/power/state", 'w')
+        except:
+            log.err("Couldn't open kernel interface")
+            return False
+        else:
+            try:
+                sysfsFP.write("mem")
+            except:
+                log.err("Couldn't write to kernel interface")
+                return False
+
+    def hibernate(self):
+        """Method to make the computer Hibernate."""
+        try:
+            sysfsFP = open("/sys/power/state", 'w')
+        except:
+            log.err("Couldn't open kernel interface")
+            return False
+        else:
+            try:
+                sysfsFP.write("disk")
+            except:
+                log.err("Couldn't write to kernel interface")
+                return False
+
+    def writeConfig(self):
+        """Method to get a configuration for the App."""
+        finalResult = True
+        for eachWriteOption in tuple(self.configOptions.keys()):
+            checkBoxName = "checkBox_" + eachWriteOption
+            if self.checkBoxList[checkBoxName].isChecked() is True:
+                val = 1
+            else:
+                val = 0
+            ret = self.populateValues(self.configOptions[eachWriteOption], val)
+
+            if ret is False:
+                log.debug("Couldn't apply setting for %s" % checkBoxName)
+                finalResult = False
+
+        if finalResult is False:
+            QMessageBox.critical(self, "Error",
+                                       "Couldn't apply all requested settings")
+        else:
+            QMessageBox.information(self, "Success",
+                                          "Applied all requested settings")
+
+    def populateValues(self, _path, value):
+        """Method to populate values from a file path."""
+        try:
+            readHandle = open(_path, 'r')
+            writeHandle = open(_path + ".tmp", 'w')
+            for line in readHandle.readlines():
+                if line.startswith(CONTROL_IDENTIFIER):
+                    newline = line.split("=")[0] + "=" + str(value)
+                    writeHandle.write(newline)
+                    # You need this newline, otherwise the next line gets
+                    # overlapped here
+                    writeHandle.write("\n")
+                else:
+                    writeHandle.write(line)
+            readHandle.close()
+            writeHandle.close()
+            move(_path + ".tmp", _path)
+            return True
+        except:
+            log.debug("Failed in populateValues() when operating on %s" % 
_path)
+            return False
+
+    def findConfig(self, configDir):
+        """Take a configDir and find the configuration for the App."""
+        if configDir is None:
+            return False
+
+        # TODO: Do we need to take care of the vendor specific overrides ???
+        for configFile in listdir(configDir):
+            if access(path.join(configDir, configFile), F_OK) is True:
+                fn = path.join(configDir, configFile)
+                self.configOptions[configFile.split(".")[0]] = fn
+            else:
+                pass
+
+    def readConfig(self, key, configOptionsDict):
+        """Take a key and dict and read the configurations for the App."""
+        self.tooltip = ''
+
+        if key is None or configOptionsDict is None:
+            return False
+
+        try:
+            fileHandle = open(configOptionsDict[key], 'r')
+        except:
+            return False
+
+        for line in fileHandle.readlines():
+            if line.startswith(COMMENT_IDENTIFIER):
+                self.tooltip = self.tooltip + line.lstrip(COMMENT_IDENTIFIER)
+            elif line.startswith(CONTROL_IDENTIFIER):
+                boolValue = line.split("=")[1]
+                # Bloody boolValue could inherit the '\n' new line
+                boolValue = boolValue.rstrip("\n")
+
+                if boolValue == str(1) or "\"auto\"" in boolValue:
+                    self.configBool = True
+                else:
+                    self.configBool = False
+
+        # This will ensure that even if we don't read any string, tooltip
+        # doesn't fail
+        self.tooltip = self.tooltip + ''
+
+
+###############################################################################
+
+
+if __name__ == "__main__":
+    log = Log()
+    application = QApplication(sys.argv)
+    application.setApplicationName(__doc__.strip().lower())
+    application.setOrganizationName(__doc__.strip().title())
+    application.setOrganizationDomain(__doc__.strip().title())
+    application.setWindowIcon(QIcon.fromTheme("preferences-system"))
+    window = MainWidget()
+    window.show()
+    window.raise_()
+    sys.exit(application.exec_())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/laptop-mode-tools-1.72.2/install.sh 
new/laptop-mode-tools-1.73.1/install.sh
--- old/laptop-mode-tools-1.72.2/install.sh     2018-02-03 17:08:43.000000000 
+0100
+++ new/laptop-mode-tools-1.73.1/install.sh     2020-01-11 12:47:05.000000000 
+0100
@@ -209,7 +209,7 @@
        exit 11
 fi
 
-if ( ! $INSTALL -m 644 gui/LMT.py "$DESTDIR/usr/share/laptop-mode-tools" ) ; 
then
+if ( ! $INSTALL -m 644 gui/lmt.py "$DESTDIR/usr/share/laptop-mode-tools" ) ; 
then
        echo "$0: Failed to install 
$DESTDIR/usr/share/laptop-mode-tools/lmt.py";
        exit 11
 fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/laptop-mode-tools-1.72.2/laptop-mode-tools.spec 
new/laptop-mode-tools-1.73.1/laptop-mode-tools.spec
--- old/laptop-mode-tools-1.72.2/laptop-mode-tools.spec 2018-02-03 
17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/laptop-mode-tools.spec 2020-01-11 
12:47:05.000000000 +0100
@@ -3,7 +3,7 @@
 
 Summary: Tools for power savings based on battery/AC status
 Name: laptop-mode-tools
-Version: 1.72.2
+Version: 1.73.1
 Release: 1
 License: GPL
 Group: System Environment/Base
@@ -83,7 +83,7 @@
 #%{_usr}/sbin/*
 %{_sbindir}/*
 %{_usr}/share/applications/laptop-mode-tools.desktop
-%{_usr}/share/laptop-mode-tools/LMT.py
+%{_usr}/share/laptop-mode-tools/lmt.py
 %{_usr}/share/laptop-mode-tools/modules/*
 %{_usr}/share/laptop-mode-tools/module-helpers/*
 %{_usr}/share/pixmaps/laptop-mode-tools.svg
@@ -106,6 +106,12 @@
 
 
 %changelog
+* Sat Jan 11 2020 Ritesh Raj Sarraf <r...@researchut.com> - 1.73.1-1
+- Updated to release 1.73.1
+
+* Sat Jan 11 2020 Ritesh Raj Sarraf <r...@researchut.com> - 1.73-1
+- Updated to release 1.73
+
 * Sat Feb  3 2018 Ritesh Raj Sarraf <r...@researchut.com> - 1.72.2-1
 - Updated to release 1.72.2
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/laptop-mode-tools-1.72.2/usr/sbin/laptop_mode 
new/laptop-mode-tools-1.73.1/usr/sbin/laptop_mode
--- old/laptop-mode-tools-1.72.2/usr/sbin/laptop_mode   2018-02-03 
17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/usr/sbin/laptop_mode   2020-01-11 
12:47:05.000000000 +0100
@@ -35,7 +35,7 @@
 
 # The laptop mode tools version number. Extracted by the installer makefile
 # as well, so don't change the format!
-LMTVERSION=1.72
+LMTVERSION=1.73
 
 # This script is loaded from multiple scripts to set the config defaults
 # and to read the configuration on top of those. Only when the command is
@@ -133,23 +133,6 @@
 # Initialize the PATH Variable
 export PATH="${PATH}":/bin:/sbin:/usr/bin:/usr/sbin
 
-# This is a 2 phase locking approach. LMT_REQ_LOCK is the outer lock and 
LMT_INVOC_LOCK is the inner lock
-# We take this approach to ensure the scenario that, "At any point when an 
event occurs (AC/BATT), the
-# kernel can generate multiple events spanning over a couple of events. The 
first event is honored and
-# lmt executes. If the last event triggered at the 9th second, there is a fair 
chance that a good amount
-# of state change would have occured in the OS, to honor that state, we keep 
an outer lock  (LMT_REQ_LOCK)
-# handy, so that those changes can also be applied and not forgotten.
-# Workflow:
-# Event-1 is generated and lmt executes (lmt runtime could span 5-10 seconds)
-# At seventh second, 4 events generate. But Event-1 is still running.
-# We don't want to discard all the remaining 4 events, but at least honor 1 so 
that we can act to the changes
-# that occured in the last 7 seconds.
-# So, Event-2 acquire LMT_REQ_LOCK and waits to acquire LMT_INVOC_LOCK (which 
is acquire by Event-1)
-LMT_REQ_LOCK="/var/lock/lmt-req.lock"
-LMT_INVOC_LOCK="/var/lock/lmt-invoc.lock"
-LMT_BATTPOLL_LOCK="/var/lock/lmt-battpoll.lock"
-FLOCK=`which flock`
-
 checkint ()
 {
        # $1 arg should be the string/integer
@@ -160,8 +143,22 @@
        # Returns 1 if it is an integer
 }
 
+
+checkCmd ()
+{
+    cmd=`which $1`;
+    if [ $? -eq 1 ]; then
+       return 1
+    fi
+    test -x $cmd || return 1;
+}
+
 # Function to handle logging
-LOGGER=`which logger`;
+if checkCmd "logger"; then
+    LOGGER=`which logger`;
+else
+    echo "No logger command available" >&2;
+fi
 
 log ()
 {
@@ -215,6 +212,40 @@
        fi
 }
 
+echo_to_file_do() {
+    echo "$1" > "$2";
+}
+
+echo_to_file() {
+    echo_to_file_do "$1" "$2" 2>&1 | \
+        while read REPLY; do
+            log "VERBOSE" "$REPLY"
+        done
+       echo_to_file_retval=$?;
+}
+
+# This is a 2 phase locking approach. LMT_REQ_LOCK is the outer lock and 
LMT_INVOC_LOCK is the inner lock
+# We take this approach to ensure the scenario that, "At any point when an 
event occurs (AC/BATT), the
+# kernel can generate multiple events spanning over a couple of events. The 
first event is honored and
+# lmt executes. If the last event triggered at the 9th second, there is a fair 
chance that a good amount
+# of state change would have occured in the OS, to honor that state, we keep 
an outer lock  (LMT_REQ_LOCK)
+# handy, so that those changes can also be applied and not forgotten.
+# Workflow:
+# Event-1 is generated and lmt executes (lmt runtime could span 5-10 seconds)
+# At seventh second, 4 events generate. But Event-1 is still running.
+# We don't want to discard all the remaining 4 events, but at least honor 1 so 
that we can act to the changes
+# that occured in the last 7 seconds.
+# So, Event-2 acquire LMT_REQ_LOCK and waits to acquire LMT_INVOC_LOCK (which 
is acquire by Event-1)
+LMT_REQ_LOCK="/var/lock/lmt-req.lock"
+LMT_INVOC_LOCK="/var/lock/lmt-invoc.lock"
+LMT_BATTPOLL_LOCK="/var/lock/lmt-battpoll.lock"
+if checkCmd "flock"; then
+    FLOCK=`which flock`;
+else
+    log "ERR" "Core dependency flock unavailable. Aborting"
+    exit 1
+fi
+
 # No default on these ones -- we need to detect if they have been set, for
 # backward compatibility with MINIMUM_BATTERY_MINUTES etc.
 AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT=
@@ -534,6 +565,8 @@
        INIT=0          # Display info in init script format?
        FORCE=0         # Force reapplying the current state?
        INITSCRIPT_STOP=0       # Track stop command from init script. Consumer 
is lm-polling daemon
+       POWER_SYSFS="/proc/acpi/ac_adapter/*/state /proc/acpi/battery/*/state 
/sys/class/power_supply/*/online /sys/class/power_supply/*/state 
/sys/class/power_supply/*/status"
+       BATT_DETAILS="/sys/class/power_supply/*/capacity* 
/sys/class/power_supply/*/energy* /sys/class/power_supply/*/manufacturer 
/sys/class/power_supply/*/model /sys/class/power_supply/*/technology 
/sys/class/power_supply/*/type"
 
        # Evaluate options passed to laptop_mode in here
        if [ "$1" = "status" ] ; then
@@ -544,7 +577,11 @@
                log "STATUS" "Drive power status:"
                for disk in $HD; do
                        if [ -r $disk ]; then
-                               hdparm -C $disk 2>/dev/null | sed "s/^/   /"
+                               if checkCmd "hdparm"; then
+                                   hdparm -C $disk 2>/dev/null | sed "s/^/   /"
+                               else
+                                   log "ERR" "hdparm command not available"
+                               fi
                        else
                                log "STATUS" "   Cannot read $disk, permission 
denied - $0 needs to be run as root"
                        fi
@@ -562,7 +599,11 @@
                        esac
                        if [ -b $DEV ] ; then
                                if [ -r $DEV ] ; then
-                                       log "STATUS" "   $DEV: $((`blockdev 
--getra $DEV` / 2)) kB"
+                                       if checkCmd "blockdev"; then
+                                           log "STATUS" "   $DEV: $((`blockdev 
--getra $DEV` / 2)) kB"
+                                       else
+                                           log "ERR" "blockdev command not 
available"
+                                       fi
                                else
                                        log "STATUS" "   Cannot read $DEV, 
permission denied - $0 needs to be run as root"
                                fi
@@ -577,7 +618,7 @@
                fi
 
                log "STATUS" " "
-               STATFILES="/proc/sys/vm/laptop_mode /proc/apm /proc/pmu/info 
/proc/sys/vm/bdflush /proc/sys/vm/dirty_ratio /proc/sys/fs/xfs/age_buffer 
/proc/sys/fs/xfs/sync_interval /proc/sys/fs/xfs/lm_age_buffer 
/proc/sys/fs/xfs/lm_sync_interval /proc/sys/vm/pagebuf/lm_flush_age 
/proc/sys/fs/xfs/xfsbufd_centisecs /proc/sys/fs/xfs/xfssyncd_centisecs 
/proc/sys/vm/dirty_background_ratio /proc/sys/vm/dirty_expire_centisecs 
/proc/sys/fs/xfs/age_buffer/centisecs /proc/sys/vm/dirty_writeback_centisecs 
/sys/devices/system/cpu/*/cpufreq/cpuinfo_*_freq 
/sys/devices/system/cpu/*/cpufreq/scaling_governor 
/proc/acpi/button/lid/*/state /proc/acpi/ac_adapter/*/state 
/proc/acpi/battery/*/state /sys/class/power_supply/*/online 
/sys/class/power_supply/*/state"
+               STATFILES="/proc/sys/vm/laptop_mode /proc/apm /proc/pmu/info 
/proc/sys/vm/bdflush /proc/sys/vm/dirty_ratio /proc/sys/fs/xfs/age_buffer 
/proc/sys/fs/xfs/sync_interval /proc/sys/fs/xfs/lm_age_buffer 
/proc/sys/fs/xfs/lm_sync_interval /proc/sys/vm/pagebuf/lm_flush_age 
/proc/sys/fs/xfs/xfsbufd_centisecs /proc/sys/fs/xfs/xfssyncd_centisecs 
/proc/sys/vm/dirty_background_ratio /proc/sys/vm/dirty_expire_centisecs 
/proc/sys/fs/xfs/age_buffer/centisecs /proc/sys/vm/dirty_writeback_centisecs 
/sys/devices/system/cpu/*/cpufreq/cpuinfo_*_freq 
/sys/devices/system/cpu/*/cpufreq/scaling_governor 
/proc/acpi/button/lid/*/state 
/sys/class/scsi_host/*/link_power_management_policy $POWER_SYSFS"
 
                for THISFILE in $STATFILES ; do
                        if [ -e "$THISFILE" ] ; then
@@ -590,10 +631,59 @@
                                log "STATUS" " "
                        fi
                done
+               
+                # Post status, gracefully exit here
+                exit 0;
+
+       elif [ "$1" = "power-stats" ] ; then
+               if checkCmd "udevadm"; then
+                   for SUPPLY_TYPE in /sys/class/power_supply/* ; do
+                       log "STATUS" "Power Supply details for $SUPPLY_TYPE"
+                       log "STATUS" ""
+                       udevadm info -q all $SUPPLY_TYPE;
+                   done
+               else
+                   log "VERBOSE" "No udevadm available. Using hardcoded paths";
+                   for THISFILE in $POWER_SYSFS $BATT_DETAILS; do
+                       if [ -e "$THISFILE" ] ; then
+                               log "STATUS" "$THISFILE:"
+                               if [ -r "$THISFILE" ] ; then
+                                       cat "$THISFILE" | sed "s/^/   /"
+                               else
+                                       log "STATUS" "   Not accessible, 
permission denied - $0 needs to be run as root."
+                               fi
+                               log "STATUS" " "
+                       fi
+                   done
+               fi
 
                 # Post status, gracefully exit here
                 exit 0;
 
+       elif [ "$1" = "power-events" ] ; then
+               if checkCmd "udevadm"; then
+                   log "STATUS" "Running Laptop Mode Tools in event tracing 
mode. Press ^C to interrupt"
+                   udevadm monitor --udev --property --kernel 
--subsystem-match=power_supply --subsystem-match=usb
+               else
+                   log "ERR" "No udevadm available to run trace"
+                   exit 1;
+               fi
+
+                # Post status, gracefully exit here
+                exit 0;
+       elif [ "$1" = "help" -o "$1" = "--help" -o "$1" = "-h" ]; then
+           log "MSG" "****************************"
+           log "MSG" "Following user commands are understood"
+           log "MSG" "status       :   Display a Laptop Mode Tools power 
savings status"
+           log "MSG" "power-stats  :   Display the power statistics on the 
machine"
+           log "MSG" "power-events :   Trap power related events on the 
machine"
+           log "MSG" "help         :   Display this help message (--help, -h)"
+           log "MSG" "version      :   Display program version (--version, -v)"
+           log "MSG" "****************************"
+           exit 0;
+       elif [ "$1" = "version" -o "$1" = "--version" -o "$1" = "-v" ]; then
+           log "MSG" "Laptop Mode Tools $LMTVERSION"
+           exit 0;
        elif [ "$1" != "readconfig" -a "$1" != "defaults" ] ; then
 
                
#############################################################################
@@ -615,22 +705,6 @@
                # Stop exporting everything -- what we do from here is private.
                set +a
 
-               if [ "$1" = "--version" ] ; then
-                       log "MSG" "Laptop Mode Tools $LMTVERSION"
-                       exit 0
-               fi
-
-               if [ ! -e /proc/sys/vm/laptop_mode ] ; then
-                       log "ERR" "Kernel does not have support for laptop 
mode. Please apply the laptop mode"
-                       log "ERR" "patch or install a newer kernel."
-                       exit 1
-               fi
-
-               if [ ! -w /proc/sys/vm/laptop_mode ] ; then
-                       log "ERR" "You do not have enough privileges to enable 
laptop_mode."
-                       exit 1
-               fi
-
                while [ "$1" != "" ] ; do
                        case "$1" in
                                init) INIT=1 ;;
@@ -653,6 +727,17 @@
                        esac
                        shift
                done
+
+               if [ ! -e /proc/sys/vm/laptop_mode ] ; then
+                       log "ERR" "Kernel does not have support for laptop 
mode. Please apply the laptop mode"
+                       log "ERR" "patch or install a newer kernel."
+                       exit 1
+               fi
+
+               if [ ! -w /proc/sys/vm/laptop_mode ] ; then
+                       log "ERR" "You do not have enough privileges to enable 
laptop_mode."
+                       exit 1
+               fi
        fi
 }
 
@@ -671,7 +756,7 @@
                                
PREV_ENOUGH_CHARGE_TO_PREVENT_HIBERNATION=$ENOUGH_CHARGE_TO_PREVENT_HIBERNATION
 
                                log "VERBOSE" "Checking levels for $BATT."
-                               PRESENT=$(cat $BATT/present)
+                               PRESENT=$(cat $BATT/present 2> /dev/null || 
echo "0")
                                log "VERBOSE" "Present: $PRESENT."
 
                                # Only do if the battery is present
@@ -993,8 +1078,8 @@
                                log "VERBOSE" 'Setting action to "start" 
because the lid is closed (says /proc/acpi/button/lid/*/state).'
                                ACTIVATE=1
                        fi
-               elif ( which hal-find-by-property >/dev/null ) ; then
-                       HAL_LID_BUTTON=$($HAL_FIND_BY_PROPERTY --key 
"button.type" --string "lid")
+               elif checkCmd "hal-find-by-property" ; then
+                       HAL_LID_BUTTON=$(hal-find-by-property --key 
"button.type" --string "lid")
                        if [ "$HAL_LID_BUTTON" != "" ] ; then
                                HAL_LID_BUTTON_STATE=$(hal-get-property --udi 
$(hal-find-by-property --key "button.type" --string "lid") --key 
"button.state.value")
                                if [ "$HAL_LID_BUTTON_STATE" = "true" ] ; then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/usr/share/laptop-mode-tools/module-helpers/lm-polling-daemon
 
new/laptop-mode-tools-1.73.1/usr/share/laptop-mode-tools/module-helpers/lm-polling-daemon
--- 
old/laptop-mode-tools-1.72.2/usr/share/laptop-mode-tools/module-helpers/lm-polling-daemon
   2018-02-03 17:08:43.000000000 +0100
+++ 
new/laptop-mode-tools-1.73.1/usr/share/laptop-mode-tools/module-helpers/lm-polling-daemon
   2020-01-11 12:47:05.000000000 +0100
@@ -10,6 +10,11 @@
 # risks data loss).
 INTERVAL=150
 
+if [ -d /run/systemd/system ]; then
+       echo "systemd detected. Battery polling is supported through lmt-poll 
timer";
+       return 0;
+fi
+
 while :; do
        sleep $INTERVAL
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/usr/share/laptop-mode-tools/modules/cpufreq 
new/laptop-mode-tools-1.73.1/usr/share/laptop-mode-tools/modules/cpufreq
--- old/laptop-mode-tools-1.72.2/usr/share/laptop-mode-tools/modules/cpufreq    
2018-02-03 17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/usr/share/laptop-mode-tools/modules/cpufreq    
2020-01-11 12:47:05.000000000 +0100
@@ -24,6 +24,34 @@
        cat "$1" | tr ' ' '\n' | sort -n | awk -v RS="" '{n=split($0,a); print 
a[int((n+1)/2)]}'
 }
 
+# get_real_cpu_governor trys to correct the special governor "auto":
+#
+# 1. use ondemand on CPUs that are not using intel_pstate driver.
+# 2. on CPUs that are using intel_psatte driver:
+#       - use powersave if the machine is on battery
+#    - otherwise use performance.
+#
+# $1 = the CPU to be set governor on.
+# $2 = the governor to use.
+get_real_cpu_governor() {
+       local CPU=$1
+       local GOVERNOR=$2
+       if [ x$GOVERNOR = xauto ]; then
+               if [ -f "$CPU/cpufreq/scaling_driver" ] &&
+               [ "$(cat $CPU/cpufreq/scaling_driver)" = "intel_pstate" ]
+               then
+                       if [ $ON_AC -eq 1 ] ; then
+                               GOVERNOR=performance
+                       else
+                               GOVERNOR=powersave
+                       fi
+               else
+                       GOVERNOR=ondemand
+               fi
+       fi
+       echo $GOVERNOR
+}
+
 
 if [ x$CONTROL_CPU_FREQUENCY = x1 ] || [ x$ENABLE_AUTO_MODULES = x1 -a 
x$CONTROL_CPU_FREQUENCY = xauto ]; then
        if [ $ON_AC -eq 1 ] ; then
@@ -45,11 +73,7 @@
                CPU_IGNORE_NICE_LOAD="$BATT_CPU_IGNORE_NICE_LOAD"
        fi
        for THISCPU in /sys/devices/system/cpu/* ; do
-               if [ -f "$THISCPU/cpufreq/scaling_driver" ] &&
-                  [ "$(cat $THISCPU/cpufreq/scaling_driver)" = "intel_pstate" ]
-               then
-                       continue # intel_pstate is a bit different - so it 
should be handled by its own module
-               fi
+               CPU_GOVERNOR="$(get_real_cpu_governor $THISCPU $CPU_GOVERNOR)"
                if [ -e $THISCPU/cpufreq/cpuinfo_min_freq ]; then
                        THIS_CPU_MAXFREQ="$CPU_MAXFREQ"
                        THIS_CPU_MINFREQ="$CPU_MINFREQ"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/usr/share/laptop-mode-tools/modules/hal-polling 
new/laptop-mode-tools-1.73.1/usr/share/laptop-mode-tools/modules/hal-polling
--- 
old/laptop-mode-tools-1.72.2/usr/share/laptop-mode-tools/modules/hal-polling    
    2018-02-03 17:08:43.000000000 +0100
+++ 
new/laptop-mode-tools-1.73.1/usr/share/laptop-mode-tools/modules/hal-polling    
    2020-01-11 12:47:05.000000000 +0100
@@ -34,7 +34,8 @@
 
        for DEV in $HAL_POLLING_DEVICES ; do
                # Thanks to the kernel's new in-kernel block dev polling.
-               device=`readlink $DEV`;
+               device=`realpath $DEV | awk -v FS="/" '{print $NF}'`;
+
                if [ -f /sys/block/$device/events_poll_msecs ]; then
                        if [ x$DISABLE_HAL_POLLING = x1 ]; then
                                echo 0 > /sys/block/$device/events_poll_msecs;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/laptop-mode-tools-1.72.2/usr/share/laptop-mode-tools/modules/runtime-pm 
new/laptop-mode-tools-1.73.1/usr/share/laptop-mode-tools/modules/runtime-pm
--- old/laptop-mode-tools-1.72.2/usr/share/laptop-mode-tools/modules/runtime-pm 
2018-02-03 17:08:43.000000000 +0100
+++ new/laptop-mode-tools-1.73.1/usr/share/laptop-mode-tools/modules/runtime-pm 
2020-01-11 12:47:05.000000000 +0100
@@ -8,31 +8,17 @@
        device=$1
        list=$2
 
-       if ! idvendor=$(cat $device/idVendor 2>/dev/null || cat $device/vendor 
2>/dev/null) || \
-          ! idproduct=$(cat $device/idProduct 2>/dev/null || cat 
$device/device 2>/dev/null); then
+       if ! { read -r idvendor < $device/idVendor || read -r idvendor < 
$device/vendor; } 2>/dev/null || \
+          ! { read -r idproduct < $device/idProduct || read -r idproduct < 
$device/device; } 2>/dev/null; then
                return 1
        fi
        idvendor=${idvendor#0x}
        idproduct=${idproduct#0x}
 
        for devid in $list; do
-           case $devid in
-                   *:*) ;;
-                   *) continue;;
-               esac
-
-               vendor=${devid%:*}
-               product=${devid#*:}
-
-               case $idvendor in
-                   ${vendor})
-                       case $idproduct in
-                           ${product}) return 0;;
-                           *) ;;
-                       esac
-                       ;;
-                   *);;
-               esac
+               if [ "$devid" = "$idvendor:$idproduct" ]; then
+                       return 0
+               fi
        done
        return 1
 }
@@ -40,19 +26,19 @@
 # Check whether the driver type is blacklisted
 listed_by_type() {
        device=$1
-       device_base=`basename $device`
+       device_base=${device##*/}
        list=$2
 
-       if ! uevent_data=$(cat $device/uevent 2>/dev/null); then
-               return 1
-       fi
+       [ -r $device/uevent ] || return 1
 
-       for driver_type in $list; do
-               case "$uevent_data" in
-                       *DRIVER=$driver_type*) return 0 ;;
-                       *DEVTYPE=$driver_type*) return 0 ;;
-               esac
-       done
+       while read -r uevent_data; do
+               for driver_type in $list; do
+                       case "$uevent_data" in
+                               DRIVER=$driver_type) return 0 ;;
+                               DEVTYPE=$driver_type) return 0 ;;
+                       esac
+               done
+       done < $device/uevent
 
        # Check child devices as well.  The actual driver type is
        # listed in a child device, not the top-level device.
@@ -82,15 +68,18 @@
        return 0
 }
 
-echo_to_file_do() {
-    echo "$1" > "$2"
-}
-echo_to_file() {
-    echo_to_file_do "$1" "$2" 2>&1 | \
-        while read REPLY; do
-            log "VERBOSE" "$REPLY"
-        done
-}
+if $LM_VERBOSE; then
+       echo_to_file() {
+               echo "$1" 2>&1 >"$2" |
+                       while read REPLY; do
+                               log "VERBOSE" "$REPLY"
+                       done
+       }
+else
+       echo_to_file() {
+               echo "$1" > "$2" 2>/dev/null
+       }
+fi
 
 if [ x$CONTROL_RUNTIME_AUTOSUSPEND = x1 ] || [ x$ENABLE_AUTO_MODULES = x1 -a 
x$CONTROL_RUNTIME_AUTOSUSPEND = xauto ]; then
        if [ $ON_AC -eq 1 ]; then
@@ -164,6 +153,23 @@
                if [ "$DEVICE_LIST" != "" ]; then
                        for runtime_device in $DEVICE_LIST;
                        do
+
+                               USE_DEVICE=0
+                               if [ x$AUTOSUSPEND_USE_WHITELIST = x1 ]; then
+                                       if whitelisted $runtime_device; then
+                                               USE_DEVICE=1
+                                       else
+                                               log "VERBOSE" "Device 
$runtime_device not whitelisted, skipping auto suspend."
+                                       fi
+                               else
+                                       if ! blacklisted $runtime_device; then
+                                               USE_DEVICE=1
+                                       else
+                                               log "Device $runtime_device is 
blacklisted, skipping auto suspend."
+                                       fi
+                               fi
+                               [ x$USE_DEVICE = x1 ] || continue
+
                                if [ -f 
"$runtime_device"/power/autosuspend_delay_ms ]; then
                                        echo_to_file $AUTOSUSPEND_TIMEOUT 
"$runtime_device"/power/autosuspend_delay_ms
                                        log "VERBOSE" "Disabling auto suspend 
mode for device $runtime_device."


Reply via email to