[PATCH] virsysinfo: Parse OEM strings

Daniel P. Berrangé berrange at redhat.com
Wed Jun 3 11:22:16 UTC 2020


On Tue, Jun 02, 2020 at 03:11:25PM +0200, Michal Privoznik wrote:
> On 6/2/20 12:56 PM, Daniel P. Berrangé wrote:
> > On Tue, Jun 02, 2020 at 12:53:18PM +0200, Michal Privoznik wrote:
> > > Setting OEM strings for a domain was introduced in
> > > v4.1.0-rc1~315. However, any application that wanted to use them
> > > (e.g. to point to an URL where a config file is stored) had to
> > > 'dmidecode -u --oem-string N' (where N is index of the string).
> > > Well, we can expose them under our <sysinfo/> XML and if the
> > > domain is running Libvirt inside it can be obtained using
> > > virConnectGetSysinfo() API.
> > > 
> > > Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> > > ---
> > >   src/util/virsysinfo.c               | 60 ++++++++++++++++++++++++++++-
> > >   tests/sysinfodata/x86sysinfo.data   | 10 +++++
> > >   tests/sysinfodata/x86sysinfo.expect | 10 +++++
> > >   3 files changed, 79 insertions(+), 1 deletion(-)
> > 
> > > diff --git a/tests/sysinfodata/x86sysinfo.data b/tests/sysinfodata/x86sysinfo.data
> > > index 426261041d..5615e144fb 100644
> > > --- a/tests/sysinfodata/x86sysinfo.data
> > > +++ b/tests/sysinfodata/x86sysinfo.data
> > > @@ -81,3 +81,13 @@ Memory Device
> > >   	Serial Number: 29057112
> > >   	Asset Tag: 0839
> > >   	Part Number: IMSH2GS13A1F1C-10F
> > > +
> > > +OEM Strings
> > > +        String 1: Default string
> > > +        String 2: Default string
> > > +        String 3: MIAMI
> > > +        String 4: Default string
> > > +        String 5: FFFFFFFFFFFFF
> > > +        String 6: FFFFFFFFFFFFF
> > > +        String 7: FFFFFFFFFFFFF
> > > +        String 8: Default string
> > 
> > What does dmidecode do for escaping (if anything) if I set a string
> > value of
> > 
> >      "Ha ha ha try parsing\n        String 3: this correctly\n        String 4:then"
> 
> This is what I put into domain XML:
> 
>   <sysinfo type='smbios'>
>     <oemStrings>
>       <entry>Hello</entry>
>       <entry>World</entry>
>       <entry>Ha ha ha try parsing\n
>       String 3: this correctly\n
>       String 4:then</entry>
>       <entry>This is, more tricky value=escaped</entry>
>     </oemStrings>
>   </sysinfo>
> 
> This is how it appeared on the cmd line:
> 
> -smbios 'type=11,value=Hello,value=World,value=Ha ha ha try parsing\n
>       String 3: this correctly\n
>       String 4:then,value=This is,, more tricky value=escaped' \
> 
> 
> Now, inside the guest, plain dmidecode replaces \n with a dot:
> 
> # dmidecode -t 11
> Handle 0x0E00, DMI type 11, 5 bytes
> OEM Strings
>         String 1: Hello
>         String 2: World
>         String 3: Ha ha ha try parsing\n.      String 3: this correctly\n.
> String 4:then
>         String 4: This is, more tricky value=escaped
> 
> 
> 
> But if I tell it to not decode entries, then it displays the string
> correctly:
> 
> # dmidecode -u --oem-string 3
> Ha ha ha try parsing\n
>       String 3: this correctly\n
>       String 4:then
> 
> 
> So maybe we should use the latter instead? We could use 'dmidecode -u
> --oem-string count' to get the number of strings and then iterate through
> each one of them.

It is a bit tedious having to run dmidecode multiple times, especially
since there won't be any strings in most cases.

With the normal format, we can reliably extract each string, but some
chars might have been mangled. How about we keep your current code, but
if we see a "." in a string, then we run "dmidecode -u --oem-string N"
just for that particular string, in order to get the unmangled value.

That will mean we only run dmidecode once majority of cases.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list