Smail/test/tools/add_dns.py
smail 9c450f1734
Some checks are pending
Security Checks / security (push) Waiting to run
运行时配置清理阶段检查点
2026-10-05 01:31:34 +08:00

78 lines
3.0 KiB
Python

import os
import urllib.request, urllib.parse, hmac, hashlib, base64, time, json, paramiko, subprocess
ak = os.environ['SMAIL_ALIDNS_ACCESS_KEY_ID']
sk = os.environ['SMAIL_ALIDNS_ACCESS_KEY_SECRET']
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.RejectPolicy())
from remote_ssh import connect_remote
connect_remote(client)
stdin, stdout, stderr = client.exec_command('cat /opt/smail/ssl/dkim/dkim.priv')
priv_key = stdout.read().decode('utf-8')
client.close()
p = subprocess.Popen(['openssl', 'rsa', '-pubout', '-outform', 'PEM'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate(input=priv_key.encode('utf-8'))
pub_lines = [line.strip() for line in out.decode('utf-8').splitlines() if '---' not in line and line.strip()]
dkim_pub = ''.join(pub_lines)
dkim_val = 'v=DKIM1; k=rsa; p=' + dkim_pub
print('DKIM Value:', dkim_val)
dmarc_val = 'v=DMARC1; p=quarantine; rua=mailto:admin@example.com'
print('DMARC Value:', dmarc_val)
def aliyun_request(params):
public_params = {
'Format': 'JSON',
'Version': '2015-01-09',
'AccessKeyId': ak,
'SignatureMethod': 'HMAC-SHA1',
'Timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()),
'SignatureVersion': '1.0',
'SignatureNonce': str(int(time.time()*1000)),
}
all_params = {**public_params, **params}
sorted_params = sorted(all_params.items())
query_str = urllib.parse.urlencode(sorted_params)
str_to_sign = 'GET' + chr(38) + '%2F' + chr(38) + urllib.parse.quote(query_str, safe='')
h = hmac.new((sk + chr(38)).encode('utf-8'), str_to_sign.encode('utf-8'), hashlib.sha1)
signature = base64.b64encode(h.digest()).decode('utf-8')
all_params['Signature'] = signature
url = 'https://alidns.aliyuncs.com/?' + urllib.parse.urlencode(all_params)
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
return json.loads(response.read().decode('utf-8'))
records = aliyun_request({'Action': 'DescribeDomainRecords', 'DomainName': 'example.com', 'PageSize': 50})
existing = { (r.get('RR'), r.get('Type')): r.get('RecordId') for r in records.get('DomainRecords', {}).get('Record', []) }
print('Existing RRs:', list(existing.keys()))
if ('_dmarc', 'TXT') not in existing:
print('Adding _dmarc...')
res = aliyun_request({
'Action': 'AddDomainRecord',
'DomainName': 'example.com',
'RR': '_dmarc',
'Type': 'TXT',
'Value': dmarc_val,
'TTL': 600
})
print('Added _dmarc result:', res)
else:
print('_dmarc already exists')
if ('default._domainkey', 'TXT') not in existing:
print('Adding default._domainkey...')
res = aliyun_request({
'Action': 'AddDomainRecord',
'DomainName': 'example.com',
'RR': 'default._domainkey',
'Type': 'TXT',
'Value': dkim_val,
'TTL': 600
})
print('Added default._domainkey result:', res)
else:
print('default._domainkey already exists')