Message ID | 20170323113913.26974-2-vfeenstr@redhat.com |
---|---|
State | New |
Headers | show |
Ping > On Mar 23, 2017, at 12:39 PM, Vinzenz 'evilissimo' Feenstra <vfeenstr@redhat.com> wrote: > > From: Vinzenz Feenstra <vfeenstr@redhat.com> > > Adds a new command `guest-get-timezone` reporting the currently > configured timezone on the system. The information on what timezone is > currently is configured is useful in case of Windows VMs where the > offset of the hardware clock is required to have the same offset. This > can be used for management systems like `oVirt` to detect the timezone > difference and warn administrators of the misconfiguration. > > Signed-off-by: Vinzenz Feenstra <vfeenstr@redhat.com> > --- > qga/commands.c | 29 +++++++++++++++++++++++++++++ > qga/qapi-schema.json | 26 ++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/qga/commands.c b/qga/commands.c > index 4d92946..3b5789c 100644 > --- a/qga/commands.c > +++ b/qga/commands.c > @@ -499,3 +499,32 @@ int ga_parse_whence(GuestFileWhence *whence, Error **errp) > error_setg(errp, "invalid whence code %"PRId64, whence->u.value); > return -1; > } > + > +GuestTimezone *qmp_guest_get_timezone(Error **errp) > +{ > + GuestTimezone *info = g_new0(GuestTimezone, 1); > + GTimeZone *tz = g_time_zone_new_local(); > + if (tz == NULL) { > + error_setg(errp, QERR_QGA_COMMAND_FAILED, > + "Couldn't retrieve local timezone"); > + goto error; > + } > + > + gint64 now = g_get_real_time() / G_USEC_PER_SEC; > + gint32 intv = g_time_zone_find_interval(tz, G_TIME_TYPE_UNIVERSAL, now); > + info->offset = g_time_zone_get_offset(tz, intv); > + gchar const *name = g_time_zone_get_abbreviation(tz, intv); > + if (name != NULL) { > + info->has_zone = true; > + info->zone = g_strdup(name); > + } > + g_time_zone_unref(tz); > + > + return info; > + > +error: > + g_time_zone_unref(tz); > + g_free(info); > + return NULL; > +} > + > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json > index a02dbf2..5183ea2 100644 > --- a/qga/qapi-schema.json > +++ b/qga/qapi-schema.json > @@ -1042,3 +1042,29 @@ > 'data': { 'path': 'str', '*arg': ['str'], '*env': ['str'], > '*input-data': 'str', '*capture-output': 'bool' }, > 'returns': 'GuestExec' } > + > + > +## > +# @GuestTimezone: > +# > +# @zone: Timezone name > +# @offset: Offset to UTC in seconds, negative numbers for time zones west of > +# GMT, positive numbers for east > +# > +# Since: 2.10 > +## > +{ 'struct': 'GuestTimezone', > + 'data': { '*zone': 'str', 'offset': 'int' } } > + > + > +## > +# @guest-get-timezone: > +# > +# Retrieves the timezone information from the guest. > +# > +# Returns: A GuestTimezone dictionary. > +# > +# Since: 2.10 > +## > +{ 'command': 'guest-get-timezone', > + 'returns': 'GuestTimezone' } > -- > 2.9.3 > -- Vinzenz Feenstra Senior Software Developer Red Hat Czech
I have tested the patch on Windows 2012 R2 Reviewed-by: Sameeh Jubran <sameeh@daynix.com> Tested-by: Sameeh Jubran <sameeh@daynix.com> On Thu, Mar 23, 2017 at 2:39 PM, Vinzenz 'evilissimo' Feenstra < vfeenstr@redhat.com> wrote: > From: Vinzenz Feenstra <vfeenstr@redhat.com> > > Adds a new command `guest-get-timezone` reporting the currently > configured timezone on the system. The information on what timezone is > currently is configured is useful in case of Windows VMs where the > offset of the hardware clock is required to have the same offset. This > can be used for management systems like `oVirt` to detect the timezone > difference and warn administrators of the misconfiguration. > > Signed-off-by: Vinzenz Feenstra <vfeenstr@redhat.com> > --- > qga/commands.c | 29 +++++++++++++++++++++++++++++ > qga/qapi-schema.json | 26 ++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/qga/commands.c b/qga/commands.c > index 4d92946..3b5789c 100644 > --- a/qga/commands.c > +++ b/qga/commands.c > @@ -499,3 +499,32 @@ int ga_parse_whence(GuestFileWhence *whence, Error > **errp) > error_setg(errp, "invalid whence code %"PRId64, whence->u.value); > return -1; > } > + > +GuestTimezone *qmp_guest_get_timezone(Error **errp) > +{ > + GuestTimezone *info = g_new0(GuestTimezone, 1); > + GTimeZone *tz = g_time_zone_new_local(); > + if (tz == NULL) { > + error_setg(errp, QERR_QGA_COMMAND_FAILED, > + "Couldn't retrieve local timezone"); > + goto error; > + } > + > + gint64 now = g_get_real_time() / G_USEC_PER_SEC; > + gint32 intv = g_time_zone_find_interval(tz, G_TIME_TYPE_UNIVERSAL, > now); > + info->offset = g_time_zone_get_offset(tz, intv); > + gchar const *name = g_time_zone_get_abbreviation(tz, intv); > + if (name != NULL) { > + info->has_zone = true; > + info->zone = g_strdup(name); > + } > + g_time_zone_unref(tz); > + > + return info; > + > +error: > + g_time_zone_unref(tz); > + g_free(info); > + return NULL; > +} > + > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json > index a02dbf2..5183ea2 100644 > --- a/qga/qapi-schema.json > +++ b/qga/qapi-schema.json > @@ -1042,3 +1042,29 @@ > 'data': { 'path': 'str', '*arg': ['str'], '*env': ['str'], > '*input-data': 'str', '*capture-output': 'bool' }, > 'returns': 'GuestExec' } > + > + > +## > +# @GuestTimezone: > +# > +# @zone: Timezone name > +# @offset: Offset to UTC in seconds, negative numbers for time zones > west of > +# GMT, positive numbers for east > +# > +# Since: 2.10 > +## > +{ 'struct': 'GuestTimezone', > + 'data': { '*zone': 'str', 'offset': 'int' } } > + > + > +## > +# @guest-get-timezone: > +# > +# Retrieves the timezone information from the guest. > +# > +# Returns: A GuestTimezone dictionary. > +# > +# Since: 2.10 > +## > +{ 'command': 'guest-get-timezone', > + 'returns': 'GuestTimezone' } > -- > 2.9.3 > >
PING? > On Apr 4, 2017, at 11:42 AM, Sameeh Jubran <sameeh@daynix.com> wrote: > > I have tested the patch on Windows 2012 R2 > > Reviewed-by: Sameeh Jubran <sameeh@daynix.com <mailto:sameeh@daynix.com>> > Tested-by: Sameeh Jubran <sameeh@daynix.com <mailto:sameeh@daynix.com>> > > On Thu, Mar 23, 2017 at 2:39 PM, Vinzenz 'evilissimo' Feenstra <vfeenstr@redhat.com <mailto:vfeenstr@redhat.com>> wrote: > From: Vinzenz Feenstra <vfeenstr@redhat.com <mailto:vfeenstr@redhat.com>> > > Adds a new command `guest-get-timezone` reporting the currently > configured timezone on the system. The information on what timezone is > currently is configured is useful in case of Windows VMs where the > offset of the hardware clock is required to have the same offset. This > can be used for management systems like `oVirt` to detect the timezone > difference and warn administrators of the misconfiguration. > > Signed-off-by: Vinzenz Feenstra <vfeenstr@redhat.com <mailto:vfeenstr@redhat.com>> > --- > qga/commands.c | 29 +++++++++++++++++++++++++++++ > qga/qapi-schema.json | 26 ++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/qga/commands.c b/qga/commands.c > index 4d92946..3b5789c 100644 > --- a/qga/commands.c > +++ b/qga/commands.c > @@ -499,3 +499,32 @@ int ga_parse_whence(GuestFileWhence *whence, Error **errp) > error_setg(errp, "invalid whence code %"PRId64, whence->u.value); > return -1; > } > + > +GuestTimezone *qmp_guest_get_timezone(Error **errp) > +{ > + GuestTimezone *info = g_new0(GuestTimezone, 1); > + GTimeZone *tz = g_time_zone_new_local(); > + if (tz == NULL) { > + error_setg(errp, QERR_QGA_COMMAND_FAILED, > + "Couldn't retrieve local timezone"); > + goto error; > + } > + > + gint64 now = g_get_real_time() / G_USEC_PER_SEC; > + gint32 intv = g_time_zone_find_interval(tz, G_TIME_TYPE_UNIVERSAL, now); > + info->offset = g_time_zone_get_offset(tz, intv); > + gchar const *name = g_time_zone_get_abbreviation(tz, intv); > + if (name != NULL) { > + info->has_zone = true; > + info->zone = g_strdup(name); > + } > + g_time_zone_unref(tz); > + > + return info; > + > +error: > + g_time_zone_unref(tz); > + g_free(info); > + return NULL; > +} > + > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json > index a02dbf2..5183ea2 100644 > --- a/qga/qapi-schema.json > +++ b/qga/qapi-schema.json > @@ -1042,3 +1042,29 @@ > 'data': { 'path': 'str', '*arg': ['str'], '*env': ['str'], > '*input-data': 'str', '*capture-output': 'bool' }, > 'returns': 'GuestExec' } > + > + > +## > +# @GuestTimezone: > +# > +# @zone: Timezone name > +# @offset: Offset to UTC in seconds, negative numbers for time zones west of > +# GMT, positive numbers for east > +# > +# Since: 2.10 > +## > +{ 'struct': 'GuestTimezone', > + 'data': { '*zone': 'str', 'offset': 'int' } } > + > + > +## > +# @guest-get-timezone: > +# > +# Retrieves the timezone information from the guest. > +# > +# Returns: A GuestTimezone dictionary. > +# > +# Since: 2.10 > +## > +{ 'command': 'guest-get-timezone', > + 'returns': 'GuestTimezone' } > -- > 2.9.3 > > > > > -- > Respectfully, > Sameeh Jubran > Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a> > Software Engineer @ Daynix <http://www.daynix.com/>. -- Vinzenz Feenstra Senior Software Developer Red Hat Czech
Quoting Vinzenz 'evilissimo' Feenstra (2017-03-23 06:39:13) > From: Vinzenz Feenstra <vfeenstr@redhat.com> > > Adds a new command `guest-get-timezone` reporting the currently > configured timezone on the system. The information on what timezone is > currently is configured is useful in case of Windows VMs where the > offset of the hardware clock is required to have the same offset. This > can be used for management systems like `oVirt` to detect the timezone > difference and warn administrators of the misconfiguration. > > Signed-off-by: Vinzenz Feenstra <vfeenstr@redhat.com> > --- > qga/commands.c | 29 +++++++++++++++++++++++++++++ > qga/qapi-schema.json | 26 ++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/qga/commands.c b/qga/commands.c > index 4d92946..3b5789c 100644 > --- a/qga/commands.c > +++ b/qga/commands.c > @@ -499,3 +499,32 @@ int ga_parse_whence(GuestFileWhence *whence, Error **errp) > error_setg(errp, "invalid whence code %"PRId64, whence->u.value); > return -1; > } > + > +GuestTimezone *qmp_guest_get_timezone(Error **errp) > +{ > + GuestTimezone *info = g_new0(GuestTimezone, 1); > + GTimeZone *tz = g_time_zone_new_local(); > + if (tz == NULL) { > + error_setg(errp, QERR_QGA_COMMAND_FAILED, > + "Couldn't retrieve local timezone"); > + goto error; > + } > + > + gint64 now = g_get_real_time() / G_USEC_PER_SEC; > + gint32 intv = g_time_zone_find_interval(tz, G_TIME_TYPE_UNIVERSAL, now); > + info->offset = g_time_zone_get_offset(tz, intv); > + gchar const *name = g_time_zone_get_abbreviation(tz, intv); Declarations should all go at the start of the block. Since it's a trivial change and I was late in reviewing this I was planning on applying and just fixing it up in my tree, but I just noticed a bigger issue: Our minimum glib version is 2.22 for non-mingw builds, and 2.30 for mingw, whereas the required versions for these functions are: g_time_zone_new_local 2.26 g_get_real_time 2.28 g_time_zone_find_interval 2.26 g_time_zone_get_offset 2.26 g_time_zone_get_abbreviation 2.26 g_time_zone_unref 2.26 So assuming there's no simple alternative implementations for these, I think what we need is a configure probe for glib >= 2.28 in order to enable this interface for non-mingw builds, and to stub it out with QERR_UNSUPPORTED errors otherwise. > + if (name != NULL) { > + info->has_zone = true; > + info->zone = g_strdup(name); > + } > + g_time_zone_unref(tz); > + > + return info; > + > +error: > + g_time_zone_unref(tz); Harmless, but since "error" label is only reachable when tz == NULL I think you can drop this. > + g_free(info); > + return NULL; > +} > + > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json > index a02dbf2..5183ea2 100644 > --- a/qga/qapi-schema.json > +++ b/qga/qapi-schema.json > @@ -1042,3 +1042,29 @@ > 'data': { 'path': 'str', '*arg': ['str'], '*env': ['str'], > '*input-data': 'str', '*capture-output': 'bool' }, > 'returns': 'GuestExec' } > + > + > +## > +# @GuestTimezone: > +# > +# @zone: Timezone name > +# @offset: Offset to UTC in seconds, negative numbers for time zones west of > +# GMT, positive numbers for east > +# > +# Since: 2.10 > +## > +{ 'struct': 'GuestTimezone', > + 'data': { '*zone': 'str', 'offset': 'int' } } > + > + > +## > +# @guest-get-timezone: > +# > +# Retrieves the timezone information from the guest. > +# > +# Returns: A GuestTimezone dictionary. > +# > +# Since: 2.10 > +## > +{ 'command': 'guest-get-timezone', > + 'returns': 'GuestTimezone' } > -- > 2.9.3 > >
diff --git a/qga/commands.c b/qga/commands.c index 4d92946..3b5789c 100644 --- a/qga/commands.c +++ b/qga/commands.c @@ -499,3 +499,32 @@ int ga_parse_whence(GuestFileWhence *whence, Error **errp) error_setg(errp, "invalid whence code %"PRId64, whence->u.value); return -1; } + +GuestTimezone *qmp_guest_get_timezone(Error **errp) +{ + GuestTimezone *info = g_new0(GuestTimezone, 1); + GTimeZone *tz = g_time_zone_new_local(); + if (tz == NULL) { + error_setg(errp, QERR_QGA_COMMAND_FAILED, + "Couldn't retrieve local timezone"); + goto error; + } + + gint64 now = g_get_real_time() / G_USEC_PER_SEC; + gint32 intv = g_time_zone_find_interval(tz, G_TIME_TYPE_UNIVERSAL, now); + info->offset = g_time_zone_get_offset(tz, intv); + gchar const *name = g_time_zone_get_abbreviation(tz, intv); + if (name != NULL) { + info->has_zone = true; + info->zone = g_strdup(name); + } + g_time_zone_unref(tz); + + return info; + +error: + g_time_zone_unref(tz); + g_free(info); + return NULL; +} + diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json index a02dbf2..5183ea2 100644 --- a/qga/qapi-schema.json +++ b/qga/qapi-schema.json @@ -1042,3 +1042,29 @@ 'data': { 'path': 'str', '*arg': ['str'], '*env': ['str'], '*input-data': 'str', '*capture-output': 'bool' }, 'returns': 'GuestExec' } + + +## +# @GuestTimezone: +# +# @zone: Timezone name +# @offset: Offset to UTC in seconds, negative numbers for time zones west of +# GMT, positive numbers for east +# +# Since: 2.10 +## +{ 'struct': 'GuestTimezone', + 'data': { '*zone': 'str', 'offset': 'int' } } + + +## +# @guest-get-timezone: +# +# Retrieves the timezone information from the guest. +# +# Returns: A GuestTimezone dictionary. +# +# Since: 2.10 +## +{ 'command': 'guest-get-timezone', + 'returns': 'GuestTimezone' }