You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.4 KiB
73 lines
2.4 KiB
6 months ago
|
import requests
|
||
|
import boto3
|
||
|
import os
|
||
|
import json
|
||
|
import datetime
|
||
|
import configparser
|
||
|
|
||
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||
|
os.chdir(script_dir)
|
||
|
|
||
|
# File to store the last known IP address
|
||
|
ip_file = 'last_ip'
|
||
|
|
||
|
# Include config data
|
||
|
config = configparser.ConfigParser()
|
||
|
config.read('settings.conf')
|
||
|
HostedZoneId = config['Settings']['HostedZoneId']
|
||
|
function_name = config['Settings']['function_name']
|
||
|
domain_list = config['Domains']['domain_list'].split(',')
|
||
|
ttl = config['Settings']['TTL']
|
||
|
ttl = int(ttl)
|
||
|
|
||
|
# Create a Lambda client
|
||
|
lambda_client = boto3.client('lambda')
|
||
|
|
||
|
def get_public_ip():
|
||
|
"""Fetch the current public IP address."""
|
||
|
response = requests.get("http://checkip.amazonaws.com")
|
||
|
return response.text.strip()
|
||
|
|
||
|
def read_last_ip():
|
||
|
"""Read the last known IP from file."""
|
||
|
if os.path.exists(ip_file):
|
||
|
with open(ip_file, 'r') as file:
|
||
|
return file.read().strip()
|
||
|
return None
|
||
|
|
||
|
def write_last_ip(ip):
|
||
|
"""Write the current IP to file as the last known IP."""
|
||
|
with open(ip_file, 'w') as file:
|
||
|
file.write(ip)
|
||
|
|
||
|
def invoke_lambda(ip_address, domain_name, HostedZoneId, ttl):
|
||
|
"""Invoke the Lambda function with the current IP address."""
|
||
|
response = lambda_client.invoke(
|
||
|
FunctionName=function_name,
|
||
|
InvocationType='RequestResponse',
|
||
|
Payload=json.dumps({'public_ip': ip_address, 'domain': domain_name, 'zoneId': HostedZoneId, 'ttl': ttl}) # Pass IP and domain as part of the payload
|
||
|
)
|
||
|
response_payload = response['Payload'].read()
|
||
|
print("Lambda response:", response_payload.decode('utf-8'))
|
||
|
|
||
|
def main():
|
||
|
current_ip = get_public_ip()
|
||
|
last_ip = read_last_ip()
|
||
|
|
||
|
if current_ip != last_ip:
|
||
|
print("Public IP has changed. Updating DNS by invoking AWS lambda Function...")
|
||
|
for domain_name in domain_list:
|
||
|
current_datetime = datetime.datetime.now()
|
||
|
formatted_datetime = current_datetime.strftime("%Y-%m-%d %H:%M:%S")
|
||
|
print(formatted_datetime, domain_name, current_ip)
|
||
|
invoke_lambda(current_ip, domain_name, HostedZoneId, ttl)
|
||
|
write_last_ip(current_ip)
|
||
|
else:
|
||
|
current_datetime = datetime.datetime.now()
|
||
|
formatted_datetime = current_datetime.strftime("%Y-%m-%d %H:%M:%S")
|
||
|
print(f"{formatted_datetime}: Public IP has not changed. No update needed, Lambda Not invoked.")
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|
||
|
|