diff --git a/.gitignore b/.gitignore index e664c1b..f5b336a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ *.zip oneget +logs +downloads dist .idea *.logs diff --git a/README.md b/README.md index b578e54..bb3ce7c 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,20 @@ [![Powered By: GoReleaser](https://img.shields.io/badge/powered%20by-goreleaser-green.svg?style=for-the-badge)](https://github.com/goreleaser) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg?style=for-the-badge)](https://conventionalcommits.org) +### Команда `get` + +Использование: + +```shell +export ONEC_USERNAME=user +export $ONEC_PASSWORD=password +oneget get --path ./tmp/dist/ --nick platform83 --version 8.3.18.1334 --filter="deb64_.*.tar.gz$" + +# or +oneget --user user --pwd password get --path ./tmp/dist/ --nick platform83 --version 8.3.18.1334 --filter="deb64_.*.tar.gz$" + +``` + ## Запуск в докере @@ -18,12 +32,56 @@ docker run -v $(pwd):/tmp/dist demoncat/oneget \ --user $ONEC_USERNAME \ --pwd $ONEC_PASSWORD \ - --path /tmp/dist/ + --path /tmp/dist/ \ --nicks platform83 \ --version-filter 8.3.16.1876 \ --distrib-filter 'deb64.tar.gz$' ``` +## Настройка логов + +### Через файл настройки +Создать рядом с приложением файл `logos.yaml` с содержимым + +```yaml +appenders: + console: + - name: CONSOLE + target: stdout + encoder: + console: + + rolling_file: + - name: FILE + file_name: ./logs/oneget.log + max_size: 100 + encoder: + json: +loggers: + root: + level: info + appender_refs: + - CONSOLE + logger: + - name: "github.com/v8platform/oneget" + appender_refs: + - CONSOLE + - FILE + level: debug + +``` + +### Через переменные окружения +```shell +export LOGOS_CONFIG="appenders.rolling_file.0.name=FILE; +appenders.rolling_file.0.file_name=./logs/oneget.log; +appenders.rolling_file.0.max_size=100; +appenders.rolling_file.0.encoder.json; +loggers.logger.0.level=debug; +loggers.logger.0.name=github.com/v8platform/oneget; +loggers.logger.0.appender_refs.0=CONSOLE; +loggers.logger.0.appender_refs.1=FILE;" +``` #TODO Идея и часть кода взята из [этого](https://github.com/korableg/Downloader1C) проекта \ No newline at end of file diff --git a/cmd/commands.go b/cmd/commands.go new file mode 100644 index 0000000..af1ccb2 --- /dev/null +++ b/cmd/commands.go @@ -0,0 +1,16 @@ +package cmd + +import ( + "github.com/urfave/cli/v2" +) + +var Commands = []Command{ + + &getCmd{}, + //&listCmd{}, + +} + +type Command interface { + Cmd() *cli.Command +} diff --git a/cmd/get.go b/cmd/get.go new file mode 100644 index 0000000..28b6631 --- /dev/null +++ b/cmd/get.go @@ -0,0 +1,115 @@ +package cmd + +import ( + "github.com/khorevaa/logos" + "time" + + "github.com/urfave/cli/v2" + dloader "github.com/v8platform/oneget/downloader" +) + +var log = logos.New("github.com/v8platform/oneget").Sugar() + +type getCmd struct { + User string + Password string + BaseDir string + StartDate time.Time + Type string + Version string + Filter string +} + +func (c *getCmd) run(ctx *cli.Context) error { + + c.StartDate = time.Time{} + + startDate := ctx.Timestamp("start-date") + + if startDate != nil { + c.StartDate = *startDate + } + c.User = ctx.String("user") + c.Password = ctx.String("pwd") + + if ctx.Bool("debug") { + logos.SetLevel("github.com/v8platform/oneget", logos.DebugLevel) + } + + downloaderConfig := dloader.Config{ + Login: c.User, + Password: c.Password, + BasePath: c.BaseDir, + StartDate: c.StartDate, + Nicks: map[string]bool{ + c.Type: true, + }, + VersionFilter: c.Version, + DistribFilter: c.Filter, + } + + downloader := dloader.New(downloaderConfig) + + files, err := downloader.Get() + if err != nil { + return err + } + log.Infof("Downloaded <%d> files", len(files)) + + return nil +} + +func (c *getCmd) Cmd() *cli.Command { + + cmd := &cli.Command{ + Name: "get", + Usage: "Получение релиза сайта релизов 1С", + Flags: c.Flags(), + Action: c.run, + } + + return cmd +} + +func (c *getCmd) Flags() []cli.Flag { + return []cli.Flag{ + + &cli.StringFlag{ + Destination: &c.Type, + EnvVars: []string{"ONEGET_NICKS"}, + Name: "nick", + Usage: `Имена приложений (например \"platform83 или EnterpriseERP20\"), + подсмотреть можно в адресе, ссылки имею вид например https://releases.1c.ru/project/EnterpriseERP20`, + Required: true, + }, + &cli.StringFlag{ + Destination: &c.Version, + EnvVars: []string{"ONEGET_NICKS_VERSION"}, + Name: "version", + Usage: "Фильтр версий по номеру", + Required: true, + }, + &cli.TimestampFlag{ + DefaultText: time.Now().Format("2006-01-02"), + Layout: "2006-01-02", + EnvVars: []string{"ONEGET_START_DATE"}, + Name: "start-date", + Usage: "Фильтр версий по номеру", + }, + &cli.StringFlag{ + Destination: &c.Filter, + EnvVars: []string{"ONEGET_NICKS_FILTER"}, + Aliases: []string{"filter"}, + Name: "distrib-filter", + Usage: "Дополнительный фильтр пакетов (регулярное выражение)", + }, + &cli.StringFlag{ + Destination: &c.BaseDir, + Name: "path", + Aliases: []string{"out"}, + Value: "./downloads", + DefaultText: "./downloads", + Usage: "Путь к каталогу выгрузки", + }, + } +} diff --git a/common.go b/common.go index 9b39d5c..29db0ae 100644 --- a/common.go +++ b/common.go @@ -1,8 +1,6 @@ package main import ( - "log" - "os" "strings" "time" ) @@ -12,15 +10,8 @@ func handleError(err error, msg string) { log.Fatalf("%s: %s", msg, err) } } -func LogFile(logPath string) (*os.File, error) { - logFile, err := os.OpenFile(logPath, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0660) - if err != nil { - return nil, err - } - return logFile, err -} -func Nicks(nicksRaw string) (map[string]bool) { +func Nicks(nicksRaw string) map[string]bool { var nicksM map[string]bool if len(nicksRaw) > 0 { nicksS := strings.Split(nicksRaw, ",") @@ -34,13 +25,13 @@ func Nicks(nicksRaw string) (map[string]bool) { return nicksM } -func StartDate(startDateRaw string) (time.Time) { +func StartDate(startDateRaw string) time.Time { if startDateRaw == "" { return time.Unix(0, 0) } - startTime, err := time.Parse("02.01.2006", startDateRaw) - if err != nil{ + startTime, err := time.Parse("02.01.2006", startDateRaw) + if err != nil { handleError(err, "Ошибка разбора даты начала") } - return startTime -} \ No newline at end of file + return startTime +} diff --git a/downloader/downloader.go b/downloader/downloader.go index 01f2b4c..e9286a6 100644 --- a/downloader/downloader.go +++ b/downloader/downloader.go @@ -4,10 +4,10 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/khorevaa/logos" "golang.org/x/net/html" "io" "io/ioutil" - "log" "net/http" "net/http/cookiejar" "net/url" @@ -29,7 +29,8 @@ const fileServerHrefPrefix = "/public/file/get" const tempFileSuffix = ".d1c" var semaMaxConnections = make(chan struct{}, 10) -var logOutput = io.Writer(os.Stdout) + +var log = logos.New("github.com/v8platform/oneget/downloader").Sugar() type FileToDownload struct { url string @@ -37,7 +38,7 @@ type FileToDownload struct { name string } -type Downloader struct { +type Config struct { Login string Password string BasePath string @@ -45,21 +46,26 @@ type Downloader struct { Nicks map[string]bool VersionFilter string DistribFilter string - httpClient *http.Client - urlCh chan *FileToDownload - wg sync.WaitGroup - logger *log.Logger } -func New(config *Downloader) *Downloader { +type Downloader struct { + Config + httpClient *http.Client + urlCh chan *FileToDownload + wg sync.WaitGroup +} + +func New(config Config) *Downloader { cj, _ := cookiejar.New(nil) - config.httpClient = &http.Client{ - Jar: cj, - } - config.logger = log.New(logOutput, "", log.LstdFlags) - return config + return &Downloader{ + Config: config, + httpClient: &http.Client{ + Jar: cj, + }, + wg: sync.WaitGroup{}, + } } @@ -86,7 +92,7 @@ func (dr *Downloader) Get() ([]os.FileInfo, error) { if err != nil { return nil, err } - if fileInfo != nil { + if fileInfo != nil { files = append(files, fileInfo) } } @@ -187,6 +193,7 @@ func (dr *Downloader) eachNode(node *html.Node, u string, f func(string, string, func (dr *Downloader) findProject(_, href string, _ *html.Node) { projectName := strings.ToLower(strings.TrimLeft(href, projectHrefPrefix)) + log.Debugf("Finding project in href %s", projectName) if (dr.Nicks == nil && strings.HasPrefix(href, projectHrefPrefix)) || dr.Nicks[projectName] { dr.wg.Add(1) go dr.findLinks(releasesURL+href, dr.findVersion) @@ -201,22 +208,23 @@ func (dr *Downloader) findVersion(_, href string, node *html.Node) { vDateRaw := strings.Trim(node.Parent.NextSibling.NextSibling.FirstChild.Data, " \n") vDate, err := time.Parse("02.01.06", vDateRaw) if err != nil { - dr.handleError(err) + //dr.handleError(err) return } if dr.VersionFilter != "" { + log.Debugf("Filtering href %s by %s", href, dr.VersionFilter) matched, err := regexp.MatchString(dr.VersionFilter, href) if err != nil { dr.handleError(err) return } if !matched { + log.Debugf("Href %s SKIP", href) return } } - if vDate.After(dr.StartDate) { dr.wg.Add(1) go dr.findLinks(releasesURL+href, dr.findToDownloadLink) @@ -250,9 +258,9 @@ func (dr *Downloader) findToDownloadLink(_, href string, _ *html.Node) { strings.HasSuffix(lowerHref, "html") || strings.HasSuffix(lowerHref, "htm") || (strings.HasSuffix(lowerHref, "zip") && isRO) { - dr.addFileToChannel(href, releasesURL+href) - } - }else { + dr.addFileToChannel(href, releasesURL+href) + } + } else { matched, err := regexp.MatchString(dr.DistribFilter, href) if err != nil { dr.handleError(err) @@ -264,8 +272,6 @@ func (dr *Downloader) findToDownloadLink(_, href string, _ *html.Node) { } } - - } func (dr *Downloader) findFileServerLink(u, href string, _ *html.Node) { @@ -322,7 +328,7 @@ func (dr *Downloader) fileNameFromUrl(rawUrl string) (string, string, error) { func (dr *Downloader) downloadFile(fileToDownload *FileToDownload) (os.FileInfo, error) { workDir := filepath.Join(dr.BasePath, strings.ToLower(fileToDownload.path)) - fileName := filepath.Join(workDir, fileToDownload.name) + fileName := filepath.Join(workDir, fileToDownload.name) fileInfo, err := os.Stat(fileName) if os.IsExist(err) { @@ -336,11 +342,11 @@ func (dr *Downloader) downloadFile(fileToDownload *FileToDownload) (os.FileInfo, return nil, err } // https://wenzr.wordpress.com/2018/03/27/go-file-permissions-on-unix/ - os.Chmod (workDir , 0777) + os.Chmod(workDir, 0777) } - dr.handleOutput(fmt.Sprintf("Workspace directory: %s\n", workDir)) + log.Debugf("Workspace directory: %s", workDir) + log.Debugf("Getting a file from url: %s", fileToDownload.url) - dr.handleOutput(fmt.Sprintf("Getting a file from url: %s\n", fileToDownload.url)) acquireSemaConnections() resp, err := dr.httpClient.Get(fileToDownload.url) if err != nil { @@ -361,8 +367,8 @@ func (dr *Downloader) downloadFile(fileToDownload *FileToDownload) (os.FileInfo, } f.Close() - dr.handleOutput(fmt.Sprintf("End of receiving file by url: %s\n", fileToDownload.url)) - dr.handleOutput(fmt.Sprintf("File saved to: %s\n", fileName)) + log.Debugf("End of receiving file by url: %s", fileToDownload.url) + log.Debugf("File saved to: %s", fileName) err = os.Rename(fileName+tempFileSuffix, fileName) if err != nil { @@ -385,13 +391,10 @@ func (dr *Downloader) downloadFile(fileToDownload *FileToDownload) (os.FileInfo, } func (dr *Downloader) handleError(err error) { - _ = fmt.Errorf("%s", err) - dr.logger.Println(err) -} - -func (dr *Downloader) handleOutput(text string) { - fmt.Print(text) - dr.logger.Print(text) + if err == nil { + return + } + log.Error(err.Error()) } func acquireSemaConnections() { @@ -401,11 +404,3 @@ func acquireSemaConnections() { func releaseSemaConnections() { _ = <-semaMaxConnections } - -func (dr *Downloader) LogOutput() io.Writer { - return logOutput -} - -func (dr *Downloader) SetLogOutput(out io.Writer) { - logOutput = out -} \ No newline at end of file diff --git a/go.mod b/go.mod index 3a31c1c..082f84f 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/v8platform/oneget go 1.16 require ( + github.com/khorevaa/logos v0.9.7 github.com/urfave/cli/v2 v2.3.0 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 ) diff --git a/go.sum b/go.sum index 81fd1b0..5dc2bf8 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,140 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= +github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-ucfg v0.8.3 h1:leywnFjzr2QneZZWhE6uWd+QN/UpP0sdJRHYyuFvkeo= +github.com/elastic/go-ucfg v0.8.3/go.mod h1:iaiY0NBIYeasNgycLyTvhJftQlQEUO2hpF+FX0JKxzo= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/khorevaa/logos v0.9.7 h1:nIm0kjMwn9RM5BFvSh5sPpjBM6RDX1y9RxLwtUwAfR8= +github.com/khorevaa/logos v0.9.7/go.mod h1:a94j5c2u9ffo0Be2HT+qGvVRna1FnvG7JX8IipZlxwo= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/phuslu/log v1.0.61/go.mod h1:kzJN3LRifrepxThMjufQwS7S35yFAB+jAV1qgA7eBW4= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= +github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj52Uc= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/logos.yaml b/logos.yaml new file mode 100644 index 0000000..3a391d2 --- /dev/null +++ b/logos.yaml @@ -0,0 +1,24 @@ +appenders: + console: + - name: CONSOLE + target: stdout + encoder: + console: + + rolling_file: + - name: FILE + file_name: ./logs/oneget.log + max_size: 100 + encoder: + json: +loggers: + root: + level: info + appender_refs: + - CONSOLE + logger: + - name: "github.com/v8platform/oneget" + appender_refs: + - CONSOLE + - FILE + level: info \ No newline at end of file diff --git a/main.go b/main.go index 0c70124..9e93b57 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,9 @@ package main import ( "fmt" - "log" + "github.com/khorevaa/logos" + "github.com/v8platform/oneget/cmd" + "os" "strings" @@ -17,6 +19,8 @@ var ( builtBy = "" ) +var log = logos.New("github.com/v8platform/oneget").Sugar() + func setFlags() []cli.Flag { return []cli.Flag{ &cli.StringFlag{ @@ -51,6 +55,11 @@ func setFlags() []cli.Flag { DefaultText: "./downloads", Usage: "Путь к каталогу выгрузки", }, + &cli.BoolFlag{ + Name: "debug", + EnvVars: []string{"ONEGET_DEBUG"}, + Usage: "Режим отладки приложения", + }, &cli.StringFlag{ Name: "logs", DefaultText: "oneget.logs", @@ -67,7 +76,7 @@ func main() { Version: buildVersion(), Flags: setFlags(), Action: func(c *cli.Context) error { - downloaderConfig := dloader.Downloader{ + downloaderConfig := dloader.Config{ Login: c.String("user"), Password: c.String("pwd"), BasePath: c.String("path"), @@ -77,24 +86,32 @@ func main() { DistribFilter: c.String("distrib-filter"), } - downloader := dloader.New(&downloaderConfig) - fileLogs, err := LogFile(c.String("logs")) - if err != nil { - handleError(err, "Ошибка записи файла логирования") + debug := c.Bool("debug") + + if debug { + logos.SetLevel("github.com/v8platform/oneget", logos.DebugLevel) } - downloader.SetLogOutput(fileLogs) - _, err = downloader.Get() - if err != nil { - log.Fatal(err) + + downloader := dloader.New(downloaderConfig) + + files, err := downloader.Get() + + if err == nil { + log.Infof("Downloaded <%d> files", len(files)) } - return nil + return err }, } + for _, command := range cmd.Commands { + app.Commands = append(app.Commands, command.Cmd()) + } + err := app.Run(os.Args) + defer log.Sync() if err != nil { - log.Fatal(err) + log.Fatal(err.Error()) } }