taldir

Directory service to resolve wallet mailboxes by messenger addresses
Log | Files | Refs | Submodules | README | LICENSE

commit 8d5674aa5af25e520a3451aa74c6a63748780357
parent 9e6fb6f91a9a8486cd83a287963ebb2193be3112
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Wed, 23 Apr 2025 00:56:20 +0200

Add configure and make and README

Diffstat:
DMakefile | 25-------------------------
AMakefile.in | 27+++++++++++++++++++++++++++
MREADME.md | 2++
Abootstrap | 14++++++++++++++
Mcmd/taldir-server/main.go | 3++-
Aconfigure | 220+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpkg/rest/taldir.go | 31++++++++++++++++++++++---------
7 files changed, 287 insertions(+), 35 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,25 +0,0 @@ -all: gana server cli - -SCRIPT_TARGET:=$(shell dirname $(shell go list -f '{{.Target}}' ./cmd/taldir-server)) - -gana: - mkdir -p internal/gana - git submodule update --init --recursive - git submodule sync --recursive - cd third_party/gana/gnu-taler-error-codes && make taler_error_codes.go - cp third_party/gana/gnu-taler-error-codes/taler_error_codes.go internal/gana/ - -VERSION=`git describe --tags` - -server: - go build -ldflags "-X main.version=${VERSION}" ./cmd/taldir-server - -cli: - go build -ldflags "-X main.version=${VERSION}" ./cmd/taldir-cli - -install: server cli - go install ./cmd/taldir-server && go install ./cmd/taldir-cli - chmod +x scripts/validators/* - cp scripts/validators/* $(SCRIPT_TARGET) - -.PHONY: all gana diff --git a/Makefile.in b/Makefile.in @@ -0,0 +1,27 @@ +all: server cli + +SCRIPT_TARGET:=$(shell dirname $(shell go list -f '{{.Target}}' ./cmd/taldir-server)) + +VERSION=`git describe --tags` + +server: + ${GO} build -ldflags "-X main.version=${VERSION} -X main.taldirdatahome=${datadir}/taldir" ./cmd/taldir-server + +cli: + ${GO} build -ldflags "-X main.version=${VERSION} -X main.taldirdatahome=${datadir}/taldir" ./cmd/taldir-cli + +conf: + sed taldir.conf.in + +install: server cli + install ./taldir-server ${DESTDIR}${bindir} + install ./taldir-cli ${DESTDIR}${bindir} + mkdir -p ${DESTDIR}${datadir}/taldir + chmod +x scripts/validators/* + cp scripts/validators/* ${DESTDIR}${bindir} + +uninstall: + ${RM} ${DESTDIR}${bindir}/taldir-* + ${RM} -r ${DESTDIR}${datadir}/taldir + +.PHONY: all diff --git a/README.md b/README.md @@ -8,6 +8,8 @@ The API can be found here: https://docs.taler.net/core/api-taldir.html Compile and run: ``` +$ ./bootstrap +$ ./configure --prefix=PREFIX $ make && make install (You may have to set your $PATH to include the go/bin folder accordingly) $ cp config/taldir-example.conf taldir.conf diff --git a/bootstrap b/bootstrap @@ -0,0 +1,14 @@ +#!/bin/sh + +if ! existence go; then + echo "Go binary not in $PATH!" + exit 1 +fi + +mkdir -p internal/gana +git submodule update --init --recursive +git submodule sync --recursive +cd third_party/gana/gnu-taler-error-codes && make taler_error_codes.go +cp third_party/gana/gnu-taler-error-codes/taler_error_codes.go internal/gana/ + + diff --git a/cmd/taldir-server/main.go b/cmd/taldir-server/main.go @@ -38,6 +38,7 @@ import ( var ( t taldir.Taldir version string + taldirdatahome string ) func handleRequests(t *taldir.Taldir) { @@ -54,7 +55,7 @@ func main() { cfgfile = *cfgFlag } t := taldir.Taldir{} - t.Initialize(cfgfile, version) + t.Initialize(cfgfile, version, taldirdatahome) t.Cfg.WriteTo(os.Stdout) handleRequests(&t) } diff --git a/configure b/configure @@ -0,0 +1,220 @@ +#!/bin/sh + +pkg_name="taldir" +pkg_default_features="" +pkg_optional_features="" +pkg_optional_dependencies="" + +# DO NOT EDIT BELOW THIS LINE +standard_dirs="prefix exec_prefix bindir sbindir libexecdir sysconfdir sharedstatedir localstatedir runstatedir libdir includedir oldincludedir datarootdir datadir infodir localedir mandir docdir htmldir dvidir pdfdir psdir srcdir" +standard_utils="AR AS BISON CC CXX CPP FLEX INSTALL LD LDCONFIG LEX MAKE MAKEINFO RANLIB TEXI2DVI YACC CHGRP CHMOD CHOWN MKNOD RM GO" +standard_flags="ARFLAGS BISONFLAGS CFLAGS CXXFLAGS CPPFLAGS FLEXFLAGS INSTALLFLAGS LDFLAGS LDCONFIGFLAGS LFLAGS MAKEFLAGS MAKEINFOFLAGS RANLIBFLAGS TEXI2DVIFLAGS YACCFLAGS CHGRPFLAGS CHMODFLAGS CHOWNFLAGS MKNODFLAGS" +standard_vars="INSTALL_DATA INSTALL_PROGRAM INSTALL_SCRIPT" +generated_comment="# This file was generated by configure. DO NOT edit it directly." + +# Save arguments +cat > config.status <<EOF +#!/bin/sh +$generated_comment +$0 $* +EOF +chmod 755 config.status + +# Parse arguments +oldifs="$IFS" +while [ "$#" -gt "0" ]; do + arg="$1" + shift + argsave="$@" + + IFS="=" + set -- $arg + IFS="$oldifs" + arg="$1" + shift + argparam="$@" + + case "$arg" in + --help|-h) + cat <<-EOF + Usage: $0 [options...] + General options: + + <variable>=<value> Overrides default utils and flags, e.g. CC=gcc + EOF + echo "" + echo "Directory variables:" + for sdir in $standard_dirs; do + echo "--$sdir=<directory>" + done + echo "" + echo "Options specific to $pkg_name:" + for feat in $pkg_optional_features; do + echo "--enable-$feat[=arg]" + done + for feat in $pkg_default_features; do + echo "--disable-$feat" + done + for dep in $pkg_optional_dependencies; do + echo "--with-$dep" + done + + echo + echo Other options will be ignored. Please see the README for additional information. + exit 0 + ;; + --enable-*) + for feat in $pkg_optional_features $pkg_default_features; do + ft=$(echo $feat | tr - _) + if [ "--enable-$feat" = "$arg" ] && [ -z "$argparam" ]; then + eval "enable_$ft=true" + elif [ "--enable-$feat" = "$arg" ]; then + if [ "$argparam" = "yes" ]; then + eval "enable_$ft=\"true\"" + else + eval "enable_$ft=\"$argparam\"" + fi + fi + done + ;; + --disable-*) + argsave="--enable-${arg#--disable-}=false $argsave" + ;; + --with-*) + for dep in $pkg_optional_dependencies; do + if [ "--with-$dep" = "$arg" ] && [ -z "$argparam" ]; then + eval "with_$dep=yes" + elif [ "--with-$dep" = "$arg" ]; then + eval "with_$dep=\"$argparam\"" + fi + done + ;; + --without-*) + argsave="--with-${arg#--without-}=no $argsave" + ;; + --*) + for dir in $standard_dirs; do + [ "--$dir" = "$arg" ] && eval "var_$dir=\"$argparam\"" + done + ;; + *) + for flag in $standard_utils $standard_flags standard_vars; do + [ "$flag" = "$arg" ] && eval "$flag=\"$argparam\"" + done + ;; + esac + + set -- $argsave +done + +# Set default values +for util in $standard_utils; do + case "$util" in + CPP) eval "$util=\"\${${util}:-\\\$(CC) -E}\"" ;; + CXX) eval "$util=\"\${${util}:-g++}\"" ;; + RM) eval "$util=\"\${${util}:-rm -f}\"" ;; + GO) eval "$util=\"\${${util}:-go}\"" ;; + *) eval "$util=\"\${${util}:-${util}}\"" ;; + esac +done +for feat in $pkg_optional_features; do + ft=$(echo $feat | tr - _) + eval "enable_$ft=\${enable_$ft:-false}" +done +for feat in $pkg_default_features; do + eval "enable_$feat=\${enable_$feat:-true}" +done +for feat in $pkg_optional_dependencies; do + eval "with_$feat=\${with_$feat:-no}" +done + +# Find source files +if [ -z "$var_srcdir" ]; then + [ -f ../Makefile.in ] && var_srcdir=.. + [ -f ./Makefile.in ] && var_srcdir=. +fi +if [ -z "$var_srcdir" ]; then + echo "Source files not found. Please specify a directory using --srcdir=..." >&2 + exit 1 +fi + +# Write Makefile +cat > Makefile <<EOF +$generated_comment +SHELL = /bin/sh +VPATH = ${var_srcdir} + +srcdir = ${var_srcdir} +prefix = ${var_prefix:-/usr/local} +exec_prefix = ${var_exec_prefix:-\$(prefix)} +bindir = ${var_bindir:-\$(exec_prefix)/bin} +sbindir = ${var_sbindir:-\$(exec_prefix)/sbin} +libexecdir = ${var_libexecdir:-\$(exec_prefix)/libexec} +datarootdir = ${var_datarootdir:-\$(prefix)/share} +datadir = ${var_datadir:-\$(datarootdir)} +sysconfdir = ${var_sysconfdir:-\$(prefix)/etc} +sharedstatedir = ${var_sharedstatedir:-\$(prefix)/com} +localstatedir = ${var_localstatedir:-\$(prefix)/var} +runstatedir = ${var_runstatedir:-\$(localstatedir)/run} +includedir = ${var_includedir:-\$(prefix)/include} +oldincludedir = ${var_oldincludedir:-/usr/include} +docdir = ${var_docdir:-\$(datarootdir)/doc/"$pkg_name"} +infodir = ${var_infodir:-\$(datarootdir)/info} +htmldir = ${var_htmldir:-\$(docdir)} +dvidir = ${var_dvidir:-\$(docdir)} +pdfdir = ${var_pdfdir:-\$(docdir)} +psdir = ${var_psdir:-\$(docdir)} +libdir = ${var_libdir:-\$(exec_prefix)/lib} +lispdir = ${var_lispdir:-\$(datarootdir)/emacs/site-lisp} +localedir = ${var_localedir:-\$(datarootdir)/locale} +mandir = ${var_mandir:-\$(datarootdir)/man} +manext = .1 +EOF + +for var in $standard_utils $standard_flags $standard_vars; do + eval "echo \"${var} = \$${var}\" >> Makefile" +done +echo >> Makefile + +for feat in $pkg_optional_features $pkg_default_features; do + ft=$(echo $feat | tr - _) + eval "echo \"enable_$ft=\${enable_$ft}\" >> Makefile" +done +for dep in $pkg_optional_dependencies; do + eval "echo \"with_$dep=\${with_$dep}\" >> Makefile" +done +echo >> Makefile + +cat "${var_srcdir}/Makefile.in" >> Makefile + +# Create default targets, if not already present +default_target() { + grep "^$1:" Makefile >/dev/null && return + echo ".PHONY: $1" >> Makefile + echo "$1: $2" >> Makefile + cat >> Makefile + echo >> Makefile +} + +#default_target Makefile <<EOF +# ./config.status +#EOF +for format in html dvi pdf ps; do + default_target "$format" </dev/null + default_target "install-$format" "$format" </dev/null +done +default_target check </dev/null +default_target mostlyclean clean </dev/null +default_target distclean clean <<EOF + \$(RM) Makefile config.status +EOF +default_target maintainer-clean distclean </dev/null +default_target install-strip <<EOF + \$(MAKE) INSTALL_PROGRAM='\$(INSTALL_PROGRAM) -s' \\ + INSTALL_SCRIPT='\$(INSTALL_SCRIPT)' install +EOF + +# Done +echo "Package $pkg_name configured successfully." +echo "Run 'make' to build and 'make install' to install the package" + diff --git a/pkg/rest/taldir.go b/pkg/rest/taldir.go @@ -916,14 +916,27 @@ func getFuncs(current *i18n.Locale) template.FuncMap { } } +func (t *Taldir) getFileName(relativeFileName string, datahome string) string { + _, err := os.Stat(relativeFileName) + if errors.Is(err, os.ErrNotExist) { + _, err := os.Stat(datahome + "/" + relativeFileName) + if errors.Is(err, os.ErrNotExist) { + return "" + } + return datahome + "/" + relativeFileName + } + return relativeFileName +} + // Initialize the Taldir instance with cfgfile -func (t *Taldir) Initialize(cfgfile string, version string) { +func (t *Taldir) Initialize(cfgfile string, version string, datahome string) { _cfg, err := ini.LooseLoad(cfgfile) if err != nil { log.Fatalf("Failed to read config: %v", err) os.Exit(1) } t.Cfg = _cfg + // FIXME localedir t.I18n, err = i18n.New(i18n.Glob("./locales/*/*", i18n.LoaderConfig{ // Set custom functions per locale! Funcs: getFuncs, @@ -935,8 +948,8 @@ func (t *Taldir) Initialize(cfgfile string, version string) { fmt.Println("Production mode enabled") } - navTplFile := t.Cfg.Section("taldir").Key("navigation").MustString("web/templates/nav.html") - footerTplFile := t.Cfg.Section("taldir").Key("footer").MustString("web/templates/footer.html") + navTplFile := t.Cfg.Section("taldir").Key("navigation").MustString(t.getFileName("web/templates/nav.html", datahome)) + footerTplFile := t.Cfg.Section("taldir").Key("footer").MustString(t.getFileName("web/templates/footer.html", datahome)) t.Version = version t.BaseUrl = t.Cfg.Section("taldir").Key("base_url").MustString("http://localhost:11000") t.Validators = make(map[string]Validator) @@ -949,7 +962,7 @@ func (t *Taldir) Initialize(cfgfile string, version string) { continue } vname := strings.TrimPrefix(sec.Name(), "taldir-validator-") - vlandingPageTplFile := sec.Key("registration_page").MustString("web/templates/landing_" + vname + ".html") + vlandingPageTplFile := sec.Key("registration_page").MustString(t.getFileName("web/templates/landing_" + vname + ".html", datahome)) vlandingPageTpl, err := template.ParseFiles(vlandingPageTplFile, navTplFile, footerTplFile) if err != nil { log.Printf("`%s` template not found, disabling validator `%s`.\n", vlandingPageTplFile, vname) @@ -1023,31 +1036,31 @@ func (t *Taldir) Initialize(cfgfile string, version string) { time.Sleep(validationExp) } }() - imprintTplFile := t.Cfg.Section("taldir").Key("imprint_page").MustString("web/templates/imprint.html") + imprintTplFile := t.Cfg.Section("taldir").Key("imprint_page").MustString(t.getFileName("web/templates/imprint.html", datahome)) t.ImprintTpl, err = template.ParseFiles(imprintTplFile, navTplFile, footerTplFile) if err != nil { log.Fatal(err) os.Exit(1) } - validationLandingTplFile := t.Cfg.Section("taldir").Key("validation_landing").MustString("web/templates/validation_landing.html") + validationLandingTplFile := t.Cfg.Section("taldir").Key("validation_landing").MustString(t.getFileName("web/templates/validation_landing.html", datahome)) t.ValidationTpl, err = template.ParseFiles(validationLandingTplFile, navTplFile, footerTplFile) if err != nil { log.Fatal(err) os.Exit(1) } - landingTplFile := t.Cfg.Section("taldir").Key("landing_page").MustString("web/templates/landing.html") + landingTplFile := t.Cfg.Section("taldir").Key("landing_page").MustString(t.getFileName("web/templates/landing.html", datahome)) t.LandingPageTpl, err = template.ParseFiles(landingTplFile, navTplFile, footerTplFile) if err != nil { log.Fatal(err) os.Exit(1) } - lookupResultTplFile := t.Cfg.Section("taldir").Key("lookup_result_page").MustString("web/templates/lookup_result.html") + lookupResultTplFile := t.Cfg.Section("taldir").Key("lookup_result_page").MustString(t.getFileName("web/templates/lookup_result.html", datahome)) t.LookupResultPageTpl, err = template.ParseFiles(lookupResultTplFile, navTplFile, footerTplFile) if err != nil { log.Fatal(err) os.Exit(1) } - aboutTplFile := t.Cfg.Section("taldir").Key("about_page").MustString("web/templates/about.html") + aboutTplFile := t.Cfg.Section("taldir").Key("about_page").MustString(t.getFileName("web/templates/about.html", datahome)) t.AboutPageTpl, err = template.ParseFiles(aboutTplFile, navTplFile, footerTplFile) if err != nil { log.Fatal(err)