Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .drone.jsonnet
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,14 @@ local build(arch, testUI) = [{
"go test -c -ldflags '-linkmode external -extldflags -static' -o api.test",
],
},
{
name: 'build external app',
image: 'golang:' + go,
commands: [
'cd test/externalapp',
"CGO_ENABLED=0 go build -ldflags '-extldflags -static' -o externalapp",
],
},
{
name: 'package',
image: 'debian:bookworm-slim',
Expand Down Expand Up @@ -145,6 +153,7 @@ local build(arch, testUI) = [{
'getent hosts $DOMAIN | sed "s/$DOMAIN/auth.$DOMAIN.redirect/g" | sudo tee -a /etc/hosts',
'getent hosts $DOMAIN | sed "s/$DOMAIN/$DOMAIN.redirect/g" | sudo tee -a /etc/hosts',
'getent hosts $DOMAIN | sed "s/$DOMAIN/unknown.$DOMAIN.redirect/g" | sudo tee -a /etc/hosts',
'getent hosts $DOMAIN | sed "s/$DOMAIN/externalapp.$DOMAIN.redirect/g" | sudo tee -a /etc/hosts',
'cat /etc/hosts',
'/opt/bin/entry_point.sh',
],
Expand Down
57 changes: 57 additions & 0 deletions backend/config/user_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ func (c *UserConfig) ensureDb() error {
return err
}

err = c.addCustomProxyTable()
if err != nil {
return err
}

return nil
}

Expand Down Expand Up @@ -588,3 +593,55 @@ func (c *UserConfig) Url(app string) string {
domain := c.GetDeviceDomain()
return ConstructUrl(port, fmt.Sprintf("%s.%s", app, domain))
}

func (c *UserConfig) addCustomProxyTable() error {
db := c.open()
defer db.Close()

query := `create table if not exists custom_proxy
(name varchar primary key, host varchar, port integer)`
_, err := db.Exec(query)
if err != nil {
return fmt.Errorf("unable to add custom_proxy table: %s", err)
}
return nil
}

type CustomProxyEntry struct {
Name string `json:"name"`
Host string `json:"host"`
Port int `json:"port"`
}

func (c *UserConfig) AddCustomProxy(name string, host string, port int) error {
db := c.open()
defer db.Close()
_, err := db.Exec("INSERT OR REPLACE INTO custom_proxy VALUES (?, ?, ?)", name, host, port)
return err
}

func (c *UserConfig) RemoveCustomProxy(name string) error {
db := c.open()
defer db.Close()
_, err := db.Exec("DELETE FROM custom_proxy WHERE name = ?", name)
return err
}

func (c *UserConfig) CustomProxies() ([]CustomProxyEntry, error) {
db := c.open()
defer db.Close()
rows, err := db.Query("select name, host, port from custom_proxy")
if err != nil {
return nil, err
}
entries := make([]CustomProxyEntry, 0)
defer rows.Close()
for rows.Next() {
var entry CustomProxyEntry
if err := rows.Scan(&entry.Name, &entry.Host, &entry.Port); err != nil {
return entries, err
}
entries = append(entries, entry)
}
return entries, rows.Err()
}
10 changes: 10 additions & 0 deletions backend/hook/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type Ldap interface {

type Nginx interface {
InitConfig() error
InitCustomProxyConfig() error
}

type SystemdControl interface {
Expand Down Expand Up @@ -114,6 +115,10 @@ func (i *Install) Install() error {
if err != nil {
return err
}
err = i.nginx.InitCustomProxyConfig()
if err != nil {
return err
}
err = i.web.InitConfig()
if err != nil {
return err
Expand All @@ -138,6 +143,11 @@ func (i *Install) PostRefresh() error {
return err
}

err = i.nginx.InitCustomProxyConfig()
if err != nil {
return err
}

err = i.web.InitConfig()
if err != nil {
return err
Expand Down
9 changes: 8 additions & 1 deletion backend/ioc/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func Init(userConfig string, systemConfig string, backupDir string, varDir strin
return nil, err
}
err = c.Singleton(func(systemConfig *config.SystemConfig, userConfig *config.UserConfig, control *systemd.Control) *nginx.Nginx {
return nginx.New(control, systemConfig, userConfig)
return nginx.New(control, systemConfig, userConfig, nginx.NewProxyConfigAdapter(userConfig))
})
if err != nil {
return nil, err
Expand Down Expand Up @@ -450,6 +450,13 @@ func Init(userConfig string, systemConfig string, backupDir string, varDir strin
return rest.NewProxy(userConfig)
})

if err != nil {
return nil, err
}
err = c.Singleton(func(userConfig *config.UserConfig, nginxService *nginx.Nginx) *rest.CustomProxy {
return rest.NewCustomProxy(userConfig, nginxService)
})

if err != nil {
return nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions backend/ioc/public_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ func InitPublicApi(userConfig string, systemConfig string, backupDir string, var
id *identification.Parser, activate *rest.Activate, userConfig *config.UserConfig, cert *rest.Certificate,
externalAddress *access.ExternalAddress, snapd *snap.Server, disks *storage.Disks, journalCtl *systemd.Journal,
executor *cli.ShellExecutor, iface *network.TcpInterfaces, sender *support.Sender,
proxy *rest.Proxy, middleware *rest.Middleware, ldapService *auth.Service, cookies *session.Cookies,
proxy *rest.Proxy, customProxy *rest.CustomProxy, middleware *rest.Middleware, ldapService *auth.Service, cookies *session.Cookies,
changesClient *snap.ChangesClient,
) *rest.Backend {
return rest.NewBackend(master, backupService, eventTrigger, worker, redirectService,
installerService, storageService, id, activate, userConfig, cert, externalAddress,
snapd, disks, journalCtl, executor, iface, sender, proxy,
snapd, disks, journalCtl, executor, iface, sender, proxy, customProxy,
ldapService, middleware, cookies, net, address, changesClient, logger)
})
if err != nil {
Expand Down
23 changes: 23 additions & 0 deletions backend/nginx/proxy_adapter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package nginx

import "github.com/syncloud/platform/config"

type ProxyConfigAdapter struct {
userConfig *config.UserConfig
}

func NewProxyConfigAdapter(userConfig *config.UserConfig) *ProxyConfigAdapter {
return &ProxyConfigAdapter{userConfig: userConfig}
}

func (a *ProxyConfigAdapter) Proxies() ([]ProxyEntry, error) {
entries, err := a.userConfig.CustomProxies()
if err != nil {
return nil, err
}
result := make([]ProxyEntry, len(entries))
for i, e := range entries {
result[i] = ProxyEntry{Name: e.Name, Host: e.Host, Port: e.Port}
}
return result, nil
}
82 changes: 76 additions & 6 deletions backend/nginx/service.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package nginx

import (
"bytes"
"os"
"path"
"strings"
"text/template"
)

type Systemd interface {
Expand All @@ -19,17 +21,29 @@ type UserConfig interface {
GetDeviceDomain() string
}

type ProxyEntry struct {
Name string
Host string
Port int
}

type ProxyConfig interface {
Proxies() ([]ProxyEntry, error)
}

type Nginx struct {
systemd Systemd
systemConfig SystemConfig
userConfig UserConfig
proxyConfig ProxyConfig
}

func New(systemd Systemd, systemConfig SystemConfig, userConfig UserConfig) *Nginx {
func New(systemd Systemd, systemConfig SystemConfig, userConfig UserConfig, proxyConfig ProxyConfig) *Nginx {
return &Nginx{
systemd: systemd,
userConfig: userConfig,
systemConfig: systemConfig,
proxyConfig: proxyConfig,
}
}

Expand All @@ -44,11 +58,67 @@ func (n *Nginx) InitConfig() error {
if err != nil {
return err
}
template := string(templateFile)
template = strings.ReplaceAll(template, "{{ domain_regex }}", strings.ReplaceAll(domain, ".", "\\."))
template = strings.ReplaceAll(template, "{{ domain }}", domain)
tmpl := string(templateFile)
tmpl = strings.ReplaceAll(tmpl, "{{ domain_regex }}", strings.ReplaceAll(domain, ".", "\\."))
tmpl = strings.ReplaceAll(tmpl, "{{ domain }}", domain)
nginxConfigDir := n.systemConfig.DataDir()
nginxConfigFile := path.Join(nginxConfigDir, "nginx.conf")
err = os.WriteFile(nginxConfigFile, []byte(template), 0644)
return err
return os.WriteFile(nginxConfigFile, []byte(tmpl), 0644)
}

type customProxyTemplateData struct {
Entries []customProxyServerEntry
}

type customProxyServerEntry struct {
ServerName string
Host string
Port int
}

func (n *Nginx) InitCustomProxyConfig() error {
return n.writeCustomProxyConfig()
}

func (n *Nginx) ReloadCustomProxy() error {
err := n.writeCustomProxyConfig()
if err != nil {
return err
}
return n.systemd.ReloadService("platform.nginx-custom-proxy")
}

func (n *Nginx) writeCustomProxyConfig() error {
domain := n.userConfig.GetDeviceDomain()
configDir := n.systemConfig.ConfigDir()
templateFile := path.Join(configDir, "nginx", "custom-proxy.conf")

tmpl, err := template.ParseFiles(templateFile)
if err != nil {
return err
}

entries, err := n.proxyConfig.Proxies()
if err != nil {
return err
}

serverEntries := make([]customProxyServerEntry, len(entries))
for i, e := range entries {
serverEntries[i] = customProxyServerEntry{
ServerName: e.Name + "." + domain,
Host: e.Host,
Port: e.Port,
}
}

var buf bytes.Buffer
err = tmpl.Execute(&buf, customProxyTemplateData{Entries: serverEntries})
if err != nil {
return err
}

nginxConfigDir := n.systemConfig.DataDir()
nginxConfigFile := path.Join(nginxConfigDir, "custom-proxy.conf")
return os.WriteFile(nginxConfigFile, buf.Bytes(), 0644)
}
Loading