Documentation
¶
Index ¶
- Variables
- func Version() string
- type Auth
- type Command
- type Conn
- type DataSocket
- type DiscardLogger
- func (logger *DiscardLogger) Print(sessionId string, message interface{})
- func (logger *DiscardLogger) PrintCommand(sessionId string, command string, params string)
- func (logger *DiscardLogger) PrintResponse(sessionId string, code int, message string)
- func (logger *DiscardLogger) Printf(sessionId string, format string, v ...interface{})
- type Driver
- type DriverFactory
- type FileInfo
- type Logger
- type Perm
- type Server
- type ServerOpts
- type SimpleAuth
- type SimplePerm
- func (s *SimplePerm) ChGroup(string, string) error
- func (s *SimplePerm) ChMode(string, os.FileMode) error
- func (s *SimplePerm) ChOwner(string, string) error
- func (s *SimplePerm) GetGroup(string) (string, error)
- func (s *SimplePerm) GetMode(string) (os.FileMode, error)
- func (s *SimplePerm) GetOwner(string) (string, error)
- type StdLogger
- func (logger *StdLogger) Print(sessionId string, message interface{})
- func (logger *StdLogger) PrintCommand(sessionId string, command string, params string)
- func (logger *StdLogger) PrintResponse(sessionId string, code int, message string)
- func (logger *StdLogger) Printf(sessionId string, format string, v ...interface{})
Constants ¶
This section is empty.
Variables ¶
var ErrServerClosed = errors.New("ftp: Server closed")
ErrServerClosed is returned by ListenAndServe() or Serve() when a shutdown was requested.
Functions ¶
Types ¶
type Conn ¶
type Conn struct {
// contains filtered or unexported fields
}
func (*Conn) Close ¶
func (conn *Conn) Close()
Close will manually close this connection, even if the client isn't ready.
func (*Conn) PassivePort ¶
func (*Conn) Serve ¶
func (conn *Conn) Serve()
Serve starts an endless loop that reads FTP commands from the client and responds appropriately. terminated is a channel that will receive a true message when the connection closes. This loop will be running inside a goroutine, so use this channel to be notified when the connection can be cleaned up.
type DataSocket ¶
type DataSocket interface {
Host() string
Port() int
// the standard io.Reader interface
Read(p []byte) (n int, err error)
// the standard io.ReaderFrom interface
ReadFrom(r io.Reader) (int64, error)
// the standard io.Writer interface
Write(p []byte) (n int, err error)
// the standard io.Closer interface
Close() error
}
DataSocket describes a data socket is used to send non-control data between the client and server.
type DiscardLogger ¶
type DiscardLogger struct{}
Silent logger, produces no output
func (*DiscardLogger) Print ¶
func (logger *DiscardLogger) Print(sessionId string, message interface{})
func (*DiscardLogger) PrintCommand ¶
func (logger *DiscardLogger) PrintCommand(sessionId string, command string, params string)
func (*DiscardLogger) PrintResponse ¶
func (logger *DiscardLogger) PrintResponse(sessionId string, code int, message string)
func (*DiscardLogger) Printf ¶
func (logger *DiscardLogger) Printf(sessionId string, format string, v ...interface{})
type Driver ¶
type Driver interface {
// Init init
Init(*Conn)
// params - a file path
// returns - a time indicating when the requested path was last modified
// - an error if the file doesn't exist or the user lacks
// permissions
Stat(string) (FileInfo, error)
// params - path
// returns - true if the current user is permitted to change to the
// requested path
ChangeDir(string) error
// params - path, function on file or subdir found
// returns - error
// path
ListDir(string, func(FileInfo) error) error
// params - path
// returns - nil if the directory was deleted or any error encountered
DeleteDir(string) error
// params - path
// returns - nil if the file was deleted or any error encountered
DeleteFile(string) error
// params - from_path, to_path
// returns - nil if the file was renamed or any error encountered
Rename(string, string) error
// params - path
// returns - nil if the new directory was created or any error encountered
MakeDir(string) error
// params - path
// returns - a string containing the file data to send to the client
GetFile(string, int64) (int64, io.ReadCloser, error)
// params - destination path, an io.Reader containing the file data
// returns - the number of bytes writen and the first error encountered while writing, if any.
PutFile(string, io.Reader, bool) (int64, error)
}
Driver is an interface that you will create an implementation that speaks to your chosen persistence layer. graval will create a new instance of your driver for each client that connects and delegate to it as required.
type DriverFactory ¶
DriverFactory is a driver factory to create driver. For each client that connects to the server, a new FTPDriver is required. Create an implementation if this interface and provide it to FTPServer.
type Server ¶
type Server struct {
*ServerOpts
// contains filtered or unexported fields
}
Server is the root of your FTP application. You should instantiate one of these and call ListenAndServe() to start accepting client connections.
Always use the NewServer() method to create a new Server.
func NewServer ¶
func NewServer(opts *ServerOpts) *Server
NewServer initialises a new FTP server. Configuration options are provided via an instance of ServerOpts. Calling this function in your code will probably look something like this:
factory := &MyDriverFactory{}
server := server.NewServer(&server.ServerOpts{ Factory: factory })
or:
factory := &MyDriverFactory{}
opts := &server.ServerOpts{
Factory: factory,
Port: 2000,
Hostname: "127.0.0.1",
}
server := server.NewServer(opts)
func (*Server) ListenAndServe ¶
ListenAndServe asks a new Server to begin accepting client connections. It accepts no arguments - all configuration is provided via the NewServer function.
If the server fails to start for any reason, an error will be returned. Common errors are trying to bind to a privileged port or something else is already listening on the same port.
type ServerOpts ¶
type ServerOpts struct {
// The factory that will be used to create a new FTPDriver instance for
// each client connection. This is a mandatory option.
Factory DriverFactory `json:"-"`
Auth Auth `json:"-"`
// Server Name, Default is Go Ftp Server
Name string `json:"name"`
// The hostname that the FTP server should listen on. Optional, defaults to
// "::", which means all hostnames on ipv4 and ipv6.
Hostname string `json:"hostName"`
// Public IP of the server
PublicIp string `json:"publicIP"`
// Passive ports
PassivePorts string `json:"passivePorts"`
// The port that the FTP should listen on. Optional, defaults to 3000. In
// a production environment you will probably want to change this to 21.
Port int `json:"port"`
// use tls, default is false
TLS bool `json:"tls"`
// if tls used, cert file is required
CertFile string `json:"certFile"`
// if tls used, key file is required
KeyFile string `json:"keyFile"`
// If ture TLS is used in RFC4217 mode
ExplicitFTPS bool `json:"explicitFTPS"`
WelcomeMessage string `json:"welcomeMessage"`
// A logger implementation, if nil the StdLogger is used
Logger Logger
}
ServerOpts contains parameters for server.NewServer()
type SimpleAuth ¶
SimpleAuth implements Auth interface to provide a memory user login auth
func (*SimpleAuth) CheckPasswd ¶
func (a *SimpleAuth) CheckPasswd(name, pass string) (bool, error)
CheckPasswd will check user's password
type SimplePerm ¶
type SimplePerm struct {
// contains filtered or unexported fields
}
func NewSimplePerm ¶
func NewSimplePerm(owner, group string) *SimplePerm
type StdLogger ¶
type StdLogger struct{}
Use an instance of this to log in a standard format
func (*StdLogger) PrintCommand ¶
func (*StdLogger) PrintResponse ¶
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
This is a very simple ftpd server using this library as an example and as something to run tests against.
|
This is a very simple ftpd server using this library as an example and as something to run tests against. |