#LOOPIA_User="username"
#
#LOOPIA_Password="password"
+#
+#LOOPIA_Api="https://api.loopia.<TLD>/RPCSERV"
-LOOPIA_Api="https://api.loopia.se/RPCSERV"
+LOOPIA_Api_Default="https://api.loopia.se/RPCSERV"
######## Public functions #####################
fulldomain=$1
txtvalue=$2
- LOOPIA_User="${LOOPIA_User:-$(_readaccountconf_mutable LOOPIA_User)}"
- LOOPIA_Password="${LOOPIA_Password:-$(_readaccountconf_mutable LOOPIA_Password)}"
- if [ -z "$LOOPIA_User" ] || [ -z "$LOOPIA_Password" ]; then
- LOOPIA_User=""
- LOOPIA_Password=""
- _err "You don't specify loopia user and password yet."
- _err "Please create you key and try again."
+ if ! _loopia_load_config; then
return 1
fi
- #save the api key and email to the account conf file.
- _saveaccountconf_mutable LOOPIA_User "$LOOPIA_User"
- _saveaccountconf_mutable LOOPIA_Password "$LOOPIA_Password"
+ _loopia_save_config
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_info "Adding record"
- _loopia_add_record "$_domain" "$_sub_domain"
- _loopia_update_record "$_domain" "$_sub_domain" "$txtvalue"
+ if ! _loopia_add_sub_domain "$_domain" "$_sub_domain"; then
+ return 1
+ fi
+ if ! _loopia_add_record "$_domain" "$_sub_domain" "$txtvalue"; then
+ return 1
+ fi
}
fulldomain=$1
txtvalue=$2
- LOOPIA_User="${LOOPIA_User:-$(_readaccountconf_mutable LOOPIA_User)}"
- LOOPIA_Password="${LOOPIA_Password:-$(_readaccountconf_mutable LOOPIA_Password)}"
- if [ -z "$LOOPIA_User" ] || [ -z "$LOOPIA_Password" ]; then
- LOOPIA_User=""
- LOOPIA_Password=""
- _err "You don't specify LOOPIA user and password yet."
- _err "Please create you key and try again."
+ if ! _loopia_load_config; then
return 1
fi
- #save the api key and email to the account conf file.
- _saveaccountconf_mutable LOOPIA_User "$LOOPIA_User"
- _saveaccountconf_mutable LOOPIA_Password "$LOOPIA_Password"
+ _loopia_save_config
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
<value><string>%s</string></value>
</param>
</params>
- </methodCall>' $LOOPIA_User $LOOPIA_Password "$_domain" "$_sub_domain")
+ </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$_domain" "$_sub_domain")
response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
if ! _contains "$response" "OK"; then
- _err "Error could not get txt records"
+ err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
+ _err "Error could not get txt records: $err_response"
return 1
fi
}
#################### Private functions below ##################################
+_loopia_load_config() {
+ LOOPIA_Api="${LOOPIA_Api:-$(_readaccountconf_mutable LOOPIA_Api)}"
+ LOOPIA_User="${LOOPIA_User:-$(_readaccountconf_mutable LOOPIA_User)}"
+ LOOPIA_Password="${LOOPIA_Password:-$(_readaccountconf_mutable LOOPIA_Password)}"
+
+ if [ -z "$LOOPIA_Api" ]; then
+ LOOPIA_Api="$LOOPIA_Api_Default"
+ fi
+
+ if [ -z "$LOOPIA_User" ] || [ -z "$LOOPIA_Password" ]; then
+ LOOPIA_User=""
+ LOOPIA_Password=""
+
+ _err "A valid Loopia API user and password not provided."
+ _err "Please provide a valid API user and try again."
+
+ return 1
+ fi
+
+ if _contains "$LOOPIA_Password" "'" || _contains "$LOOPIA_Password" '"'; then
+ _err "Password contains a quotation mark or double quotation marks and this is not supported by dns_loopia.sh"
+ return 1
+ fi
+
+ Encoded_Password=$(_xml_encode "$LOOPIA_Password")
+ return 0
+}
+
+_loopia_save_config() {
+ if [ "$LOOPIA_Api" != "$LOOPIA_Api_Default" ]; then
+ _saveaccountconf_mutable LOOPIA_Api "$LOOPIA_Api"
+ fi
+ _saveaccountconf_mutable LOOPIA_User "$LOOPIA_User"
+ _saveaccountconf_mutable LOOPIA_Password "$LOOPIA_Password"
+}
+
+_loopia_get_records() {
+ domain=$1
+ sub_domain=$2
+
+ xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
+ <methodCall>
+ <methodName>getZoneRecords</methodName>
+ <params>
+ <param>
+ <value><string>%s</string></value>
+ </param>
+ <param>
+ <value><string>%s</string></value>
+ </param>
+ <param>
+ <value><string>%s</string></value>
+ </param>
+ <param>
+ <value><string>%s</string></value>
+ </param>
+ </params>
+ </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain")
+
+ response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
+ if ! _contains "$response" "<array>"; then
+ err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
+ _err "Error: $err_response"
+ return 1
+ fi
+ return 0
+}
+
_get_root() {
domain=$1
_debug "get root"
<value><string>%s</string></value>
</param>
</params>
- </methodCall>' $LOOPIA_User $LOOPIA_Password)
+ </methodCall>' "$LOOPIA_User" "$Encoded_Password")
response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
while true; do
}
-_loopia_update_record() {
+_loopia_add_record() {
domain=$1
sub_domain=$2
txtval=$3
xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
- <methodName>updateZoneRecord</methodName>
+ <methodName>addZoneRecord</methodName>
<params>
<param>
<value><string>%s</string></value>
<value><string>%s</string></value>
</param>
<param>
- <struct>
- <member>
- <name>type</name>
- <value><string>TXT</string></value>
- </member>
- <member>
- <name>priority</name>
- <value><int>0</int></value>
- </member>
- <member>
- <name>ttl</name>
- <value><int>60</int></value>
- </member>
- <member>
- <name>rdata</name>
- <value><string>%s</string></value>
- </member>
- <member>
- <name>record_id</name>
- <value><int>0</int></value>
- </member>
- </struct>
+ <value>
+ <struct>
+ <member>
+ <name>type</name>
+ <value><string>TXT</string></value>
+ </member>
+ <member>
+ <name>priority</name>
+ <value><int>0</int></value>
+ </member>
+ <member>
+ <name>ttl</name>
+ <value><int>300</int></value>
+ </member>
+ <member>
+ <name>rdata</name>
+ <value><string>%s</string></value>
+ </member>
+ </struct>
+ </value>
</param>
</params>
- </methodCall>' $LOOPIA_User $LOOPIA_Password "$domain" "$sub_domain" "$txtval")
+ </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain" "$txtval")
response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
if ! _contains "$response" "OK"; then
- _err "Error"
+ err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
+ _err "Error: $err_response"
return 1
fi
return 0
}
-_loopia_add_record() {
+_sub_domain_exists() {
domain=$1
sub_domain=$2
+ xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
+ <methodCall>
+ <methodName>getSubdomains</methodName>
+ <params>
+ <param>
+ <value><string>%s</string></value>
+ </param>
+ <param>
+ <value><string>%s</string></value>
+ </param>
+ <param>
+ <value><string>%s</string></value>
+ </param>
+ </params>
+ </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain")
+
+ response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
+
+ if _contains "$response" "$sub_domain"; then
+ return 0
+ fi
+ return 1
+}
+
+_loopia_add_sub_domain() {
+ domain=$1
+ sub_domain=$2
+
+ if _sub_domain_exists "$domain" "$sub_domain"; then
+ return 0
+ fi
+
xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>addSubdomain</methodName>
<value><string>%s</string></value>
</param>
</params>
- </methodCall>' $LOOPIA_User $LOOPIA_Password "$domain" "$sub_domain")
+ </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain")
response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
if ! _contains "$response" "OK"; then
- _err "Error"
+ err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
+ _err "Error: $err_response"
return 1
fi
return 0
}
+
+_xml_encode() {
+ encoded_string=$1
+ encoded_string=$(echo "$encoded_string" | sed 's/&/\&/')
+ encoded_string=$(echo "$encoded_string" | sed 's/</\</')
+ encoded_string=$(echo "$encoded_string" | sed 's/>/\>/')
+ printf "%s" "$encoded_string"
+}