Skip to content

Commit 6280984

Browse files
authored
Merge pull request #33 from fclairamb/switch-to-gokit
Replacing log15 by go-kit/log
2 parents 40d8240 + 0622a0f commit 6280984

File tree

8 files changed

+71
-35
lines changed

8 files changed

+71
-35
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Note: this is a fork of [andrewarrow/paradise_ftp](https://github.com/andrewarro
2222
* Passive socket connections (EPSV and PASV commands)
2323
* Active socket connections (PORT command)
2424
* Small memory footprint
25-
* Only relies on the standard library except for logging which uses [log15](https://github.com/inconshreveable/log15) ([which could change](https://github.com/fclairamb/ftpserver/issues/7)).
25+
* Only relies on the standard library except for logging which uses [go-kit log](https://github.com/go-kit/kit/tree/master/log).
2626
* Supported extensions:
2727
* [MDTM](https://tools.ietf.org/html/rfc3659#page-8) - File Modification Time
2828
* [MLST](https://tools.ietf.org/html/rfc3659#page-23) - Directory listing for maching processing

main.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import (
99

1010
"github.com/fclairamb/ftpserver/sample"
1111
"github.com/fclairamb/ftpserver/server"
12-
"gopkg.in/inconshreveable/log15.v2"
12+
"github.com/go-kit/kit/log"
13+
"github.com/go-kit/kit/log/level"
1314
)
1415

1516
var (
@@ -18,13 +19,30 @@ var (
1819

1920
func main() {
2021
flag.Parse()
21-
ftpServer = server.NewFtpServer(sample.NewSampleDriver())
22+
23+
logger := log.With(
24+
log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)),
25+
"ts", log.DefaultTimestampUTC,
26+
"caller", log.DefaultCaller,
27+
)
28+
29+
level.Info(logger).Log("msg", "Sample server")
30+
31+
driver, err := sample.NewSampleDriver()
32+
if err != nil {
33+
level.Error(logger).Log("msg", "Could not load the driver", "err", err)
34+
return
35+
}
36+
driver.Logger = log.With(logger, "component", "driver")
37+
38+
ftpServer = server.NewFtpServer(driver)
39+
ftpServer.Logger = log.With(logger, "component", "server")
2240

2341
go signalHandler()
2442

25-
err := ftpServer.ListenAndServe()
43+
err = ftpServer.ListenAndServe()
2644
if err != nil {
27-
log15.Error("Problem listening", "err", err)
45+
level.Error(logger).Log("msg", "Problem listening", "err", err)
2846
}
2947
}
3048

sample/sample_driver.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ import (
1313
"time"
1414

1515
"github.com/fclairamb/ftpserver/server"
16+
"github.com/go-kit/kit/log"
17+
"github.com/go-kit/kit/log/level"
1618
"github.com/naoina/toml"
17-
"gopkg.in/inconshreveable/log15.v2"
1819
)
1920

2021
// MainDriver defines a very basic serverftp driver
2122
type MainDriver struct {
23+
Logger log.Logger
2224
baseDir string
2325
tlsConfig *tls.Config
2426
}
@@ -33,7 +35,7 @@ func (driver *MainDriver) WelcomeUser(cc server.ClientContext) (string, error) {
3335
// AuthUser authenticates the user and selects an handling driver
3436
func (driver *MainDriver) AuthUser(cc server.ClientContext, user, pass string) (server.ClientHandlingDriver, error) {
3537
if user == "bad" || pass == "bad" {
36-
return nil, errors.New("Bad username or password")
38+
return nil, errors.New("bad username or password")
3739
}
3840

3941
return driver, nil
@@ -42,7 +44,7 @@ func (driver *MainDriver) AuthUser(cc server.ClientContext, user, pass string) (
4244
// GetTLSConfig returns a TLS Certificate to use
4345
func (driver *MainDriver) GetTLSConfig() (*tls.Config, error) {
4446
if driver.tlsConfig == nil {
45-
log15.Info("Loading certificate")
47+
level.Info(driver.Logger).Log("msg", "Loading certificate")
4648
if cert, err := tls.LoadX509KeyPair("sample/certs/mycert.crt", "sample/certs/mycert.key"); err == nil {
4749
driver.tlsConfig = &tls.Config{
4850
NextProtos: []string{"ftp"},
@@ -185,11 +187,11 @@ func (driver *MainDriver) GetSettings() *server.Settings {
185187

186188
// This is the new IP loading change coming from Ray
187189
if config.PublicHost == "" {
188-
log15.Debug("Fetching our external IP address...")
190+
level.Debug(driver.Logger).Log("msg", "Fetching our external IP address...")
189191
if config.PublicHost, err = externalIP(); err != nil {
190-
log15.Warn("Couldn't fetch an external IP", "err", err)
192+
level.Warn(driver.Logger).Log("msg", "Couldn't fetch an external IP", "err", err)
191193
} else {
192-
log15.Debug("Fetched our external IP address", "ipAddress", config.PublicHost)
194+
level.Debug(driver.Logger).Log("msg", "Fetched our external IP address", "ipAddress", config.PublicHost)
193195
}
194196
}
195197

@@ -199,17 +201,18 @@ func (driver *MainDriver) GetSettings() *server.Settings {
199201
// NewSampleDriver creates a sample driver
200202
// Note: This is not a mistake. Interface can be pointers. There seems to be a lot of confusion around this in the
201203
// server_ftp original code.
202-
func NewSampleDriver() *MainDriver {
204+
func NewSampleDriver() (*MainDriver, error) {
203205
dir, err := ioutil.TempDir("", "ftpserver")
204206
if err != nil {
205-
log15.Error("Could not find a temporary dir", "err", err)
207+
return nil, fmt.Errorf("could not find a temporary dir, err: %v", err)
206208
}
207209

208210
driver := &MainDriver{
209211
baseDir: dir,
212+
Logger: log.NewNopLogger(),
210213
}
211214
os.MkdirAll(driver.baseDir, 0777)
212-
return driver
215+
return driver, nil
213216
}
214217

215218
type virtualFile struct {

server/client_handler.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import (
99
"strings"
1010
"time"
1111

12-
"gopkg.in/inconshreveable/log15.v2"
12+
"github.com/go-kit/kit/log"
13+
"github.com/go-kit/kit/log/level"
1314
)
1415

1516
type clientHandler struct {
@@ -29,21 +30,25 @@ type clientHandler struct {
2930
debug bool // Show debugging info on the server side
3031
transfer transferHandler // Transfer connection (only passive is implemented at this stage)
3132
transferTLS bool // Use TLS for transfer connection
33+
logger log.Logger // Client handler logging
3234
}
3335

3436
// newClientHandler initializes a client handler when someone connects
3537
func (server *FtpServer) newClientHandler(connection net.Conn) *clientHandler {
3638

39+
id := server.clientCounter
40+
3741
server.clientCounter++
3842

3943
p := &clientHandler{
4044
daddy: server,
4145
conn: connection,
42-
ID: server.clientCounter,
46+
ID: id,
4347
writer: bufio.NewWriter(connection),
4448
reader: bufio.NewReader(connection),
4549
connectedAt: time.Now().UTC(),
4650
path: "/",
51+
logger: log.With(server.Logger, "clientId", id),
4752
}
4853

4954
// Just respecting the existing logic here, this could be probably be dropped at some point
@@ -104,7 +109,7 @@ func (c *clientHandler) HandleCommands() {
104109
for {
105110
if c.reader == nil {
106111
if c.debug {
107-
log15.Debug("Clean disconnect", "action", "ftp.disconnect", "id", c.ID, "clean", true)
112+
level.Debug(c.logger).Log(logKeyMsg, "Clean disconnect", logKeyAction, "ftp.disconnect", "clean", true)
108113
}
109114
return
110115
}
@@ -114,16 +119,16 @@ func (c *clientHandler) HandleCommands() {
114119
if err != nil {
115120
if err == io.EOF {
116121
if c.debug {
117-
log15.Debug("TCP disconnect", "action", "ftp.disconnect", "id", c.ID, "clean", false)
122+
level.Debug(c.logger).Log(logKeyMsg, "TCP disconnect", logKeyAction, "ftp.disconnect", "clean", false)
118123
}
119124
} else {
120-
log15.Error("Read error", "action", "ftp.read_error", "id", c.ID, "err", err)
125+
level.Error(c.logger).Log(logKeyMsg, "Read error", logKeyAction, "ftp.read_error", "err", err)
121126
}
122127
return
123128
}
124129

125130
if c.debug {
126-
log15.Debug("FTP RECV", "action", "ftp.cmd_recv", "id", c.ID, "line", line)
131+
level.Debug(c.logger).Log(logKeyMsg, "FTP RECV", logKeyAction, "ftp.cmd_recv", "line", line)
127132
}
128133

129134
c.handleCommand(line)
@@ -158,7 +163,7 @@ func (c *clientHandler) handleCommand(line string) {
158163

159164
func (c *clientHandler) writeLine(line string) {
160165
if c.debug {
161-
log15.Debug("FTP SEND", "action", "ftp.cmd_send", "id", c.ID, "line", line)
166+
level.Debug(c.logger).Log(logKeyMsg, "FTP SEND", logKeyAction, "ftp.cmd_send", "line", line)
162167
}
163168
c.writer.Write([]byte(line))
164169
c.writer.Write([]byte("\r\n"))
@@ -177,7 +182,7 @@ func (c *clientHandler) TransferOpen() (net.Conn, error) {
177182
c.writeMessage(150, "Using transfer connection")
178183
conn, err := c.transfer.Open()
179184
if err == nil && c.debug {
180-
log15.Debug("FTP Transfer connection opened", "action", "ftp.transfer_open", "id", c.ID, "remoteAddr", conn.RemoteAddr().String(), "localAddr", conn.LocalAddr().String())
185+
level.Debug(c.logger).Log(logKeyMsg, "FTP Transfer connection opened", logKeyAction, "ftp.transfer_open", "remoteAddr", conn.RemoteAddr().String(), "localAddr", conn.LocalAddr().String())
181186
}
182187
return conn, err
183188
}
@@ -188,7 +193,7 @@ func (c *clientHandler) TransferClose() {
188193
c.transfer.Close()
189194
c.transfer = nil
190195
if c.debug {
191-
log15.Debug("FTP Transfer connection closed", "action", "ftp.transfer_close", "id", c.ID)
196+
level.Debug(c.logger).Log(logKeyMsg, "FTP Transfer connection closed", logKeyAction, "ftp.transfer_close")
192197
}
193198
}
194199
}

server/server.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,15 @@ import (
77
"sync"
88
"time"
99

10-
"gopkg.in/inconshreveable/log15.v2"
10+
"github.com/go-kit/kit/log"
11+
"github.com/go-kit/kit/log/level"
12+
)
13+
14+
const (
15+
// logKeyMsg is the human-readable part of the log
16+
logKeyMsg = "msg"
17+
// logKeyAction is the machine-readable part of the log
18+
logKeyAction = "action"
1119
)
1220

1321
// CommandDescription defines which function should be used and if it should be open to anyone or only logged in users
@@ -74,6 +82,7 @@ func init() {
7482
// FtpServer is where everything is stored
7583
// We want to keep it as simple as possible
7684
type FtpServer struct {
85+
Logger log.Logger // Go-Kit logger
7786
Settings *Settings // General settings
7887
Listener net.Listener // Listener used to receive files
7988
StartTime time.Time // Time when the server was started
@@ -114,11 +123,11 @@ func (server *FtpServer) Listen() error {
114123
)
115124

116125
if err != nil {
117-
log15.Error("Cannot listen", "err", err)
126+
level.Error(server.Logger).Log(logKeyMsg, "Cannot listen", "err", err)
118127
return err
119128
}
120129

121-
log15.Info("Listening...", "address", server.Listener.Addr())
130+
level.Info(server.Logger).Log(logKeyMsg, "Listening...", logKeyAction, "ftp.listening", "address", server.Listener.Addr())
122131

123132
return err
124133
}
@@ -129,7 +138,7 @@ func (server *FtpServer) Serve() {
129138
connection, err := server.Listener.Accept()
130139
if err != nil {
131140
if server.Listener != nil {
132-
log15.Error("Accept error", "err", err)
141+
level.Error(server.Logger).Log(logKeyMsg, "Accept error", "err", err)
133142
}
134143
break
135144
}
@@ -145,7 +154,7 @@ func (server *FtpServer) ListenAndServe() error {
145154
return err
146155
}
147156

148-
log15.Info("Starting...")
157+
level.Info(server.Logger).Log(logKeyMsg, "Starting...", logKeyAction, "ftp.starting")
149158

150159
server.Serve()
151160

@@ -160,6 +169,7 @@ func NewFtpServer(driver MainDriver) *FtpServer {
160169
driver: driver,
161170
StartTime: time.Now().UTC(), // Might make sense to put it in Start method
162171
connectionsByID: make(map[uint32]*clientHandler),
172+
Logger: log.NewNopLogger(),
163173
}
164174
}
165175

@@ -180,10 +190,10 @@ func (server *FtpServer) clientArrival(c *clientHandler) error {
180190
server.connectionsByID[c.ID] = c
181191
nb := len(server.connectionsByID)
182192

183-
log15.Info("FTP Client connected", "action", "ftp.connected", "id", c.ID, "src", c.conn.RemoteAddr(), "total", nb)
193+
level.Info(c.logger).Log(logKeyMsg, "FTP Client connected", logKeyAction, "ftp.connected", "clientIp", c.conn.RemoteAddr(), "total", nb)
184194

185195
if nb > server.Settings.MaxConnections {
186-
return fmt.Errorf("Too many clients %d > %d", nb, server.Settings.MaxConnections)
196+
return fmt.Errorf("too many clients %d > %d", nb, server.Settings.MaxConnections)
187197
}
188198

189199
return nil
@@ -196,5 +206,5 @@ func (server *FtpServer) clientDeparture(c *clientHandler) {
196206

197207
delete(server.connectionsByID, c.ID)
198208

199-
log15.Info("FTP Client disconnected", "action", "ftp.disconnected", "id", c.ID, "src", c.conn.RemoteAddr(), "total", len(server.connectionsByID))
209+
level.Info(c.logger).Log(logKeyMsg, "FTP Client disconnected", logKeyAction, "ftp.disconnected", "clientIp", c.conn.RemoteAddr(), "total", len(server.connectionsByID))
200210
}

server/transfer_active.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func parseRemoteAddr(param string) (*net.TCPAddr, error) {
6969
//TODO(mgenov): ensure that format of the params is valid
7070
params := strings.Split(param, ",")
7171
if len(params) != 6 {
72-
return nil, errors.New("Bad number of args")
72+
return nil, errors.New("bad number of args")
7373
}
7474
ip := strings.Join(params[0:4], ".")
7575

server/transfer_pasv.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"strings"
99
"time"
1010

11-
"gopkg.in/inconshreveable/log15.v2"
11+
"github.com/go-kit/kit/log/level"
1212
)
1313

1414
// Active/Passive transfer connection handler
@@ -54,7 +54,7 @@ func (c *clientHandler) handlePASV() {
5454
}
5555

5656
if err != nil {
57-
log15.Error("Could not listen", "err", err)
57+
level.Error(c.logger).Log(logKeyMsg, "Could not listen", "err", err)
5858
return
5959
}
6060

tests/test_driver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (driver *ServerDriver) AuthUser(cc server.ClientContext, user, pass string)
5454
if user == "test" && pass == "test" {
5555
return NewClientDriver(), nil
5656
}
57-
return nil, errors.New("Bad username or password")
57+
return nil, errors.New("bad username or password")
5858
}
5959

6060
// UserLeft is called when the user disconnects

0 commit comments

Comments
 (0)