[ "$_DATE" ] || _DATE="$(date +%s)"
+debug "$REQUEST_METHOD $REQUEST_URI $SERVER_PROTOCOL $_DATE"
+
ingest() {
- local J="$1"
+ local J="$1" ztmp="${TMP:-/tmp}/zipfile_$$.zip"
# json_get "$J" title
# json_get "$J" parts.comments
| sed 's;<[^>]*>;;g'
;;
*.docx)
- printf %s "$content" |base64 -d \
- | unzip -qc /dev/stdin word/document.xml \
+ printf %s "$content" |base64 -d >"$ztmp"
+ unzip -qc "$ztmp" word/document.xml \
| head -c 128M | sed 's;<[^>]*>;;g'
+ rm -- "$ztmp"
;;
*.xlsx)
- printf %s "$content" |base64 -d \
- | unzip -qc /dev/stdin xl/sharedStrings.xml \
+ printf %s "$content" |base64 -d >"$ztmp"
+ unzip -qc "$ztmp" xl/sharedStrings.xml \
| head -c 128M | sed 's;<[^>]*>; ;g'
+ rm -- "$ztmp"
;;
*.odt)
- printf %s "$content" |base64 -d \
- | unzip -qc /dev/stdin content.xml \
+ printf %s "$content" |base64 -d >"$ztmp"
+ unzip -qc "$ztmp" content.xml \
| head -c 128M | sed 's;<[^>]*>;;g'
+ rm -- "$ztmp"
;;
*.ods|*.odp)
- printf %s "$content" |base64 -d \
- | unzip -qc /dev/stdin content.xml \
+ printf %s "$content" |base64 -d >"$ztmp"
+ unzip -qc "$ztmp" content.xml \
| head -c 128M | sed 's;<[^>]*>; ;g'
+ rm -- "$ztmp"
;;
*):;;
esac
_INDEX="${PATH_INFO#/}" _INDEX="${_INDEX%%/*}"
_records="${_DATA}/${_INDEX}/_0_DOCS"
+if [ "${INDEX}" -a ! -d "${_DATA}/${_INDEX}" ]; then
+ printf '%s\r\n' "Status: 404 Not Found" ""
+ exit 0
+elif authlist="$(DBM "${_DATA}/auth.db" get "${_INDEX}" )"; then
+ auth="$(HEADER Authorization)" auth="${auth#Basic }"
+ for a in $authlist deny; do
+ [ "$auth" = "$a" ] && break
+ done
+ if [ "$a" = "deny" -o ! "$auth" ]; then
+ printf '%s\r\n' "Status: 401 Unauthorized" \
+ "WWW-Authenticate: Basic realm=\"Rigid Find\"" "" \
+ | debug
+ exit 0
+ fi
+ unset a auth authlist
+fi
+
if [ "$REQUEST_METHOD" = "PUT" ]; then
_doc="${PATH_INFO#"/${_INDEX}/_doc"}"
s;,[ \t\r\n]*"content"[ \t\r\n]*:[ \t\r\n]*"[^"]*";;
')"
J="$(json_load "${J}")"
-
- ingest "$J" "$content"\
- | "${_EXEC}/concordance.sh" \
- "$_DATA/$_INDEX/" "$(STRING "$_doc") $_DATE"
+
+ debug "Content: ${#content} bytes"
+ debug "$(json_dump "$J")"
+
+ if [ "${#content}" -gt 0 ]; then
+ ingest "$J" "$content"\
+ | "${_EXEC}/concordance.sh" \
+ "$_DATA/$_INDEX/" "$(STRING "$_doc") $_DATE"
+ fi
J="${J#obj:}"
J="$(DB2 "$J" set _indexdate num:"$_DATE")"
- if DBM "$_records" insert "$_doc" "$J"; then
+ if [ "${#content}" -eq 0 ]; then
+ printf '%s: %s\r\n' "Status" "200 OK"
+ result="updated"
+ elif DBM "$_records" insert "$_doc" "$J"; then
printf '%s: %s\r\n' "Status" "201 Created" "Location" "/${_INDEX}/_doc/$(URL "$_doc")" \
result="created"
elif DBM "$_records" update "$_doc" "$J"; then
exit 0
fi
- sed 's;$;\r;' <<-EOF
- X-elastic-product: Elasticsearch
- content-type: application/vnd.elasticsearch+json;compatible-with=8
-
+ cat <<-EOF
+ X-elastic-product: Elasticsearch\r
+ content-type: application/vnd.elasticsearch+json;compatible-with=8\r
+ \r
{ "_index": $(json_dump str:"${_INDEX}"),
"_id": $(json_dump str:"$_doc"),
"result": "$result",
result="not_found"
fi
- sed 's;$;\r;' <<-EOF
- X-elastic-product: Elasticsearch
- content-type: application/vnd.elasticsearch+json;compatible-with=8
-
+ cat <<-EOF
+ X-elastic-product: Elasticsearch\r
+ content-type: application/vnd.elasticsearch+json;compatible-with=8\r
+ \r
{ "_index": $(json_dump str:"${_INDEX}"),
"_id": $(json_dump str:"$_doc"),
"result": "$result",
exit 0
elif [ "$REQUEST_METHOD" = "POST" ]; then
- J="$(json_load "$(head -c "${CONTENT_LENGTH:-0}")")"
+ J="$(json_load "$(head -c "${CONTENT_LENGTH:-0}" |debug)")"
J="$(json_get "$J" query.bool.must.bool.should)"
words="$(
json_get "$(UNSTRING "$j")" match_phrase_prefix.content
done 2>/dev/null
)"
+ debug "Search words: $words"
results="@ $(
search "${_DATA}/${_INDEX}" $words \
| while read -r score id source; do
- S="$(DB2 "" set _id str:"$(UNSTRING "${id#/}")")"
+ debug "Hit: $id $score"
+ S="$(DB2 "" set _index str:"${_INDEX}")"
+ S="$(DB2 "$S" set _id str:"$(UNSTRING "${id#/}")")"
S="$(DB2 "$S" set _score num:"$score")"
S="$(DB2 "$S" set _source obj:"$(UNSTRING "$source")")"
printf 'obj:%s\t' "$(STRING "$S")"
)"
results="${results% }"
- sed 's;$;\r;' <<-EOF
- Status: 200 OK
- X-elastic-product: Elasticsearch
- Content-Type: application/vnd.elasticsearch+json;compatible-with=8
-
+ cat <<-EOF
+ Status: 200 OK\r
+ X-elastic-product: Elasticsearch\r
+ Content-Type: application/vnd.elasticsearch+json;compatible-with=8\r
+ \r
{ "took":0,
"timed_out":false,
"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},
[ ! "${accept#*"vnd.elasticsearch+json"*}" ] \
&& ctype="${accept}" || ctype="application/json"
- sed 's;$;\r;' <<-EOF
- HTTP/1.1 200 OK
- X-elastic-product: Elasticsearch
- content-type: ${ctype}
-
- EOF
- exit 0
-
-elif [ "$REQUEST_METHOD" = "GET" ]; then
- accept="$(HEADER Accept)"
- [ ! "${accept#*"vnd.elasticsearch+json"*}" ] \
- && ctype="${accept}" || ctype="application/json"
-
- sed 's;$;\r;' <<-EOF
- HTTP/1.1 200 OK
- X-elastic-product: Elasticsearch
- content-type: ${ctype}
-
+ cat <<-EOF
+ Status: 200 OK\r
+ X-elastic-product: Elasticsearch\r
+ content-type: ${ctype}\r
+ \r
EOF
-
- if [ "$PATH_INFO" = "/${_INDEX}/" ]; then
- sed 's;$;\r;' <<-EOF
- { $(json_dump str:"${_INDEX}"): {
- "aliases":{},
- "mappings": {
- "properties": {
- "content": {"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},
- "hash":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},
- "metatags":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},
- "owner":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},
- "parts":{"properties":{"comments":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}}},
- "provider":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},
- "share_names":{"properties":{"paul":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}}},
- "source":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},
- "title":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}
- }
- },
- "settings": {
- "index": {
- "routing":{"allocation":{"include":{"_tier_preference":"data_content"}}},
- "number_of_shards":"1",
- "provided_name": $(json_dump str:"${_INDEX}"),
- "creation_date": "$(stat -c %W "${_DATA}/${_INDEX}")",
- "number_of_replicas":"1",
- "uuid":"0000000000000000000000",
- "version":{"created":"8500010"}
- }
- }
- }
- }
- EOF
- else
- sed 's;$;\r;' <<-EOF
- { "name" : "head",
- "cluster_name" : "elasticsearch",
- "version" : {
- "number" : "8.12.1",
- "lucene_version" : "9.9.2",
- "minimum_wire_compatibility_version" : "7.17.0",
- "minimum_index_compatibility_version" : "7.0.0"
- },
- "tagline" : "You Know, for Search"
- }
- EOF
- fi
exit 0
else
- printf '%s\r\n' "Status: 500 Internal Server Error" ""
+ # elif [ "$REQUEST_METHOD" = "GET" ]; then
+ cat <<-EOF
+ Status: 501 Not Implemented\r
+ X-elastic-product: Elasticsearch\r
+ content-type: text/plain\r
+ \r
+ Use the Nextcloud Elastic Search Plugin to use this service.
+ EOF
exit 0
fi