2014-10-06 01:24:19 +00:00
/ *
2015-05-01 16:19:44 +00:00
Copyright 2014 The Kubernetes Authors All rights reserved .
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-03-09 22:08:16 +00:00
"fmt"
2014-10-06 01:24:19 +00:00
"io"
2015-02-04 09:31:39 +00:00
"strings"
2014-10-06 01:24:19 +00:00
2015-08-05 22:03:47 +00:00
"k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
2014-10-06 01:24:19 +00:00
"github.com/golang/glog"
"github.com/spf13/cobra"
)
2015-03-11 17:22:08 +00:00
const (
proxy_example = ` // Run a proxy to kubernetes apiserver on port 8011, serving static content from ./local/www/
$ kubectl proxy -- port = 8011 -- www = . / local / www /
2015-07-07 05:04:39 +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-03-11 17:22:08 +00:00
// Run a proxy to kubernetes apiserver, changing the api prefix to k8s-api
2015-06-05 19:47:15 +00:00
// This makes e.g. the pods api available at localhost:8011/k8s-api/v1/pods/
2015-05-28 20:47:47 +00:00
$ kubectl proxy -- api - prefix = / k8s - api `
2015-03-11 17:22:08 +00:00
)
2015-04-07 18:21:25 +00:00
func NewCmdProxy ( f * cmdutil . Factory , out io . Writer ) * cobra . Command {
2014-10-06 01:24:19 +00:00
cmd := & cobra . Command {
2015-06-04 01:22:31 +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 : ` 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 '
` ,
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." )
cmd . Flags ( ) . StringP ( "api-prefix" , "" , "/api/" , "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-07 05:04:39 +00:00
cmd . Flags ( ) . IntP ( "port" , "p" , 8001 , "The port on which to run the proxy. Set to 0 to pick a random port." )
2015-06-04 23:21:11 +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. Use with caution." )
2014-10-06 01:24:19 +00:00
return cmd
}
2015-03-09 22:08:16 +00:00
2015-04-07 18:21:25 +00:00
func RunProxy ( f * cmdutil . Factory , out io . Writer , cmd * cobra . Command ) error {
port := cmdutil . GetFlagInt ( cmd , "port" )
2015-03-09 22:08:16 +00:00
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" ) {
glog . Warning ( "Request filter disabled, your proxy is vulnerable to XSRF attacks, please be cautious" )
filter = nil
}
2015-07-07 05:04:39 +00:00
server , err := kubectl . NewProxyServer ( port , cmdutil . GetFlagString ( cmd , "www" ) , apiProxyPrefix , staticPrefix , filter , clientConfig )
2015-03-09 22:08:16 +00:00
if err != nil {
return err
}
2015-07-07 05:04:39 +00:00
// Separate listening from serving so we can report the bound port
// when it is chosen by os (port == 0)
l , err := server . Listen ( )
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
}