Syslog: introduce interfaces for e-mail sending

Interfaces to configure multiple e-mail destinations, each with an
individual threshold for the priority level of the syslog messages.

The idea is to provide facilities to implement a minimally useful subset
of Redfish Event Destinations for e-mail with ability to add additional
properties if the need arises.

D-Bus object path for each destination contains 8 digits of a mailto
hash, so Level can be changed later but for another URI a new object
needs to be created.

Current set of properties is made on assumption that organisation has an
SMTP smarthost (that BMC is allowed to use without authentication) which
takes care of dispatching messages; rsyslog's ommail module is
considered for the initial implementation.

Example session:

root@qemuarm:~# busctl tree xyz.openbmc_project.Syslog.Config
└─/xyz
  └─/xyz/openbmc_project
    └─/xyz/openbmc_project/logging
      └─/xyz/openbmc_project/logging/config
        ├─/xyz/openbmc_project/logging/config/mail
        │ ├─/xyz/openbmc_project/logging/config/mail/2dc1e699
        │ ├─/xyz/openbmc_project/logging/config/mail/5d43d672
        │ ├─/xyz/openbmc_project/logging/config/mail/b4dc9055
        │ ├─/xyz/openbmc_project/logging/config/mail/d5d4db03
        │ └─/xyz/openbmc_project/logging/config/mail/e0974603
        └─/xyz/openbmc_project/logging/config/remote
root@qemuarm:~# busctl introspect xyz.openbmc_project.Syslog.Config /xyz/openbmc_project/logging/config/mail
NAME                                                       TYPE      SIGNATURE RESULT/VALUE       FLAGS
org.freedesktop.DBus.Introspectable                        interface -         -                  -
.Introspect                                                method    -         s                  -
org.freedesktop.DBus.Peer                                  interface -         -                  -
.GetMachineId                                              method    -         s                  -
.Ping                                                      method    -         -                  -
org.freedesktop.DBus.Properties                            interface -         -                  -
.Get                                                       method    ss        v                  -
.GetAll                                                    method    s         a{sv}              -
.Set                                                       method    ssv       -                  -
.PropertiesChanged                                         signal    sa{sv}as  -                  -
xyz.openbmc_project.Collection.DeleteAll                   interface -         -                  -
.DeleteAll                                                 method    -         -                  -
xyz.openbmc_project.Logging.Syslog.Destination.Mail        interface -         -                  -
.From                                                      property  s         "from@some.domain" emits-change writable
xyz.openbmc_project.Logging.Syslog.Destination.Mail.Create interface -         -                  -
.Create                                                    method    ss        o                  -
xyz.openbmc_project.Network.Client                         interface -         -                  -
.Address                                                   property  s         "smarthost.lan"    emits-change writable
.Port                                                      property  q         25                 emits-change writable
xyz.openbmc_project.Object.Enable                          interface -         -                  -
.Enabled                                                   property  b         true               emits-change writable
root@qemuarm:~# busctl introspect xyz.openbmc_project.Syslog.Config /xyz/openbmc_project/logging/config/mail/d5d4db03
NAME                                                      TYPE      SIGNATURE RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable                       interface -         -                                        -
.Introspect                                               method    -         s                                        -
org.freedesktop.DBus.Peer                                 interface -         -                                        -
.GetMachineId                                             method    -         s                                        -
.Ping                                                     method    -         -                                        -
org.freedesktop.DBus.Properties                           interface -         -                                        -
.Get                                                      method    ss        v                                        -
.GetAll                                                   method    s         a{sv}                                    -
.Set                                                      method    ssv       -                                        -
.PropertiesChanged                                        signal    sa{sv}as  -                                        -
xyz.openbmc_project.Logging.Syslog.Destination.Mail.Entry interface -         -                                        -
.Level                                                    property  s         "xyz.openbmc_project.Logging.Entry.Leve… emits-change writable
.Mailto                                                   property  s         "mailto://someone2@otherdomain.test"     emits-change
xyz.openbmc_project.Object.Delete                         interface -         -                                        -
.Delete                                                   method    -         -                                        -

Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Change-Id: Ic78fc2bf3608c1dd7ec0c962412e69062dde48d4
diff --git a/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create/meson.build b/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create/meson.build
new file mode 100644
index 0000000..b8be39b
--- /dev/null
+++ b/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create/meson.build
@@ -0,0 +1,14 @@
+# Generated file; do not modify.
+generated_sources += custom_target(
+    'xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create__cpp'.underscorify(),
+    input: [ '../../../../../../../../yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create.interface.yaml',  ],
+    output: [ 'server.cpp', 'server.hpp', 'client.hpp',  ],
+    command: [
+        sdbuspp_gen_meson_prog, '--command', 'cpp',
+        '--output', meson.current_build_dir(),
+        '--tool', sdbusplusplus_prog,
+        '--directory', meson.current_source_dir() / '../../../../../../../../yaml',
+        'xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create',
+    ],
+)
+
diff --git a/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry/meson.build b/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry/meson.build
new file mode 100644
index 0000000..5af3dec
--- /dev/null
+++ b/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry/meson.build
@@ -0,0 +1,14 @@
+# Generated file; do not modify.
+generated_sources += custom_target(
+    'xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry__cpp'.underscorify(),
+    input: [ '../../../../../../../../yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry.interface.yaml',  ],
+    output: [ 'server.cpp', 'server.hpp', 'client.hpp',  ],
+    command: [
+        sdbuspp_gen_meson_prog, '--command', 'cpp',
+        '--output', meson.current_build_dir(),
+        '--tool', sdbusplusplus_prog,
+        '--directory', meson.current_source_dir() / '../../../../../../../../yaml',
+        'xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry',
+    ],
+)
+
diff --git a/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/meson.build b/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/meson.build
new file mode 100644
index 0000000..5138e4f
--- /dev/null
+++ b/gen/xyz/openbmc_project/Logging/Syslog/Destination/Mail/meson.build
@@ -0,0 +1,42 @@
+# Generated file; do not modify.
+generated_sources += custom_target(
+    'xyz/openbmc_project/Logging/Syslog/Destination/Mail__cpp'.underscorify(),
+    input: [ '../../../../../../../yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail.interface.yaml',  ],
+    output: [ 'server.cpp', 'server.hpp', 'client.hpp',  ],
+    command: [
+        sdbuspp_gen_meson_prog, '--command', 'cpp',
+        '--output', meson.current_build_dir(),
+        '--tool', sdbusplusplus_prog,
+        '--directory', meson.current_source_dir() / '../../../../../../../yaml',
+        'xyz/openbmc_project/Logging/Syslog/Destination/Mail',
+    ],
+)
+
+subdir('Create')
+generated_others += custom_target(
+    'xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create__markdown'.underscorify(),
+    input: [ '../../../../../../../yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create.interface.yaml',  ],
+    output: [ 'Create.md' ],
+    command: [
+        sdbuspp_gen_meson_prog, '--command', 'markdown',
+        '--output', meson.current_build_dir(),
+        '--tool', sdbusplusplus_prog,
+        '--directory', meson.current_source_dir() / '../../../../../../../yaml',
+        'xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create',
+    ],
+)
+
+subdir('Entry')
+generated_others += custom_target(
+    'xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry__markdown'.underscorify(),
+    input: [ '../../../../../../../yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry.interface.yaml',  ],
+    output: [ 'Entry.md' ],
+    command: [
+        sdbuspp_gen_meson_prog, '--command', 'markdown',
+        '--output', meson.current_build_dir(),
+        '--tool', sdbusplusplus_prog,
+        '--directory', meson.current_source_dir() / '../../../../../../../yaml',
+        'xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry',
+    ],
+)
+
diff --git a/gen/xyz/openbmc_project/Logging/Syslog/Destination/meson.build b/gen/xyz/openbmc_project/Logging/Syslog/Destination/meson.build
new file mode 100644
index 0000000..9b23be3
--- /dev/null
+++ b/gen/xyz/openbmc_project/Logging/Syslog/Destination/meson.build
@@ -0,0 +1,15 @@
+# Generated file; do not modify.
+subdir('Mail')
+generated_others += custom_target(
+    'xyz/openbmc_project/Logging/Syslog/Destination/Mail__markdown'.underscorify(),
+    input: [ '../../../../../../yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail.interface.yaml',  ],
+    output: [ 'Mail.md' ],
+    command: [
+        sdbuspp_gen_meson_prog, '--command', 'markdown',
+        '--output', meson.current_build_dir(),
+        '--tool', sdbusplusplus_prog,
+        '--directory', meson.current_source_dir() / '../../../../../../yaml',
+        'xyz/openbmc_project/Logging/Syslog/Destination/Mail',
+    ],
+)
+
diff --git a/gen/xyz/openbmc_project/Logging/Syslog/meson.build b/gen/xyz/openbmc_project/Logging/Syslog/meson.build
new file mode 100644
index 0000000..e2a677b
--- /dev/null
+++ b/gen/xyz/openbmc_project/Logging/Syslog/meson.build
@@ -0,0 +1,2 @@
+# Generated file; do not modify.
+subdir('Destination')
diff --git a/gen/xyz/openbmc_project/Logging/meson.build b/gen/xyz/openbmc_project/Logging/meson.build
index d4affee..d01db9b 100644
--- a/gen/xyz/openbmc_project/Logging/meson.build
+++ b/gen/xyz/openbmc_project/Logging/meson.build
@@ -97,3 +97,4 @@
     ],
 )
 
+subdir('Syslog')
diff --git a/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail.interface.yaml b/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail.interface.yaml
new file mode 100644
index 0000000..e7ba1ab
--- /dev/null
+++ b/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail.interface.yaml
@@ -0,0 +1,8 @@
+description: >
+    Interface to control sending syslog messages via e-mail.
+
+properties:
+    - name: From
+      type: string
+      description: >
+          Specifies e-mail address from which mails would be sent.
diff --git a/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create.interface.yaml b/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create.interface.yaml
new file mode 100644
index 0000000..22e316f
--- /dev/null
+++ b/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Create.interface.yaml
@@ -0,0 +1,27 @@
+description: >
+    Interface to create new e-mail destinations for syslog.
+
+methods:
+    - name: Create
+      description: >
+          This method creates a new D-Bus object representing the destination
+          for which e-mails would be sent for all syslog messages with matching
+          or lower (meaning more important) level.
+      parameters:
+          - name: Mailto
+            type: string
+            description: >
+                Specifies the mailto:// URI (RFC6068) to send events to.
+          - name: Level
+            type: enum[xyz.openbmc_project.Logging.Entry.Level]
+            description: >
+                Specifies the maximum level for the log events to be sent.
+      returns:
+          - name: Path
+            type: object_path
+            description: >
+                The object path of the created
+                xyz.openbmc_project.Logging.Syslog.Destination.Mail.Entry.
+      errors:
+          - xyz.openbmc_project.Common.Error.InternalFailure
+          - xyz.openbmc_project.Common.Error.InvalidArgument
diff --git a/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry.interface.yaml b/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry.interface.yaml
new file mode 100644
index 0000000..ca8cde9
--- /dev/null
+++ b/yaml/xyz/openbmc_project/Logging/Syslog/Destination/Mail/Entry.interface.yaml
@@ -0,0 +1,17 @@
+description: >
+    Interface representing an e-mail destination for syslog messages.
+
+    The object which implements this interface must implement
+    xyz.openbmc_project.Object.Delete.
+
+properties:
+    - name: Mailto
+      type: string
+      flags:
+          - readonly
+      description: >
+          Specifies the mailto: URI (RFC6068) to send events to.
+    - name: Level
+      type: enum[xyz.openbmc_project.Logging.Entry.Level]
+      description: >
+          Specifies the maximum level for the log events to be sent.