Compare commits

...

10 Commits

Author SHA1 Message Date
Simon Bruder 0be60e1458
Make listen address configurable 2021-01-05 12:40:26 +01:00
Simon Bruder dec28b98f6
Add nix package expression 2021-01-05 12:30:16 +01:00
Simon Bruder 658690b152
Restructure repository
The evaluator is the main part of this, so it doesn’t have to be in a
subdirectory.
2021-01-05 12:25:39 +01:00
Simon Bruder 8e763b1b9e
evaluator: Load bangs at build time (go generate) 2021-01-05 12:25:39 +01:00
Simon Bruder fb909ba592
Remove Dockerfile 2021-01-05 12:25:38 +01:00
Simon Bruder 604f9d07db
Remove Drone CI 2021-01-05 12:25:38 +01:00
Simon Bruder 01330f405c
evaluator: Directly parse yaml file 2021-01-04 22:10:39 +01:00
Simon Bruder 3304bf1b49
Remove startpage user script 2021-01-04 21:57:02 +01:00
Simon Bruder 9f39ee7ce4
evaluator: Make go module 2021-01-04 21:50:08 +01:00
Simon Bruder 40e58e2557
evaluator: Format 2021-01-04 21:04:16 +01:00
9 changed files with 102 additions and 109 deletions

View File

@ -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

4
.gitignore vendored
View File

@ -1 +1,3 @@
bangs.json
/vendor/
/bangs.go
/result*

View File

@ -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

23
default.nix Normal file
View File

@ -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?)
}

View File

@ -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

5
go.mod Normal file
View File

@ -0,0 +1,5 @@
module git.sbruder.de/simon/bangs/evaluator
go 1.15
require gopkg.in/yaml.v2 v2.4.0

3
go.sum Normal file
View File

@ -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=

51
scripts/includebangs.go Normal file
View File

@ -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 doesnt 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"))
}

View File

@ -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);
}
})