├── .github └── ISSUE_TEMPLATE │ └── feature_request.md ├── .gitignore ├── .gitlab-ci.yml ├── .goreleaser.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── cmd └── flares │ └── main.go ├── go.mod ├── go.sum ├── install.sh ├── internal └── cloudflare │ ├── cloudflare.go │ └── cloudflare_test.go └── static ├── flaredns_demo.gif └── flares.cast /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | --- 5 | 6 | **What would you like?** 7 | 8 | 9 | **Describe the solution you'd like** 10 | 11 | 12 | **Describe alternatives you've considered (if any)** 13 | 14 | 15 | **Additional context (if you want)** 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | idea.md 3 | *.bind 4 | .dockerignore 5 | .vscode/ 6 | .idea/ 7 | dist/ 8 | vendor/ 9 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | GIT_STRATEGY: fetch 3 | DOCKER_DRIVER: overlay 4 | 5 | services: 6 | - docker:dind 7 | 8 | backup: 9 | image: docker 10 | stage: build 11 | retry: 2 12 | script: | 13 | # Fetch your CloudFlare API token from here: 14 | # https://dash.cloudflare.com/profile/api-tokens 15 | # -> Create Token 16 | # -> Edit zone DNS 17 | # -> Permission: read 18 | # -> Zone resources: Include -> All zones 19 | 20 | docker run -t --rm \ 21 | -e CF_API_TOKEN="$CF_API_TOKEN" \ 22 | lfaoro/flares --all > dns_backup.bind 23 | artifacts: 24 | untracked: true 25 | # uncomment if needed (default is forever on gitlab.com) 26 | # expire_in: 4 week 27 | name: "bck-${date}" 28 | paths: 29 | - dns_backup.bind 30 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | builds: 2 | - env: 3 | - CGO_ENABLED=0 4 | flags: 5 | - -mod=vendor 6 | goos: 7 | - darwin 8 | - linux 9 | - freebsd 10 | goarch: 11 | - amd64 12 | 13 | checksum: 14 | name_template: "checksums.txt" 15 | signs: 16 | - artifacts: checksum 17 | snapshot: 18 | name_template: "{{ .Tag }}" 19 | changelog: 20 | sort: asc 21 | filters: 22 | exclude: 23 | - "^docs:" 24 | - "^test:" 25 | - "^vendor:" 26 | - "^refactor:" 27 | 28 | brews: 29 | - # Repository to push the tap to. 30 | tap: 31 | owner: lfaoro 32 | name: tap 33 | 34 | # Git author used to commit to the repository. 35 | # Defaults are shown. 36 | commit_author: 37 | name: Leonardo Faoro 38 | email: lfaoro@gmail.com 39 | 40 | # Your app's homepage. 41 | # Default is empty. 42 | homepage: "https://github.com/lfaoro/flares" 43 | 44 | # Your app's description. 45 | # Default is empty. 46 | description: "Flares is a CloudFlare DNS backup tool" 47 | 48 | # Setting this will prevent goreleaser to actually try to commit the updated 49 | # formula - instead, the formula file will be stored on the dist folder only, 50 | # leaving the responsibility of publishing it to the user. 51 | # If set to auto, the release will not be uploaded to the homebrew tap 52 | # in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1 53 | # Default is false. 54 | skip_upload: false 55 | 56 | # So you can `brew test` your formula. 57 | # Default is empty. 58 | test: | 59 | system "#{bin}/flares --version" 60 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at support@vlct.io. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | When contributing to this project; first discuss the change you wish to make via issue, email, or any other method with the maintainers before submitting changes. 3 | 4 | Note we have a [code of conduct](./CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. 5 | 6 | ## Pull Request Process 7 | 1. Fork it 8 | 2. Create your feature branch (`git checkout -b my-new-feature`) 9 | 3. Commit your changes (`git commit -am 'Add new feature'`) 10 | 4. Push to the branch (`git push origin my-new-feature`) 11 | 5. Create new Pull/Merge Request 12 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:alpine as builder 2 | WORKDIR /build 3 | COPY . . 4 | RUN apk add --update git gcc 5 | RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 \ 6 | go install -mod vendor -gcflags "-N -l" ./cmd/flares 7 | 8 | FROM alpine:latest 9 | RUN apk add --update --no-cache \ 10 | ca-certificates && \ 11 | update-ca-certificates 12 | COPY --from=builder /go/bin/ /usr/local/bin/ 13 | WORKDIR /usr/local/bin/ 14 | ENTRYPOINT ["flares"] 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 Leonardo Faoro. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are 5 | met: 6 | 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above 11 | copyright notice, this list of conditions and the following disclaimer 12 | in the documentation and/or other materials provided with the 13 | distribution. 14 | 15 | * Neither the name of Leonardo Faoro nor the names of its 16 | contributors may be used to endorse or promote products derived from 17 | this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | APP ?= "./cmd/flares" 2 | VERSION ?= 1.0.0 3 | EPOCH ?= 1 4 | MAINTAINER ?= "The Flares Developers" 5 | LDFLAGS += -X "main.date=$(shell date '+%Y-%m-%d %I:%M:%S %Z')" 6 | 7 | install: 8 | @go install -ldflags='$(LDFLAGS)' "$(APP)" 9 | 10 | build: 11 | @go build -o flares "$(APP)" 12 | 13 | tag?="" 14 | tag: 15 | git tag -f -a $(tag) -m "$(tag)" 16 | git push -f origin $(tag) 17 | 18 | release: 19 | cd cmd/flares && \ 20 | goreleaser release --rm-dist --config=../../.goreleaser.yml 21 | 22 | reltest: 23 | cd cmd/flares && \ 24 | goreleaser release --snapshot --rm-dist --skip-publish --config=../../.goreleaser.yml 25 | 26 | installer: 27 | godownloader --repo=lfaoro/flares > ./install.sh 28 | 29 | dep: 30 | go mod init || : 31 | go mod tidy 32 | go mod verify 33 | go mod download 34 | go mod vendor 35 | 36 | clean: 37 | rm -rf vendor/ go.mod go.sum 38 | 39 | docker: 40 | docker build -t lfaoro/flares . 41 | #docker push lfaoro/flares 42 | 43 | .PHONY: install 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flares 🔥 2 | 3 | Flares is a CloudFlare DNS backup tool, it dumps your DNS table to the screen or exports it as BIND formatted zone 4 | files. 5 | 6 | [![BSD License](https://img.shields.io/badge/license-BSD-blue.svg?style=flat)](LICENSE) 7 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Flfaoro%2Fflares.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Flfaoro%2Fflares?ref=badge_shield) 8 | [![Go Report Card](https://goreportcard.com/badge/github.com/lfaoro/flares)](https://goreportcard.com/report/github.com/lfaoro/flares) 9 | 10 | ![Docker Pulls](https://img.shields.io/docker/pulls/lfaoro/flares.svg?logo=docker&style=popout-square) 11 | [![PayPal](https://img.shields.io/badge/paypal-contribute-blue.svg?style=popout-square&logo=paypal)](https://www.paypal.com/pools/c/8fm4OKBYMa) 12 | 13 | ## Quick Start 14 | 15 | ### [Video Tutorial](https://asciinema.org/a/NLVa6TyQzvTEhnzZDdH1q79lO) 16 | 17 | ### Docker 18 | ```bash 19 | # Fetch your CloudFlare API token from here: 20 | # https://dash.cloudflare.com/profile/api-tokens 21 | # -> Create Token 22 | # -> Edit zone DNS 23 | # -> Permission: read 24 | # -> Zone resources: Include -> All zones 25 | 26 | $ export CF_API_TOKEN="KClp4y8BgD2LQiz2..." 27 | 28 | $ docker run -it --rm \ 29 | -e CF_API_TOKEN="$CF_API_TOKEN" \ 30 | lfaoro/flares domain1.tld domain2.tld 31 | ``` 32 | 33 | ### macOS 34 | ```bash 35 | brew install lfaoro/tap/flares 36 | ``` 37 | 38 | ### Linux/BSD 39 | ```bash 40 | curl https://raw.githubusercontent.com/lfaoro/flares/master/install.sh | bash 41 | ``` 42 | 43 | ### Developers 44 | > Go installer: https://golang.org/dl/ 45 | ```bash 46 | go get -u github.com/lfaoro/flares 47 | make install 48 | flares -h 49 | 50 | make test 51 | ``` 52 | 53 | ## Examples 54 | 55 | ```bash 56 | $ make install 57 | $ flares -h 58 | 59 | $ flares domain1.tld 60 | ;; 61 | ;; Domain: domain1.tld 62 | ;; Exported: 2019-06-03 06:31:29 63 | ...continued 64 | 65 | $ flares --export domain1.tld domain2.tld 66 | BIND table for domain1.tld successfully exported 67 | BIND table for domain2.tld successfully exported 68 | $ ls 69 | domain1.tld domain2.tld 70 | ``` 71 | 72 | ## Automation 73 | 74 | ### GitLab CI/CD 75 | 76 | - Copy [.gitlab-ci.yml](.gitlab-ci.yml) inside your repo 77 | - Use the [pipeline schedules](https://gitlab.com/help/user/project/pipelines/schedules) feature 78 | - Each run of the task will generate a DNS backup stored as a downloadable artifact 79 | 80 | # Contributing 81 | 82 | > Any help and suggestions are very welcome and appreciated. Start by opening an [issue](https://github.com/lfaoro/flares/issues/new). 83 | 84 | - Fork the project 85 | - Create your feature branch `git checkout -b my-new-feature` 86 | - Commit your changes `git commit -am 'Add my feature'` 87 | - Push to the branch `git push origin my-new-feature` 88 | - Create a new pull request against the master branch 89 | -------------------------------------------------------------------------------- /cmd/flares/main.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2019 Leonardo Faoro. All rights reserved. 3 | * Use of this source code is governed by a BSD-style 4 | * license that can be found in the LICENSE file. 5 | */ 6 | 7 | // ___________.__ 8 | // \_ _____/| | _____ _______ ____ ______ 9 | // | __) | | \__ \\_ __ \_/ __ \ / ___/ 10 | // | \ | |__/ __ \| | \/\ ___/ \___ \ 11 | // \___ / |____(____ /__| \___ >____ > 12 | // \/ \/ \/ \/ 13 | // 14 | // Flares is a CloudFlare DNS backup tool. 15 | package main 16 | 17 | import ( 18 | "fmt" 19 | "io/ioutil" 20 | "log" 21 | "os" 22 | "path" 23 | "sync" 24 | 25 | "github.com/pkg/errors" 26 | "github.com/urfave/cli" 27 | 28 | "github.com/lfaoro/flares/internal/cloudflare" 29 | ) 30 | 31 | var ( 32 | // version is injected during the release process. 33 | version = "dev" 34 | // commit is injected during the release process. 35 | commit = "none" 36 | // date is injected during the release process. 37 | date = "unknown" 38 | ) 39 | 40 | var debugFlag bool 41 | 42 | func main() { 43 | app := cli.NewApp() 44 | app.Name = "flares" 45 | app.Usage = "CloudFlare DNS backup tool" 46 | app.Version = fmt.Sprintf("%s %s %s", version, commit, date) 47 | app.EnableBashCompletion = true 48 | app.Authors = []cli.Author{ 49 | { 50 | Name: "Leonardo Faoro", 51 | Email: "lfaoro@gmail.com", 52 | }, 53 | } 54 | 55 | var flagAPIToken string 56 | app.Flags = []cli.Flag{ 57 | cli.StringFlag{ 58 | Name: "token", 59 | Usage: "CloudFlare API token", 60 | EnvVar: "CF_API_TOKEN", 61 | Destination: &flagAPIToken, 62 | }, 63 | cli.BoolFlag{ 64 | Name: "all, a", 65 | Usage: "retrieves the records table for all domains", 66 | EnvVar: "FLARES_ALL", 67 | }, 68 | cli.BoolFlag{ 69 | Name: "export, e", 70 | Usage: "exports the DNS table into BIND formatted files", 71 | EnvVar: "FLARES_EXPORT", 72 | }, 73 | cli.BoolFlag{ 74 | Name: "debug", 75 | Usage: "displays debugFlag information.", 76 | EnvVar: "FLARES_DEBUG", 77 | Hidden: true, 78 | Destination: &debugFlag, 79 | }, 80 | } 81 | 82 | app.Action = func(c *cli.Context) error { 83 | if flagAPIToken == "" { 84 | return errors.New( 85 | "provide --token flag\n" + 86 | "or $CF_API_TOKEN" + " ENV variable\n" + 87 | "in order to access CloudFlare.\n\n" + 88 | "GOTO: https://dash.cloudflare.com/profile/api-tokens -> Create Token with Zone.DNS permission") 89 | } 90 | 91 | dns := cloudflare.New(flagAPIToken) 92 | 93 | if c.Bool("all") { 94 | zones, err := dns.Zones() 95 | fatalIfErr(err) 96 | 97 | wg := sync.WaitGroup{} 98 | for id, domain := range zones { 99 | if debugFlag { 100 | fmt.Printf("ID: %s: domain: %s\n", id, domain) 101 | } 102 | 103 | wg.Add(1) 104 | go func(domain string) { 105 | if debugFlag { 106 | fmt.Println("domain:", domain) 107 | wg.Done() 108 | return 109 | } 110 | 111 | table, err := dns.TableFor(domain) 112 | fatalIfErr(err) 113 | 114 | if c.Bool("export") { 115 | export(domain, table) 116 | } else { 117 | fmt.Println(string(table)) 118 | } 119 | 120 | wg.Done() 121 | }(domain) 122 | 123 | } 124 | 125 | wg.Wait() 126 | 127 | return nil 128 | } 129 | 130 | if c.NArg() < 1 { 131 | cli.ShowAppHelpAndExit(c, 2) 132 | } 133 | 134 | for _, domain := range c.Args() { 135 | if debugFlag { 136 | log.Println("domain", domain) 137 | continue 138 | } 139 | 140 | table, err := dns.TableFor(domain) 141 | fatalIfErr(err) 142 | 143 | if c.Bool("export") { 144 | export(domain, table) 145 | continue 146 | } 147 | 148 | fmt.Println(string(table)) 149 | } 150 | 151 | return nil 152 | } 153 | 154 | err := app.Run(os.Args) 155 | fatalIfErr(err) 156 | } 157 | 158 | func export(domain string, data []byte) { 159 | dir, err := os.Getwd() 160 | fatalIfErr(err) 161 | 162 | filename := path.Join(dir, domain) 163 | err = ioutil.WriteFile(filename, data, 0600) 164 | fatalIfErr(err) 165 | 166 | fmt.Printf("BIND data for %s successfully exported\n", domain) 167 | } 168 | 169 | func fatalIfErr(err error) { 170 | if err != nil { 171 | fmt.Printf("ERROR: %s\n", err) 172 | os.Exit(1) 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/lfaoro/flares 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect 7 | github.com/davecgh/go-spew v1.1.1 // indirect 8 | github.com/pkg/errors v0.9.1 9 | github.com/stretchr/testify v1.7.0 10 | github.com/urfave/cli v1.22.5 11 | gopkg.in/yaml.v3 v3.0.0 // indirect 12 | ) 13 | 14 | require ( 15 | github.com/pmezard/go-difflib v1.0.0 // indirect 16 | github.com/russross/blackfriday/v2 v2.1.0 // indirect 17 | ) 18 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 2 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 3 | github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= 4 | github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 9 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 10 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 11 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 12 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 13 | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 14 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 15 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 16 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 17 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 18 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 19 | github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= 20 | github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 21 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 22 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 23 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 24 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 25 | gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= 26 | gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 27 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | # Code generated by godownloader on 2019-06-05T08:44:24Z. DO NOT EDIT. 4 | # 5 | 6 | usage() { 7 | this=$1 8 | cat </dev/null 126 | } 127 | echoerr() { 128 | echo "$@" 1>&2 129 | } 130 | log_prefix() { 131 | echo "$0" 132 | } 133 | _logp=6 134 | log_set_priority() { 135 | _logp="$1" 136 | } 137 | log_priority() { 138 | if test -z "$1"; then 139 | echo "$_logp" 140 | return 141 | fi 142 | [ "$1" -le "$_logp" ] 143 | } 144 | log_tag() { 145 | case $1 in 146 | 0) echo "emerg" ;; 147 | 1) echo "alert" ;; 148 | 2) echo "crit" ;; 149 | 3) echo "err" ;; 150 | 4) echo "warning" ;; 151 | 5) echo "notice" ;; 152 | 6) echo "info" ;; 153 | 7) echo "debug" ;; 154 | *) echo "$1" ;; 155 | esac 156 | } 157 | log_debug() { 158 | log_priority 7 || return 0 159 | echoerr "$(log_prefix)" "$(log_tag 7)" "$@" 160 | } 161 | log_info() { 162 | log_priority 6 || return 0 163 | echoerr "$(log_prefix)" "$(log_tag 6)" "$@" 164 | } 165 | log_err() { 166 | log_priority 3 || return 0 167 | echoerr "$(log_prefix)" "$(log_tag 3)" "$@" 168 | } 169 | log_crit() { 170 | log_priority 2 || return 0 171 | echoerr "$(log_prefix)" "$(log_tag 2)" "$@" 172 | } 173 | uname_os() { 174 | os=$(uname -s | tr '[:upper:]' '[:lower:]') 175 | case "$os" in 176 | msys_nt) os="windows" ;; 177 | esac 178 | echo "$os" 179 | } 180 | uname_arch() { 181 | arch=$(uname -m) 182 | case $arch in 183 | x86_64) arch="amd64" ;; 184 | x86) arch="386" ;; 185 | i686) arch="386" ;; 186 | i386) arch="386" ;; 187 | aarch64) arch="arm64" ;; 188 | armv5*) arch="armv5" ;; 189 | armv6*) arch="armv6" ;; 190 | armv7*) arch="armv7" ;; 191 | esac 192 | echo ${arch} 193 | } 194 | uname_os_check() { 195 | os=$(uname_os) 196 | case "$os" in 197 | darwin) return 0 ;; 198 | dragonfly) return 0 ;; 199 | freebsd) return 0 ;; 200 | linux) return 0 ;; 201 | android) return 0 ;; 202 | nacl) return 0 ;; 203 | netbsd) return 0 ;; 204 | openbsd) return 0 ;; 205 | plan9) return 0 ;; 206 | solaris) return 0 ;; 207 | windows) return 0 ;; 208 | esac 209 | log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" 210 | return 1 211 | } 212 | uname_arch_check() { 213 | arch=$(uname_arch) 214 | case "$arch" in 215 | 386) return 0 ;; 216 | amd64) return 0 ;; 217 | arm64) return 0 ;; 218 | armv5) return 0 ;; 219 | armv6) return 0 ;; 220 | armv7) return 0 ;; 221 | ppc64) return 0 ;; 222 | ppc64le) return 0 ;; 223 | mips) return 0 ;; 224 | mipsle) return 0 ;; 225 | mips64) return 0 ;; 226 | mips64le) return 0 ;; 227 | s390x) return 0 ;; 228 | amd64p32) return 0 ;; 229 | esac 230 | log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" 231 | return 1 232 | } 233 | untar() { 234 | tarball=$1 235 | case "${tarball}" in 236 | *.tar.gz | *.tgz) tar -xzf "${tarball}" ;; 237 | *.tar) tar -xf "${tarball}" ;; 238 | *.zip) unzip "${tarball}" ;; 239 | *) 240 | log_err "untar unknown archive format for ${tarball}" 241 | return 1 242 | ;; 243 | esac 244 | } 245 | http_download_curl() { 246 | local_file=$1 247 | source_url=$2 248 | header=$3 249 | if [ -z "$header" ]; then 250 | code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") 251 | else 252 | code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") 253 | fi 254 | if [ "$code" != "200" ]; then 255 | log_debug "http_download_curl received HTTP status $code" 256 | return 1 257 | fi 258 | return 0 259 | } 260 | http_download_wget() { 261 | local_file=$1 262 | source_url=$2 263 | header=$3 264 | if [ -z "$header" ]; then 265 | wget -q -O "$local_file" "$source_url" 266 | else 267 | wget -q --header "$header" -O "$local_file" "$source_url" 268 | fi 269 | } 270 | http_download() { 271 | log_debug "http_download $2" 272 | if is_command curl; then 273 | http_download_curl "$@" 274 | return 275 | elif is_command wget; then 276 | http_download_wget "$@" 277 | return 278 | fi 279 | log_crit "http_download unable to find wget or curl" 280 | return 1 281 | } 282 | http_copy() { 283 | tmp=$(mktemp) 284 | http_download "${tmp}" "$1" "$2" || return 1 285 | body=$(cat "$tmp") 286 | rm -f "${tmp}" 287 | echo "$body" 288 | } 289 | github_release() { 290 | owner_repo=$1 291 | version=$2 292 | test -z "$version" && version="latest" 293 | giturl="https://github.com/${owner_repo}/releases/${version}" 294 | json=$(http_copy "$giturl" "Accept:application/json") 295 | test -z "$json" && return 1 296 | version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') 297 | test -z "$version" && return 1 298 | echo "$version" 299 | } 300 | hash_sha256() { 301 | TARGET=${1:-/dev/stdin} 302 | if is_command gsha256sum; then 303 | hash=$(gsha256sum "$TARGET") || return 1 304 | echo "$hash" | cut -d ' ' -f 1 305 | elif is_command sha256sum; then 306 | hash=$(sha256sum "$TARGET") || return 1 307 | echo "$hash" | cut -d ' ' -f 1 308 | elif is_command shasum; then 309 | hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 310 | echo "$hash" | cut -d ' ' -f 1 311 | elif is_command openssl; then 312 | hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 313 | echo "$hash" | cut -d ' ' -f a 314 | else 315 | log_crit "hash_sha256 unable to find command to compute sha-256 hash" 316 | return 1 317 | fi 318 | } 319 | hash_sha256_verify() { 320 | TARGET=$1 321 | checksums=$2 322 | if [ -z "$checksums" ]; then 323 | log_err "hash_sha256_verify checksum file not specified in arg2" 324 | return 1 325 | fi 326 | BASENAME=${TARGET##*/} 327 | want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) 328 | if [ -z "$want" ]; then 329 | log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" 330 | return 1 331 | fi 332 | got=$(hash_sha256 "$TARGET") 333 | if [ "$want" != "$got" ]; then 334 | log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" 335 | return 1 336 | fi 337 | } 338 | cat /dev/null <"] 40 | [9.388849, "o", "\u001b[?2004l\r\r\n"] 41 | [9.390215, "o", "\u001b]2;brew install lfaoro/tap/flares\u0007\u001b]1;brew\u0007"] 42 | [9.390262, "o", "\u001b]133;C;\u0007"] 43 | [12.65666, "o", "Updating Homebrew...\r\n"] 44 | [14.002923, "o", "\u001b[34m==>\u001b[0m \u001b[1mInstalling flares from lfaoro/tap\u001b[0m\r\n"] 45 | [17.811318, "o", "\u001b[34m==>\u001b[0m \u001b[1mDownloading https://github.com/lfaoro/flares/releases/download/v2.0.0-beta/flares_\u001b[0m\r\n"] 46 | [17.81139, "o", "\u001b[34m==>\u001b[0m \u001b[1mDownloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/1\u001b[0m\r\n"] 47 | [19.183079, "o", "\r 0.6%"] 48 | [19.324382, "o", "\r# 2.3%"] 49 | [19.465194, "o", "\r### 5.3%"] 50 | [19.613541, "o", "\r####### 10.7%"] 51 | [19.753798, "o", "\r############## 19.7%"] 52 | [19.904534, "o", "\r#################### 28.6%"] 53 | [20.095046, "o", "\r################################# 47.2%"] 54 | [20.2164, "o", "\r##################################################### 74.6%"] 55 | [20.237574, "o", "\r######################################################################## 100.0%\r\n"] 56 | [22.329233, "o", "🍺 /usr/local/Cellar/flares/2.0.0-beta: 3 files, 7.2MB, built in 6 seconds\r\n"] 57 | [22.388703, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 58 | [22.388897, "o", "\u001b]2;lfaoro@unbookw: ~/go/src/github.com/lfaoro/flares\u0007\u001b]1;..lfaoro/flares\u0007\u001b]133;D;0\u0007\u001b]1337;RemoteHost=lfaoro@unbookw.local\u0007\u001b]1337;CurrentDir=/Users/lfaoro/go/src/github.com/lfaoro/flares\u0007"] 59 | [22.419727, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:00] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 60 | [22.419908, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 61 | [25.181751, "o", "\u001b[H\u001b[2J\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:03] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 62 | [26.621107, "o", "f"] 63 | [26.684658, "o", "\bfl"] 64 | [26.785533, "o", "a"] 65 | [26.892505, "o", "r"] 66 | [27.032412, "o", "e"] 67 | [27.344912, "o", "s"] 68 | [27.522576, "o", " "] 69 | [27.713041, "o", "-"] 70 | [27.881433, "o", "h"] 71 | [28.248756, "o", "\u001b[?1l\u001b>\u001b[?2004l"] 72 | [28.249022, "o", "\r\r\n"] 73 | [28.255746, "o", "\u001b]2;flares -h\u0007\u001b]1;flares\u0007"] 74 | [28.255948, "o", "\u001b]133;C;\u0007"] 75 | [28.271608, "o", "NAME:\r\n"] 76 | [28.271841, "o", " flares - CloudFlare DNS backup tool\r\n\r\nUSAGE:\r\n flares [global options] command [command options] [arguments...]\r\n\r\nVERSION:\r\n dev none 2019-06-03 01:48:03 CEST\r\n\r\n"] 77 | [28.272003, "o", "AUTHOR:\r\n Leonardo Faoro \r\n\r\nCOMMANDS:\r\n"] 78 | [28.272107, "o", " help, h Shows a list of commands or help for one command\r\n\r\nGLOBAL OPTIONS:\r\n"] 79 | [28.272251, "o", " --key value CloudFlare API key [$CF_API_KEY]\r\n --email value CloudFlare API email [$CF_API_EMAIL]\r\n --all, -a retrieves the records table for all domains [$FLARES_ALL]\r\n --export, -e exports the DNS table into BIND formatted files [$FLARES_EXPORT]\r\n --help, -h show help\r\n --version, -v print the version\r\n"] 80 | [28.2736, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 81 | [28.27377, "o", "\u001b]2;lfaoro@unbookw: ~/go/src/github.com/lfaoro/flares\u0007\u001b]1;..lfaoro/flares\u0007"] 82 | [28.273891, "o", "\u001b]133;D;0\u0007\u001b]1337;RemoteHost=lfaoro@unbookw.local\u0007\u001b]1337;CurrentDir=/Users/lfaoro/go/src/github.com/lfaoro/flares\u0007"] 83 | [28.310738, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:06] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 84 | [28.310936, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 85 | [34.970909, "o", "\u001b[H\u001b[2J\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:13] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 86 | [35.446186, "o", "f"] 87 | [35.55259, "o", "\bfl"] 88 | [35.631805, "o", "a"] 89 | [35.771809, "o", "r"] 90 | [35.871668, "o", "e"] 91 | [36.073754, "o", "s"] 92 | [36.189525, "o", " "] 93 | [37.727177, "o", "v"] 94 | [37.817756, "o", "l"] 95 | [37.910799, "o", "c"] 96 | [38.075923, "o", "t"] 97 | [38.361826, "o", "i"] 98 | [38.777594, "o", "\b \b"] 99 | [39.039377, "o", "."] 100 | [39.266516, "o", "i"] 101 | [39.330576, "o", "o"] 102 | [41.600456, "o", " "] 103 | [41.877754, "o", "|"] 104 | [42.468719, "o", " "] 105 | [43.087231, "o", "h"] 106 | [43.15952, "o", "e"] 107 | [43.267424, "o", "a"] 108 | [43.375659, "o", "d"] 109 | [43.479336, "o", " "] 110 | [43.684467, "o", "-"] 111 | [43.896577, "o", "n"] 112 | [44.001471, "o", " "] 113 | [44.185856, "o", "5"] 114 | [45.302722, "o", "\u001b[?1l\u001b>"] 115 | [45.302914, "o", "\u001b[?2004l\r\r\n"] 116 | [45.304023, "o", "\u001b]2;flares vlct.io | head -n 5\u0007\u001b]1;flares\u0007"] 117 | [45.304146, "o", "\u001b]133;C;\u0007"] 118 | [46.274242, "o", ";;\r\n;; Domain: vlct.io.\r\n;; Exported: 2019-06-03 11:48:24\r\n;;\r\n;; This file is intended for use for informational and archival\r\n"] 119 | [46.278235, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 120 | [46.27842, "o", "\u001b]2;lfaoro@unbookw: ~/go/src/github.com/lfaoro/flares\u0007\u001b]1;..lfaoro/flares\u0007"] 121 | [46.278563, "o", "\u001b]133;D;0\u0007\u001b]1337;RemoteHost=lfaoro@unbookw.local\u0007\u001b]1337;CurrentDir=/Users/lfaoro/go/src/github.com/lfaoro/flares\u0007"] 122 | [46.309865, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:24] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 123 | [46.310044, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 124 | [49.292125, "o", "f"] 125 | [49.374905, "o", "\bfl"] 126 | [49.483989, "o", "a"] 127 | [49.674018, "o", "r"] 128 | [49.808877, "o", "e"] 129 | [50.077858, "o", "s"] 130 | [50.367447, "o", " "] 131 | [50.567837, "o", "v"] 132 | [50.657845, "o", "l"] 133 | [50.74472, "o", "c"] 134 | [50.905565, "o", "t"] 135 | [51.023735, "o", "."] 136 | [51.230688, "o", "i"] 137 | [51.294583, "o", "o"] 138 | [51.649563, "o", " "] 139 | [52.856822, "o", "\b"] 140 | [53.17586, "o", "\b\b"] 141 | [53.320074, "o", "\b\b\b\b\b"] 142 | [53.947627, "o", "-vlct.io\b\b\b\b\b\b\b"] 143 | [54.104928, "o", "-vlct.io\b\b\b\b\b\b\b"] 144 | [54.29062, "o", "evlct.io\b\b\b\b\b\b\b"] 145 | [54.460552, "o", "xvlct.io\b\b\b\b\b\b\b"] 146 | [54.549603, "o", "pvlct.io\b\b\b\b\b\b\b"] 147 | [54.664971, "o", "ovlct.io\b\b\b\b\b\b\b"] 148 | [54.765, "o", "rvlct.io\b\b\b\b\b\b\b"] 149 | [54.910591, "o", "tvlct.io\b\b\b\b\b\b\b"] 150 | [54.990418, "o", " vlct.io\b\b\b\b\b\b\b"] 151 | [55.408623, "o", "\u001b[?1l\u001b>"] 152 | [55.408696, "o", "\u001b[?2004l\r\r\n"] 153 | [55.409658, "o", "\u001b]2;flares --export vlct.io\u0007\u001b]1;flares\u0007"] 154 | [55.409701, "o", "\u001b]133;C;\u0007"] 155 | [56.477931, "o", "BIND data for vlct.io successfully exported\r\n"] 156 | [56.480965, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 157 | [56.481163, "o", "\u001b]2;lfaoro@unbookw: ~/go/src/github.com/lfaoro/flares\u0007"] 158 | [56.481298, "o", "\u001b]1;..lfaoro/flares\u0007\u001b]133;D;0\u0007\u001b]1337;RemoteHost=lfaoro@unbookw.local\u0007\u001b]1337;CurrentDir=/Users/lfaoro/go/src/github.com/lfaoro/flares\u0007"] 159 | [56.521942, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:34] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 160 | [56.522104, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 161 | [58.886145, "o", "flares --export vlct.io"] 162 | [59.931414, "o", " "] 163 | [60.312523, "o", "v"] 164 | [60.36871, "o", "a"] 165 | [60.443198, "o", "u"] 166 | [60.600536, "o", "l"] 167 | [60.672809, "o", "t"] 168 | [60.732662, "o", "e"] 169 | [60.93255, "o", "x"] 170 | [61.012611, "o", "."] 171 | [61.171319, "o", "n"] 172 | [61.227503, "o", "e"] 173 | [61.299357, "o", "t"] 174 | [61.677276, "o", "\u001b[?1l\u001b>"] 175 | [61.67745, "o", "\u001b[?2004l\r\r\n"] 176 | [61.678152, "o", "\u001b]2;flares --export vlct.io vaultex.net\u0007\u001b]1;flares\u0007"] 177 | [61.678235, "o", "\u001b]133;C;\u0007"] 178 | [62.723142, "o", "BIND data for vlct.io successfully exported\r\n"] 179 | [63.337486, "o", "BIND data for vaultex.net successfully exported\r\n"] 180 | [63.341382, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 181 | [63.341544, "o", "\u001b]2;lfaoro@unbookw: ~/go/src/github.com/lfaoro/flares\u0007\u001b]1;..lfaoro/flares\u0007"] 182 | [63.341692, "o", "\u001b]133;D;0\u0007\u001b]1337;RemoteHost=lfaoro@unbookw.local\u0007\u001b]1337;CurrentDir=/Users/lfaoro/go/src/github.com/lfaoro/flares\u0007"] 183 | [63.379338, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:41] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 184 | [63.379422, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 185 | [66.623318, "o", "flares --export vlct.io vaultex.net"] 186 | [67.4168, "o", "\b\b\b \b\b\b"] 187 | [67.588908, "o", "\u001b[8D \u001b[8D"] 188 | [67.880753, "o", "\b\b\b \b\b"] 189 | [68.389619, "o", "\b\b\b\b\b \b\b\b\b\b"] 190 | [69.245128, "o", "-"] 191 | [69.380342, "o", "-"] 192 | [69.601194, "o", "a"] 193 | [69.701319, "o", "l"] 194 | [69.828626, "o", "l"] 195 | [72.196723, "o", "\u001b[?1l\u001b>\u001b[?2004l"] 196 | [72.196782, "o", "\r\r\n"] 197 | [72.197594, "o", "\u001b]2;flares --export --all\u0007\u001b]1;flares\u0007"] 198 | [72.197757, "o", "\u001b]133;C;\u0007"] 199 | [73.577461, "o", "BIND data for apionic.com successfully exported\r\n"] 200 | [74.293907, "o", "BIND data for arenacube.com successfully exported\r\n"] 201 | [75.011244, "o", "BIND data for lfaoro.com successfully exported\r\n"] 202 | [75.597201, "o", "BIND data for vaulter.app successfully exported\r\n"] 203 | [76.208505, "o", "BIND data for vaultex.net successfully exported\r\n"] 204 | [76.808638, "o", "BIND data for velocibet.com successfully exported\r\n"] 205 | [77.438244, "o", "BIND data for vlct.io successfully exported\r\n"] 206 | [77.442242, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 207 | [77.44247, "o", "\u001b]2;lfaoro@unbookw: ~/go/src/github.com/lfaoro/flares\u0007"] 208 | [77.442715, "o", "\u001b]1;..lfaoro/flares\u0007\u001b]133;D;0\u0007\u001b]1337;RemoteHost=lfaoro@unbookw.local\u0007\u001b]1337;CurrentDir=/Users/lfaoro/go/src/github.com/lfaoro/flares\u0007"] 209 | [77.482605, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:55] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 210 | [77.4828, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 211 | [80.273011, "o", "l"] 212 | [80.409061, "o", "\bll"] 213 | [81.008383, "o", "\u001b[?1l\u001b>"] 214 | [81.008456, "o", "\u001b[?2004l\r\r\n"] 215 | [81.009376, "o", "\u001b]2;ls -G -GhaltrF\u0007\u001b]1;ll\u0007"] 216 | [81.00943, "o", "\u001b]133;C;\u0007"] 217 | [81.015315, "o", "total 176\r\n"] 218 | [81.015557, "o", "drwxr-xr-x 3 lfaoro staff 96B Oct 21 2018 \u001b[1m\u001b[36m.github\u001b[39;49m\u001b[0m/\r\ndrwxr-xr-x 3 lfaoro staff 96B Oct 25 2018 \u001b[1m\u001b[36mstatic\u001b[39;49m\u001b[0m/\r\ndrwxr-xr-x 3 lfaoro staff 96B Oct 25 2018 \u001b[1m\u001b[36minternal\u001b[39;49m\u001b[0m/\r\n"] 219 | [81.015692, "o", "-rw-r--r-- 1 lfaoro staff 3.3K Oct 25 2018 CODE_OF_CONDUCT.md\r\ndrwxr-xr-x 22 lfaoro staff 704B May 27 12:49 \u001b[1m\u001b[36m..\u001b[39;49m\u001b[0m/\r\n-rw-r--r-- 1 lfaoro staff 381B Jun 3 12:33 Dockerfile\r\n-rw-r--r-- 1 lfaoro staff 576B Jun 3 12:49 .gitlab-ci.yml\r\n-rw-r--r-- 1 lfaoro staff 546B Jun 3 12:50 CONTRIBUTING.md\r\n-rw-r--r-- 1 lfaoro staff 1.4K Jun 3 12:51 LICENSE\r\ndrwxr-xr-x 3 lfaoro staff 96B Jun 3 12:59 \u001b[1m\u001b[36mcmd\u001b[39;49m\u001b[0m/\r\n-rw------- 1 lfaoro staff 1.0K Jun 3 13:20 go.sum\r\n-rw------- 1 lfaoro staff 198B Jun 3 13:20 go.mod\r\ndrwxr-xr-x 4 lfaoro staff 128B Jun 3 13:20 \u001b[1m\u001b[36mvendor\u001b[39;49m\u001b[0m/\r\n-rw-r--r-- 1 lfaoro staff 2.4K Jun 3 13:22 README.md\r\n-rw-r--r-- 1 lfaoro staff 55B Jun 3 13:27 .gitignore\r\n-rw-r--r-- 1 lfaoro staff 1.3K Jun 3 13:28 .goreleaser.yml\r\n-rw-r--r-- 1 lfaoro staff 726B Jun 3 13:31 Makefile\r\ndrwxr-xr-x 10 lfaoro staff 320B Jun 3 13:40 \u001b[1m\u001b[36m.idea\u001b[39;49m\u001b[0m/\r\n-rw------- 1 lfaoro staff 1.3K J"] 220 | [81.015768, "o", "un 3 13:48 apionic.com\r\n-rw------- 1 lfaoro staff 1.8K Jun 3 13:48 arenacube.com\r\n-rw------- 1 lfaoro staff 1.8K Jun 3 13:48 lfaoro.com\r\n-rw------- 1 lfaoro staff 1.6K Jun 3 13:48 vaulter.app\r\n-rw------- 1 lfaoro staff 2.7K Jun 3 13:48 vaultex.net\r\ndrwxr-xr-x 28 lfaoro staff 896B Jun 3 13:48 \u001b[1m\u001b[36m.\u001b[39;49m\u001b[0m/\r\n-rw------- 1 lfaoro staff 1.3K Jun 3 13:48 velocibet.com\r\n-rw------- 1 lfaoro staff 1.9K Jun 3 13:48 vlct.io\r\ndrwxr-xr-x 15 lfaoro staff 480B Jun 3 13:48 \u001b[1m\u001b[36m.git\u001b[39;49m\u001b[0m/\r\n-rw-r--r-- 1 lfaoro staff 14K Jun 3 13:48 flares.cast\r\n"] 221 | [81.016258, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 222 | [81.016375, "o", "\u001b]2;lfaoro@unbookw: ~/go/src/github.com/lfaoro/flares\u0007\u001b]1;..lfaoro/flares\u0007"] 223 | [81.016492, "o", "\u001b]133;D;0\u0007\u001b]1337;RemoteHost=lfaoro@unbookw.local\u0007"] 224 | [81.016653, "o", "\u001b]1337;CurrentDir=/Users/lfaoro/go/src/github.com/lfaoro/flares\u0007"] 225 | [81.052888, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b]133;A\u0007\r\n\u001b[1m\u001b[34m#\u001b[00m \u001b[36mlfaoro \u001b[37m@ \u001b[32munbookw \u001b[37min \u001b[1m\u001b[33m~/go/src/github.com/lfaoro/flares\u001b[00m \u001b[37mon\u001b[00m git:\u001b[36mdevelop \u001b[31mx\u001b[00m \u001b[37m[13:48:59] \r\n\u001b[1m\u001b[31m$ \u001b[00m\u001b]133;B\u0007\u001b[K"] 226 | [81.053076, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 227 | [84.577204, "o", "\u001b[?2004l\r\r\n"] 228 | --------------------------------------------------------------------------------