Source of spfgenerator.deb (debian package).
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.

156 lines
3.0 KiB

#!/bin/sh
showHelp() {
cat <<EOF
NAME
spfgenerator generate SPF DNS entry
SYNOPSIS
spfgenerator [-h] [-s] [-mx] [-a [domain]] [-i domain] [-p fail|soft|neutral] [-d domain]
DESCRIPTION
spfgenerator generates SPF DNS entry
-h, --help
show this help.
-mx
Allow servers listed as MX to send email for the domain.
-ip <ip>
Allow IP to send email for the domain.
Can be used several times.
-i, --include <domain>
Any domains that may deliver or relay mail for the domain.
Can be used several times.
-a <domain>
Add any other server hostname that may deliver or relay mail for the domain.
If domain is empty, it allow current IP address of the domain to send email for the domain.
Can be used several times.
-p, --policy <fail|soft|neutral
How strict should be the servers treating the emails
neutral:
Mails will be probably accepted
Default value.
fail:
Not compliant will be rejected
soft:
Not compliant will be accepted but marked
-d, --domain <domain>
Default value: @
-s, --short
Only show the value
EOF
}
MX=0
IPv4s=
IPv6s=
INCLUDEs=
POLICY='?all'
DOMAIN=@
SHORT=0
As=
testData() {
if [ -z "$1" ]; then
(
echo "Invalid parameter ($2)\n"
showHelp
) >&2
exit 1
fi
}
addIp() {
if [ -n "$1" ]; then
if [ $(echo "$1" | egrep "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") ]; then
IPv4s="$IPv4s ip4:$1"
else
IPv6s="$IPv6s ip6:$1"
fi
fi
}
addA() {
if [ -z "$1" ]; then
As="$As a"
else
As="$As a:$1"
fi
}
addInclude() {
if [ -n "$1" ]; then
INCLUDEs="$INCLUDEs include:$1"
fi
}
for i in $@; do
case $1 in
-h|--help)
showHelp
exit 0
;;
-mx)
MX=1
shift
;;
-s|--short)
SHORT=1
shift
;;
-a)
shift
addA $1
shift
;;
-ip)
shift
addIp $1
shift
;;
-i|--include)
shift
addInclude $1
shift
;;
-p|--policy)
shift
case $1 in
neutral) POLICY='?all';;
soft) POLICY='~all';;
fail) POLICY='-all';;
esac
shift
;;
-d|--domain)
shift
DOMAIN=$1
shift
;;
esac
done
testData "$DOMAIN" domain
testData "$IPv4s$IPv6s" ip
(
if [ $MX -eq 1 ]; then
MX=mx
fi
if [ $SHORT -eq 0 ]; then
echo "$DOMAIN IN TXT \"v=spf1 $MX $As $IPv4s $IPv6s $INCLUDEs $POLICY\""
else
echo "v=spf1 $MX $As $IPv4s $IPv6s $INCLUDEs $POLICY"
fi
) | sed 's/ */ /g'