package timezone; # $Id$

use diagnostics;
use strict;
use vars qw($ntp_servers);

use common;
use log;


sub getTimeZones {
    my ($prefix) = @_;
    local *F;
    open F, "cd $prefix/usr/share/zoneinfo && find [A-Z]* -type f |";
    my @l = chomp_(<F>);
    close F or die "cannot list the available zoneinfos";
    sort @l;
}

sub read {
    my ($prefix) = @_;
    my $f = "$prefix/etc/sysconfig/clock";
    my %t = getVarsFromSh($f) or return;

    (timezone => $t{ZONE}, UTC => text2bool($t{UTC}));
}

sub ntp_server {
    my ($prefix, $server) = @_;

    my $f = "$prefix/etc/ntp.conf";
    -e $f or return;

    if (@_ > 1) {
	my $added = 0;
	substInFile {
	    if (/^#?\s*server\s+(\S*)/ && $1 ne '127.127.1.0') {
		$_ = $added ? "#server $1\n" : "server $server\n";
		$added = 1;
	    }
	} $f;
	output("$prefix/etc/ntp/step-tickers", "$server\n");
    } else {
	($server) = grep { $_ ne '127.127.1.0' } map { if_(/^\s*server\s+(\S*)/, $1) } cat_($f);
    }
    $server;
}

sub write {
    my ($prefix, $t) = @_;

    ntp_server($prefix, $t->{ntp});

    eval { cp_af("$prefix/usr/share/zoneinfo/$t->{timezone}", "$prefix/etc/localtime") };
    $@ and log::l("installing /etc/localtime failed");
    setVarsInSh("$prefix/etc/sysconfig/clock", {
	ZONE => $t->{timezone},
	UTC  => bool2text($t->{UTC}),
	ARC  => "false",
    });
}

my %l2t = (
'Afrikaans (South Africa)' => 'Africa/Johannesburg',
'Arabic' => 'Africa/Cairo',
'Armenian (Armenia)' => 'Asia/Yerevan',
'Azeri (Azerbaijan)' => 'Asia/Baku',
'Belarussian (Belarus)' => 'Europe/Minsk',
'Bosnian (Bosnia)' => 'Europe/Sarajevo',
'Brezhoneg (Brittany)' => 'Europe/Paris',
'Bulgarian (Bulgaria)' => 'Europe/Sofia',
'Catalan' => 'Europe/Madrid',
'Chinese Traditional (Taiwan)' => 'Asia/Taipei',
'Chinese Simplified (China)' => 'Asia/Beijing',
'Croatian (Bosnia)' => 'Europe/Sarajevo',
'Croatian (Croatia)' => 'Europe/Zagreb',
'Cymraeg (Welsh)' => 'Europe/London',
'Czech' => 'Europe/Prague',
'Danish (Denmark)' => 'Europe/Copenhagen',
'Dutch (Netherlands)' => 'Europe/Amsterdam',
'English (United States)' => 'America/New_York',
'English (United Kingdom)' => 'Europe/London',
'Esperanto' => 'Europe/Warsaw',
'Estonian (Estonia)' => 'Europe/Tallinn',
'Euskara (Basque)' => 'Europe/Madrid',
'Finnish (Finland)' => 'Europe/Helsinki',
'French (France)' => 'Europe/Paris',
'French (Belgium)' => 'Europe/Brussels',
'French (Canada)' => 'Canada/Atlantic', # or Newfoundland ? or Eastern ?
'Gaeilge (Ireland)' => 'Europe/Dublin',
'Galego' => 'Europe/Madrid',
'Georgian (Georgia)' => 'Asia/Yerevan',
'German (Austria)' => 'Europe/Vienna',
'German (Germany)' => 'Europe/Berlin',
'Greek (Greece)' => 'Europe/Athens',
'Greenlandic' => 'Arctic/Longyearbyen',
'Hebrew (Israel)' => 'Asia/Tel_Aviv',
'Hungarian (Hungary)' => 'Europe/Budapest',
'Icelandic (Iceland)' => 'Atlantic/Reykjavik',
'Indonesian (Indonesia)' => 'Asia/Jakarta',
'Iranian (Iran)' => 'Asia/Tehran',
'Italian (Italy)' => 'Europe/Rome',
#-'Italian (San Marino)' => 'Europe/San_Marino',
#-'Italian (Vatican)' => 'Europe/Vatican',
#-'Italian (Switzerland)' => 'Europe/Zurich',
'Japanese (Japon)' => 'Asia/Tokyo',
'Korean (Korea)' => 'Asia/Seoul',
'Latvian (Latvia)' => 'Europe/Riga',
'Lithuanian (Lithuania)' => 'Europe/Vilnius',
'Macedonian (Macedonia)' => 'Europe/Skopje',
'Maori (New Zealand)' => 'Australia/Sydney',
'Norwegian (Bokmaal)' => 'Europe/Oslo',
'Norwegian (Nynorsk)' => 'Europe/Oslo',
'Polish (Poland)' => 'Europe/Warsaw',
'Portuguese (Brazil)' => 'Brazil/East', # most people live on the east coast
'Portuguese (Portugal)' => 'Europe/Lisbon',
'Romanian (Rumania)' => 'Europe/Bucharest',
'Russian (Russia)' => 'Europe/Moscow',
'Serbian (Serbia)' => 'Europe/Belgrade',
'Slovak (Slovakia)' => 'Europe/Bratislava',
'Slovenian (Slovenia)' => 'Europe/Ljubljana',
'Spanish (Argentina)' => 'America/Buenos_Aires',
'Spanish (Mexico)' => 'America/Mexico_City',
'Spanish (Spain)' => 'Europe/Madrid',
'Swedish (Sweden)' => 'Europe/Stockholm',
'Tajik (Tajikistan)' => 'Asia/Dushanbe',
'Tamil (Sri Lanka)' => 'Asia/Colombo',
'Tatar' => 'Europe/Minsk',
'Thai (Thailand)' => 'Asia/Bangkok',
'Turkish (Turkey)' => 'Europe/Istanbul',
'Ukrainian (Ukraine)' => 'Europe/Kiev',
'Uzbek (Uzbekistan)' => 'Asia/Tashkent',
'Vietnamese (Vietnam)' => 'Asia/Saigon',
'Walon (Belgium)' => 'Europe/Brussels',
);

sub fuzzyChoice { 
    my ($b, $count) = common::bestMatchSentence($_[0], keys %l2t);
    $count ? $b : '';
}
sub bestTimezone { $l2t{fuzzyChoice($_[0])} || 'GMT' }

my %sex = (
fr_FR => { '[iln]a$' => 1, '[cdilnst]e$' => 1, 'e$' => .8, 'n$' => .1, 'd$' => .05, 't$' => 0 },
en => { 'a$' => 1, 'o$' => 0, '[ln]$' => .3, '[rs]$' => .2 },
);


sub sexProb($) {
    local ($_) = @_;
    my $l = $sex{$ENV{LC_ALL}} or return 0.5;

    my ($prob, $nb) = (0, 0);
    foreach my $k (keys %$l) {
	/$k/ and $prob += $l->{$k}, $nb++;
    }
    $nb ? $prob / $nb : 0.5;
}

$ntp_servers = 
q(Australia (ntp.adelaide.edu.au)
Australia (ntp.saard.net)
Australia (time.esec.com.au)
Canada (ntp.cpsc.ucalgary.ca)
Canada (ntp1.cmc.ec.gc.ca)
Canada (ntp2.cmc.ec.gc.ca)
Canada (time.chu.nrc.ca)
Canada (time.nrc.ca)
Canada (timelord.uregina.ca)
Spain (slug.ctv.es)
France (ntp.univ-lyon1.fr)
Croatia (zg1.ntp.carnet.hr)
Croatia (zg2.ntp.carnet.hr)
Croatia (st.ntp.carnet.hr)
Croatia (ri.ntp.carnet.hr)
Croatia (os.ntp.carnet.hr)
Indonesia (ntp.incaf.net)
Korea, republic of (time.nuri.net)
Norway (fartein.ifi.uio.no)
Russia (ntp.landau.ac.ru)
Singapore (ntp.shim.org)
Slovenia (time.ijs.si)
Slovenia (time.ijs.si)
United kingdom (ntp.cs.strath.ac.uk)
United kingdom (ntp2a.mcc.ac.uk)
United kingdom (ntp2b.mcc.ac.uk)
United kingdom (ntp2c.mcc.ac.uk)
United kingdom (ntp2d.mcc.ac.uk)
United states DE (louie.udel.edu)
United states IL (ntp-0.cso.uiuc.edu)
United states IL (ntp-1.cso.uiuc.edu)
United states IL (ntp-2.cso.uiuc.edu)
United states IN (gilbreth.ecn.purdue.edu)
United states IN (harbor.ecn.purdue.edu)
United states IN (molecule.ecn.purdue.edu)
);

1;
value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Pascal Rigaux &lt;pixel@mandriva.com&gt;</td><td class='right'>2008-02-11 16:52:56 +0000</td></tr>
<tr><th>committer</th><td>Pascal Rigaux &lt;pixel@mandriva.com&gt;</td><td class='right'>2008-02-11 16:52:56 +0000</td></tr>
<tr><th>commit</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/?h=17.17&amp;id=40badaddb5194e14abc394cca7b0234d0266ea10'>40badaddb5194e14abc394cca7b0234d0266ea10</a> (<a href='/software/drakx/patch/?id=40badaddb5194e14abc394cca7b0234d0266ea10'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='sha1'><a href='/software/drakx/tree/?h=17.17&amp;id=40badaddb5194e14abc394cca7b0234d0266ea10'>cc136284b845d04526500229abd1b64954fcaec2</a></td></tr>
<tr><th>parent</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/?h=17.17&amp;id=bdac332d6aaf078f875f639fed6659b5b2d039c7'>bdac332d6aaf078f875f639fed6659b5b2d039c7</a> (<a href='/software/drakx/diff/?h=17.17&amp;id=40badaddb5194e14abc394cca7b0234d0266ea10&amp;id2=bdac332d6aaf078f875f639fed6659b5b2d039c7'>diff</a>)</td></tr><tr><th>download</th><td colspan='2' class='sha1'><a href='/software/drakx/snapshot/drakx-40badaddb5194e14abc394cca7b0234d0266ea10.tar'>drakx-40badaddb5194e14abc394cca7b0234d0266ea10.tar</a><br/><a href='/software/drakx/snapshot/drakx-40badaddb5194e14abc394cca7b0234d0266ea10.tar.gz'>drakx-40badaddb5194e14abc394cca7b0234d0266ea10.tar.gz</a><br/><a href='/software/drakx/snapshot/drakx-40badaddb5194e14abc394cca7b0234d0266ea10.tar.bz2'>drakx-40badaddb5194e14abc394cca7b0234d0266ea10.tar.bz2</a><br/><a href='/software/drakx/snapshot/drakx-40badaddb5194e14abc394cca7b0234d0266ea10.tar.xz'>drakx-40badaddb5194e14abc394cca7b0234d0266ea10.tar.xz</a><br/><a href='/software/drakx/snapshot/drakx-40badaddb5194e14abc394cca7b0234d0266ea10.zip'>drakx-40badaddb5194e14abc394cca7b0234d0266ea10.zip</a><br/></td></tr></table>
<div class='commit-subject'>- Xorg needs xkb/rules/base, otherwise it can go crazy (#35912)</div><div class='commit-msg'></div><div class='diffstat-header'><a href='/software/drakx/diff/?h=17.17&amp;id=40badaddb5194e14abc394cca7b0234d0266ea10'>Diffstat</a></div><table summary='diffstat' class='diffstat'><tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/software/drakx/diff/perl-install/install/NEWS?h=17.17&amp;id=40badaddb5194e14abc394cca7b0234d0266ea10'>perl-install/install/NEWS</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='1%'><tr><td class='add' style='width: 100.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/software/drakx/diff/perl-install/install/share/list.xml?h=17.17&amp;id=40badaddb5194e14abc394cca7b0234d0266ea10'>perl-install/install/share/list.xml</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='1%'><tr><td class='add' style='width: 100.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr>
</table><div class='diffstat-summary'>2 files changed, 2 insertions, 0 deletions</div><table summary='diff' class='diff'><tr><td><div class='head'>diff --git a/perl-install/install/NEWS b/perl-install/install/NEWS<br/>index 3f39464bc..f6b0e9cd5 100644<br/>--- a/<a href='/software/drakx/tree/perl-install/install/NEWS?h=17.17&amp;id=bdac332d6aaf078f875f639fed6659b5b2d039c7'>perl-install/install/NEWS</a><br/>+++ b/<a href='/software/drakx/tree/perl-install/install/NEWS?h=17.17&amp;id=40badaddb5194e14abc394cca7b0234d0266ea10'>perl-install/install/NEWS</a></div><div class='hunk'>@@ -1,3 +1,4 @@</div><div class='add'>+- Xorg needs xkb/rules/base, otherwise it can go crazy (#35912)</div><div class='ctx'> - add mkntfs (#37462)</div><div class='ctx'> - detect systems with C7-M processor as laptop (like Belinea s.book)</div><div class='ctx'> </div><div class='head'>diff --git a/perl-install/install/share/list.xml b/perl-install/install/share/list.xml<br/>index 4bb413922..76c9693f5 100644<br/>--- a/<a href='/software/drakx/tree/perl-install/install/share/list.xml?h=17.17&amp;id=bdac332d6aaf078f875f639fed6659b5b2d039c7'>perl-install/install/share/list.xml</a><br/>+++ b/<a href='/software/drakx/tree/perl-install/install/share/list.xml?h=17.17&amp;id=40badaddb5194e14abc394cca7b0234d0266ea10'>perl-install/install/share/list.xml</a></div><div class='hunk'>@@ -84,6 +84,7 @@</div><div class='ctx'>   geometry/pc</div><div class='ctx'>   keycodes/aliases</div><div class='ctx'>   keycodes/xfree86</div><div class='add'>+  rules/base</div><div class='ctx'>   rules/xorg</div><div class='ctx'>   rules/xorg.lst</div><div class='ctx'>   compat semantics types</div></td></tr></table></div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.1</a> (<a href='https://git-scm.com/'>git 2.21.0</a>) at 2025-02-23 01:32:28 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>