#!/bin/bash COOKIE_JAR=/tmp/ihc-cookie.txt DNS_PAGE=/tmp/ihc-dns.html V_USER= V_PASSWORD= V_ACTION= V_DOMAIN= V_NAME= V_TYPE= V_CONTENT= V_RECORD= ################################################################################ function auth() { # Авторизация local __login=$1 local __password=$2 local __result=$(curl -s -X POST 'https://my.ihc.ru/j_spring_security_check?ajax=true' \ --cookie-jar $COOKIE_JAR \ -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ -H 'Referer: https://my.ihc.ru/login/auth' \ --data-raw "j_username=${__login}&j_password=${__password}&recaptcha=&ihccaptcha=" \ | jq -r '.alert.type') if [[ $__result != 'none' ]]; then echo 'ERROR AUTH' exit 1 fi } function get_domains() { # Получить список доступных доменов # RETURN # { # "id": 1234567, # "domain": "example.com" # } curl -s -X GET 'https://my.ihc.ru/dnsZone/list' \ --cookie $COOKIE_JAR \ --cookie-jar $COOKIE_JAR \ > $DNS_PAGE xmllint --html --xpath '//li[@class="zoneList__zone "]/*/a' $DNS_PAGE 2>/dev/null \ | perl -ne 'chop($_); m#href="/dnsZone/index/(.+?)">(.+?)#; print "{\"id\": $1, \"domain\": \"$2\"}\n"' \ | jq } function get_domain() { # RETURN # { # "id": 1234567, # "domain": "example.com" # } local __domain=$1 get_domains | jq '. | select(.domain == "'$__domain'")' } function get_domain_records() { local __domain_id=$1 curl -s -X POST \ --cookie $COOKIE_JAR \ --cookie-jar $COOKIE_JAR \ -H 'Accept: application/json, text/javascript, */*; q=0.01' \ -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ -H 'Referer: https://my.ihc.ru/dnsZone/index/'$__domain_id \ --data-raw 'id='$__domain_id \ 'https://my.ihc.ru/dnsZone/records' \ | jq '.data.records[]' } function create_record() { local __domain_id=$1 local __type=$2 local __content=$3 local __name=$4 curl -s -X POST \ --cookie $COOKIE_JAR \ --cookie-jar $COOKIE_JAR \ -H 'Accept: application/json, text/javascript, */*; q=0.01' \ -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ -H 'Referer: https://my.ihc.ru/dnsZone/index/'$__domain_id \ -H 'X-Requested-With: XMLHttpRequest' \ --data-raw 'name='$__name'&type='$__type'&content='$__content'&id='$__domain_id \ 'https://my.ihc.ru/dnsZone/createRecord' } function edit_record() { local __domain_id=$1 local __record_id=$2 local __type=$3 local __content=$4 local __name=$5 curl -s -X POST \ --cookie $COOKIE_JAR \ --cookie-jar $COOKIE_JAR \ -H 'Accept: application/json, text/javascript, */*; q=0.01' \ -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ -H 'Referer: https://my.ihc.ru/dnsZone/index/'$__domain_id \ -H 'X-Requested-With: XMLHttpRequest' \ --data-raw 'name='$__name'&content='$__content'&id='$__domain_id'&recordId='$__record_id'&type='$__type \ 'https://my.ihc.ru/dnsZone/updateRecord' } function delete_record() { local __domain_id=$1 local __record_id=$2 curl -s -X POST \ --cookie $COOKIE_JAR \ --cookie-jar $COOKIE_JAR \ -H 'Accept: application/json, text/javascript, */*; q=0.01' \ -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ -H 'Referer: https://my.ihc.ru/dnsZone/index/'$__domain_id \ -H 'X-Requested-With: XMLHttpRequest' \ --data-raw 'id='$__domain_id'&recordId='$__record_id \ 'https://my.ihc.ru/dnsZone/deleteRecord' } function clean() { rm $COOKIE_JAR rm $DNS_PAGE } ################################################################################ function action_list() { if [[ -z "$V_DOMAIN" ]]; then auth "$V_USER" "$V_PASSWORD" get_domains clean else auth "$V_USER" "$V_PASSWORD" get_domain_records $(get_domains | jq -r '. | select(.domain == "'$V_DOMAIN'") | .id') clean fi } function action_add() { if [[ -z "$V_DOMAIN" ]]; then echo "Требуется указать домен" exit 2 fi if [[ -z "$V_TYPE" ]]; then echo "Требуется указать тип контента" exit 2 fi if [[ -z "$V_CONTENT" ]]; then echo "Требуется указать контент" exit 2 fi auth "$V_USER" "$V_PASSWORD" local __domain_id=$(get_domains | jq -r '. | select(.domain == "'$V_DOMAIN'") | .id') create_record $__domain_id "$V_TYPE" "$V_CONTENT" "$V_NAME" | jq clean } function action_delete() { if [[ -z "$V_DOMAIN" ]]; then echo "Требуется указать домен" exit 3 fi if [[ -z "$V_RECORD" ]]; then echo "Требуется указать ID записи" exit 3 fi auth "$V_USER" "$V_PASSWORD" local __domain_id=$(get_domains | jq -r '. | select(.domain == "'$V_DOMAIN'") | .id') delete_record $__domain_id $V_RECORD | jq clean } function action_edit() { if [[ -z "$V_DOMAIN" ]]; then echo "Требуется указать домен" exit 4 fi if [[ -z "$V_RECORD" ]]; then echo "Требуется указать ID записи" exit 4 fi if [[ -z "$V_TYPE" ]]; then echo "Требуется указать тип контента" exit 4 fi if [[ -z "$V_CONTENT" ]]; then echo "Требуется указать контент" exit 4 fi auth "$V_USER" "$V_PASSWORD" local __domain_id=$(get_domains | jq -r '. | select(.domain == "'$V_DOMAIN'") | .id') edit_record $__domain_id $V_RECORD "$V_TYPE" "$V_CONTENT" "$V_NAME" | jq clean } function entry_point() { if [[ -z "$V_USER" ]] || [[ -z "$V_PASSWORD" ]]; then echo "Требуется указать логин и пароль" exit 1 fi if [[ -z "$V_ACTION" ]]; then echo "Треуется действие" exit 1 fi case "$V_ACTION" in "list") action_list ;; "add") action_add ;; "edit") action_edit ;; "delete") action_delete ;; esac } ################################################################################ # https://www.baeldung.com/linux/bash-parse-command-line-arguments VALID_ARGS=$(getopt -o '' --long user:,password:,domain:,list,add,edit,name:,type:,content:,delete,record: -- "$@") if [[ $? -ne 0 ]]; then exit 1; fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in --user) V_USER=$2 shift 2 ;; --password) V_PASSWORD=$2 shift 2 ;; --domain) V_DOMAIN=$2 shift 2 ;; --list) V_ACTION="list" shift ;; --add) V_ACTION="add" shift ;; --edit) V_ACTION="edit" shift ;; --name) V_NAME=$2 shift 2 ;; --type) V_TYPE=$2 shift 2 ;; --content) V_CONTENT=$2 shift 2 ;; --delete) V_ACTION="delete" shift ;; --record) V_RECORD=$2 shift 2 ;; --) shift break ;; esac done entry_point