hi,

On Tue, Jun 16, 2020 at 04:45:34PM +0200, Thomas Lamprecht wrote:
> Am 6/16/20 um 3:36 PM schrieb Oguz Bektas:
> > optionally enabled.
> > 
> > adds the 'timezone' option to config, which takes a valid timezone (i.e.
> > Europe/Vienna) to set in the container.
> > 
> > if nothing is selected, then it will show as 'container managed' in
> > GUI, and nothing will be done.
> > 
> > if set to 'host', the /etc/localtime symlink from the host node will be
> > cached and set in the container rootfs.
> > 
> > Signed-off-by: Oguz Bektas <o.bek...@proxmox.com>
> > ---
> >  src/PVE/LXC/Config.pm     |  5 +++++
> >  src/PVE/LXC/Setup.pm      | 13 +++++++++++++
> >  src/PVE/LXC/Setup/Base.pm | 28 +++++++++++++++++++++++++---
> >  3 files changed, 43 insertions(+), 3 deletions(-)
> > 
> > diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm
> > index 8d1854a..0ebf517 100644
> > --- a/src/PVE/LXC/Config.pm
> > +++ b/src/PVE/LXC/Config.pm
> > @@ -444,6 +444,11 @@ my $confdesc = {
> >     type => 'string', format => 'address-list',
> >     description => "Sets DNS server IP address for a container. Create will 
> > automatically use the setting from the host if you neither set searchdomain 
> > nor nameserver.",
> >      },
> > +    timezone => {
> > +   optional => 1,
> > +   type => 'string', format => 'timezone',
> > +   description => "Time zone to use in the container. If option isn't set, 
> > then nothing will be done. Can be set to 'host' to match the host time 
> > zone, or an arbitrary time zone option from 
> > /usr/share/zoneinfo/zone1970.tab",
> > +    },
> >      rootfs => get_standard_option('pve-ct-rootfs'),
> >      parent => {
> >     optional => 1,
> > diff --git a/src/PVE/LXC/Setup.pm b/src/PVE/LXC/Setup.pm
> > index c738e64..0e07796 100644
> > --- a/src/PVE/LXC/Setup.pm
> > +++ b/src/PVE/LXC/Setup.pm
> > @@ -5,6 +5,8 @@ use warnings;
> >  use POSIX;
> >  use PVE::Tools;
> >  
> > +use Cwd 'abs_path';
> > +
> >  use PVE::LXC::Setup::Debian;
> >  use PVE::LXC::Setup::Ubuntu;
> >  use PVE::LXC::Setup::CentOS;
> > @@ -103,6 +105,7 @@ sub new {
> >  
> >      # Cache some host files we need access to:
> >      $plugin->{host_resolv_conf} = PVE::INotify::read_file('resolvconf');
> > +    $plugin->{host_localtime} = abs_path('/etc/localtime');
> 
> Hmm, I'd not save that in the $plugin, makes no sense to me.
> I mean, I see where this comes from but that also doesn't makes much sense to 
> me.
> 
> This isn't both expected to be used often, so just using it directly without 
> cache
> or at least cache only if at least used once would be nicer IMO.


this was the simplest way i found, and it's just caching a ~50 byte
string (/etc/localtime symlink) to be used in the setup.

how else can i access that in the setup routines
which are running in CT rootfs?


> 
> >  
> >      # pass on user namespace information:
> >      my ($id_map, $rootuid, $rootgid) = PVE::LXC::parse_id_maps($conf);
> > @@ -205,6 +208,16 @@ sub set_dns {
> >      $self->protected_call($code);
> >  }
> >  
> > +sub set_timezone {
> > +    my ($self) = @_;
> > +
> > +    return if !$self->{plugin}; # unmanaged
> > +    my $code = sub {
> > +   $self->{plugin}->set_timezone($self->{conf});
> > +    };
> > +    $self->protected_call($code);
> > +}
> > +
> >  sub setup_init {
> >      my ($self) = @_;
> >  
> > diff --git a/src/PVE/LXC/Setup/Base.pm b/src/PVE/LXC/Setup/Base.pm
> > index 93dace7..4c7c2e6 100644
> > --- a/src/PVE/LXC/Setup/Base.pm
> > +++ b/src/PVE/LXC/Setup/Base.pm
> > @@ -451,6 +451,26 @@ my $randomize_crontab = sub {
> >     }
> >  };
> >  
> > +sub set_timezone {
> > +    my ($self, $conf) = @_;
> > +
> > +    my $zoneinfo = $conf->{timezone};
> > +
> > +    return if !defined($zoneinfo);
> > +
> > +    my $tz_path = "/usr/share/zoneinfo/$zoneinfo";
> > +    if ($zoneinfo eq 'host') {
> > +   $tz_path= $self->{host_localtime};
> 
> whitespace error before =
> 
> > +    }
> > +
> > +    if ($self->ct_file_exists($tz_path)) {
> > +   $self->ct_unlink("/etc/localtime");
> > +   $self->ct_symlink($tz_path, "/etc/localtime");
> 
> could be nicer to do a atomic move, i.e. symlink to some 
> "localtime.$$.new.tmpfile" and do a
> rename (move) afterwards to "/etc/localtime".
> 
> Also it would be nice to avoid the change if it points already to the correct 
> zone, avoiding
> IO even if minimal is always good.

alright

> 
> > +    } else {
> > +   warn "container does not have $tz_path, timezone can not be modified\n";
> > +    }
> > +}
> > +
> >  sub pre_start_hook {
> >      my ($self, $conf) = @_;
> >  
> > @@ -458,6 +478,7 @@ sub pre_start_hook {
> >      $self->setup_network($conf);
> >      $self->set_hostname($conf);
> >      $self->set_dns($conf);
> > +    $self->set_timezone($conf);
> >  
> >      # fixme: what else ?
> >  }
> > @@ -466,16 +487,17 @@ sub post_create_hook {
> >      my ($self, $conf, $root_password, $ssh_keys) = @_;
> >  
> >      $self->template_fixup($conf);
> > -    
> > +
> >      &$randomize_crontab($self, $conf);
> > -    
> > +
> >      $self->set_user_password($conf, 'root', $root_password);
> >      $self->set_user_authorized_ssh_keys($conf, 'root', $ssh_keys) if 
> > $ssh_keys;
> >      $self->setup_init($conf);
> >      $self->setup_network($conf);
> >      $self->set_hostname($conf);
> >      $self->set_dns($conf);
> > -    
> > +    $self->set_timezone($conf);
> > +
> >      # fixme: what else ?
> >  }
> >  
> > 
> 

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to