# sets the replication policy for all objects in the MN where the calling member node is the  authoritative member node.
# This code can easily be changed to replace $identifiers with a custom list of ids
# the $xml_path should point to a XML file with the replication policy to apply to all based on xmlns:d1="http://ns.dataone.org/service/types/v1" 
# 
# Dependencies:
#	xmlstarlet - developed with version 1.0.1
#	curl - developed with version 7.19.7

authoritativeMN="urn:node:mnDemo8"
MN_base_URL="https://mn-demo-8.test.dataone.org/knb/d1/mn/v1"
CN_base_URL="https://cn-dev.test.dataone.org/cn/v1"
cert_path="/var/metacat/certs/urn_node_mnDemo8.pem"
xml_path="replicapolicy.xml"

identifiers=$(curl -s -o - -E $cert_path "$MN_base_URL/object?count=7&replicaStatus=false" | xmlstarlet sel -t -m "//objectInfo" -v "identifier" -n)

failedIDs=""
successCount=0
failCount=0
skipCount=0

for id in ${identifiers};
do
        metadata=$(curl -s -o - -E $cert_path "$CN_base_URL/meta/${id}" | xmlstarlet sel -t -v "concat(//serialVersion,';',//authoritativeMemberNode)" -n)

        OIFS=$IFS
        IFS=";"
        arr=($metadata)
        if [ ${arr[1]} = $authoritativeMN ]; then
#echo "skip"
            echo "Updating replica policy for id: $id"
           statusCode=$(curl -s -o - -w "%{http_code}" -X PUT -E $cert_path --capath "/etc/ssl/certs" -F "serialVersion=${arr[0]}" -F "policy=@$xml_path" "$CN_base_URL/replicaPolicies/${id}")
            if [ $statusCode = "200" ]; then
                successCount=$(($successCount + 1))
            else
                failCount=$(($failCount + 1))
            fi

        else
            echo "$authoritativeMN is not the authoritative member node for id: $id. (is ${arr[1]})"
            failedIDs=$(printf "$failedIDs\n$id")
            skipCount=$(($skipCount + 1))
        fi
done

echo -e "\n\nDONE\n----------------------------------"
echo -e "\nSUCCESSES: $successCount"
echo -e "\nFAILURES: $failCount"
echo -e "\n\nSKIPS (objects with a different authoritative member node): $skipCount"
echo -e "\nIDs of objects with a different authoritative member node: \n$failedIDs"