Import document with bash script using SOAP
The script imports a document into OpenKM server using SOAP Webservices.
Download the script import_sh.zip.
#!/bin/sh
##############################################################################
# Copyright (c) 2013: Jörg Palmer, JoergPalmer @ OpenKM forums
#
# Script for importing a document into OpenKM via web services
# 1. Logon using an "import user"
# 2. Import the document into a pre-defined folder
# 3. Logoff the server
##############################################################################
### Configuration section, please adjust to your setup
OKM_ID="autoImport" # User ID / name
OKM_PW="Import42" # Password
### Configuration section ends here
### DO NOT CHANGE FROM HERE UNLESS YOU KNOW WHAT YOU ARE DOING!
# Constants definition
TOOLNAME="OpenKM_import"
VERSION="v1.0"
# Possible exit codes
EXIT_OK="0" # 0=success
EXIT_BAD_ARGS="1" # 1=wrong number of parameters
EXIT_BAD_LOGON="2" # 2=logon to OpenKM failed
EXIT_BAD_LOGOFF="3" # 3=Logoff from OpenKM failed
# LOG Level
LOG_ERR="0" # 0=only error messages
LOG_INFO="1" # 1=error messages and some infos
LOG_DEBUG="2" # 2=debug level logging
START=`date +%s`
usage() {
cat << EOF
--------------------------------------------------------------------------------------
Script to import a document into an OpenKM server, using SOAP web services.
Please adjust the user id settings at the beginning of the script to your needs.
Copyright: Jörg Palmer
Version: $VERSION
Usage: OpenKM_import.sh [-h] [-v] [-g] [-u url] [-p path] document
Options:
-h : Display this help message
-v : Increase the verbosity (this option can be used more than once)
-g : Activate debug mode:
- Set the verbosity to the highest possible
-u url : Set the url to the OpenKM instance
Default: http://localhost:8080/OpenKM
-p path : Set the taxonomy path to be imported to
Default: /okm:root/imported
document : The file to be imported
--------------------------------------------------------------------------------------
EOF
}
#################################################
# Get an absolute path from a relative path to a file
#
# Param1 : Relative path
# Returns: 1 if the folder in which the file is located does not exist
# 0 otherwise
#################################################
absolutePath() {
local wdsave absolutepath
wdsave="$(pwd)"
! cd "$(dirname "$1")" 1> /dev/null 2> /dev/null && return 1
absolutepath="$(pwd)/$(basename "$1")"
cd "$wdsave"
echo "$absolutepath"
return 0
}
# Initialization the configuration parameters with default values
VERBOSITY="$LOG_ERR" # default verbosity level
OKM_URL="http://localhost:8080/OpenKM" # OpenKM URL
OKM_PATH="/okm:root/imported" # Taxonomy path to be imported to
# Parse optional command line arguments
while getopts ":hvgu:p:" opt; do
case $opt in
h) usage ; exit 0 ;;
v) VERBOSITY=$(($VERBOSITY+1)) ;;
g) VERBOSITY="10" ;;
u) OKM_URL="$OPTARG" ;;
p) OKM_PATH="$OPTARG" ;;
\?)
echo "Invalid option: -$OPTARG" >&2
usage
exit $EXIT_BAD_ARGS ;;
:)
echo "Option -$OPTARG requires an argument" >&2
usage
exit $EXIT_BAD_ARGS ;;
esac
done
# Remove the optional arguments parsed above.
shift $((OPTIND-1))
# Check if the number of mandatory parameters
# provided is as expected
if [ "$#" -ne "1" ]; then
echo "Document file name is missing! ($# arguments provided)" >&2
usage
exit $EXIT_BAD_ARGS
fi
[ $VERBOSITY -ge $LOG_INFO ] && echo "$TOOLNAME, version: $VERSION"
# Generate the document information
FILENAME="`absolutePath "$1"`"
FILENAME_BASE="${FILENAME##*/}"
[ $VERBOSITY -ge $LOG_INFO ] && echo "Document file: '$FILENAME', basename: '$FILENAME_BASE'"
# Logon
[ $VERBOSITY -ge $LOG_DEBUG ] && echo "Logging on to OpenKM Server '$OKM_URL' with '$OKM_ID'"
response_Auth_logon=$(curl --silent --header "Content-Type: text/xml;charset=UTF-8" \
--header "SOAPAction:action" --data @- \
--request POST "${OKM_URL}/services/OKMAuth" << EOF
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.openkm.com">
<soapenv:Header/>
<soapenv:Body>
<ws:login>
<user>$OKM_ID</user>
<password>$OKM_PW</password>
</ws:login>
</soapenv:Body>
</soapenv:Envelope>
EOF
)
# Check for response code -> Got access token?
token=$(grep -oPm1 "(?<=<return>)[^<]+" <<< "$response_Auth_logon")
if [ -z "$token" ]; then
echo "Error logging on to OpenKM server!" >&2
echo "Response: "$response_Auth_logon >&2 && exit $EXIT_BAD_LOGON
else
[ $VERBOSITY -ge $LOG_DEBUG ] && echo "Logon successful (Token: '"$token"')"
fi
# Content must be base64 -> read and encode
[ $VERBOSITY -ge $LOG_DEBUG ] && echo "Encoding input file as Base64"
content="`base64 "$FILENAME"`"
# Import the document
[ $VERBOSITY -ge $LOG_DEBUG ] && echo "Importing document '$FILENAME_BASE' to '$OKM_PATH/$FILENAME_BASE'"
response_Doc=$(curl --silent --header "Content-Type: text/xml;charset=UTF-8" \
--header "SOAPAction:action" --data @- \
--request POST "${OKM_URL}/services/OKMDocument" << EOF
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.openkm.com">
<soapenv:Header/>
<soapenv:Body>
<ws:createSimple>
<token>$token</token>
<docPath>$OKM_PATH/$FILENAME_BASE</docPath>
<content>$content</content>
</ws:createSimple>
</soapenv:Body>
</soapenv:Envelope>
EOF
)
# Check for success
fault=$(grep -oPm1 "(?<=<faultcode>)[^<]+" <<< "$response_Doc")
if [ -n "$fault" ]; then
echo "Error importing document: "$fault": '" \
$(grep -oPm1 "(?<=<faultstring>)[^<]+" <<< "$response_Doc") \
"' -> "$(grep -oPm1 "[^:]+Exception" <<< "$response_Doc") >&2
echo "Response: "$response_Doc >&2
else
uuid=$(grep -oPm1 "(?<=<uuid>)[^<]+" <<< "$response_Doc")
[ $VERBOSITY -ge $LOG_DEBUG ] && echo "Document '$uuid' imported successfully"
fi
# Logoff
[ $VERBOSITY -ge $LOG_DEBUG ] && echo "Logging off from OpenKM server"
response_Auth_logoff=$(curl --silent --header "ConteONnt-Type: text/xml;charset=UTF-8" \
--header "SOAPAction:action" --data @- \
--request POST "${OKM_URL}/services/OKMAuth" << EOF
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.openkm.com">
<soapenv:Header/>
<soapenv:Body>
<ws:logout>
<token>$token</token>
</ws:logout>
</soapenv:Body>
</soapenv:Envelope>
EOF
)
# Check for success
fault=$(grep -oPm1 "(?<=<faultcode>)[^<]+" <<< "$response_Auth_logoff")
if [ -n "$fault" ]; then
echo "Error logging off from server: "$fault": '" \
$(grep -oPm1 "(?<=<faultstring>)[^<]+" <<< "$response_Auth_logoff") \
"' -> "$(grep -oPm1 "[^:]+Exception" <<< "$response_Auth_logoff") >&2
echo "Response: "$response_Auth_logoff >&2
else
[ $VERBOSITY -ge $LOG_DEBUG ] && echo "Logoff successful"
fi
END=`date +%s`
[ $VERBOSITY -ge $LOG_DEBUG ] && echo "Script took $(($END-$START)) seconds"
exit $EXIT_OK
More information at our public forum.