classes-systemd: Add restart policy warning

Print a warning if a systemd service unit is detected without
a restart policy defined.  To inhibit:

INHIBIT_SYSTEMD_RESTART_POLICY_WARNING += "${UNIT}"

Change-Id: I27436276425d028d892c7c98736781e8577ad8eb
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/classes/obmc-phosphor-systemd.bbclass b/classes/obmc-phosphor-systemd.bbclass
index 3df5ee4..dba39d3 100644
--- a/classes/obmc-phosphor-systemd.bbclass
+++ b/classes/obmc-phosphor-systemd.bbclass
@@ -8,6 +8,11 @@
 #
 # Alternatively this class can just be inherited and
 # ${PN}.service will be added to the main package.
+#
+# Other variables:
+# INHIBIT_SYSTEMD_RESTART_POLICY_${unit}
+#    Inhibit the warning that is displayed if a service unit without a
+#    restart policy is detected.
 
 inherit obmc-phosphor-utils
 inherit systemd
@@ -15,16 +20,45 @@
 _INSTALL_SD_UNITS=""
 
 
+def systemd_is_service(unit):
+    return unit.endswith('.service')
+
+
+def systemd_is_template(unit):
+    return '@.' in unit
+
+
+def systemd_parse_unit(d, path):
+    import ConfigParser
+    parser = ConfigParser.SafeConfigParser()
+    parser.optionxform = str
+    parser.read('%s' % path)
+    return parser
+
+
 python() {
-    def add_sd_unit(d, unit, pkg):
+    def check_sd_unit(d, unit):
         searchpaths = d.getVar('FILESPATH', True)
         path = bb.utils.which(searchpaths, '%s' % unit)
         if not os.path.isfile(path):
             bb.fatal('Did not find unit file "%s"' % unit)
+
+        parser = systemd_parse_unit(d, path)
+        inhibit = listvar_to_list(d, 'INHIBIT_SYSTEMD_RESTART_POLICY_WARNING')
+        if systemd_is_service(unit) and \
+                not systemd_is_template(unit) and \
+                unit not in inhibit and \
+                not parser.has_option('Service', 'Restart'):
+            bb.warn('Systemd unit \'%s\' does not '
+                'have a restart policy defined.' % unit)
+
+
+    def add_sd_unit(d, unit, pkg):
         set_append(d, 'SRC_URI', 'file://%s' % unit)
         set_append(d, 'FILES_%s' % pkg, '%s/%s' \
             % (d.getVar('systemd_system_unitdir', True), unit))
-        set_append(d, '_INSTALL_SD_UNITS', '%s' % unit)
+        set_append(d, '_INSTALL_SD_UNITS', unit)
+
 
     pn = d.getVar('PN', True)
     if d.getVar('SYSTEMD_SERVICE_%s' % pn, True) is None:
@@ -32,6 +66,7 @@
 
     for pkg in listvar_to_list(d, 'SYSTEMD_PACKAGES'):
         for unit in listvar_to_list(d, 'SYSTEMD_SERVICE_%s' % pkg):
+            check_sd_unit(d, unit)
             add_sd_unit(d, unit, pkg)
 }