POSIX-compliant shell implementation of ip2location lite database search.
v 1.0.0
- Portable.
- As lean as possible (no database engine required, works directly on CSV file downloaded from https://lite.ip2location.com).
- Fast (see benchmark results).
- Smart. Tries different approaches prior to giving up.
- Agile. Supports different DB's (from DB1LITE to DB11LITE) and configurable output fields.
- IPv4 (done) and IPv6 (in testing) support.
- Comes with handy setup script.
- POSIX shell (tested on busybox/ash & dash)
- output redirection & piping support
- getopts
- printf or echo (w/ -e & -n options)
- test, if-then-else, do-while, case, break, true
- functions () {}
- subshell execution via $()
- exit
- command -v
- awk (awk / gawk / mawk)
- stat or ls -l
- dd
- bc for IPv6 conversions (optional, but increases speed in comparison with built-in awk code)
- mkdir
- grep
- curl or wget
- crontab
- unzip
chmod +x *.sh
./setupScript.sh -v
Don't forget to set ip2location account info in config.
chmod +x *.sh
./setupScript.sh -iv
then place ip2loc-lean.sh into dir listed in $PATH (or add ip2loc-lean dir to $PATH)
ip2loc-lean.sh [-scrClztuh] IP_ADDRESS [OUT_FORMAT]
- Valid (no check in script) IPv4 addresses like "8.8.8.8"
- Valid (no check in script) IPv6 addresses like "2404:6800:4001:805::1006" or "::1"
Currently script tries to guess which address is supplied.
empty (default) - fields delimited by ::
csv - fields delimited by , and embraced by "
default is -c
-s Two-character country code based on ISO 3166 (i.e. US)
-c Country name based on ISO 3166 (i.e. United States)
-r Region or state name (i.e. Arizona)
-C City name (i.e. Tucson)
-l Location, lat & lon (i.e. 32.242850 -110.946248)
-z Zip/Postal code (i.e. 85719)
-t UTC time zone (with DST supported) (i.e. -07:00)
-u Update DB just now. Used internally via cronjob, but you can use it as well.
-h Usage help
-
If you aren't happy with storing database in your home dir just use symlinks.
-
Login & password for ip2location database automatic downloads are stored in config as plain text. For now config file should have 600 (-rw---------) access rights when account is stored there for preventing leaks. In future config and account data will be separated.
-
IPv6 is currently not
supportedwidely tested. -
Automatic update downloads new zip file, uncompress it, creates new indices and only after all that rewrites previous DB. So, you need 2 * <selected base CSV size> + <zip size> free space to make successful auto-updates. And even worse - script doesn't check for space availability at auto-update beginning!
-
More data precision = more storage space & more computing time. So, if you need only country by IP - don't use anything more than DB1LITE. Keep it as lean as possible, as do I.
-
Output is not parseable because of ambiguent spaces. Will be fixed by using custom delimiter.Bug #1, closed in c529b2b. -
This code can do something unexpected. I.e. burn your house, put your
head
under yourtail
or evenfsck
your dog. Don't blame me for that (as stated in LICENSE), just send me a postcard with funny photo of casualty attached.
Spoiler: Puppy Linux on Pentium 4 is fastest so far.
- CPU: MIPS 74K V4.9, 248.83 BogoMIPS
- 32 Mb RAM.
IPv4
DB1LITE, creating index: 0m 15.42s
Total time: 4m 28.22s (268.22s) per 1000 queries, Average value: 0.27s, Median value: 0.27s per query
DB3LITE, creating index: 7m 8.37s
Total time: 5m 12.69s (312.69s) per 1000 queries, Average value: 0.31s, Median value: 0.31s per query
DB5LITE, creating index: 8m 50.92s
Total time: 5m 15.19s (315.19s) per 1000 queries, Average value: 0.32s, Median value: 0.31s per query
DB9LITE, creating index: 9m 16.20s
Total time: 5m 35.07s (335.07s) per 1000 queries, Average value: 0.34s, Median value: 0.31s per query
DB11LITE, creating index: 13m 21.88s
Total time: 6m 22.76s (382.76s) per 1000 queries, Average value: 0.38s, Median value: 0.34s per query
IPv6
DB1LITEIPV6, creating index: 0m 31.44s
(With bc) Total time: 5m 37.44s (337.44s) per 1000 queries, Average value: 0.34s, Median value: 0.35s per query
(Without bc) Total time: 8m 42.38s (522.38s) per 1000 queries, Average value: 0.52s, Median value: 0.46s per query
DB3LITEIPV6, creating index: 8m 35.45s
(With bc) Total time: 5m 45.71s (345.71s) per 1000 queries, Average value: 0.35s, Median value: 0.33s per query
(Without bc) Total time: 9m 46.96s (586.96s) per 1000 queries, Average value: 0.59s, Median value: 0.50s per query
DB5LITEIPV6, creating index: 10m 22.65s
(With bc) Total time: 6m 0.73s (360.73s) per 1000 queries, Average value: 0.36s, Median value: 0.34s per query
(Without bc) Total time: 9m 20.82s (560.82s) per 1000 queries, Average value: 0.56s, Median value: 0.49s per query
DB9LITEIPV6, creating index: 11m 16.40s
(With bc) Total time: 7m 13.09s (433.09s) per 1000 queries, Average value: 0.43s, Median value: 0.41s per query
(Without bc) Total time: 13m 36.28s (816.28s) per 1000 queries, Average value: 0.82s, Median value: 0.70s per query
DB11LITEIPV6, creating index: 17m 53.45s
(With bc) Total time: 10m 14.88s (614.88s) per 1000 queries, Average value: 0.62s, Median value: 0.59s per query
(Without bc) Total time: 14m 24.67s (864.67s) per 1000 queries, Average value: 0.87s, Median value: 0.73s per query
- CPU: ARMv7 Processor rev 0 (v7l), 1987.37 BogoMIPS @ 2 cores
- 1Gb RAM.
DB1LITE, creating index: 0m 2.34s
Total time: 1m 14.80s (74.80s) per 1000 queries, Average value: 0.08s, Median value: 0.07s per query
DB3LITE, creating index: 1m 24.18s
Total time: 1m 54.57s (114.57s) per 1000 queries, Average value: 0.12s, Median value: 0.10s per query
DB5LITE, creating index: 1m 44.31s
Total time: 2m 27.41s (147.41s) per 1000 queries, Average value: 0.15s, Median value: 0.13s per query
DB9LITE, creating index: 1m 54.59s
Total time: 2m 38.98s (158.98s) per 1000 queries, Average value: 0.16s, Median value: 0.14s per query
DB11LITE, creating index: 2m 3.62s
Total time: 2m 51.69s (171.69s) per 1000 queries, Average value: 0.17s, Median value: 0.16s per query
- CPU: Intel(R) Pentium(R) 4 CPU 3.00Ghz, 5985.22 BogoMIPS
- 4Gb RAM.
DB1LITE, creating index: 0m 1.183s
Total time: 1m 23.36s (83.36s) per 1000 queries, Average value: 0.08s, Median value: 0.08s per query
DB3LITE, creating index: 0m 39.886s
Total time: 1m 37.21s (97.21s) per 1000 queries, Average value: 0.10s, Median value: 0.1s per query
DB5LITE, creating index: 0m 50.301s
Total time: 1m 50.85s (110.85s) per 1000 queries, Average value: 0.11s, Median value: 0.11s per query
DB9LITE, creating index: 0m 54.275s
Total time: 1m 56.88s (116.88s) per 1000 queries, Average value: 0.12s, Median value: 0.12s per query
DB11LITE, creating index: 1m 0.580s
Total time: 2m 4.27s (124.27s) per 1000 queries, Average value: 0.12s, Median value: 0.12s per query
- CPU: Intel(R) Pentium(R) 4 CPU 3.00GHz, 2060.28 BogoMIPS
- 512 Mb RAM.
DB1LITE, creating index: 0m 3.669s
Total time: 6m 51.36s (411.36s) per 1000 queries, Average value: 0.41s, Median value: 0.39s per query
DB3LITE, creating index: 1m 18.10s
Total time: 8m 49.33s (529.33s) per 1000 queries, Average value: 0.53s, Median value: 0.51s per query
DB5LITE, creating index: 1m 33.48s
Total time: 10m 29.28s (629.28s) per 1000 queries, Average value: 0.63s, Median value: 0.61s per query
DB9LITE, creating index: 1m 38.98s
Total time: 10m 42.33s (642.33s) per 1000 queries, Average value: 0.64s, Median value: 0.62s per query
DB11LITE, creating index: 1m 49.92s
Total time: 11m 57.38s (717.38s) per 1000 queries, Average value: 0.72s, Median value: 0.71s per query
- CPU: Intel(R) Pentium(R) 4 CPU 3.00GHz, 2060.28 BogoMIPS
- 3 Gb RAM.
DB1LITE, creating index: 0m 4.57s
Total time: 27m 55.76s (1675.76s) per 1000 queries, Average value: 1.68s, Median value: 1.45s per query
DB3LITE, creating index: 2m 22.34s
Total time: 5h 52m 54.88s (21174.88s) per 628 queries, Average value: 33.72s, Median value: 37.00s per query
^C
OK, enough. Cygwin is a pain.
...to be filled further
Any mentions, suggestions, pull-requests, bug reports, usage reports etc. are welcome and appreciated. Really. I mean it.
Ip2location staff for provided databases.
D-Link for outstanding hardware.
nibble@list.ru
https://facebook.com/Ip2loclean
https://vk.com/ip2loc_lean
Last update: 26.08.2017