2014-10-06 01:24:19 +00:00
/ *
2016-06-03 00:25:58 +00:00
Copyright 2014 The Kubernetes Authors .
2014-10-06 01:24:19 +00:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package cmd
import (
2015-07-01 08:17:53 +00:00
"errors"
2015-03-09 22:08:16 +00:00
"fmt"
2014-10-06 01:24:19 +00:00
"io"
2015-07-01 08:17:53 +00:00
"net"
2015-02-04 09:31:39 +00:00
"strings"
2014-10-06 01:24:19 +00:00
"github.com/golang/glog"
"github.com/spf13/cobra"
2015-08-05 22:05:17 +00:00
"k8s.io/kubernetes/pkg/kubectl"
2016-10-07 22:24:42 +00:00
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
2015-08-05 22:05:17 +00:00
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
2014-10-06 01:24:19 +00:00
)
2016-05-20 17:49:56 +00:00
var (
2016-10-07 22:24:42 +00:00
default_port = 8001
proxy_long = templates . LongDesc ( `
To proxy all of the kubernetes api and nothing else , use :
$ kubectl proxy -- api - prefix = /
To proxy only part of the kubernetes api and also some static files :
$ kubectl proxy -- www = / my / files -- www - prefix = / static / -- api - prefix = / api /
The above lets you ' curl localhost : 8001 / api / v1 / pods ' .
To proxy the entire kubernetes api at a different root , use :
$ kubectl proxy -- api - prefix = / custom /
The above lets you ' curl localhost : 8001 / custom / api / v1 / pods ' ` )
proxy_example = templates . Examples ( `
2016-05-20 17:49:56 +00:00
# Run a proxy to kubernetes apiserver on port 8011 , serving static content from . / local / www /
kubectl proxy -- port = 8011 -- www = . / local / www /
2015-03-11 17:22:08 +00:00
2016-05-20 17:49:56 +00:00
# Run a proxy to kubernetes apiserver on an arbitrary local port .
# The chosen port for the server will be output to stdout .
kubectl proxy -- port = 0
2015-07-07 05:04:39 +00:00
2016-05-20 17:49:56 +00:00
# Run a proxy to kubernetes apiserver , changing the api prefix to k8s - api
2016-11-29 11:54:48 +00:00
# This makes e . g . the pods api available at localhost : 8001 / k8s - api / v1 / pods /
2016-05-20 17:49:56 +00:00
kubectl proxy -- api - prefix = / k8s - api ` )
2015-03-11 17:22:08 +00:00
)
2016-10-13 00:18:39 +00:00
func NewCmdProxy ( f cmdutil . Factory , out io . Writer ) * cobra . Command {
2014-10-06 01:24:19 +00:00
cmd := & cobra . Command {
2016-10-07 22:24:42 +00:00
Use : "proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix]" ,
Short : "Run a proxy to the Kubernetes API server" ,
Long : proxy_long ,
2015-03-11 17:22:08 +00:00
Example : proxy_example ,
2014-10-06 01:24:19 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2015-03-09 22:08:16 +00:00
err := RunProxy ( f , out , cmd )
2015-04-07 18:21:25 +00:00
cmdutil . CheckErr ( err )
2014-10-06 01:24:19 +00:00
} ,
}
2015-02-03 17:59:21 +00:00
cmd . Flags ( ) . StringP ( "www" , "w" , "" , "Also serve static files from the given directory under the specified prefix." )
cmd . Flags ( ) . StringP ( "www-prefix" , "P" , "/static/" , "Prefix to serve static files under, if static file directory is specified." )
2015-10-09 19:02:16 +00:00
cmd . Flags ( ) . StringP ( "api-prefix" , "" , "/" , "Prefix to serve the proxied API under." )
2015-06-04 23:21:11 +00:00
cmd . Flags ( ) . String ( "accept-paths" , kubectl . DefaultPathAcceptRE , "Regular expression for paths that the proxy should accept." )
cmd . Flags ( ) . String ( "reject-paths" , kubectl . DefaultPathRejectRE , "Regular expression for paths that the proxy should reject." )
cmd . Flags ( ) . String ( "accept-hosts" , kubectl . DefaultHostAcceptRE , "Regular expression for hosts that the proxy should accept." )
cmd . Flags ( ) . String ( "reject-methods" , kubectl . DefaultMethodRejectRE , "Regular expression for HTTP methods that the proxy should reject." )
2015-07-01 08:17:53 +00:00
cmd . Flags ( ) . IntP ( "port" , "p" , default_port , "The port on which to run the proxy. Set to 0 to pick a random port." )
2015-09-30 10:14:00 +00:00
cmd . Flags ( ) . StringP ( "address" , "" , "127.0.0.1" , "The IP address on which to serve on." )
2015-07-01 08:17:53 +00:00
cmd . Flags ( ) . Bool ( "disable-filter" , false , "If true, disable request filtering in the proxy. This is dangerous, and can leave you vulnerable to XSRF attacks, when used with an accessible port." )
cmd . Flags ( ) . StringP ( "unix-socket" , "u" , "" , "Unix socket on which to run the proxy." )
2014-10-06 01:24:19 +00:00
return cmd
}
2015-03-09 22:08:16 +00:00
2016-10-13 00:18:39 +00:00
func RunProxy ( f cmdutil . Factory , out io . Writer , cmd * cobra . Command ) error {
2015-07-01 08:17:53 +00:00
path := cmdutil . GetFlagString ( cmd , "unix-socket" )
2015-04-07 18:21:25 +00:00
port := cmdutil . GetFlagInt ( cmd , "port" )
2015-09-30 10:14:00 +00:00
address := cmdutil . GetFlagString ( cmd , "address" )
2015-03-09 22:08:16 +00:00
2015-07-01 08:17:53 +00:00
if port != default_port && path != "" {
return errors . New ( "Don't specify both --unix-socket and --port" )
}
2015-03-14 10:45:18 +00:00
clientConfig , err := f . ClientConfig ( )
2015-03-09 22:08:16 +00:00
if err != nil {
return err
}
2015-04-07 18:21:25 +00:00
staticPrefix := cmdutil . GetFlagString ( cmd , "www-prefix" )
2015-03-09 22:08:16 +00:00
if ! strings . HasSuffix ( staticPrefix , "/" ) {
staticPrefix += "/"
}
2015-04-07 18:21:25 +00:00
apiProxyPrefix := cmdutil . GetFlagString ( cmd , "api-prefix" )
2015-03-09 22:08:16 +00:00
if ! strings . HasSuffix ( apiProxyPrefix , "/" ) {
apiProxyPrefix += "/"
}
2015-06-04 23:21:11 +00:00
filter := & kubectl . FilterServer {
AcceptPaths : kubectl . MakeRegexpArrayOrDie ( cmdutil . GetFlagString ( cmd , "accept-paths" ) ) ,
RejectPaths : kubectl . MakeRegexpArrayOrDie ( cmdutil . GetFlagString ( cmd , "reject-paths" ) ) ,
AcceptHosts : kubectl . MakeRegexpArrayOrDie ( cmdutil . GetFlagString ( cmd , "accept-hosts" ) ) ,
}
if cmdutil . GetFlagBool ( cmd , "disable-filter" ) {
2015-07-01 08:17:53 +00:00
if path == "" {
glog . Warning ( "Request filter disabled, your proxy is vulnerable to XSRF attacks, please be cautious" )
}
2015-06-04 23:21:11 +00:00
filter = nil
}
2015-07-01 08:17:53 +00:00
server , err := kubectl . NewProxyServer ( cmdutil . GetFlagString ( cmd , "www" ) , apiProxyPrefix , staticPrefix , filter , clientConfig )
2015-03-09 22:08:16 +00:00
2015-07-07 05:04:39 +00:00
// Separate listening from serving so we can report the bound port
2015-07-01 08:17:53 +00:00
// when it is chosen by os (eg: port == 0)
var l net . Listener
if path == "" {
2015-09-30 10:14:00 +00:00
l , err = server . Listen ( address , port )
2015-07-01 08:17:53 +00:00
} else {
l , err = server . ListenUnix ( path )
}
2015-07-07 05:04:39 +00:00
if err != nil {
glog . Fatal ( err )
}
fmt . Fprintf ( out , "Starting to serve on %s" , l . Addr ( ) . String ( ) )
glog . Fatal ( server . ServeOnListener ( l ) )
2015-03-09 22:08:16 +00:00
return nil
}