chore(build-system): make assets default relative, serve assets from assets/public (#1309)

pull/1315/head
1138-4EB 2017-10-26 11:17:45 +02:00 committed by Anthony Lapenna
parent c4e75fc858
commit 34d40e4876
6 changed files with 23 additions and 31 deletions

View File

@ -7,6 +7,7 @@ import (
"github.com/portainer/portainer" "github.com/portainer/portainer"
"os" "os"
"path/filepath"
"strings" "strings"
"gopkg.in/alecthomas/kingpin.v2" "gopkg.in/alecthomas/kingpin.v2"
@ -54,6 +55,15 @@ func (*Service) ParseFlags(version string) (*portainer.CLIFlags, error) {
} }
kingpin.Parse() kingpin.Parse()
if !filepath.IsAbs(*flags.Assets) {
ex, err := os.Executable()
if err != nil {
panic(err)
}
*flags.Assets = filepath.Join(filepath.Dir(ex), *flags.Assets)
}
return flags, nil return flags, nil
} }

View File

@ -5,7 +5,7 @@ package cli
const ( const (
defaultBindAddress = ":9000" defaultBindAddress = ":9000"
defaultDataDirectory = "/data" defaultDataDirectory = "/data"
defaultAssetsDirectory = "/" defaultAssetsDirectory = "./"
defaultNoAuth = "false" defaultNoAuth = "false"
defaultNoAnalytics = "false" defaultNoAnalytics = "false"
defaultTLSVerify = "false" defaultTLSVerify = "false"

View File

@ -3,7 +3,7 @@ package cli
const ( const (
defaultBindAddress = ":9000" defaultBindAddress = ":9000"
defaultDataDirectory = "C:\\data" defaultDataDirectory = "C:\\data"
defaultAssetsDirectory = "/" defaultAssetsDirectory = "./"
defaultNoAuth = "false" defaultNoAuth = "false"
defaultNoAnalytics = "false" defaultNoAnalytics = "false"
defaultTLSVerify = "false" defaultTLSVerify = "false"

View File

@ -3,12 +3,8 @@ package handler
import ( import (
"os" "os"
"github.com/portainer/portainer"
httperror "github.com/portainer/portainer/http/error"
"log" "log"
"net/http" "net/http"
"path"
"strings" "strings"
) )
@ -16,22 +12,13 @@ import (
type FileHandler struct { type FileHandler struct {
http.Handler http.Handler
Logger *log.Logger Logger *log.Logger
allowedDirectories map[string]bool
} }
// NewFileHandler returns a new instance of FileHandler. // NewFileHandler returns a new instance of FileHandler.
func NewFileHandler(assetPath string) *FileHandler { func NewFileHandler(assetPublicPath string) *FileHandler {
h := &FileHandler{ h := &FileHandler{
Handler: http.FileServer(http.Dir(assetPath)), Handler: http.FileServer(http.Dir(assetPublicPath)),
Logger: log.New(os.Stderr, "", log.LstdFlags), Logger: log.New(os.Stderr, "", log.LstdFlags),
allowedDirectories: map[string]bool{
"/": true,
"/css": true,
"/js": true,
"/images": true,
"/fonts": true,
"/ico": true,
},
} }
return h return h
} }
@ -46,17 +33,10 @@ func isHTML(acceptContent []string) bool {
} }
func (handler *FileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (handler *FileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
requestDirectory := path.Dir(r.URL.Path)
if !handler.allowedDirectories[requestDirectory] {
httperror.WriteErrorResponse(w, portainer.ErrResourceNotFound, http.StatusNotFound, handler.Logger)
return
}
if !isHTML(r.Header["Accept"]) { if !isHTML(r.Header["Accept"]) {
w.Header().Set("Cache-Control", "max-age=31536000") w.Header().Set("Cache-Control", "max-age=31536000")
} else { } else {
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
} }
handler.Handler.ServeHTTP(w, r) handler.Handler.ServeHTTP(w, r)
} }

View File

@ -7,6 +7,7 @@ import (
"github.com/portainer/portainer/http/security" "github.com/portainer/portainer/http/security"
"net/http" "net/http"
"path/filepath"
) )
// Server implements the portainer.Server interface // Server implements the portainer.Server interface
@ -42,7 +43,7 @@ func (server *Server) Start() error {
requestBouncer := security.NewRequestBouncer(server.JWTService, server.TeamMembershipService, server.AuthDisabled) requestBouncer := security.NewRequestBouncer(server.JWTService, server.TeamMembershipService, server.AuthDisabled)
proxyManager := proxy.NewManager(server.ResourceControlService, server.TeamMembershipService, server.SettingsService) proxyManager := proxy.NewManager(server.ResourceControlService, server.TeamMembershipService, server.SettingsService)
var fileHandler = handler.NewFileHandler(server.AssetsPath) var fileHandler = handler.NewFileHandler(filepath.Join(server.AssetsPath, "public"))
var authHandler = handler.NewAuthHandler(requestBouncer, server.AuthDisabled) var authHandler = handler.NewAuthHandler(requestBouncer, server.AuthDisabled)
authHandler.UserService = server.UserService authHandler.UserService = server.UserService
authHandler.CryptoService = server.CryptoService authHandler.CryptoService = server.CryptoService

View File

@ -57,7 +57,7 @@ module.exports = function (grunt) {
// Project configuration. // Project configuration.
grunt.initConfig({ grunt.initConfig({
distdir: 'dist', distdir: 'dist/public',
shippedDockerVersion: '17.09.0-ce', shippedDockerVersion: '17.09.0-ce',
pkg: grunt.file.readJSON('package.json'), pkg: grunt.file.readJSON('package.json'),
config: { config: {
@ -72,8 +72,8 @@ module.exports = function (grunt) {
css: ['assets/css/app.css'] css: ['assets/css/app.css']
}, },
clean: { clean: {
all: ['<%= distdir %>/*'], all: ['<%= distdir %>/../*'],
app: ['<%= distdir %>/*', '!<%= distdir %>/portainer*', '!<%= distdir %>/docker*'], app: ['<%= distdir %>/*', '!<%= distdir %>/../portainer*', '!<%= distdir %>/../docker*'],
tmpl: ['<%= distdir %>/templates'], tmpl: ['<%= distdir %>/templates'],
tmp: ['<%= distdir %>/js/*', '!<%= distdir %>/js/app.*.js', '<%= distdir %>/css/*', '!<%= distdir %>/css/app.*.css'] tmp: ['<%= distdir %>/js/*', '!<%= distdir %>/js/app.*.js', '<%= distdir %>/css/*', '!<%= distdir %>/css/app.*.css']
}, },
@ -93,7 +93,8 @@ module.exports = function (grunt) {
release: { release: {
src: '<%= src.html %>', src: '<%= src.html %>',
options: { options: {
root: '<%= distdir %>' root: '<%= distdir %>',
dest: '<%= distdir %>'
} }
} }
}, },
@ -187,7 +188,7 @@ module.exports = function (grunt) {
run: { run: {
command: [ command: [
'docker rm -f portainer', 'docker rm -f portainer',
'docker run -d -p 9000:9000 -v $(pwd)/dist:/app -v /tmp/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock:z --name portainer portainer/base /app/portainer-linux-' + arch + ' --no-analytics -a /app' 'docker run -d -p 9000:9000 -v $(pwd)/dist:/app -v /tmp/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock:z --name portainer portainer/base /app/portainer-linux-' + arch + ' --no-analytics'
].join(';') ].join(';')
}, },
downloadDockerBinary: { downloadDockerBinary: {