├── LICENSE ├── README.md ├── ncdapi.sh └── screenshots ├── netcup-1.png ├── netcup-2.png └── netcup-3.png /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 linux-insideDE 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UNMAINTAINED ncdapi (inofficial netcup DNS API Client) 2 | 3 | This script is currently unmaintained. Due to the fact that changes need at least 10 minutes to be applied and the api still does not support setting a ttl per record. 4 | 5 | > [!IMPORTANT] 6 | > This repo was archived, because the client uses an old API. The entire DNS infrastructure and API could hopefully be replaced by an excellent one in 2024. 7 | 8 | ## WARNING 9 | This client is well tested, but it is possible that some actions provoke a bug, so the use of this client is on your own risk and may result in lost of your zone data. 10 | 11 | ### Requirements 12 | - jq (a json parser) 13 | - curl 14 | 15 | ### Credentials 16 | To use this script you must replace the values at beginning of the script with your: 17 | ``` 18 | #Credentials 19 | apikey=YOUR_API_KEY 20 | apipw=YOUR_API_PASSWORD 21 | cid=YOUR_CUSTOMERNUMBER 22 | ``` 23 | ### How to use 24 | ``` 25 | IMPORTANT: Only ONE Argument like -N or -dN 26 | If you have a string which is including spaces use "around your string" 27 | 28 | -d Debug Mode ncdapi.sh -d... 29 | -N NEW Record ncdapi.sh -N HOST DOMAIN RECORDTYPE DESTINATION [PRIORITY] 30 | -M MOD Record ncdapi.sh -M ID HOST DOMAIN RECORDTYPE DESTINATION [PRIORITY] 31 | -D DEL Record ncdapi.sh -D ID HOST DOMAIN RECORDTYPE DESTINATION [PRIORITY] 32 | -g get all Records ncdapi.sh -g DOMAIN 33 | -b backup from Zone ncdapi.sh -b DOMAIN 34 | -R Restore Zone ncdapi.sh -R FILE 35 | -s get SOA ncdapi.sh -s DOMAIN 36 | -S change SOA ncdapi.sh -S DOMAIN TTL REFRESH RETRY EXPIRE DNSSECSTATUS 37 | -l list all Domains ncdapi.sh -l 38 | -h this help 39 | 40 | Examples: 41 | New CAA Record: ncdapi.sh -N @ example.com CAA "0 issue letsencrypt.org" 42 | New A Record: ncdapi.sh -N @ example.com A 127.0.0.1 43 | New MX Record: ncdapi.sh -N @ example.com MX mail.example.com 20 44 | Get all records: ncdapi.sh -g example.com 45 | Delete Record: ncdapi.sh -D 1234567 @ example.com A 127.0.0.1 46 | Change SOA: ncdapi.sh -S example.com 3600 28800 7200 1209600 true 47 | ``` 48 | 49 | ### Functions 50 | * add new record 51 | * modify record/SOA 52 | * delete record 53 | * get all records/domains 54 | * backup/restore of zone + SOA 55 | * If the api returns a failure the session will automatically make invalid and the plain JSON from the api will be written to stdout 56 | 57 | ### TODO 58 | - DynDNS capability if the api get the possibility for per record TTL in near future 59 | - ... 60 | 61 | ## How to obtain the DNS entry ID? 62 | 63 | First, login to the [netcup](https://netcup.de) website. Navigate to "Domains" -> choose your domain -> "DNS" section: 64 | 65 | ![netcup NDS section](./screenshots/netcup-1.png) 66 | 67 | Then click with the right mouse button on the desired DNS entry from which the ID should come from. Choose the "inspect element" menue entry. 68 | 69 | ![DNS entries for a domain](./screenshots/netcup-2.png) 70 | 71 | Now you should see the developer tools and a ``-element. The number in the `name`-attribute's value after `record[` is the wanted number. 72 | 73 | ![DNS entry's ID](./screenshots/netcup-3.png) 74 | 75 | Copy this ID (here: 12176576) into your script. 76 | 77 | developed by linxside @GPN18 78 | -------------------------------------------------------------------------------- /ncdapi.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #developed by linux-insideDE @GPN18 3 | 4 | #Credentials 5 | apikey=YOUR_API_KEY 6 | apipw=YOUR_API_PASSWORD 7 | cid=YOUR_CUSTOMERNUMBER 8 | 9 | end="https://ccp.netcup.net/run/webservice/servers/endpoint.php?JSON" 10 | client="" 11 | debug=false 12 | 13 | #functions 14 | login() { 15 | tmp=$(curl -s -X POST -d "{\"action\": \"login\", \"param\": {\"apikey\": \"$apikey\", \"apipassword\": \"$apipw\", \"customernumber\": \"$cid\"}}" "$end") 16 | sid=$(echo "${tmp}" | jq -r .responsedata.apisessionid) 17 | if [ $debug = true ]; then 18 | msg=$(echo "${tmp}" | jq -r .shortmessage) 19 | echo "$msg" 20 | fi 21 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 22 | echo "Error: $tmp" 23 | return 1 24 | fi 25 | } 26 | logout() { 27 | tmp=$(curl -s -X POST -d "{\"action\": \"logout\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\"}}" "$end") 28 | if [ $debug = true ]; then 29 | msg=$(echo "${tmp}" | jq -r .shortmessage) 30 | echo "$msg" 31 | fi 32 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 33 | echo "Error: Session isn't made invalid !!!" 34 | echo "Error: $tmp" 35 | return 1 36 | fi 37 | } 38 | addRecord() { 39 | login 40 | if [ "$3" == "CAA" ] || [ "$3" == "caa" ]; then 41 | if [ "$(echo "$4" | cut -d' ' -f2)" == "issue" ] || [ "$(echo "$4" | cut -d' ' -f2)" == "iodef" ] || [ "$(echo "$4" | cut -d' ' -f2)" == "issuewild" ]; then 42 | prepstate=$(echo "$4" | cut -d' ' -f3) 43 | dest=${4//$prepstate/\\"\"$prepstate\\"\"} 44 | else 45 | echo "Error: Please Check your CAA Record" 46 | logout 47 | exit 1 48 | fi 49 | else 50 | dest=$4 51 | fi 52 | tmp=$(curl -s -X POST -d "{\"action\": \"updateDnsRecords\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\",\"clientrequestid\": \"$client\" , \"domainname\": \"$2\", \"dnsrecordset\": { \"dnsrecords\": [ {\"id\": \"\", \"hostname\": \"$1\", \"type\": \"$3\", \"priority\": \"${5:-"0"}\", \"destination\": \"$dest\", \"deleterecord\": \"false\", \"state\": \"yes\"} ]}}}" "$end") 53 | if [ $debug = true ]; then 54 | echo "${tmp}" 55 | fi 56 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 57 | echo "Error: $tmp" 58 | logout 59 | return 1 60 | fi 61 | echo "${tmp}" | jq --arg host "$1" --arg type "$3" --arg dest "$dest" '.responsedata.dnsrecords[] | select(.hostname==$host and .type==$type and .destination==$dest) .id' | tr -d \" 62 | logout 63 | } 64 | delRecord() { 65 | login 66 | if [ "$4" == "CAA" ] || [ "$4" == "caa" ]; then 67 | if [ "$(echo "$5" | cut -d' ' -f2)" == "issue" ] || [ "$(echo "$5" | cut -d' ' -f2)" == "iodef" ] || [ "$(echo "$5" | cut -d' ' -f2)" == "issuewild" ]; then 68 | prepstate=$(echo "$5" | cut -d' ' -f3) 69 | dest=${5//$prepstate/\\"\"$prepstate\\"\"} 70 | else 71 | echo "Error: Please Check your CAA Record" 72 | logout 73 | exit 1 74 | fi 75 | else 76 | dest=$5 77 | fi 78 | tmp=$(curl -s -X POST -d "{\"action\": \"updateDnsRecords\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\",\"clientrequestid\": \"$client\" , \"domainname\": \"$3\", \"dnsrecordset\": { \"dnsrecords\": [ {\"id\": \"$1\", \"hostname\": \"$2\", \"type\": \"$4\", \"priority\": \"${6:-"0"}\", \"destination\": \"$dest\", \"deleterecord\": \"TRUE\", \"state\": \"yes\"} ]}}}" "$end") 79 | if [ $debug = true ]; then 80 | echo "${tmp}" 81 | fi 82 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 83 | echo "Error: $tmp" 84 | logout 85 | return 1 86 | fi 87 | logout 88 | } 89 | modRecord() { 90 | login 91 | if [ "$4" == "CAA" ] || [ "$4" == "caa" ]; then 92 | if [ "$(echo "$5" | cut -d' ' -f2)" == "issue" ] || [ "$(echo "$5" | cut -d' ' -f2)" == "iodef" ] || [ "$(echo "$5" | cut -d' ' -f2)" == "issuewild" ]; then 93 | prepstate=$(echo "$5" | cut -d' ' -f3) 94 | dest=${5//$prepstate/\\"\"$prepstate\\"\"} 95 | else 96 | echo "Error: Please Check your CAA Record" 97 | logout 98 | exit 1 99 | fi 100 | else 101 | dest=$5 102 | fi 103 | tmp=$(curl -s -X POST -d "{\"action\": \"updateDnsRecords\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\",\"clientrequestid\": \"$client\" , \"domainname\": \"$3\", \"dnsrecordset\": { \"dnsrecords\": [ {\"id\": \"$1\", \"hostname\": \"$2\", \"type\": \"$4\", \"priority\": \"${6:-"0"}\", \"destination\": \"$dest\", \"deleterecord\": \"FALSE\", \"state\": \"yes\"} ]}}}" "$end") 104 | if [ $debug = true ]; then 105 | echo "${tmp}" 106 | fi 107 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 108 | echo "Error: $tmp" 109 | logout 110 | return 1 111 | fi 112 | logout 113 | } 114 | getSOA() { 115 | login 116 | tmp=$(curl -s -X POST -d "{\"action\": \"infoDnsZone\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\", \"domainname\": \"$1\"}}" "$end") 117 | if [ $debug = true ]; then 118 | echo "$tmp" 119 | fi 120 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 121 | echo "Error: $tmp" 122 | logout 123 | return 1 124 | fi 125 | xxd=$(echo "${tmp}" | jq -r '.responsedata') 126 | echo "$xxd" 127 | logout 128 | } 129 | getSOAONESESSION() { 130 | tmp=$(curl -s -X POST -d "{\"action\": \"infoDnsZone\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\", \"domainname\": \"$1\"}}" "$end") 131 | xxd=$(echo "${tmp}" | jq -r '.responsedata') 132 | echo "$xxd" 133 | } 134 | setSOA() { 135 | login 136 | tmp=$(curl -s -X POST -d "{\"action\": \"updateDnsZone\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\",\"clientrequestid\": \"$client\" , \"domainname\": \"$1\", \"dnszone\": { \"name\": \"$1\", \"ttl\": \"$2\", \"serial\": \"\", \"refresh\": \"$3\", \"retry\": \"$4\", \"expire\": \"$5\", \"dnssecstatus\": \"$6\"} }}" "$end") 137 | if [ $debug = true ]; then 138 | echo "${tmp}" 139 | fi 140 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 141 | echo "Error: $tmp" 142 | logout 143 | return 1 144 | fi 145 | logout 146 | } 147 | listDomains() { 148 | login 149 | tmp=$(curl -s -X POST -d "{\"action\": \"listallDomains\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\", \"domainname\": \"$1\"}}" "$end") 150 | if [ $debug = true ]; then 151 | echo "$tmp" 152 | fi 153 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 154 | echo "Error: $tmp" 155 | logout 156 | return 1 157 | fi 158 | xxd=$(echo "${tmp}" | jq -r '.responsedata[].domainname') 159 | echo "$xxd" 160 | logout 161 | } 162 | getRecords() { 163 | login 164 | tmp=$(curl -s -X POST -d "{\"action\": \"infoDnsRecords\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\", \"domainname\": \"$1\"}}" "$end") 165 | if [ $debug = true ]; then 166 | echo "$tmp" 167 | fi 168 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 169 | echo "Error: $tmp" 170 | logout 171 | return 1 172 | fi 173 | xxd=$(echo "${tmp}" | jq -r '.responsedata.dnsrecords') 174 | echo "$xxd" 175 | logout 176 | } 177 | getRecordsONESESSION() { 178 | tmp=$(curl -s -X POST -d "{\"action\": \"infoDnsRecords\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\", \"domainname\": \"$1\"}}" "$end") 179 | xxd=$(echo "$tmp" | jq -r '.responsedata.dnsrecords') 180 | echo "$xxd" 181 | } 182 | backup() { 183 | login 184 | debug=false 185 | soa=$(getSOAONESESSION "$1") 186 | records=$(getRecordsONESESSION "$1") 187 | statement="{\"soa\":$soa,\"records\":$records}" 188 | echo "$statement" > backup-"$1"-"$(date +%Y%m%d)"-"$(date +%H%M%S)".txt 189 | logout 190 | } 191 | restore() { 192 | login 193 | bfile=$(cat "$1") 194 | name=$(echo "$bfile" | jq -r '.soa.name') 195 | ttl=$(echo "$bfile" | jq -r '.soa.ttl') 196 | refresh=$(echo "$bfile" | jq -r '.soa.refresh') 197 | retry=$(echo "$bfile" | jq -r '.soa.retry') 198 | expire=$(echo "$bfile" | jq -r '.soa.expire') 199 | dnssecstatus=$(echo "$bfile" | jq -r '.soa.dnssecstatus') 200 | currec=$(getRecordsONESESSION "$name") 201 | inc=0 202 | 203 | #update soa 204 | tmp=$(curl -s -X POST -d "{\"action\": \"updateDnsZone\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\",\"clientrequestid\": \"$client\" , \"domainname\": \"$name\", \"dnszone\": { \"name\": \"$name\", \"ttl\": \"$ttl\", \"serial\": \"\", \"refresh\": \"$refresh\", \"retry\": \"$retry\", \"expire\": \"$expire\", \"dnssecstatus\": \"$dnssecstatus\"} }}" "$end") 205 | if [ $debug = true ]; then 206 | echo "${tmp}" 207 | fi 208 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 209 | echo "Error: $tmp" 210 | logout 211 | return 1 212 | fi 213 | 214 | #del all 215 | len=$(echo "$currec" | jq '. | length') 216 | statement="" 217 | while [ "$inc" != "$len" ]; do 218 | id=$(echo "$currec" | jq -r .[$inc].id) 219 | host=$(echo "$currec" | jq -r .[$inc].hostname) 220 | type=$(echo "$currec" | jq -r .[$inc].type) 221 | prio=$(echo "$currec" | jq -r .[$inc].priority) 222 | dest=$(echo "$currec" | jq -r .[$inc].destination) 223 | if [ "$type" == "CAA" ] || [ "$type" == "caa" ]; then 224 | if [ "$(echo "$dest" | cut -d' ' -f2)" == "issue" ] || [ "$(echo "$dest" | cut -d' ' -f2)" == "iodef" ] || [ "$(echo "$dest" | cut -d' ' -f2)" == "issuewild" ]; then 225 | prepstate=$(echo "$dest" | cut -d' ' -f3) 226 | # shellcheck disable=SC2001 227 | dest=$(echo "$dest" | sed 's/\"/\\"/g') 228 | else 229 | echo "Error: Please Check your CAA Record" 230 | logout 231 | exit 1 232 | fi 233 | else 234 | dest=$dest 235 | fi 236 | 237 | if [ "$inc" = "$((len-1))" ]; then 238 | statement+="{\"id\": \"$id\", \"hostname\": \"$host\", \"type\": \"$type\", \"priority\": \"$prio\", \"destination\": \"$dest\", \"deleterecord\": \"TRUE\", \"state\": \"yes\"}" 239 | else 240 | statement+="{\"id\": \"$id\", \"hostname\": \"$host\", \"type\": \"$type\", \"priority\": \"$prio\", \"destination\": \"$dest\", \"deleterecord\": \"TRUE\", \"state\": \"yes\"}," 241 | 242 | fi 243 | inc=$((inc+1)) 244 | done 245 | tmp=$(curl -s -X POST -d "{\"action\": \"updateDnsRecords\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\",\"clientrequestid\": \"$client\" , \"domainname\": \"$name\", \"dnsrecordset\": { \"dnsrecords\": [ $statement ]}}}" "$end") 246 | if [ $debug = true ]; then 247 | echo "${tmp}" 248 | fi 249 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 250 | echo "Error: $tmp" 251 | logout 252 | return 1 253 | fi 254 | 255 | inc=0 256 | #add all 257 | statement="" 258 | len=$(echo "$bfile" | jq '.records | length') 259 | while [ "$inc" != "$len" ]; do 260 | host=$(echo "$bfile" | jq -r .records[$inc].hostname) 261 | type=$(echo "$bfile" | jq -r .records[$inc].type) 262 | prio=$(echo "$bfile" | jq -r .records[$inc].priority) 263 | dest=$(echo "$bfile" | jq -r .records[$inc].destination) 264 | if [ "$type" == "CAA" ] || [ "$type" == "caa" ]; then 265 | if [ "$(echo "$dest" | cut -d' ' -f2)" == "issue" ] || [ "$(echo "$dest" | cut -d' ' -f2)" == "iodef" ] || [ "$(echo "$dest" | cut -d' ' -f2)" == "issuewild" ]; then 266 | prepstate=$(echo "$dest" | cut -d' ' -f3) 267 | # shellcheck disable=SC2001 268 | dest=$(echo "$dest" | sed 's/\"/\\"/g') 269 | else 270 | echo "Error: Please Check your CAA Record" 271 | logout 272 | exit 1 273 | fi 274 | else 275 | dest=$dest 276 | fi 277 | if [ "$inc" = "$((len-1))" ]; then 278 | statement+="{\"id\": \"\", \"hostname\": \"$host\", \"type\": \"$type\", \"priority\": \"$prio\", \"destination\": \"$dest\", \"deleterecord\": \"false\", \"state\": \"yes\"}" 279 | else 280 | statement+="{\"id\": \"\", \"hostname\": \"$host\", \"type\": \"$type\", \"priority\": \"$prio\", \"destination\": \"$dest\", \"deleterecord\": \"false\", \"state\": \"yes\"}," 281 | fi 282 | inc=$((inc+1)) 283 | done 284 | tmp=$(curl -s -X POST -d "{\"action\": \"updateDnsRecords\", \"param\": {\"apikey\": \"$apikey\", \"apisessionid\": \"$sid\", \"customernumber\": \"$cid\",\"clientrequestid\": \"$client\" , \"domainname\": \"$name\", \"dnsrecordset\": { \"dnsrecords\": [ $statement ]}}}" "$end") 285 | if [ $debug = true ]; then 286 | echo "${tmp}" 287 | fi 288 | if [ "$(echo "$tmp" | jq -r .status)" != "success" ]; then 289 | echo "Error: $tmp" 290 | logout 291 | return 1 292 | fi 293 | logout 294 | } 295 | help() { 296 | echo "IMPORTANT: Only ONE Argument like -N or -dN" 297 | echo "If you have a string which is including spaces use \"around your string\"" 298 | echo "" 299 | echo "-d Debug Mode ncdapi.sh -d..." 300 | echo "-N NEW Record ncdapi.sh -N HOST DOMAIN RECORDTYPE DESTINATION [PRIORITY]" 301 | echo "-M MOD Record ncdapi.sh -M ID HOST DOMAIN RECORDTYPE DESTINATION [PRIORITY]" 302 | echo "-D DEL Record ncdapi.sh -D ID HOST DOMAIN RECORDTYPE DESTINATION [PRIORITY]" 303 | echo "-g get all Records ncdapi.sh -g DOMAIN" 304 | echo "-b backup from Zone ncdapi.sh -b DOMAIN" 305 | echo "-R Restore Zone ncdapi.sh -R FILE" 306 | echo "-s get SOA ncdapi.sh -s DOMAIN" 307 | echo "-S change SOA ncdapi.sh -S DOMAIN TTL REFRESH RETRY EXPIRE DNSSECSTATUS" 308 | echo "-l list all Domains ncdapi.sh -l" 309 | echo "-h this help" 310 | echo "" 311 | echo "Examples:" 312 | echo "New CAA Record: ncdapi.sh -N @ example.com CAA \"0 issue letsencrypt.org\"" 313 | echo "New A Record: ncdapi.sh -N @ example.com A 127.0.0.1" 314 | echo "New MX Record: ncdapi.sh -N @ example.com MX mail.example.com 20" 315 | echo "Get all records: ncdapi.sh -g example.com" 316 | echo "Delete Record: ncdapi.sh -D 1234567 @ example.com A 127.0.0.1" 317 | echo "Change SOA: ncdapi.sh -S example.com 3600 28800 7200 1209600 true" 318 | } 319 | 320 | #begin script 321 | 322 | if [ $# -eq 0 ]; then 323 | echo "No Argument" 324 | help 325 | fi 326 | 327 | while getopts 'NdDgMbRhslS' opt; do 328 | case "$opt" in 329 | d) debug=true;; 330 | N) addRecord "$2" "$3" "$4" "$5" "$6";; 331 | D) delRecord "$2" "$3" "$4" "$5" "$6" "$7" "$8";; 332 | g) getRecords "$2";; 333 | M) modRecord "$2" "$3" "$4" "$5" "$6" "$7";; 334 | b) backup "$2";; 335 | R) restore "$2";; 336 | s) getSOA "$2";; 337 | S) setSOA "$2" "$3" "$4" "$5" "$6" "$7";; 338 | l) listDomains "$2" ;; 339 | h) help;; 340 | *) echo "Invalid Argument";; 341 | esac 342 | done 343 | -------------------------------------------------------------------------------- /screenshots/netcup-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linxside/ncdapi/ce75805b1bea6fb44380360202b01cd21fcc7e3c/screenshots/netcup-1.png -------------------------------------------------------------------------------- /screenshots/netcup-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linxside/ncdapi/ce75805b1bea6fb44380360202b01cd21fcc7e3c/screenshots/netcup-2.png -------------------------------------------------------------------------------- /screenshots/netcup-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linxside/ncdapi/ce75805b1bea6fb44380360202b01cd21fcc7e3c/screenshots/netcup-3.png --------------------------------------------------------------------------------