Package: ninfo
nInfonInfo is a library, CLI tool, and web interface (and lots of plugins) for gathering information on any of the following:IP Address (v4 or v6)CIDR Block (v4 or v6)MAC AddressHostnameUsernameHashes (as in md5/sha1 etc)It consists of multiple plugin classes that implement aget_infofunction.
The classes contain metadata for the type of arguments they accept, and if
they are relevant for internal and or external hosts.The CLI toolListing plugins$ ninfo -l
Name                 Title                Description
cif                  CIF                  Collective Intelligence Framework
cymruwhois           Cymru Whois          Cymru Whois lookup
geoip                GeoIP                GeoIP
google_safebrowsing  Google Safe Browsing Google Safe Browsing check
....Getting informationSilly example, run two plugins against two addreses:$ ninfo -p geoip -p cymruwhois 8.8.8.8 4.2.2.2
=== 8.8.8.8 === 
*** Cymru Whois (Cymru Whois lookup) ***
15169 US 8.8.8.0/24 GOOGLE - Google Inc.

*** GeoIP (GeoIP) ***
US - United States

=== 4.2.2.2 === 
*** Cymru Whois (Cymru Whois lookup) ***
3356 US 4.0.0.0/9 LEVEL3 Level 3 Communications

*** GeoIP (GeoIP) ***
US - United StatesThe Library>>> from ninfo import Ninfo
>>> n=Ninfo()
>>> n.get_info("cymruwhois", "8.8.8.8")
{'cc': 'US', 'ip': '8.8.8.8', 'prefix': '8.8.8.0/24', 'asn': '15169', 'owner': 'GOOGLE - Google Inc.'}
>>> print n.get_info_text("geoip", "8.8.8.8")
US - United StatesThe Web InterfaceSeehttps://github.com/justinazoff/ninfo_weborhttps://github.com/justinazoff/django-ninfoWriting A pluginHere's a plugin:fromninfoimportPluginBaseclassfun_plugin(PluginBase):"""This plugin returns something cool!"""name='fun'title='Fun Plugin'description='Happy Fun time'cache_timeout=60*2types=['ip','hostname']#def setup(self):#    #libraries should be lazy imported in setup. This is only called once.#    import mybackendlibrary#    self.client = mybackendlibrary.Client()defget_info(self,arg):#should always return a dictionary, even for a single value#multiple values are the norm, and allow values to be added without breakageresult='hello%s'%argreturn{"result":result}plugin_class=fun_pluginIf installed, this plugin can be run as follows:>>> from ninfo import Ninfo
>>> p = Ninfo()
>>> print p.get_info('fun', 'justin.rules')
{'result': 'hello justin.rules'}I had to include a '.' in the argument, because without it, ninfo will assume
the argument is a 'user' and not an 'ip' or a 'hostname', and it will not run
the plugin.Plugins are installed and located using entry_points. If the above class was in a python module
called fun_plugin, it would be installed by the following in setup.py:...py_modules=["fun_plugin"],entry_points={'ninfo.plugin':['fun = fun_plugin',]...Plugin MetadataStrings__doc__ - The python docstring of the class is used as the long_description for the plugin.name - The name of the plugin. Can be anything, but keeping it limited to [a-z_] is recommended.title - The title of the plugin. This is what is actually displayed to the user.description - Short description of the plugin.cache_timeout - timeout in seconds that this plugin should be cached in
memcache, and the max-age parameter sent by the web interface.types - A list of one or more of 'mac', 'ip4', 'ip6', 'cidr4', 'cidr6', 'hostname', 'username'.local - if False, this plugin will not be run against local hosts.remote - if False, this plugin will not be run against remote hosts.Cloned PluginsMultiple instances of a plugin can be created by adding another section in the
configuration file and optionally overriding the plugin metadata:[plugin:geoip]
path = GeoIP.dat

[plugin:geoipcity]
clone = geoip
path = GeoIPCity.dat
title = City GeoIP
description = City Level GeoIPSee Alsoninfo_web- basic web interfacedjango-ninfo- ninfo integrated with djangoninfo-plugin-template- paster template for creating pluginsninfo-client- REST client for ninfo_web or django-ninfoSearch github for ninfo-plugin- more plugins