11package loopd
22
33import (
4+ "fmt"
5+ "os"
46 "path/filepath"
57
68 "github.com/btcsuite/btcutil"
79 "github.com/lightninglabs/loop/lsat"
10+ "github.com/lightningnetwork/lnd/lncfg"
811)
912
1013var (
1417 defaultLogDirname = "logs"
1518 defaultLogFilename = "loopd.log"
1619 defaultLogDir = filepath .Join (loopDirBase , defaultLogDirname )
20+ defaultConfigFile = filepath .Join (loopDirBase , defaultConfigFilename )
1721
1822 defaultMaxLogFiles = 3
1923 defaultMaxLogFileSize = 10
@@ -43,6 +47,9 @@ type Config struct {
4347 RESTListen string `long:"restlisten" description:"Address to listen on for REST clients"`
4448 CORSOrigin string `long:"corsorigin" description:"The value to send in the Access-Control-Allow-Origin header. Header will be omitted if empty."`
4549
50+ LoopDir string `long:"loopdir" description:"The directory for all of loop's data."`
51+ ConfigFile string `long:"configfile" description:"Path to configuration file."`
52+ DataDir string `long:"datadir" description:"Directory for loopdb."`
4653 LogDir string `long:"logdir" description:"Directory to log output."`
4754 MaxLogFiles int `long:"maxlogfiles" description:"Maximum logfiles to keep (0 for no rotation)"`
4855 MaxLogFileSize int `long:"maxlogfilesize" description:"Maximum logfile size in MB"`
@@ -74,6 +81,9 @@ func DefaultConfig() Config {
7481 Server : & loopServerConfig {
7582 NoTLS : false ,
7683 },
84+ LoopDir : loopDirBase ,
85+ ConfigFile : defaultConfigFile ,
86+ DataDir : loopDirBase ,
7787 LogDir : defaultLogDir ,
7888 MaxLogFiles : defaultMaxLogFiles ,
7989 MaxLogFileSize : defaultMaxLogFileSize ,
@@ -86,3 +96,51 @@ func DefaultConfig() Config {
8696 },
8797 }
8898}
99+
100+ // Validate cleans up paths in the config provided and validates it.
101+ func Validate (cfg * Config ) error {
102+ // Cleanup any paths before we use them.
103+ cfg .LoopDir = lncfg .CleanAndExpandPath (cfg .LoopDir )
104+ cfg .DataDir = lncfg .CleanAndExpandPath (cfg .DataDir )
105+ cfg .LogDir = lncfg .CleanAndExpandPath (cfg .LogDir )
106+
107+ // Since our loop directory overrides our log/data dir values, make sure
108+ // that they are not set when loop dir is set. We hard here rather than
109+ // overwriting and potentially confusing the user.
110+ logDirSet := cfg .LogDir != defaultLogDir
111+ dataDirSet := cfg .DataDir != loopDirBase
112+ loopDirSet := cfg .LoopDir != loopDirBase
113+
114+ if loopDirSet {
115+ if logDirSet {
116+ return fmt .Errorf ("loopdir overwrites logdir, please " +
117+ "only set one value" )
118+ }
119+
120+ if dataDirSet {
121+ return fmt .Errorf ("loopdir overwrites datadir, please " +
122+ "only set one value" )
123+ }
124+
125+ // Once we are satisfied that neither config value was set, we
126+ // replace them with our loop dir.
127+ cfg .DataDir = cfg .LoopDir
128+ cfg .LogDir = filepath .Join (cfg .LoopDir , defaultLogDirname )
129+ }
130+
131+ // Append the network type to the data and log directory so they are
132+ // "namespaced" per network.
133+ cfg .DataDir = filepath .Join (cfg .DataDir , cfg .Network )
134+ cfg .LogDir = filepath .Join (cfg .LogDir , cfg .Network )
135+
136+ // If either of these directories do not exist, create them.
137+ if err := os .MkdirAll (cfg .DataDir , os .ModePerm ); err != nil {
138+ return err
139+ }
140+
141+ if err := os .MkdirAll (cfg .LogDir , os .ModePerm ); err != nil {
142+ return err
143+ }
144+
145+ return nil
146+ }
0 commit comments