[ create a new paste ] login | about

Link: http://codepad.org/0f5Yi67y    [ raw code | fork ]

Python, pasted on Jun 9:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Author: yura_nn
# License: GNU/GPL v3
#
# Предварительно нужно установить пакет Python urllib3. В Gentoo:
# emerge dev-python/urllib3
# Путь к файлу privoxy user.action.
import requests
import time

user_action_path = "/etc/privoxy/user.action"


def get_public_ip():
    return requests.get("https://wtfismyip.com/text").text.strip()


if __name__ == "__main__":
    with open(user_action_path, "r") as fd:
        user_action_lines = fd.readlines()

    while True:
        try:
            address = get_public_ip()
        except Exception as ex:
            print("failed to get external address: {}".format(ex))
            address = False

        if address:
            for idx, line in enumerate(user_action_lines):
                # Поиск строки, определяющей заголовок.
                first_find_symbol = line.find("{+add-header{X-Forwarded-For:")
                # Когда искомая строка найдена.
                if first_find_symbol != -1:
                    updated_line = "{+add-header{X-Forwarded-For: %s}}\n" % address
                    # Если новый IP-адрес (строка целиком) не совпадает со старым,
                    # то выполняется замена строки на новую.
                    if line != updated_line:
                        print("external address changed to {}, updating config".format(address))
                        del user_action_lines[idx]
                        user_action_lines.insert(idx, updated_line)
                        # Перезапись файла user.action.
                        try:
                            with open(user_action_path, "w") as fd:
                                fd.writelines(user_action_lines)
                        except IOError as ex:
                            print("failed to update config: {}".format(ex))
                            exit(1)

        # Ожидание 10 минут перед следующей проверкой.
        time.sleep(600)


Create a new paste based on this one


Comments: