FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Ubuntu > Ubuntu User

 
 
LinkBack Thread Tools
 
Old 10-04-2011, 02:50 PM
Martin Gracik
 
Default first attempt to use GeoIP information

I went over the patches, syntax and everything looks fine, but I have to
say I'm a little confused by some of the calls and variables, like

current = self.instLang.getLangName(self.instLang.instLang)

We have a lot of defaultLangName, countryLangName, canonLang, instLang
etc so it's easy to get lost.

And this:

> +MIRROR_MANAGER_URL = "mirrors.fedoraproject.org"
> +MIRROR_LIST_REQUEST = "/mirrorlist?repo=fedora-15&arch=i386"

Will we need to change this every release?


On Tue, 2011-10-04 at 15:46 +0200, Vratislav Podzimek wrote:
> ---
> pyanaconda/iw/language_gui.py | 20 ++++++++++++--
> pyanaconda/language.py | 43 +++++++++++++++++++++++++----
> pyanaconda/localeinfo.py | 7 ++++-
> scripts/getlangnames.py | 2 +-
> tests/pyanaconda_test/language_test.py | 22 ++++++++++++---
> tests/pyanaconda_test/localeinfo_test.py | 2 +-
> 6 files changed, 79 insertions(+), 17 deletions(-)
>
> diff --git a/pyanaconda/iw/language_gui.py b/pyanaconda/iw/language_gui.py
> index 34aa88d..245c5fa 100644
> --- a/pyanaconda/iw/language_gui.py
> +++ b/pyanaconda/iw/language_gui.py
> @@ -69,6 +69,17 @@ class LanguageWindow (InstallWindow):
>
> # LanguageWindow tag="lang"
> def getScreen (self, anaconda):
> + self.instLang = anaconda.instLanguage
> +
> + wait_window = gui.WaitWindow(_("Getting GeoIP information"), _("Trying to get GeoIP information."))
> + current = None
> + try:
> + guess = self.instLang.getGeoIPinfo()
> + current = self.instLang.getCountryLang(guess)
> + except ValueError:
> + pass
> + wait_window.pop()
> +
> mainBox = gtk.VBox (False, 10)
>
> hbox = gtk.HBox(False, 5)
> @@ -84,8 +95,6 @@ class LanguageWindow (InstallWindow):
> label.set_size_request(350, -1)
> hbox.pack_start(label, False)
>
> - self.instLang = anaconda.instLanguage
> -
> self.listStore = gtk.ListStore(gobject.TYPE_STRING,
> gobject.TYPE_STRING,
> gobject.TYPE_STRING)
> @@ -107,7 +116,12 @@ class LanguageWindow (InstallWindow):
> self.listView.append_column(col)
> self.listView.set_property("headers-visible", False)
>
> - current = self.instLang.getLangName(self.instLang.instLang)
> + if not current:
> + try:
> + current = self.instLang.getLangName(self.instLang.instLang)
> + except ValueError:
> + current = self.instLang.defaultLangName
> +
> iter = self.listStore.get_iter_first()
> while iter:
> if self.listStore.get_value(iter, 1) == current:
> diff --git a/pyanaconda/language.py b/pyanaconda/language.py
> index 8a0d7f6..3ebacb3 100644
> --- a/pyanaconda/language.py
> +++ b/pyanaconda/language.py
> @@ -31,9 +31,15 @@ import localeinfo
> from simpleconfig import SimpleConfigFile
> import system_config_keyboard.keyboard as keyboard
>
> +import httplib
> +import pyanaconda.network
> +
> import logging
> log = logging.getLogger("anaconda")
>
> +MIRROR_MANAGER_URL = "mirrors.fedoraproject.org"
> +MIRROR_LIST_REQUEST = "/mirrorlist?repo=fedora-15&arch=i386"
> +
> def langComponents(astring):
> pattern = re.compile("(?P<language>[A-Za-z]+)(_(?P<territory>[A-Za-z]+))?(.(?P<codeset>[-w]+))?(@(?P<modifier>[-w]+))?")
> m = pattern.match(astring)
> @@ -137,7 +143,7 @@ class Language(object):
> f.close()
> break
>
> - self.localeInfo = localeinfo.get(self._default)
> + (self.localeInfo, self.countriesLangs) = localeinfo.get(self._default)
>
> # instLang must be set after localeInfo is populated, in case the
> # current setting is unsupported by anaconda..
> @@ -225,11 +231,8 @@ class Language(object):
> return self.localeInfo[l][2]
>
> def getLangName(self, lang):
> - try:
> - l = self._canonLang(lang)
> - except ValueError:
> - l = self._default
> -
> + """@raise ValueError: if lang is not recognized"""
> + l = self._canonLang(lang)
> return self.localeInfo[l][0]
>
> def getLangByName(self, name):
> @@ -251,3 +254,31 @@ class Language(object):
>
> def writeKS(self, f):
> f.write("lang %s
" % self.info['LANG'])
> +
> + def getCountryLang(self, country_code):
> + return self.countriesLangs.get(country_code, self.defaultLangName)
> +
> + @property
> + def defaultLangName(self):
> + return self.localeInfo[self._default][0]
> +
> + def getGeoIPinfo(self):
> + if not pyanaconda.network.hasActiveNetDev():
> + log.info("Cannot get GeoIP information: network down")
> + raise ValueError
> + conn = httplib.HTTPSConnection(MIRROR_MANAGER_URL)
> + conn.request("GET", MIRROR_LIST_REQUEST)
> + response = conn.getresponse()
> + data = response.read()
> + lines = data.split("
")
> +
> + match = re.search(r'countrys+=s+([A-Z]+)', lines[0])
> + if match:
> + country = match.group(1).upper()
> + log.debug("Country guessed by GeoIP: {0}".format(country))
> + return country
> + else:
> + log.info("Cannot get GeoIP information: {0} {1}".format(
> + response.status, response.reason))
> + raise ValueError
> +
> diff --git a/pyanaconda/localeinfo.py b/pyanaconda/localeinfo.py
> index eefdf2e..9f90770 100644
> --- a/pyanaconda/localeinfo.py
> +++ b/pyanaconda/localeinfo.py
> @@ -30,6 +30,7 @@ import string
>
> def get(default):
> localeInfo = {}
> + countriesLangs = {} #country code (e.g. US) -> language code (e.g. en)
> # nick -> (name, short name, font, keyboard, timezone) mapping
> search = ('lang-table', '/tmp/updates/lang-table', '/etc/lang-table',
> '/usr/share/anaconda/lang-table')
> @@ -46,12 +47,16 @@ def get(default):
>
> localeInfo[l[3]] = (l[0], l[1], l[2], l[4], string.strip(l[5]))
>
> + if len(l) > 6:
> + for country in l[6].split(","):
> + countriesLangs[country] = l[0]
> +
> f.close()
> break
>
> # Hard code this to prevent errors in the build environment.
> localeInfo['C'] = localeInfo[default]
> - return localeInfo
> + return (localeInfo, countriesLangs)
>
> # Converts a single language into a "language search path". For example,
> # fr_FR.utf8@euro would become "fr_FR.utf8@euro fr_FR.utf8 fr_FR fr"
> diff --git a/scripts/getlangnames.py b/scripts/getlangnames.py
> index 2e579a4..b794f5f 100644
> --- a/scripts/getlangnames.py
> +++ b/scripts/getlangnames.py
> @@ -23,7 +23,7 @@ import localeinfo
>
> import gettext
>
> -localeInfo = localeinfo.get("en_US.UTF-8")
> +localeInfo = localeinfo.get("en_US.UTF-8")[0]
> names = {}
> for k in localeInfo.keys():
> found = False
> diff --git a/tests/pyanaconda_test/language_test.py b/tests/pyanaconda_test/language_test.py
> index daf500b..1eb31db 100644
> --- a/tests/pyanaconda_test/language_test.py
> +++ b/tests/pyanaconda_test/language_test.py
> @@ -211,26 +211,38 @@ class LanguageTest(mock.TestCase):
> def get_lang_name_1_test(self):
> import pyanaconda.language
> lang = pyanaconda.language.Language()
> - ret = lang.getLangName('en')
> + try:
> + ret = lang.getLangName('en')
> + except ValueError:
> + ret = lang.defaultLangName
> self.assertEqual(ret, 'English')
>
> def get_lang_name_2_test(self):
> import pyanaconda.language
> lang = pyanaconda.language.Language()
> - ret = lang.getLangName('cs')
> + try:
> + ret = lang.getLangName('cs')
> + except ValueError:
> + ret = lang.defaultLangName
> self.assertEqual(ret, 'Czech')
>
> def get_lang_name_3_test(self):
> import pyanaconda.language
> lang = pyanaconda.language.Language()
> - ret = lang.getLangName('he')
> + try:
> + ret = lang.getLangName('he')
> + except ValueError:
> + ret = lang.defaultLangName
> self.assertEqual(ret, 'Hebrew')
>
> def get_lang_name_4_test(self):
> import pyanaconda.language
> lang = pyanaconda.language.Language()
> - ret = lang.getLangName('foo')
> - self.assertEqual(ret, 'English')
> + try:
> + ret = lang.getLangName('foo')
> + except ValueError:
> + ret = lang.defaultLangName
> + self.assertEqual(ret, lang.defaultLangName)
>
> def get_lang_by_name_1_test(self):
> import pyanaconda.language
> diff --git a/tests/pyanaconda_test/localeinfo_test.py b/tests/pyanaconda_test/localeinfo_test.py
> index 32f0916..bd42444 100644
> --- a/tests/pyanaconda_test/localeinfo_test.py
> +++ b/tests/pyanaconda_test/localeinfo_test.py
> @@ -26,7 +26,7 @@ English en latarcyrheb-sun16 en_US.UTF-8 us America/New_York

> Hebrew he none he_IL.UTF-8 us Asia/Jerusalem"""
> self.take_over_io(fs, localeinfo)
>
> - info = localeinfo.get("en_US.UTF-8")
> + info = localeinfo.get("en_US.UTF-8")[0]
> self.assertEqual(
> info,
> {'C': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'),

--
Martin Gracik <mgracik@redhat.com>

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 
Old 10-04-2011, 03:16 PM
Vratislav Podzimek
 
Default first attempt to use GeoIP information

On Tue, 2011-10-04 at 16:50 +0200, Martin Gracik wrote:
> I went over the patches, syntax and everything looks fine, but I have to
> say I'm a little confused by some of the calls and variables, like
>
> current = self.instLang.getLangName(self.instLang.instLang)
>
> We have a lot of defaultLangName, countryLangName, canonLang, instLang
> etc so it's easy to get lost.
I absolutely agree, but there's not much I can do with it. I think the
biggest problem is in naming an instance of pyanaconda/language.py:class
Language as instLang when it itself has the instLang attribute.

>
> And this:
>
> > +MIRROR_MANAGER_URL = "mirrors.fedoraproject.org"
> > +MIRROR_LIST_REQUEST = "/mirrorlist?repo=fedora-15&arch=i386"
>
> Will we need to change this every release?
Only every second. This is a "non-sense" request, but there is no
other option how to query Mirror Manager for the GeoIP information at
the moment. And it doesn't make much sense to patch it somehow until we
agree that we will really use it this way.

--
Vratislav Podzimek

>
>
> On Tue, 2011-10-04 at 15:46 +0200, Vratislav Podzimek wrote:
> > ---
> > pyanaconda/iw/language_gui.py | 20 ++++++++++++--
> > pyanaconda/language.py | 43 +++++++++++++++++++++++++----
> > pyanaconda/localeinfo.py | 7 ++++-
> > scripts/getlangnames.py | 2 +-
> > tests/pyanaconda_test/language_test.py | 22 ++++++++++++---
> > tests/pyanaconda_test/localeinfo_test.py | 2 +-
> > 6 files changed, 79 insertions(+), 17 deletions(-)
> >
> > diff --git a/pyanaconda/iw/language_gui.py b/pyanaconda/iw/language_gui.py
> > index 34aa88d..245c5fa 100644
> > --- a/pyanaconda/iw/language_gui.py
> > +++ b/pyanaconda/iw/language_gui.py
> > @@ -69,6 +69,17 @@ class LanguageWindow (InstallWindow):
> >
> > # LanguageWindow tag="lang"
> > def getScreen (self, anaconda):
> > + self.instLang = anaconda.instLanguage
> > +
> > + wait_window = gui.WaitWindow(_("Getting GeoIP information"), _("Trying to get GeoIP information."))
> > + current = None
> > + try:
> > + guess = self.instLang.getGeoIPinfo()
> > + current = self.instLang.getCountryLang(guess)
> > + except ValueError:
> > + pass
> > + wait_window.pop()
> > +
> > mainBox = gtk.VBox (False, 10)
> >
> > hbox = gtk.HBox(False, 5)
> > @@ -84,8 +95,6 @@ class LanguageWindow (InstallWindow):
> > label.set_size_request(350, -1)
> > hbox.pack_start(label, False)
> >
> > - self.instLang = anaconda.instLanguage
> > -
> > self.listStore = gtk.ListStore(gobject.TYPE_STRING,
> > gobject.TYPE_STRING,
> > gobject.TYPE_STRING)
> > @@ -107,7 +116,12 @@ class LanguageWindow (InstallWindow):
> > self.listView.append_column(col)
> > self.listView.set_property("headers-visible", False)
> >
> > - current = self.instLang.getLangName(self.instLang.instLang)
> > + if not current:
> > + try:
> > + current = self.instLang.getLangName(self.instLang.instLang)
> > + except ValueError:
> > + current = self.instLang.defaultLangName
> > +
> > iter = self.listStore.get_iter_first()
> > while iter:
> > if self.listStore.get_value(iter, 1) == current:
> > diff --git a/pyanaconda/language.py b/pyanaconda/language.py
> > index 8a0d7f6..3ebacb3 100644
> > --- a/pyanaconda/language.py
> > +++ b/pyanaconda/language.py
> > @@ -31,9 +31,15 @@ import localeinfo
> > from simpleconfig import SimpleConfigFile
> > import system_config_keyboard.keyboard as keyboard
> >
> > +import httplib
> > +import pyanaconda.network
> > +
> > import logging
> > log = logging.getLogger("anaconda")
> >
> > +MIRROR_MANAGER_URL = "mirrors.fedoraproject.org"
> > +MIRROR_LIST_REQUEST = "/mirrorlist?repo=fedora-15&arch=i386"
> > +
> > def langComponents(astring):
> > pattern = re.compile("(?P<language>[A-Za-z]+)(_(?P<territory>[A-Za-z]+))?(.(?P<codeset>[-w]+))?(@(?P<modifier>[-w]+))?")
> > m = pattern.match(astring)
> > @@ -137,7 +143,7 @@ class Language(object):
> > f.close()
> > break
> >
> > - self.localeInfo = localeinfo.get(self._default)
> > + (self.localeInfo, self.countriesLangs) = localeinfo.get(self._default)
> >
> > # instLang must be set after localeInfo is populated, in case the
> > # current setting is unsupported by anaconda..
> > @@ -225,11 +231,8 @@ class Language(object):
> > return self.localeInfo[l][2]
> >
> > def getLangName(self, lang):
> > - try:
> > - l = self._canonLang(lang)
> > - except ValueError:
> > - l = self._default
> > -
> > + """@raise ValueError: if lang is not recognized"""
> > + l = self._canonLang(lang)
> > return self.localeInfo[l][0]
> >
> > def getLangByName(self, name):
> > @@ -251,3 +254,31 @@ class Language(object):
> >
> > def writeKS(self, f):
> > f.write("lang %s
" % self.info['LANG'])
> > +
> > + def getCountryLang(self, country_code):
> > + return self.countriesLangs.get(country_code, self.defaultLangName)
> > +
> > + @property
> > + def defaultLangName(self):
> > + return self.localeInfo[self._default][0]
> > +
> > + def getGeoIPinfo(self):
> > + if not pyanaconda.network.hasActiveNetDev():
> > + log.info("Cannot get GeoIP information: network down")
> > + raise ValueError
> > + conn = httplib.HTTPSConnection(MIRROR_MANAGER_URL)
> > + conn.request("GET", MIRROR_LIST_REQUEST)
> > + response = conn.getresponse()
> > + data = response.read()
> > + lines = data.split("
")
> > +
> > + match = re.search(r'countrys+=s+([A-Z]+)', lines[0])
> > + if match:
> > + country = match.group(1).upper()
> > + log.debug("Country guessed by GeoIP: {0}".format(country))
> > + return country
> > + else:
> > + log.info("Cannot get GeoIP information: {0} {1}".format(
> > + response.status, response.reason))
> > + raise ValueError
> > +
> > diff --git a/pyanaconda/localeinfo.py b/pyanaconda/localeinfo.py
> > index eefdf2e..9f90770 100644
> > --- a/pyanaconda/localeinfo.py
> > +++ b/pyanaconda/localeinfo.py
> > @@ -30,6 +30,7 @@ import string
> >
> > def get(default):
> > localeInfo = {}
> > + countriesLangs = {} #country code (e.g. US) -> language code (e.g. en)
> > # nick -> (name, short name, font, keyboard, timezone) mapping
> > search = ('lang-table', '/tmp/updates/lang-table', '/etc/lang-table',
> > '/usr/share/anaconda/lang-table')
> > @@ -46,12 +47,16 @@ def get(default):
> >
> > localeInfo[l[3]] = (l[0], l[1], l[2], l[4], string.strip(l[5]))
> >
> > + if len(l) > 6:
> > + for country in l[6].split(","):
> > + countriesLangs[country] = l[0]
> > +
> > f.close()
> > break
> >
> > # Hard code this to prevent errors in the build environment.
> > localeInfo['C'] = localeInfo[default]
> > - return localeInfo
> > + return (localeInfo, countriesLangs)
> >
> > # Converts a single language into a "language search path". For example,
> > # fr_FR.utf8@euro would become "fr_FR.utf8@euro fr_FR.utf8 fr_FR fr"
> > diff --git a/scripts/getlangnames.py b/scripts/getlangnames.py
> > index 2e579a4..b794f5f 100644
> > --- a/scripts/getlangnames.py
> > +++ b/scripts/getlangnames.py
> > @@ -23,7 +23,7 @@ import localeinfo
> >
> > import gettext
> >
> > -localeInfo = localeinfo.get("en_US.UTF-8")
> > +localeInfo = localeinfo.get("en_US.UTF-8")[0]
> > names = {}
> > for k in localeInfo.keys():
> > found = False
> > diff --git a/tests/pyanaconda_test/language_test.py b/tests/pyanaconda_test/language_test.py
> > index daf500b..1eb31db 100644
> > --- a/tests/pyanaconda_test/language_test.py
> > +++ b/tests/pyanaconda_test/language_test.py
> > @@ -211,26 +211,38 @@ class LanguageTest(mock.TestCase):
> > def get_lang_name_1_test(self):
> > import pyanaconda.language
> > lang = pyanaconda.language.Language()
> > - ret = lang.getLangName('en')
> > + try:
> > + ret = lang.getLangName('en')
> > + except ValueError:
> > + ret = lang.defaultLangName
> > self.assertEqual(ret, 'English')
> >
> > def get_lang_name_2_test(self):
> > import pyanaconda.language
> > lang = pyanaconda.language.Language()
> > - ret = lang.getLangName('cs')
> > + try:
> > + ret = lang.getLangName('cs')
> > + except ValueError:
> > + ret = lang.defaultLangName
> > self.assertEqual(ret, 'Czech')
> >
> > def get_lang_name_3_test(self):
> > import pyanaconda.language
> > lang = pyanaconda.language.Language()
> > - ret = lang.getLangName('he')
> > + try:
> > + ret = lang.getLangName('he')
> > + except ValueError:
> > + ret = lang.defaultLangName
> > self.assertEqual(ret, 'Hebrew')
> >
> > def get_lang_name_4_test(self):
> > import pyanaconda.language
> > lang = pyanaconda.language.Language()
> > - ret = lang.getLangName('foo')
> > - self.assertEqual(ret, 'English')
> > + try:
> > + ret = lang.getLangName('foo')
> > + except ValueError:
> > + ret = lang.defaultLangName
> > + self.assertEqual(ret, lang.defaultLangName)
> >
> > def get_lang_by_name_1_test(self):
> > import pyanaconda.language
> > diff --git a/tests/pyanaconda_test/localeinfo_test.py b/tests/pyanaconda_test/localeinfo_test.py
> > index 32f0916..bd42444 100644
> > --- a/tests/pyanaconda_test/localeinfo_test.py
> > +++ b/tests/pyanaconda_test/localeinfo_test.py
> > @@ -26,7 +26,7 @@ English en latarcyrheb-sun16 en_US.UTF-8 us America/New_York

> > Hebrew he none he_IL.UTF-8 us Asia/Jerusalem"""
> > self.take_over_io(fs, localeinfo)
> >
> > - info = localeinfo.get("en_US.UTF-8")
> > + info = localeinfo.get("en_US.UTF-8")[0]
> > self.assertEqual(
> > info,
> > {'C': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'),
>


_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 04:27 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org