Skip to content

Instantly share code, notes, and snippets.

@lhaagsma
Created May 31, 2019 22:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lhaagsma/20822e23045af88b33edbf7d1123d8db to your computer and use it in GitHub Desktop.
Save lhaagsma/20822e23045af88b33edbf7d1123d8db to your computer and use it in GitHub Desktop.
Download and provide interface to port to service (better then socket.getservbyport, as /etc/services is not always complete)
#!/usr/bin/env python
import os
import csv
import requests
CSV_DIR = 'resources'
CSV_PATH = 'resources/service-names-port-numbers.csv'
URL = 'https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv'
def _download_and_save(outfile):
data = requests.get(URL).content
open(outfile, 'w').write(data)
class PortToName(object):
def __init__(self, csv_path=CSV_PATH):
self.map = {}
self.csv_path = csv_path
if not os.path.exists(CSV_DIR):
os.mkdir(CSV_DIR)
if not os.path.exists(CSV_PATH):
_download_and_save(CSV_PATH)
self._load_csv()
def _load_csv(self):
with open(self.csv_path) as fh:
for row in csv.DictReader(fh, delimiter=','):
port = row['Port Number']
service = row['Service Name']
if service == '':
continue
self.map[port] = service
def resolve(self, port, filler='-'):
return self.map.get(str(port), filler)
if __name__ == '__main__':
port_resolver = PortToName()
print port_resolver.resolve(445)
print port_resolver.resolve('445')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment