mirror of
https://github.com/containers/podman.git
synced 2025-06-22 18:08:11 +08:00
Merge pull request #14806 from n1hility/win-proxy
Implement proxy support for Windows
This commit is contained in:
@ -18,6 +18,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/containers/common/pkg/config"
|
||||||
"github.com/containers/podman/v4/pkg/machine"
|
"github.com/containers/podman/v4/pkg/machine"
|
||||||
"github.com/containers/podman/v4/utils"
|
"github.com/containers/podman/v4/utils"
|
||||||
"github.com/containers/storage/pkg/homedir"
|
"github.com/containers/storage/pkg/homedir"
|
||||||
@ -116,6 +117,43 @@ ln -fs /home/[USER]/.config/systemd/[USER]/linger-example.service \
|
|||||||
/home/[USER]/.config/systemd/[USER]/default.target.wants/linger-example.service
|
/home/[USER]/.config/systemd/[USER]/default.target.wants/linger-example.service
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const proxyConfigSetup = `#!/bin/bash
|
||||||
|
|
||||||
|
SYSTEMD_CONF=/etc/systemd/system.conf.d/default-env.conf
|
||||||
|
ENVD_CONF=/etc/environment.d/default-env.conf
|
||||||
|
PROFILE_CONF=/etc/profile.d/default-env.sh
|
||||||
|
|
||||||
|
IFS="|"
|
||||||
|
read proxies
|
||||||
|
|
||||||
|
mkdir -p /etc/profile.d /etc/environment.d /etc/systemd/system.conf.d/
|
||||||
|
rm -f $SYSTEMD_CONF
|
||||||
|
for proxy in $proxies; do
|
||||||
|
output+="$proxy "
|
||||||
|
done
|
||||||
|
echo "[Manager]" >> $SYSTEMD_CONF
|
||||||
|
echo -ne "DefaultEnvironment=" >> $SYSTEMD_CONF
|
||||||
|
|
||||||
|
echo $output >> $SYSTEMD_CONF
|
||||||
|
rm -f $ENVD_CONF
|
||||||
|
for proxy in $proxies; do
|
||||||
|
echo "$proxy" >> $ENVD_CONF
|
||||||
|
done
|
||||||
|
rm -f $PROFILE_CONF
|
||||||
|
for proxy in $proxies; do
|
||||||
|
echo "export $proxy" >> $PROFILE_CONF
|
||||||
|
done
|
||||||
|
`
|
||||||
|
|
||||||
|
const proxyConfigAttempt = `if [ -f /usr/local/bin/proxyinit ]; \
|
||||||
|
then /usr/local/bin/proxyinit; \
|
||||||
|
else exit 42; \
|
||||||
|
fi`
|
||||||
|
|
||||||
|
const clearProxySettings = `rm -f /etc/systemd/system.conf.d/default-env.conf \
|
||||||
|
/etc/environment.d/default-env.conf \
|
||||||
|
/etc/profile.d/default-env.sh`
|
||||||
|
|
||||||
const wslInstallError = `Could not %s. See previous output for any potential failure details.
|
const wslInstallError = `Could not %s. See previous output for any potential failure details.
|
||||||
If you can not resolve the issue, and rerunning fails, try the "wsl --install" process
|
If you can not resolve the issue, and rerunning fails, try the "wsl --install" process
|
||||||
outlined in the following article:
|
outlined in the following article:
|
||||||
@ -300,6 +338,7 @@ func (v *MachineVM) Init(opts machine.InitOptions) (bool, error) {
|
|||||||
return cont, err
|
return cont, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_ = setupWslProxyEnv()
|
||||||
homeDir := homedir.Get()
|
homeDir := homedir.Get()
|
||||||
sshDir := filepath.Join(homeDir, ".ssh")
|
sshDir := filepath.Join(homeDir, ".ssh")
|
||||||
v.IdentityPath = filepath.Join(sshDir, v.Name)
|
v.IdentityPath = filepath.Join(sshDir, v.Name)
|
||||||
@ -526,6 +565,40 @@ func configureSystem(v *MachineVM, dist string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func configureProxy(dist string, useProxy bool) error {
|
||||||
|
if !useProxy {
|
||||||
|
_ = runCmdPassThrough("wsl", "-d", dist, "sh", "-c", clearProxySettings)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var content string
|
||||||
|
for i, key := range config.ProxyEnv {
|
||||||
|
if value, _ := os.LookupEnv(key); len(value) > 0 {
|
||||||
|
var suffix string
|
||||||
|
if i < (len(config.ProxyEnv) - 1) {
|
||||||
|
suffix = "|"
|
||||||
|
}
|
||||||
|
content = fmt.Sprintf("%s%s=\"%s\"%s", content, key, value, suffix)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := pipeCmdPassThrough("wsl", content, "-d", dist, "sh", "-c", proxyConfigAttempt); err != nil {
|
||||||
|
const failMessage = "Failure creating proxy configuration"
|
||||||
|
if exitErr, isExit := err.(*exec.ExitError); isExit && exitErr.ExitCode() != 42 {
|
||||||
|
return errors.Wrap(err, failMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Installing proxy support")
|
||||||
|
_ = pipeCmdPassThrough("wsl", proxyConfigSetup, "-d", dist, "sh", "-c",
|
||||||
|
"cat > /usr/local/bin/proxyinit; chmod 755 /usr/local/bin/proxyinit")
|
||||||
|
|
||||||
|
if err = pipeCmdPassThrough("wsl", content, "-d", dist, "/usr/local/bin/proxyinit"); err != nil {
|
||||||
|
return errors.Wrap(err, failMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func enableUserLinger(v *MachineVM, dist string) error {
|
func enableUserLinger(v *MachineVM, dist string) error {
|
||||||
lingerCmd := "mkdir -p /var/lib/systemd/linger; touch /var/lib/systemd/linger/" + v.RemoteUsername
|
lingerCmd := "mkdir -p /var/lib/systemd/linger; touch /var/lib/systemd/linger/" + v.RemoteUsername
|
||||||
if err := runCmdPassThrough("wsl", "-d", dist, "sh", "-c", lingerCmd); err != nil {
|
if err := runCmdPassThrough("wsl", "-d", dist, "sh", "-c", lingerCmd); err != nil {
|
||||||
@ -555,6 +628,11 @@ func installScripts(dist string) error {
|
|||||||
return errors.Wrap(err, "could not create bootstrap script for guest OS")
|
return errors.Wrap(err, "could not create bootstrap script for guest OS")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := pipeCmdPassThrough("wsl", proxyConfigSetup, "-d", dist, "sh", "-c",
|
||||||
|
"cat > /usr/local/bin/proxyinit; chmod 755 /usr/local/bin/proxyinit"); err != nil {
|
||||||
|
return errors.Wrap(err, "could not create proxyinit script for guest OS")
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -816,6 +894,26 @@ func pipeCmdPassThrough(name string, input string, arg ...string) error {
|
|||||||
return cmd.Run()
|
return cmd.Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setupWslProxyEnv() (hasProxy bool) {
|
||||||
|
current, _ := os.LookupEnv("WSLENV")
|
||||||
|
for _, key := range config.ProxyEnv {
|
||||||
|
if value, _ := os.LookupEnv(key); len(value) < 1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
hasProxy = true
|
||||||
|
delim := ""
|
||||||
|
if len(current) > 0 {
|
||||||
|
delim = ":"
|
||||||
|
}
|
||||||
|
current = fmt.Sprintf("%s%s%s/u", current, delim, key)
|
||||||
|
}
|
||||||
|
if hasProxy {
|
||||||
|
os.Setenv("WSLENV", current)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (v *MachineVM) Set(_ string, opts machine.SetOptions) ([]error, error) {
|
func (v *MachineVM) Set(_ string, opts machine.SetOptions) ([]error, error) {
|
||||||
// If one setting fails to be applied, the others settings will not fail and still be applied.
|
// If one setting fails to be applied, the others settings will not fail and still be applied.
|
||||||
// The setting(s) that failed to be applied will have its errors returned in setErrors
|
// The setting(s) that failed to be applied will have its errors returned in setErrors
|
||||||
@ -852,6 +950,10 @@ func (v *MachineVM) Start(name string, _ machine.StartOptions) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dist := toDist(name)
|
dist := toDist(name)
|
||||||
|
useProxy := setupWslProxyEnv()
|
||||||
|
if err := configureProxy(dist, useProxy); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
err := runCmdPassThrough("wsl", "-d", dist, "/root/bootstrap")
|
err := runCmdPassThrough("wsl", "-d", dist, "/root/bootstrap")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Reference in New Issue
Block a user