You are here

README.txt in IP-based Determination of a Visitor's Country 8

Same filename and directory in other branches
  1. 5 README.txt
  2. 6 README.txt
  3. 7 README.txt
About
=====
This module uses a visitor's IP address to identify the geographical location
(country) of the user.  The module makes this determination and stores the
result as an ISO 3166-1 2-character country code in the Drupal $user object,
but otherwise has no effect on the operation of your site.  The intent is
simply to provide the information for use by other modules.  Anonymous users
are not identified by country.  An API is also provided so that you can lookup
IP-Country information in your own code.



Installation
============
Check requirements:  Drupal 8.x, nothing more.

Copy ip2country.tar.gz into your sites/all/modules directory and unzip/untar it.

In your web browser, navigate to admin/modules and enable the following
module: IP-based determination of Country

NOTE!  When ip2country is installed, it downloads a large amount of
data off the Internet to build a table in your Drupal database.  This
process can take up to 30 seconds, so please be patient and WAIT until
the page loads!  You can verify a correct install by looking into your
Drupal database for the ip2country table and verifying that it is full
of data.

This module defines an "administer ip2country" permission, which must be
explicitly enabled for the administration user at admin/people/permissions.

You must now enter values in the administration menus.  Defaults are chosen
reasonably, but you should examine them and set them as you wish.

Go to admin/config/people/ip2country to review and change settings for the
IP-based determination of Country module.  You can read about the Debug
preferences in the "Troubleshooting" section below.

Finally, cron needs to be running for automatic database updates.  If you
haven't set up cron for your Drupal site, refer to
https://www.drupal.org/docs/8/cron-automated-tasks/cron-automated-tasks-overview
for instructions.

Everything should now work.  If it doesn't, read the rest of this document
(which you really should have done first, anyway!).  If you still have
problems see the "Troubleshooting" section below.



Features
========
This module uses the IP Address that a user is connected from to deduce the
Country where the user is located.  This method is not foolproof, because
a user may connect through an anonymizing proxy, or may be in an unusual
situation, such as using an ISP from a neighboring country, or using an
IP block leased from a company in another country.  Additionally, users
accessing a server on a local network may be using an IP that is not assigned
to any country (e.g. 192.168.1.x or 127.0.0.1).

Country determination occurs upon user login.  If a country can be determined
from the IP address, the ISO 3166 2-character country code is stored in the
Drupal $user object as $user->country_iso_code_2.  If no country can be
determined, this member variable is left unset.

Rules support allows you to detect the user's country and take action
depending on the value.  For instance, you could have customized landing pages
for users from different countries, or show/hide content based on the user's
country (e.g. a product not available for sale in a certain country).  An
example Reaction Rule is included with this module - it will be automatically
installed but set to "disabled" so it will not run until you manually "enable"
it from the Rules UI.  You may edit this example for your own needs, or just use
it as reference.  The Rule is named "Login redirect - ES" and it demonstrates
how to redirect a user at login in time, based on the country of that user's
IP address.

Alternatively, a function is provided so that you may look up the country
from within your own code, for your own use.  The way to use this is:

  $ip = \Drupal::request()->getClientIp();
  $country_code = \Drupal::service('ip2country.lookup')->getCountry($ip);

Drupal core provides a function which can transform this $country_code into
a country name.  Use it like this:

  $country_list = \Drupal::service('country_manager')->getList();
  $country_name = $country_list[$country_code];


The database used by this module is maintained by ARIN, the American Registry
for Internet Numbers (http://www.arin.net/about_us/index.html), which is one of
the five official Regional Internet Registries (RIR) responsible for assigning
IP addresses.  The claim is the database is 98% accurate, with most of the
problems coming from users in less-developed countries.  Regardless, there's
no more-authoritative source of this information.  Although the default RIR
used is ARIN, an admin menu allows you to choose any of the five.

If you have cron set up for your Drupal site, this IP to Country database will
be automatically updated at a frequency determined by the admin menu at
admin/config/people/ip2country.  A checkbox is provided to turn on/off
logging of database updates.  The default update frequency is 1 week, but it
can be adjusted from 1 day up to 4 weeks.  Because this module downloads a lot
of data during the update and because the database is very stable, shorter
database update times are not needed.

Database updates may also be performed manually by pressing the button at
admin/config/people/ip2country.  Note this can take up to 30 seconds to
complete - do not interrupt the update process or the update will fail and you
will have to do it again.  (A failed update does *not* corrupt the database.)


Drush support
=============
Support for both Drush 8 and Drush 9+ has been added. There are three drush
commands provided by this module (use a '-' instead of the ':' in the command
name if you are using Drush 8):

  drush ip2country:update --registry=<registry>
      Updates the ip2country database from the specified registry, or from
      the default registry if not specified.

  drush ip2country:lookup <ip>
      Looks up the given IP address in the ip2country database displays the
      country associated with that IP address.

  drush ip2country:status
      Prints the time and data source (RIR) of the last database update.

Drush may also be used to configure any of the settings for this program.  For
example, to see all the settings, use:

  drush cget ip2country.settings

And to change the settings, use the corresponding drush cset.  For example, to
disable automatic database updates, use:

  drush cset ip2country.setttings update_interval 0

Or to turn on debug country/IP spoofing, use:

  drush cset ip2country.setttings debug true

More help may be found using drush help --filter=ip2country


Requirements
============
This module is tested to work with Drupal 8.x.  There is a separate version
specifically for Drupal 7.x (and for Drupal 6.x and for Drupal 5.x too, if you
still need that).  Future version of this module will be backwards compatible
with this release.



Troubleshooting
===============
Because it's not practical to log in from another country in order to test
these features, a debugging setting is provided to allow the administrator
to specify a Country or IP Address to simulate.  When debugging is enabled,
it only affects the country stored in the administrator's $user object.
To use this debugging setting, check the box "Admin Debug" at
admin/config/people/ip2country.  You must also specify either a Country to
simulate or an IP to simulate.  A notification will be printed across the top
of the page when you submit the form, letting you know that the debug feature
has successfully been turned on (or off).  The simulated Country or IP will be
used for the administrator until this feature is turned off in the admin menu.

If your dblog indicates that the database update is failing due to timeouts,
you may have to increase Drupal's allowed cron run time.  This requires editing
core/lib/Drupal/Core/Cron.php and changing the time in the function run()
from 240 a larger number.  Note that this problem is extremely unlikely if
you have a version of this module >=8.x-1.9.

When all else fails, read the comments in the code - there are some debugging
print statements left in that can be uncommented to see what is going on, and
most functions are described in the comments.

File

README.txt
View source
  1. About
  2. =====
  3. This module uses a visitor's IP address to identify the geographical location
  4. (country) of the user. The module makes this determination and stores the
  5. result as an ISO 3166-1 2-character country code in the Drupal $user object,
  6. but otherwise has no effect on the operation of your site. The intent is
  7. simply to provide the information for use by other modules. Anonymous users
  8. are not identified by country. An API is also provided so that you can lookup
  9. IP-Country information in your own code.
  10. Installation
  11. ============
  12. Check requirements: Drupal 8.x, nothing more.
  13. Copy ip2country.tar.gz into your sites/all/modules directory and unzip/untar it.
  14. In your web browser, navigate to admin/modules and enable the following
  15. module: IP-based determination of Country
  16. NOTE! When ip2country is installed, it downloads a large amount of
  17. data off the Internet to build a table in your Drupal database. This
  18. process can take up to 30 seconds, so please be patient and WAIT until
  19. the page loads! You can verify a correct install by looking into your
  20. Drupal database for the ip2country table and verifying that it is full
  21. of data.
  22. This module defines an "administer ip2country" permission, which must be
  23. explicitly enabled for the administration user at admin/people/permissions.
  24. You must now enter values in the administration menus. Defaults are chosen
  25. reasonably, but you should examine them and set them as you wish.
  26. Go to admin/config/people/ip2country to review and change settings for the
  27. IP-based determination of Country module. You can read about the Debug
  28. preferences in the "Troubleshooting" section below.
  29. Finally, cron needs to be running for automatic database updates. If you
  30. haven't set up cron for your Drupal site, refer to
  31. https://www.drupal.org/docs/8/cron-automated-tasks/cron-automated-tasks-overview
  32. for instructions.
  33. Everything should now work. If it doesn't, read the rest of this document
  34. (which you really should have done first, anyway!). If you still have
  35. problems see the "Troubleshooting" section below.
  36. Features
  37. ========
  38. This module uses the IP Address that a user is connected from to deduce the
  39. Country where the user is located. This method is not foolproof, because
  40. a user may connect through an anonymizing proxy, or may be in an unusual
  41. situation, such as using an ISP from a neighboring country, or using an
  42. IP block leased from a company in another country. Additionally, users
  43. accessing a server on a local network may be using an IP that is not assigned
  44. to any country (e.g. 192.168.1.x or 127.0.0.1).
  45. Country determination occurs upon user login. If a country can be determined
  46. from the IP address, the ISO 3166 2-character country code is stored in the
  47. Drupal $user object as $user->country_iso_code_2. If no country can be
  48. determined, this member variable is left unset.
  49. Rules support allows you to detect the user's country and take action
  50. depending on the value. For instance, you could have customized landing pages
  51. for users from different countries, or show/hide content based on the user's
  52. country (e.g. a product not available for sale in a certain country). An
  53. example Reaction Rule is included with this module - it will be automatically
  54. installed but set to "disabled" so it will not run until you manually "enable"
  55. it from the Rules UI. You may edit this example for your own needs, or just use
  56. it as reference. The Rule is named "Login redirect - ES" and it demonstrates
  57. how to redirect a user at login in time, based on the country of that user's
  58. IP address.
  59. Alternatively, a function is provided so that you may look up the country
  60. from within your own code, for your own use. The way to use this is:
  61. $ip = \Drupal::request()->getClientIp();
  62. $country_code = \Drupal::service('ip2country.lookup')->getCountry($ip);
  63. Drupal core provides a function which can transform this $country_code into
  64. a country name. Use it like this:
  65. $country_list = \Drupal::service('country_manager')->getList();
  66. $country_name = $country_list[$country_code];
  67. The database used by this module is maintained by ARIN, the American Registry
  68. for Internet Numbers (http://www.arin.net/about_us/index.html), which is one of
  69. the five official Regional Internet Registries (RIR) responsible for assigning
  70. IP addresses. The claim is the database is 98% accurate, with most of the
  71. problems coming from users in less-developed countries. Regardless, there's
  72. no more-authoritative source of this information. Although the default RIR
  73. used is ARIN, an admin menu allows you to choose any of the five.
  74. If you have cron set up for your Drupal site, this IP to Country database will
  75. be automatically updated at a frequency determined by the admin menu at
  76. admin/config/people/ip2country. A checkbox is provided to turn on/off
  77. logging of database updates. The default update frequency is 1 week, but it
  78. can be adjusted from 1 day up to 4 weeks. Because this module downloads a lot
  79. of data during the update and because the database is very stable, shorter
  80. database update times are not needed.
  81. Database updates may also be performed manually by pressing the button at
  82. admin/config/people/ip2country. Note this can take up to 30 seconds to
  83. complete - do not interrupt the update process or the update will fail and you
  84. will have to do it again. (A failed update does *not* corrupt the database.)
  85. Drush support
  86. =============
  87. Support for both Drush 8 and Drush 9+ has been added. There are three drush
  88. commands provided by this module (use a '-' instead of the ':' in the command
  89. name if you are using Drush 8):
  90. drush ip2country:update --registry=
  91. Updates the ip2country database from the specified registry, or from
  92. the default registry if not specified.
  93. drush ip2country:lookup
  94. Looks up the given IP address in the ip2country database displays the
  95. country associated with that IP address.
  96. drush ip2country:status
  97. Prints the time and data source (RIR) of the last database update.
  98. Drush may also be used to configure any of the settings for this program. For
  99. example, to see all the settings, use:
  100. drush cget ip2country.settings
  101. And to change the settings, use the corresponding drush cset. For example, to
  102. disable automatic database updates, use:
  103. drush cset ip2country.setttings update_interval 0
  104. Or to turn on debug country/IP spoofing, use:
  105. drush cset ip2country.setttings debug true
  106. More help may be found using drush help --filter=ip2country
  107. Requirements
  108. ============
  109. This module is tested to work with Drupal 8.x. There is a separate version
  110. specifically for Drupal 7.x (and for Drupal 6.x and for Drupal 5.x too, if you
  111. still need that). Future version of this module will be backwards compatible
  112. with this release.
  113. Troubleshooting
  114. ===============
  115. Because it's not practical to log in from another country in order to test
  116. these features, a debugging setting is provided to allow the administrator
  117. to specify a Country or IP Address to simulate. When debugging is enabled,
  118. it only affects the country stored in the administrator's $user object.
  119. To use this debugging setting, check the box "Admin Debug" at
  120. admin/config/people/ip2country. You must also specify either a Country to
  121. simulate or an IP to simulate. A notification will be printed across the top
  122. of the page when you submit the form, letting you know that the debug feature
  123. has successfully been turned on (or off). The simulated Country or IP will be
  124. used for the administrator until this feature is turned off in the admin menu.
  125. If your dblog indicates that the database update is failing due to timeouts,
  126. you may have to increase Drupal's allowed cron run time. This requires editing
  127. core/lib/Drupal/Core/Cron.php and changing the time in the function run()
  128. from 240 a larger number. Note that this problem is extremely unlikely if
  129. you have a version of this module >=8.x-1.9.
  130. When all else fails, read the comments in the code - there are some debugging
  131. print statements left in that can be uncommented to see what is going on, and
  132. most functions are described in the comments.