Compare commits
10 Commits
4a9bce07d3
...
0be60e1458
Author | SHA1 | Date |
---|---|---|
Simon Bruder | 0be60e1458 | |
Simon Bruder | dec28b98f6 | |
Simon Bruder | 658690b152 | |
Simon Bruder | 8e763b1b9e | |
Simon Bruder | fb909ba592 | |
Simon Bruder | 604f9d07db | |
Simon Bruder | 01330f405c | |
Simon Bruder | 3304bf1b49 | |
Simon Bruder | 9f39ee7ce4 | |
Simon Bruder | 40e58e2557 |
31
.drone.yml
31
.drone.yml
|
@ -1,31 +0,0 @@
|
|||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: mikefarah/yq
|
||||
commands:
|
||||
- yq r -j bangs.yml > bangs.json
|
||||
|
||||
- name: upload
|
||||
image: plugins/s3
|
||||
settings:
|
||||
bucket: cdn
|
||||
access_key:
|
||||
from_secret: aws_access_key_id
|
||||
secret_key:
|
||||
from_secret: aws_secret_access_key
|
||||
source: bangs.json
|
||||
target: /bangs/
|
||||
path_style: true
|
||||
endpoint: https://s3.sbruder.de
|
||||
|
||||
- name: docker
|
||||
image: plugins/docker
|
||||
settings:
|
||||
registry: r.sbruder.de
|
||||
username:
|
||||
from_secret: docker_username
|
||||
password:
|
||||
from_secret: docker_password
|
||||
repo: r.sbruder.de/bang-evaluator
|
|
@ -1 +1,3 @@
|
|||
bangs.json
|
||||
/vendor/
|
||||
/bangs.go
|
||||
/result*
|
||||
|
|
22
Dockerfile
22
Dockerfile
|
@ -1,22 +0,0 @@
|
|||
FROM golang:alpine as builder
|
||||
|
||||
WORKDIR /go/src/git.sbruder.de/simon/bangs/evaluator/
|
||||
|
||||
COPY evaluator/evaluator.go .
|
||||
|
||||
RUN apk add --no-cache git upx
|
||||
|
||||
RUN go get -v \
|
||||
&& CGO_ENABLED=0 go build -v -ldflags="-s -w" \
|
||||
&& upx --ultra-brute evaluator
|
||||
|
||||
FROM scratch
|
||||
|
||||
COPY --from=builder /go/src/git.sbruder.de/simon/bangs/evaluator/evaluator /evaluator
|
||||
copy bangs.json /bangs.json
|
||||
|
||||
USER 1000
|
||||
|
||||
ENTRYPOINT ["/evaluator"]
|
||||
|
||||
EXPOSE 8081
|
|
@ -0,0 +1,23 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
let
|
||||
gitignoreSrc = pkgs.fetchFromGitHub {
|
||||
owner = "hercules-ci";
|
||||
repo = "gitignore";
|
||||
rev = "c4662e662462e7bf3c2a968483478a665d00e717";
|
||||
sha256 = "1npnx0h6bd0d7ql93ka7azhj40zgjp815fw2r6smg8ch9p7mzdlx";
|
||||
};
|
||||
inherit (import gitignoreSrc { inherit (pkgs) lib; }) gitignoreSource;
|
||||
in
|
||||
pkgs.buildGoModule {
|
||||
name = "bang-evaluator";
|
||||
|
||||
src = gitignoreSource ./.; # FIXME: reproducibility
|
||||
|
||||
subPackages = [ "." ];
|
||||
|
||||
vendorSha256 = "11r1l5lcdfm3wymrkbddl5khpjmr30jln31l40mfyyy9msnqayf3";
|
||||
|
||||
preBuild = ''go generate ./...'';
|
||||
|
||||
doCheck = false; # no tests (yet?)
|
||||
}
|
|
@ -1,23 +1,22 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var bangs = loadBangs()
|
||||
//go:generate go run scripts/includebangs.go
|
||||
|
||||
func main() {
|
||||
http.HandleFunc("/eval", func(w http.ResponseWriter, r *http.Request) {
|
||||
searchQuery := r.URL.Query().Get("query")
|
||||
searchEngine := r.URL.Query().Get("engine")
|
||||
|
||||
if (searchQuery == "" || searchEngine == "") {
|
||||
if searchQuery == "" || searchEngine == "" {
|
||||
http.Error(w, "400 Bad Request", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
@ -28,23 +27,24 @@ func main() {
|
|||
http.Redirect(w, r, searchURL, http.StatusSeeOther)
|
||||
})
|
||||
|
||||
log.Fatalf("Failed to start http server: %v", http.ListenAndServe(":8081", nil))
|
||||
listenAddress := getSetting("LISTEN_ADDRESS", ":8081")
|
||||
log.Printf("Listening at %s", listenAddress)
|
||||
|
||||
log.Fatalf("Failed to start http server: %v", http.ListenAndServe(listenAddress, nil))
|
||||
}
|
||||
|
||||
func loadBangs() (bangs map[string]string) {
|
||||
data, err := ioutil.ReadFile("bangs.json")
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to read bangs: %v", err)
|
||||
func getenv(name string, fallback string) (value string) {
|
||||
value = os.Getenv(name)
|
||||
if value == "" {
|
||||
return fallback
|
||||
}
|
||||
|
||||
err = json.Unmarshal(data, &bangs)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to decode bangs: %v", err)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func getSetting(name, fallback string) (value string) {
|
||||
return getenv("BANG_EVALUATOR_"+name, fallback)
|
||||
}
|
||||
|
||||
func buildSearchURL(template string, query string) (searchUrl string) {
|
||||
searchUrl = strings.Replace(template, "%s", url.QueryEscape(query), 1)
|
||||
searchUrl = strings.Replace(searchUrl, "%S", query, 1)
|
||||
|
@ -73,9 +73,9 @@ func parseBang(searchQuery string) (bang string, query string) {
|
|||
|
||||
func evaluateBang(searchQuery string, searchEngine string) (query string, engine string) {
|
||||
bang, query := parseBang(searchQuery)
|
||||
engine = bangs[bang]
|
||||
engine = getBang(bang)
|
||||
|
||||
if (bang == "" || engine == ""){
|
||||
if bang == "" || engine == "" {
|
||||
return searchQuery, searchEngine
|
||||
} else {
|
||||
return query, engine
|
|
@ -0,0 +1,5 @@
|
|||
module git.sbruder.de/simon/bangs/evaluator
|
||||
|
||||
go 1.15
|
||||
|
||||
require gopkg.in/yaml.v2 v2.4.0
|
|
@ -0,0 +1,3 @@
|
|||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|
@ -0,0 +1,51 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"sort"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
func loadBangs() (bangs map[string]string) {
|
||||
data, err := ioutil.ReadFile("bangs.yml")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("Failed to load bangs.yml: %v", err))
|
||||
}
|
||||
|
||||
err = yaml.Unmarshal(data, &bangs)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("Failed to decode bangs: %v", err))
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
bangs := loadBangs()
|
||||
|
||||
// generating sorted keys to have stable generated code
|
||||
// this is not optimal, performance-wise but it runs only once at build
|
||||
// time, so it doesn’t matter that much)
|
||||
bangNames := []string{}
|
||||
for bang := range bangs {
|
||||
bangNames = append(bangNames, bang)
|
||||
}
|
||||
sort.Strings(bangNames)
|
||||
|
||||
out, err := os.Create("bangs.go")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("Failed to create bangs.go: %v", err))
|
||||
}
|
||||
|
||||
out.Write([]byte("// Code generated from ../bangs.yml DO NOT EDIT.\n"))
|
||||
out.Write([]byte("package main \n\nfunc getBang(name string) string {\n\tswitch name {\n"))
|
||||
|
||||
for _, bangName := range bangNames {
|
||||
out.Write([]byte("\t\tcase `" + bangName + "`: return `" + bangs[bangName] + "`\n"))
|
||||
}
|
||||
out.Write([]byte("\t\tdefault: return \"\"\n"))
|
||||
out.Write([]byte("\t}\n}\n"))
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
// ==UserScript==
|
||||
// @name Startpage Bangs
|
||||
// @version 1
|
||||
// @grant none
|
||||
// @run-at document-start
|
||||
// @include https://*.startpage.com/*
|
||||
// ==/UserScript==
|
||||
|
||||
fetch('https://s3.sbruder.de/cdn/bangs/bangs.json')
|
||||
.then(text => text.json())
|
||||
.then(bangs => {
|
||||
const urlParams = new URLSearchParams(window.location.search)
|
||||
const searchQuery = urlParams.get('query')
|
||||
|
||||
let matchBang = null
|
||||
let parsedBang = null
|
||||
|
||||
matchBang = searchQuery.match(/(.*) \!(.*)/)
|
||||
if (matchBang !== null) {
|
||||
parsedBang = {
|
||||
'bang': matchBang[2].toLowerCase(),
|
||||
'query': matchBang[1]
|
||||
}
|
||||
}
|
||||
|
||||
matchBang = searchQuery.match(/\!(.*) (.*)/)
|
||||
if (matchBang !== null) {
|
||||
parsedBang = {
|
||||
'bang': matchBang[1].toLowerCase(),
|
||||
'query': matchBang[2]
|
||||
}
|
||||
}
|
||||
|
||||
if (parsedBang !== null) {
|
||||
redirectURL = bangs[parsedBang.bang].replace('%s', encodeURI(parsedBang.query)).replace('%S', parsedBang.query)
|
||||
window.location.replace(redirectURL);
|
||||
}
|
||||
})
|
Loading…
Reference in New Issue