package main
import (
"context"
"flag"
"net/http"
"os"
"time"
"cloud.google.com/go/profiler"
"github.com/go-redis/redis/v8"
"github.com/google/safehtml/template"
"golang.org/x/pkgsite/cmd/internal/cmdconfig"
"golang.org/x/pkgsite/internal"
"golang.org/x/pkgsite/internal/config"
"golang.org/x/pkgsite/internal/dcensus"
"golang.org/x/pkgsite/internal/frontend"
"golang.org/x/pkgsite/internal/log"
"golang.org/x/pkgsite/internal/middleware"
"golang.org/x/pkgsite/internal/postgres"
"golang.org/x/pkgsite/internal/proxy"
"golang.org/x/pkgsite/internal/proxydatasource"
"golang.org/x/pkgsite/internal/queue"
"golang.org/x/pkgsite/internal/source"
)
var (
queueName = config .GetEnv ("GO_DISCOVERY_FRONTEND_TASK_QUEUE" , "" )
workers = flag .Int ("workers" , 10 , "number of concurrent requests to the fetch service, when running locally" )
_ = flag .String ("static" , "content/static" , "path to folder containing static files served" )
thirdPartyPath = flag .String ("third_party" , "third_party" , "path to folder containing third-party libraries" )
devMode = flag .Bool ("dev" , false , "enable developer mode (reload templates on each page load, serve non-minified JS/CSS, etc.)" )
disableCSP = flag .Bool ("nocsp" , false , "disable Content Security Policy" )
proxyURL = flag .String ("proxy_url" , "https://proxy.golang.org" , "Uses the module proxy referred to by this URL " +
"for direct proxy mode and frontend fetches" )
directProxy = flag .Bool ("direct_proxy" , false , "if set to true, uses the module proxy referred to by this URL " +
"as a direct backend, bypassing the database" )
bypassLicenseCheck = flag .Bool ("bypass_license_check" , false , "display all information, even for non-redistributable paths" )
hostAddr = flag .String ("host" , "localhost:8080" , "Host address for the server" )
)
func main () {
flag .Parse ()
ctx := context .Background ()
cfg , err := config .Init (ctx )
if err != nil {
log .Fatal (ctx , err )
}
cfg .Dump (os .Stderr )
if cfg .UseProfiler {
if err := profiler .Start (profiler .Config {}); err != nil {
log .Fatalf (ctx , "profiler.Start: %v" , err )
}
}
log .SetLevel (cfg .LogLevel )
var (
dsg func (context .Context ) internal .DataSource
fetchQueue queue .Queue
)
if *bypassLicenseCheck {
log .Info (ctx , "BYPASSING LICENSE CHECKING: DISPLAYING NON-REDISTRIBUTABLE INFORMATION" )
}
log .Infof (ctx , "cmd/frontend: initializing cmdconfig.ExperimentGetter" )
expg := cmdconfig .ExperimentGetter (ctx , cfg )
log .Infof (ctx , "cmd/frontend: initialized cmdconfig.ExperimentGetter" )
proxyClient , err := proxy .New (*proxyURL )
if err != nil {
log .Fatal (ctx , err )
}
if *directProxy {
var pds *proxydatasource .DataSource
if *bypassLicenseCheck {
pds = proxydatasource .NewBypassingLicenseCheck (proxyClient )
} else {
pds = proxydatasource .New (proxyClient )
}
dsg = func (context .Context ) internal .DataSource { return pds }
} else {
db , err := cmdconfig .OpenDB (ctx , cfg , *bypassLicenseCheck )
if err != nil {
log .Fatalf (ctx , "%v" , err )
}
defer db .Close ()
dsg = func (context .Context ) internal .DataSource { return db }