Our Flake8 linter's max-line-length constraint is now 120, so taking advantage of...
authorStevenBlack <redacted>
Tue, 20 Mar 2018 03:48:22 +0000 (23:48 -0400)
committerStevenBlack <redacted>
Tue, 20 Mar 2018 03:48:22 +0000 (23:48 -0400)
updateHostsFile.py

index 949e9d9e3ed5cd9c3359311aa8d454826159c443..5b057d33ef1fd4257a9139cc2ac0681edb79c56c 100644 (file)
@@ -6,8 +6,7 @@
 # This Python script will combine all the host files you provide
 # as sources into one, unique host file to keep you internet browsing happy.
 
-from __future__ import (absolute_import, division, print_function,
-                        unicode_literals)
+from __future__ import (absolute_import, division, print_function, unicode_literals)
 
 import argparse
 import fnmatch
@@ -76,11 +75,9 @@ def get_defaults():
         "sourcedatafilename": "update.json",
         "sourcesdata": [],
         "readmefilename": "readme.md",
-        "readmetemplate": path_join_robust(BASEDIR_PATH,
-                                           "readme_template.md"),
+        "readmetemplate": path_join_robust(BASEDIR_PATH, "readme_template.md"),
         "readmedata": {},
-        "readmedatafilename": path_join_robust(BASEDIR_PATH,
-                                               "readmeData.json"),
+        "readmedatafilename": path_join_robust(BASEDIR_PATH, "readmeData.json"),
         "exclusionpattern": "([a-zA-Z\d-]+\.){0,}",
         "exclusionregexs": [],
         "exclusions": [],
@@ -143,8 +140,7 @@ def main():
 
     options = vars(parser.parse_args())
 
-    options["outputpath"] = path_join_robust(BASEDIR_PATH,
-                                             options["outputsubfolder"])
+    options["outputpath"] = path_join_robust(BASEDIR_PATH, options["outputsubfolder"])
     options["freshen"] = not options["noupdate"]
 
     settings = get_defaults()
@@ -157,8 +153,7 @@ def main():
     settings["extensionsources"] = list_dir_no_hidden(extensions_path)
 
     # All our extensions folders...
-    settings["extensions"] = [os.path.basename(item) for item in
-                              list_dir_no_hidden(extensions_path)]
+    settings["extensions"] = [os.path.basename(item) for item in list_dir_no_hidden(extensions_path)]
     # ... intersected with the extensions passed-in as arguments, then sorted.
     settings["extensions"] = sorted(list(
         set(options["extensions"]).intersection(settings["extensions"])))
@@ -193,14 +188,12 @@ def main():
     remove_old_hosts_file(settings["backup"])
     if settings["compress"]:
         # Another mode is required to read and write the file in Python 3
-        final_file = open(path_join_robust(settings["outputpath"], "hosts"),
-                          "w+b" if PY3 else "w+")
+        final_file = open(path_join_robust(settings["outputpath"], "hosts"), "w+b" if PY3 else "w+")
         compressed_file = tempfile.NamedTemporaryFile()
         remove_dups_and_excl(merge_file, exclusion_regexes, compressed_file)
         compress_file(compressed_file, settings["targetip"], final_file)
     elif settings["minimise"]:
-        final_file = open(path_join_robust(settings["outputpath"], "hosts"),
-                          "w+b" if PY3 else "w+")
+        final_file = open(path_join_robust(settings["outputpath"], "hosts"), "w+b" if PY3 else "w+")
         minimised_file = tempfile.NamedTemporaryFile()
         remove_dups_and_excl(merge_file, exclusion_regexes, minimised_file)
         minimise_file(minimised_file, settings["targetip"], final_file)
@@ -271,8 +264,7 @@ def prompt_for_update(freshen, update_auto):
             # Starting in Python 3.3, IOError is aliased
             # OSError. However, we have to catch both for
             # Python 2.x failures.
-            print_failure("ERROR: No 'hosts' file in the folder. "
-                          "Try creating one manually.")
+            print_failure("ERROR: No 'hosts' file in the folder. Try creating one manually.")
 
     if not freshen:
         return
@@ -367,8 +359,7 @@ def prompt_for_move(final_file, **move_params):
     elif move_params["auto"] or skip_static_hosts:
         move_file = False
     else:
-        prompt = ("Do you want to replace your existing hosts file " +
-                  "with the newly generated file?")
+        prompt = ("Do you want to replace your existing hosts file with the newly generated file?")
         move_file = query_yes_no(prompt)
 
     if move_file:
@@ -379,8 +370,7 @@ def prompt_for_move(final_file, **move_params):
 
 
 # Exclusion logic
-def display_exclusion_options(common_exclusions, exclusion_pattern,
-                              exclusion_regexes):
+def display_exclusion_options(common_exclusions, exclusion_pattern, exclusion_regexes):
     """
     Display the exclusion options to the user.
 
@@ -443,13 +433,11 @@ def gather_custom_exclusions(exclusion_pattern, exclusion_regexes):
     # We continue running this while-loop until the user
     # says that they have no more domains to exclude.
     while True:
-        domain_prompt = ("Enter the domain you want "
-                         "to exclude (e.g. facebook.com): ")
+        domain_prompt = ("Enter the domain you want to exclude (e.g. facebook.com): ")
         user_domain = raw_input(domain_prompt)
 
         if is_valid_domain_format(user_domain):
-            exclusion_regexes = exclude_domain(user_domain, exclusion_pattern,
-                                               exclusion_regexes)
+            exclusion_regexes = exclude_domain(user_domain, exclusion_pattern, exclusion_regexes)
 
         continue_prompt = "Do you have more domains you want to enter?"
         if not query_yes_no(continue_prompt):
@@ -543,8 +531,7 @@ def update_sources_data(sources_data, **sources_params):
 
     source_data_filename = sources_params["sourcedatafilename"]
 
-    for source in recursive_glob(sources_params["datapath"],
-                                 source_data_filename):
+    for source in recursive_glob(sources_params["datapath"], source_data_filename):
         update_file = open(source, "r")
         update_data = json.load(update_file)
         sources_data.append(update_data)
@@ -553,8 +540,7 @@ def update_sources_data(sources_data, **sources_params):
     for source in sources_params["extensions"]:
         source_dir = path_join_robust(
             sources_params["extensionspath"], source)
-        for update_file_path in recursive_glob(source_dir,
-                                               source_data_filename):
+        for update_file_path in recursive_glob(source_dir, source_data_filename):
             update_file = open(update_file_path, "r")
             update_data = json.load(update_file)
 
@@ -613,8 +599,7 @@ def update_all_sources(source_data_filename, host_filename):
         if update_data.get("transforms"):
             update_transforms = update_data["transforms"]
 
-        print("Updating source " + os.path.dirname(
-            source) + " from " + update_url)
+        print("Updating source " + os.path.dirname(source) + " from " + update_url)
 
         try:
             updated_file = get_file_by_url(update_url)
@@ -767,14 +752,12 @@ def remove_dups_and_excl(merge_file, exclusion_regexes, output_file=None):
 
     if output_file is None:
         # Another mode is required to read and write the file in Python 3
-        final_file = open(path_join_robust(settings["outputpath"], "hosts"),
-                          "w+b" if PY3 else "w+")
+        final_file = open(path_join_robust(settings["outputpath"], "hosts"), "w+b" if PY3 else "w+")
     else:
         final_file = output_file
 
     merge_file.seek(0)  # reset file pointer
-    hostnames = {"localhost", "localhost.localdomain",
-                 "local", "broadcasthost"}
+    hostnames = {"localhost", "localhost.localdomain", "local", "broadcasthost"}
     exclusions = settings["exclusions"]
 
     for line in merge_file.readlines():
@@ -937,25 +920,19 @@ def write_opening_header(final_file, **header_params):
     write_data(final_file, "# This hosts file is a merged collection "
                            "of hosts from reputable sources,\n")
     write_data(final_file, "# with a dash of crowd sourcing via Github\n#\n")
-    write_data(final_file, "# Date: " + time.strftime(
-        "%B %d %Y", time.gmtime()) + "\n")
+    write_data(final_file, "# Date: " + time.strftime("%B %d %Y", time.gmtime()) + "\n")
 
     if header_params["extensions"]:
         write_data(final_file, "# Extensions added to this file: " + ", ".join(
             header_params["extensions"]) + "\n")
 
-    write_data(final_file, ("# Number of unique domains: " +
-                            "{:,}\n#\n".format(header_params[
-                                                   "numberofrules"])))
+    write_data(final_file, ("# Number of unique domains: {:,}\n#\n".format(header_params["numberofrules"])))
     write_data(final_file, "# Fetch the latest version of this file: "
-                           "https://raw.githubusercontent.com/"
-                           "StevenBlack/hosts/master/" +
-               path_join_robust(header_params["outputsubfolder"],
-                                "") + "hosts\n")
-    write_data(final_file, "# ==============================="
-                           "================================\n")
+                           "https://raw.githubusercontent.com/StevenBlack/hosts/master/" +
+               path_join_robust(header_params["outputsubfolder"], "") + "hosts\n")
     write_data(final_file, "# Project home page: https://github.com/StevenBlack/hosts\n")
     write_data(final_file, "# Project releases: https://github.com/StevenBlack/hosts/releases\n#\n")
+    write_data(final_file, "# ===============================================================\n")
     write_data(final_file, "\n")
 
     if not header_params["skipstatichosts"]:
@@ -1041,15 +1018,12 @@ def move_hosts_file_into_place(final_file):
     filename = os.path.abspath(final_file.name)
 
     if os.name == "posix":
-        print("Moving the file requires administrative privileges. "
-              "You might need to enter your password.")
+        print("Moving the file requires administrative privileges. You might need to enter your password.")
         if subprocess.call(SUDO + ["cp", filename, "/etc/hosts"]):
             print_failure("Moving the file failed.")
     elif os.name == "nt":
-        print("Automatically moving the hosts file "
-              "in place is not yet supported.")
-        print("Please move the generated file to "
-              "%SystemRoot%\system32\drivers\etc\hosts")
+        print("Automatically moving the hosts file in place is not yet supported.")
+        print("Please move the generated file to %SystemRoot%\system32\drivers\etc\hosts")
 
 
 def flush_dns_cache():
@@ -1058,8 +1032,7 @@ def flush_dns_cache():
     """
 
     print("Flushing the DNS cache to utilize new hosts file...")
-    print("Flushing the DNS cache requires administrative privileges. " +
-          "You might need to enter your password.")
+    print("Flushing the DNS cache requires administrative privileges. You might need to enter your password.")
 
     dns_cache_found = False
 
@@ -1095,8 +1068,7 @@ def flush_dns_cache():
             for service_type in service_types:
                 service = service_type + ".service"
                 service_file = path_join_robust(system_dir, service)
-                service_msg = ("Flushing the DNS cache by "
-                               "restarting " + service + " {result}")
+                service_msg = ("Flushing the DNS cache by restarting " + service + " {result}")
 
                 if os.path.isfile(service_file):
                     dns_cache_found = True
@@ -1107,8 +1079,7 @@ def flush_dns_cache():
                         print_success(service_msg.format(result="succeeded"))
 
         dns_clean_file = "/etc/init.d/dns-clean"
-        dns_clean_msg = ("Flushing the DNS cache via "
-                         "dns-clean executable {result}")
+        dns_clean_msg = ("Flushing the DNS cache via dns-clean executable {result}")
 
         if os.path.isfile(dns_clean_file):
             dns_cache_found = True
@@ -1336,8 +1307,7 @@ def query_yes_no(question, default="yes"):
         elif choice in valid:
             reply = valid[choice]
         else:
-            print_failure("Please respond with 'yes' or 'no' "
-                          "(or 'y' or 'n').\n")
+            print_failure("Please respond with 'yes' or 'no' (or 'y' or 'n').\n")
 
     return reply == "yes"
 
@@ -1364,8 +1334,7 @@ def is_valid_domain_format(domain):
     domain_regex = re.compile("www\d{0,3}[.]|https?")
 
     if domain_regex.match(domain):
-        print("The domain " + domain +
-              " is not valid. Do not include "
+        print("The domain " + domain + " is not valid. Do not include "
               "www.domain.com or http(s)://domain.com. Try again.")
         return False
     else:
@@ -1434,8 +1403,7 @@ def path_join_robust(path, *paths):
 
         return os.path.join(path, *paths)
     except UnicodeDecodeError as e:
-        raise locale.Error("Unable to construct path. This is "
-                           "likely a LOCALE issue:\n\n" + str(e))
+        raise locale.Error("Unable to construct path. This is likely a LOCALE issue:\n\n" + str(e))
 
 
 # Colors
@@ -1461,8 +1429,7 @@ def supports_color():
     """
 
     sys_platform = sys.platform
-    supported = sys_platform != "Pocket PC" and (sys_platform != "win32"
-                                                 or "ANSICON" in os.environ)
+    supported = sys_platform != "Pocket PC" and (sys_platform != "win32" or "ANSICON" in os.environ)
 
     atty_connected = hasattr(sys.stdout, "isatty") and sys.stdout.isatty()
     return supported and atty_connected
git clone https://git.99rst.org/PROJECT