From 5ccd3b227cde2e988e3a8f259a0a25b3c3c668bc Mon Sep 17 00:00:00 2001 From: Voomra Date: Wed, 24 Apr 2024 22:37:06 +0300 Subject: [PATCH] import code --- ihc-dns.sh | 298 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 ihc-dns.sh diff --git a/ihc-dns.sh b/ihc-dns.sh new file mode 100644 index 0000000..8b34327 --- /dev/null +++ b/ihc-dns.sh @@ -0,0 +1,298 @@ +#!/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 +