X-Git-Url: https://git.plutz.net//?a=blobdiff_plain;f=index.cgi;h=94c397041e73483d0db5bedaa5b88ab903070934;hb=1a3925fc31df0c8810d3a938e750ee2b2bf460df;hp=0078a2f8f1837201ae7fc7a19324cd0fe01d4818;hpb=092bfad64ae6b2022991f6193f042d6d53bf10c2;p=rigidfind diff --git a/index.cgi b/index.cgi index 0078a2f..94c3970 100755 --- a/index.cgi +++ b/index.cgi @@ -1,11 +1,13 @@ #!/bin/sh +read _DATE _date_n <<-EOF + $(date +"%s %N") + EOF + . "${_EXEC:-${0%/*}}/cgilite/cgilite.sh" . "${_EXEC:-${0%/*}}/cgilite/storage.sh" . "${_EXEC:-${0%/*}}/cgilite/json.sh" -[ "$_DATE" ] || _DATE="$(date +%s)" - debug "$REQUEST_METHOD $REQUEST_URI $SERVER_PROTOCOL $_DATE" ingest() { @@ -109,6 +111,23 @@ search() { _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"}" @@ -200,12 +219,14 @@ elif [ "$REQUEST_METHOD" = "POST" ]; then words="$( for j in $(DB2 "$J" iterate @); do json_get "$(UNSTRING "$j")" match_phrase_prefix.content - done 2>/dev/null + done 2>/dev/null |tr \\n ' ' )" + debug "Search words: $words" results="@ $( search "${_DATA}/${_INDEX}" $words \ | while read -r score id source; do + 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")" @@ -215,17 +236,18 @@ elif [ "$REQUEST_METHOD" = "POST" ]; then )" results="${results% }" + t="$(( ${_DATE}${_date_n} - $(date +%s%N) ))" + cat <<-EOF Status: 200 OK X-elastic-product: Elasticsearch Content-Type: application/vnd.elasticsearch+json;compatible-with=8 - { "took":0, + { "took":$((t / 1000)), "timed_out":false, - "_shards":{"total":1,"successful":1,"skipped":0,"failed":0}, "hits": { "total":{"value": $(DB2 "$results" count @) ,"relation":"eq"}, - "max_score": $(json_get "arr:$results" '[0]._score' 2>&- || printf 0), + "max_score": $(json_get "arr:$results" '[0]._score' 2>/dev/null || printf 0), "hits": $(json_dump "arr:$results") } } @@ -237,73 +259,21 @@ elif [ "$REQUEST_METHOD" = "HEAD" ]; then && ctype="${accept}" || ctype="application/json" cat <<-EOF - HTTP/1.1 200 OK + Status: 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" - +else + # elif [ "$REQUEST_METHOD" = "GET" ]; then cat <<-EOF - HTTP/1.1 200 OK + Status: 501 Not Implemented X-elastic-product: Elasticsearch - content-type: ${ctype} + content-type: text/plain + Use the Nextcloud Elastic Search Plugin to use this service. EOF - - if [ "$PATH_INFO" = "/${_INDEX}/" ]; then - cat <<-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 - cat <<-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" "" exit 0 fi