#!/bin/bash # # Fetch Service Provider metadata and save into entityid filename # error() { echo "Error: $*" 1>&2 exit 1 } metadataurl=$1 if [ -z "$metadataurl" ] ; then cat < Ex: `basename $0` https://shibsp.mysite.com/Shibboleth.sso/Metadata `basename $0` https://shibidp.mysite.com/idp/profile/Metadata/SAML `basename $0` some-downloaded-metadata.xml `basename $0` reep: `basename $0` (tries to pull from standard locations) EOF exit 1 fi xmldir=swamid-2.0 update_xml=true if echo "$metadataurl" | grep -qE '^http://|^https://' ; then metadata=`curl -L -s -k -f "$metadataurl"` elif echo "$metadataurl" | grep -qE '^reep:' ; then id=`echo -n "$metadataurl" | sed 's/^reep://' | sha1sum | awk '{print $1}'` metadataurl="http://md.reep.refeds.org/entities/%7Bsha1%7D$id" metadata=`curl -L -s -k -f "$metadataurl"` else if [ -s "${metadataurl}" ]; then metadata=`cat "$metadataurl"` else case $metadataurl in [0-9][0-9]*) xmldir=$(curl -L -m 5 -s -k -f "https://metadata.swamid.se/?show=feed&id=${metadataurl}") urls="https://metadata.swamid.se/?rawXML=${metadataurl}" update_xml=false ;; http*) urls="$metadataurl" ;; *) urls="https://${metadataurl}/idp/shibboleth https://${metadataurl}/Shibboleth.sso/Metadata https://${metadataurl}/saml/index/sp-metadata https://${metadataurl}/saml/metadata https://${metadataurl}/federationmetadata/2007-06/federationmetadata.xml" ;; esac for i in ${urls}; do metadata=`curl -L -m 5 -s -k -f "${i}"` [ -n "${metadata}" ] && break done fi fi [ -n "$metadata" ] || error "Failed to fetch metadata from $metadataurl" script_cwd=`dirname "$0"` if test -d $xmldir ; then echo "Moving into $xmldir/" cd $xmldir echo "$script_cwd" | grep -q ^/ || script_cwd=../$script_cwd fi entityid=`echo "$metadata" | sed -n 's/.*entityID=['\''"]\([^"]*\)['\''"].*/\1/p'` [ -n "$entityid" ] || error "Failed to find entityID in metadata" [ `echo "$entityid" | wc -l` = 1 ] || error "Multiple entityid:s found: `echo $entityid`" entityidfn=`echo "$entityid" | sed 's;.*://;;' | sed 's/[^a-zwA-ZW0-9_.-]/-/g' | sed 's/$/.xml/'` [ -n "$entityidfn" ] || error "Failed to generate filename from entityid $entityid" [ -r "$entityidfn" ] && new=false || new=true if $new ; then echo -n "Save metadata into $entityidfn [Y/n]? " else regdate=$(sed -n 's;.*RegistrationInfo.*registrationInstant="\([^"]*\)".*;\1;p' < "$entityidfn" | head -n 1) echo -n "Replace $entityidfn with metadata [Y/n]? " fi [ -n "$regdate" ] || regdate=$(perl $script_cwd/../scripts/now_date.pl) read x case $x in Y|y|"") echo "$metadata" > $entityidfn tmp=`mktemp` if $update_xml ; then xsltproc --stringparam regDate "$regdate" $script_cwd/../xslt/add-rpi.xsl ${entityidfn} > ${tmp} && mv ${tmp} ${entityidfn} fi xsltproc $script_cwd/../xslt/clean-entitydescriptor.xsl ${entityidfn} > ${tmp} && mv ${tmp} ${entityidfn} if $new ; then echo -n "Add ${xmldir}/$entityidfn to git [Y/n]? " read x case $x in Y|y|"") git add $entityidfn ;; *) echo "Not added" ;; esac fi ;; *) echo "Nothing done" ;; esac