**Expectation**: These unified hosts files should serve all devices, regardless of OS.
-## Sources of hosts data unified here
+## Sources of hosts data unified in this variant
Updated `hosts` files from the following locations are always unified and included:
-* The [Adaway hosts file](http://adaway.org/hosts.txt), updated regularly.
-* MVPs.org Hosts file at [http://winhelp2002.mvps.org/hosts.htm](http://winhelp2002.mvps.org/hosts.htm), updated
-monthly, or thereabouts.
-* Dan Pollock at [http://someonewhocares.org/hosts/](http://someonewhocares.org/hosts/) updated regularly.
-* Malware Domain List at [http://www.malwaredomainlist.com/](http://www.malwaredomainlist.com/), updated regularly.
-* Peter Lowe at [http://pgl.yoyo.org/adservers/](http://pgl.yoyo.org/adservers/), updated regularly.
-* My own small list in raw form [here](https://raw.github.com/StevenBlack/hosts/master/data/StevenBlack/hosts).
+Host file source | Description | Home page | Raw hosts | Update frequency
+-----------------|-------------|:---------:|:---------:|:-------:
+@SOURCEROWS@
+
## Extensions
The unified hosts file is extensible. You manage extensions by curating the `extensions/` folder tree.
def main():
- master = "https://github.com/StevenBlack/hosts/blob/master/"
- raw = "https://raw.githubusercontent.com/StevenBlack/hosts/master/"
- s = Template('${description} | [Readme](${master}${location}readme.md) | [link](${raw}${location}hosts) | [link](${raw}${location}hosts.zip) | ${fmtentries}')
+ s = Template('${description} | [Readme](https://github.com/StevenBlack/hosts/blob/master/${location}readme.md) | [link](https://raw.githubusercontent.com/StevenBlack/hosts/master/${location}hosts) | [link](https://raw.githubusercontent.com/StevenBlack/hosts/master/${location}hosts.zip) | ${fmtentries}')
with open(README_DATA_FILENAME, 'r') as f:
data = json.load(f)
tocRows += s.substitute(data[key]) + "\n"
+ rowdefaults = {
+ "name": "",
+ "description": "",
+ "homeurl": "",
+ "frequency": "",
+ "issues": "",
+ "url": ""}
+
+ t = Template('${name} | ${description} |[link](${homeurl}) | [raw](${url}) | ${frequency} ')
for key in keys:
extensions = key.replace( "-", ", ")
extensionsStr = "* Extensions: **" + extensions + "**."
extensionsHeader = "with "+ extensions + " extensions"
+ sourceRows = ""
+ sourceList = data[key]["sourcesdata"]
+ for source in sourceList:
+ thisrow = {}
+ thisrow.update(rowdefaults)
+ thisrow.update(source)
+ sourceRows += t.substitute(thisrow) + "\n"
+
with open(os.path.join(data[key]["location"],README_FILENAME), "wt") as out:
for line in open(README_TEMPLATE):
line = line.replace( '@GEN_DATE@', time.strftime("%B %d %Y", time.gmtime()))
line = line.replace( '@NUM_ENTRIES@', "{:,}".format(data[key]["entries"]))
line = line.replace( '@SUBFOLDER@',os.path.join(data[key]["location"], ''))
line = line.replace( '@TOCROWS@', tocRows )
+ line = line.replace( '@SOURCEROWS@', sourceRows )
out.write( line )
def cmp_keys(item):