Projects STRLCPY Osmedeus Commits 0b67eb0e
🤬
  • Added new template engine + dynamic threads support for the workflow

  • Loading...
  • j3ssie committed 1 year ago
    0b67eb0e
    1 parent 1495966b
  • ■ ■ ■ ■ ■ ■
    .github/FUNDING.yml
     1 +# These are supported funding model platforms
     2 + 
     3 +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
     4 +patreon: j3ssie
     5 +open_collective: osmedeus
     6 +ko_fi: # Replace with a single Ko-fi username
     7 +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
     8 +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
     9 +liberapay: # Replace with a single Liberapay username
     10 +issuehunt: # Replace with a single IssueHunt username
     11 +otechie: # Replace with a single Otechie username
     12 +custom: [ 'https://paypal.me/j3ssiejjj', 'https://www.buymeacoffee.com/j3ssie' ]
  • ■ ■ ■ ■ ■ ■
    README.md
    skipped 41 lines
    42 42  go install -v github.com/j3ssie/osmedeus@latest
    43 43  ```
    44 44   
    45  -Check out [**this page**](https://docs.osmedeus.org/installation/) for more the install on other platforms
     45 +Check out [**this page**](https://docs.osmedeus.org/installation/) for more the install on other platforms and [**docker
     46 +image**](https://docs.osmedeus.org/installation/using-docker/).
    46 47   
    47 48  ## 🚀 Key Features of Osmedeus
    48 49   
    skipped 17 lines
    66 67   
    67 68  # Practical Scan Usage:
    68 69   osmedeus scan -T list_of_targets.txt -W custom_workspaces
    69  - osmedeus scan -t target.com -w workspace_name --debug
     70 + osmedeus scan --tactic aggressive -f general -t sample.com
    70 71   osmedeus scan -f general -t www.sample.com
    71  - osmedeus scan -f gdirb -T list_of_target.txt
    72 72   osmedeus scan -m ~/.osmedeus/core/workflow/test/dirbscan.yaml -t list_of_urls.txt
    73 73   osmedeus scan --wfFolder ~/custom-workflow/ -f your-custom-workflow -t list_of_urls.txt
    74 74   
    skipped 15 lines
    90 90   osmedeus cloud --chunk -c 10 -f [flowName] -t [targetsFile]
    91 91   
    92 92  # Utilities Usage:
     93 + ## Health check utility
    93 94   osmedeus health
    94 95   osmedeus health git
    95 96   osmedeus health cloud
    96 97   osmedeus version --json
     98 + ## Update utility
    97 99   osmedeus update
    98 100   osmedeus update --vuln
    99 101   osmedeus update --force --clean
     102 + ## Other utilities
    100 103   osmedeus utils tmux ls
    101 104   osmedeus utils tmux logs -A -l 10
    102 105   osmedeus utils ps
    skipped 1 lines
    104 107   osmedeus utils cron --cmd 'osmdeus scan -t example.com' --sch 60
    105 108   osmedeus utils cron --for --cmd 'osmedeus scan -t example.com'
    106 109   osmedeus utils workflow
     110 + osmedeus config set --threads-hold=10
    107 111  ```
    108 112   
    109 113  Check out [**this page**](https://docs.osmedeus.org/installation/usage/) for full usage and the [**Practical
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    cmd/cloud.go
    skipped 1 lines
    2 2   
    3 3  import (
    4 4   "fmt"
     5 + "io"
     6 + "os"
     7 + "path"
     8 + 
    5 9   "github.com/fatih/color"
    6 10   "github.com/j3ssie/osmedeus/core"
    7 11   "github.com/j3ssie/osmedeus/distribute"
    skipped 2 lines
    10 14   "github.com/spf13/cobra"
    11 15   "golang.org/x/text/cases"
    12 16   "golang.org/x/text/language"
    13  - "io"
    14  - "os"
    15  - "path"
    16 17  )
    17 18   
    18 19  func init() {
    skipped 16 lines
    35 36   cloudCmd.Flags().StringVar(&options.Cloud.LocalSyncFolder, "rfolder", fmt.Sprintf("/root/.%s/workspaces/", libs.BINARY), "Remote Folder to sync back to local")
    36 37   
    37 38   // commands on cloud
    38  - cloudCmd.Flags().IntVar(&options.Cloud.Threads, "threads", 1, "Concurrency level on remote cloud")
     39 + cloudCmd.Flags().IntVar(&options.Cloud.Threads, "cloud-threads", 1, "Concurrency level on remote cloud")
    39 40   cloudCmd.Flags().StringVar(&options.Cloud.Extra, "extra", "", "append raw command after the command builder")
    40  - cloudCmd.Flags().StringVar(&options.Cloud.RawCommand, "cmd", "", "specific raw command and override everything (eg: --cmd 'curl {{.Target}}')")
     41 + cloudCmd.Flags().StringVar(&options.Cloud.RawCommand, "cmd", "", "specific raw command and override everything (eg: --cmd 'curl {{Target}}')")
    41 42   cloudCmd.Flags().StringVar(&options.Cloud.CloudWait, "wait", "30m", "time to wait before next queue check")
    42 43   cloudCmd.Flags().StringVar(&options.Cloud.ClearTime, "clear", "10m", "time to wait before next clear check")
    43 44   cloudCmd.Flags().StringVar(&options.Cloud.TempTarget, "tempTargets", "/tmp/osm-tmp-inputs/", "Temp Folder to store targets file")
    skipped 138 lines
  • ■ ■ ■ ■ ■ ■
    cmd/config.go
    skipped 1 lines
    2 2   
    3 3  import (
    4 4   "fmt"
     5 + "github.com/fatih/color"
    5 6   "github.com/j3ssie/osmedeus/database"
    6 7   "github.com/j3ssie/osmedeus/execution"
    7 8   "os"
    skipped 7 lines
    15 16  func init() {
    16 17   var configCmd = &cobra.Command{
    17 18   Use: "config",
    18  - Short: "Do some config stuff",
     19 + Short: "Do some configuration from CLI",
    19 20   Long: core.Banner(),
    20 21   RunE: runConfig,
    21 22   }
    skipped 4 lines
    26 27   configCmd.Flags().String("user", "", "Username")
    27 28   configCmd.Flags().String("pass", "", "Password")
    28 29   configCmd.Flags().StringP("workspace", "w", "", "Name of workspace")
    29  - 
    30 30   configCmd.SetHelpFunc(ConfigHelp)
    31 31   RootCmd.AddCommand(configCmd)
    32 32  }
    skipped 1 lines
    34 34  func runConfig(cmd *cobra.Command, args []string) error {
    35 35   sort.Strings(args)
    36 36   action, _ := cmd.Flags().GetString("action")
    37  - //pluginsRepo, _ := cmd.Flags().GetString("pluginsRepo")
    38 37   workspace, _ := cmd.Flags().GetString("workspace")
    39 38   DBInit()
    40 39   
    skipped 16 lines
    57 56   break
    58 57   
    59 58   case "reload":
    60  - core.ReloadConfig(options)
     59 + core.ReloadConfig(&options)
    61 60   break
    62 61   
    63  - case "delete":
     62 + case "delete", "del":
    64 63   options.Scan.Input = workspace
    65 64   options.Scan.ROptions = core.ParseInput(options.Scan.Input, options)
    66 65   utils.InforF("Delete Workspace: %v", options.Scan.ROptions["Workspace"])
    67 66   os.RemoveAll(options.Scan.ROptions["Output"])
    68  - //ws := database.SelectScan(options.Scan.ROptions["Workspace"])
    69  - //database.DeleteScan(int(ws.ID))
    70 67   break
    71 68   
    72 69   case "pull":
    skipped 2 lines
    75 72   }
    76 73   break
    77 74   
     75 + case "set":
     76 + core.SetTactic(&options)
     77 + break
    78 78   case "update":
    79 79   core.Update(options)
    80 80   break
    skipped 1 lines
    82 82   case "clean", "cl", "c":
    83 83   database.ClearDB()
    84 84   break
     85 + default:
     86 + utils.ErrorF("Unknown action: %v", color.HiRedString(action))
     87 + fmt.Println(ConfigUsage())
    85 88   }
    86 89   
    87 90   return nil
    skipped 2 lines
  • ■ ■ ■ ■ ■ ■
    cmd/health.go
    skipped 26 lines
    27 27   
    28 28  func runHealth(_ *cobra.Command, args []string) error {
    29 29   if options.PremiumPackage {
    30  - fmt.Printf("�� Osmedeus %s: Run diagnostics to check if everything okay\n", libs.VERSION)
     30 + fmt.Printf("�� Osmedeus Premium %s: Run diagnostics to ensure that everything is in arrange.\n", libs.VERSION)
    31 31   } else {
    32  - fmt.Printf("�� Osmedeus %s: Run diagnostics to check if everything okay\n", libs.VERSION)
     32 + fmt.Printf("�� Osmedeus %s: Run diagnostics to ensure that everything is in arrange.\n", libs.VERSION)
    33 33   }
    34 34   
    35 35   sort.Strings(args)
    skipped 112 lines
    148 148   
    149 149   // check core programs
    150 150   var err error
    151  - _, err = utils.RunCommandWithErr("jaeles -h")
    152  - if err != nil {
     151 + if _, err = utils.RunCommandWithErr("jaeles -h"); err != nil {
    153 152   color.Red("[-] Core program setup incorrectly")
    154 153   return fmt.Errorf("error checking core programs: %v", "jaeles")
    155  - 
    156 154   }
    157  - _, err = utils.RunCommandWithErr("amass -h")
    158  - if err != nil {
     155 + if _, err = utils.RunCommandWithErr("timeout --help"); err != nil {
     156 + color.Red("[-] Core program setup incorrectly")
     157 + return fmt.Errorf("error checking core programs: %v", "timeout")
     158 + }
     159 + if _, err = utils.RunCommandWithErr("amass -h"); err != nil {
    159 160   color.Red("[-] Core program setup incorrectly")
    160 161   return fmt.Errorf("error checking core programs: %v", "amass")
    161  - 
    162 162   }
    163 163   _, err = utils.RunCommandWithErr(fmt.Sprintf("%s -h", path.Join(options.Env.BinariesFolder, "httprobe")))
    164 164   if err != nil {
    skipped 47 lines
    212 212   utils.ErrorF("Error parsing flow: %v", flow)
    213 213   continue
    214 214   }
     215 + 
     216 + if parsedFlow.SkipIndexed {
     217 + continue
     218 + }
     219 + 
    215 220   row := []string{
    216 221   parsedFlow.Name, parsedFlow.Desc,
    217 222   }
    skipped 54 lines
  • ■ ■ ■ ■ ■ ■
    cmd/queue.go
    skipped 1 lines
    2 2   
    3 3  import (
    4 4   "fmt"
     5 + "path"
     6 + "strings"
     7 + 
    5 8   "github.com/fatih/color"
    6 9   "github.com/j3ssie/osmedeus/core"
    7 10   "github.com/j3ssie/osmedeus/libs"
    8 11   "github.com/j3ssie/osmedeus/utils"
    9 12   jsoniter "github.com/json-iterator/go"
    10 13   "github.com/spf13/cobra"
    11  - "path"
    12  - "strings"
    13 14  )
    14 15   
    15 16  func init() {
    skipped 51 lines
    67 68   return
    68 69   }
    69 70   
    70  - // osmedeus queue --add -t /tmp/cidr --cmd "osmedeus -t {{.Input}} -m recon -w"
     71 + // osmedeus queue --add -t /tmp/cidr --cmd "osmedeus -t {{Input}} -m recon -w"
    71 72   for _, target := range options.Scan.Inputs {
    72 73   queueInput := libs.InputFormat{
    73 74   Input: target,
    skipped 9 lines
  • ■ ■ ■ ■ ■ ■
    cmd/root.go
    skipped 50 lines
    51 51   RootCmd.PersistentFlags().StringVarP(&options.Scan.Flow, "flow", "f", "general", "Flow name for running (default: general)")
    52 52   RootCmd.PersistentFlags().StringVarP(&options.Scan.CustomWorkspace, "workspace", "w", "", "Name of workspace (default is same as target)")
    53 53   RootCmd.PersistentFlags().StringSliceVarP(&options.Scan.Params, "params", "p", []string{}, "Custom params -p='foo=bar' (Multiple -p flags are accepted)")
     54 + RootCmd.PersistentFlags().StringVar(&options.Scan.SuffixName, "suffix", "", "Suffix string for file converted (default: randomly)")
     55 + RootCmd.PersistentFlags().IntVarP(&options.Threads, "threads-hold", "B", 0, "Threads hold for each module (default: number of CPUs)")
     56 + RootCmd.PersistentFlags().StringVar(&options.Tactics, "tactic", "default", "Choosing the tactic for running workflow from [default aggressive gently]")
    54 57   
    55 58   // cloud flags
    56 59   RootCmd.PersistentFlags().BoolVar(&options.Cloud.EnableChunk, "chunk", false, "Enable chunk mode")
    skipped 3 lines
    60 63   RootCmd.PersistentFlags().StringVar(&options.Cloud.Size, "size", "", "Override Size of cloud provider (default will get from 'cloud/provider.yaml')")
    61 64   RootCmd.PersistentFlags().StringVar(&options.Cloud.Region, "region", "", "Override Region of cloud provider (default will get from 'cloud/provider.yaml')")
    62 65   RootCmd.PersistentFlags().StringVar(&options.Cloud.Token, "token", "", "Override token of cloud provider (default will get from 'cloud/provider.yaml')")
    63  - RootCmd.PersistentFlags().StringVar(&options.Cloud.TokensFile, "token-file", "", "Override token of cloud provider (default will get from 'cloud/provider.yaml')")
     66 + RootCmd.PersistentFlags().StringVar(&options.Cloud.TokensFile, "token-file", "", "File contains list token of cloud providers")
    64 67   RootCmd.PersistentFlags().StringVar(&options.Cloud.Provider, "provider", "", "Provider config file (default will get from 'cloud/provider.yaml')")
    65 68   RootCmd.PersistentFlags().BoolVar(&options.Cloud.ReBuildBaseImage, "rebuild", false, "Forced to rebuild the images event though the version didn't change")
    66 69   
    skipped 46 lines
    113 116   utils.ErrorF("config file does not writable: %v", options.ConfigFile)
    114 117   utils.BlockF("fatal", "Make sure you are login as 'root user' if your installation done via root user")
    115 118   }
    116  - core.LoadConfig(&options)
     119 + core.ParsingConfig(&options)
    117 120   
    118 121   // parse inputs
    119 122   if options.Scan.InputList != "" {
    skipped 32 lines
  • ■ ■ ■ ■
    cmd/scan.go
    skipped 58 lines
    59 59   
    60 60  func CreateRunner(j interface{}) {
    61 61   target := j.(string)
    62  - if core.IsRootDomain(target) && options.Scan.Flow == "general" {
     62 + if core.IsRootDomain(target) && options.Scan.Flow == "general" && len(options.Scan.Modules) == 0 {
    63 63   utils.WarnF("looks like you scanning a subdomain '%s' with general flow. The result might be much less than usual", color.HiCyanString(target))
    64 64   utils.WarnF("Better input should be root domain with TLD like '-t target.com'")
    65 65   }
    skipped 9 lines
  • ■ ■ ■ ■
    cmd/server.go
    skipped 20 lines
    21 21   serverCmd.Flags().BoolVar(&options.Server.DisableSSL, "disable-ssl", false, "Disable workspaces directory listing")
    22 22   serverCmd.Flags().BoolVar(&options.Server.DisableWorkspaceListing, "disable-listing", false, "Disable workspaces directtory listing")
    23 23   serverCmd.Flags().BoolVar(&options.Server.PreFork, "prefork", false, "Enable Prefork mode for the api server")
    24  - serverCmd.Flags().BoolVar(&options.Server.NoAuthen, "no-auth", false, "Disable authentication for the api server")
     24 + serverCmd.Flags().BoolVarP(&options.Server.NoAuthen, "no-auth", "A", false, "Disable authentication for the api server")
    25 25   RootCmd.AddCommand(serverCmd)
    26 26  }
    27 27   
    skipped 10 lines
  • ■ ■ ■ ■ ■
    cmd/usage.go
    skipped 1 lines
    2 2   
    3 3  import (
    4 4   "fmt"
     5 + 
    5 6   "github.com/fatih/color"
    6 7   "github.com/j3ssie/osmedeus/core"
    7 8   "github.com/j3ssie/osmedeus/libs"
    skipped 39 lines
    47 48   osmedeus scan -f vuln-and-dirb -t list-of-domains.txt
    48 49  
    49 50   ## Use a custom wordlist
    50  - osmedeus scan -t sample.com -p 'wordlists={{.Data}}/wordlists/content/big.txt' -p 'fthreads=40'
     51 + osmedeus scan -t sample.com -p 'wordlists={{Data}}/wordlists/content/big.txt'
    51 52  
    52 53   ## Get target from a stdin and start the scan with 2 concurrency
    53 54   cat list_of_targets.txt | osmedeus scan -c 2
    skipped 13 lines
    67 68   h += " osmedeus scan -f /path/to/flow.yaml -t [target] \n"
    68 69   h += " osmedeus scan -m /path/to/module.yaml -t [target] --params 'port=9200'\n"
    69 70   h += " osmedeus scan -m /path/to/module.yaml -t [target] -l /tmp/log.log\n"
     71 + h += " osmedeus scan --tactic aggressive -m module -t [target] \n"
    70 72   h += " cat targets | osmedeus scan -f sample\n"
    71 73   
    72 74   h += color.HiCyanString("\nPractical Scan Usage:\n")
    73 75   h += " osmedeus scan -T list_of_targets.txt -W custom_workspaces\n"
    74 76   h += " osmedeus scan -t target.com -w workspace_name --debug\n"
    75 77   h += " osmedeus scan -f general -t sample.com\n"
     78 + h += " osmedeus scan --tactic aggressive -f general -t sample.com\n"
    76 79   h += " osmedeus scan -f extensive -t sample.com -t another.com\n"
    77 80   h += " cat list_of_urls.txt | osmedeus scan -f urls\n"
     81 + h += " osmedeus scan --threads-hold=30 -f cidr -t 1.2.3.4/24\n"
    78 82   h += " osmedeus scan -m ~/.osmedeus/core/workflow/test/dirbscan.yaml -t list_of_urls.txt\n"
    79 83   h += " osmedeus scan --wfFolder ~/custom-workflow/ -f your-custom-workflow -t list_of_urls.txt\n"
    80 84   h += " osmedeus scan --chunk --chunk-part 40 -c 2 -f cidr -t list-of-cidr.txt\n"
    81  - 
    82 85   return h
    83 86  }
    84 87   
    skipped 13 lines
    98 101   h += " osmedeus utils cron --cmd 'osmdeus scan -t example.com' --sch 60\n"
    99 102   h += " osmedeus utils cron --for --cmd 'osmedeus scan -t example.com'\n"
    100 103   h += " osmedeus utils workflow\n"
     104 + h += " osmedeus config set --threads-hold=10\n"
    101 105   return h
    102 106  }
    103 107   
    skipped 6 lines
    110 114   h += " osmedeus config clean \n"
    111 115   h += " osmedeus config delete -t woskapce \n"
    112 116   h += " osmedeus config delete -w workspace_name \n"
     117 + h += " osmedeus config set --threads-hold=10 \n"
    113 118   return h
    114 119  }
    115 120   
    skipped 103 lines
  • ■ ■ ■ ■ ■ ■
    core/config.go
    skipped 6 lines
    7 7   "github.com/j3ssie/osmedeus/libs"
    8 8   "github.com/j3ssie/osmedeus/provider"
    9 9   "github.com/j3ssie/osmedeus/utils"
     10 + "github.com/spf13/cast"
    10 11   "github.com/spf13/viper"
    11  - "net/url"
    12 12   "os"
    13 13   "path"
    14 14   "path/filepath"
     15 + "runtime"
    15 16   "strings"
    16 17  )
    17 18   
    skipped 123 lines
    141 142   "destorage": path.Join(options.Env.RootFolder, "destorage"),
    142 143   })
    143 144   
    144  - v.Set("Notification", map[string]string{
     145 + v.SetDefault("Notification", map[string]string{
    145 146   "client_name": utils.GetOSEnv("CLIENT_NAME", "CLIENT_NAME"),
    146 147   "slack_status_channel": utils.GetOSEnv("SLACK_STATUS_CHANNEL", "SLACK_STATUS_CHANNEL"),
    147 148   "slack_report_channel": utils.GetOSEnv("SLACK_REPORT_CHANNEL", "SLACK_REPORT_CHANNEL"),
    skipped 7 lines
    155 156   "telegram_mics_channel": utils.GetOSEnv("TELEGRAM_MICS_CHANNEL", "TELEGRAM_MICS_CHANNEL"),
    156 157   })
    157 158   
     159 + v.SetDefault("Cdn", map[string]string{
     160 + // this is default s3 bucket for public report that generated by osmedeus
     161 + "public_s3_bucket": utils.GetOSEnv("PUBLIC_S3_BUCKET", "PUBLIC_S3_BUCKET"),
     162 + // this should be a private s3 bucket for private report that only own by you
     163 + "private_s3_bucket": utils.GetOSEnv("PRIVATE_S3_BUCKET", "PRIVATE_S3_BUCKET"),
     164 + "aws_access_key": utils.GetOSEnv("AWS_ACCESS_KEY", "AWS_ACCESS_KEY"),
     165 + "aws_secret_key": utils.GetOSEnv("AWS_SECRET_KEY", "AWS_SECRET_KEY"),
     166 + })
     167 + 
     168 + v.SetDefault("Tactic", map[string]any{
     169 + "default": runtime.NumCPU(), // 2,4,8,16
     170 + "aggressive": runtime.NumCPU() * 4,
     171 + "gently": int(runtime.NumCPU() + 1/2),
     172 + })
     173 + 
    158 174   v.SetDefault("Mics", map[string]string{
    159 175   "docs": utils.GetOSEnv("OSM_DOCS", libs.DOCS),
    160 176   })
    skipped 14 lines
    175 191   return nil
    176 192  }
    177 193   
    178  -func LoadConfig(options *libs.Options) {
     194 +func LoadConfig(options *libs.Options) *viper.Viper {
    179 195   v = viper.New()
    180 196   v.SetConfigName("config")
    181 197   v.SetConfigType("yaml")
    skipped 3 lines
    185 201   if err := v.ReadInConfig(); err != nil {
    186 202   utils.ErrorF("Error reading config file, %s", err)
    187 203   }
     204 + return v
     205 +}
    188 206   
     207 +func ParsingConfig(options *libs.Options) {
     208 + v = LoadConfig(options)
    189 209   GetEnv(options)
    190 210   GetStorages(options)
    191 211   GetNotification(options)
    skipped 44 lines
    236 256   options.Env.WorkFlowsFolder = utils.NormalizePath(envs["workflows"])
    237 257   }
    238 258   
     259 + // @NOTE: well of course you can rebuild the core engine binary to bypass this check
     260 + // but the premium package is more about custom workflow + wordlists + tools
     261 + // see more about it here: https://docs.osmedeus.org/faq/#premium-package-related-questions and https://docs.osmedeus.org/premium/
    239 262   if utils.FileExists(path.Join(options.Env.WorkFlowsFolder, "premium.md")) {
    240 263   options.PremiumPackage = true
    241 264   }
    skipped 28 lines
    270 293   os.Setenv("PATH", fmt.Sprintf("%s:%s", osPATH, strings.TrimRight(options.Env.BinariesFolder, "/")))
    271 294   }
    272 295   
     296 + tactics := v.GetStringMap("Tactic")
     297 + options.Tactics = strings.ToLower(options.Tactics)
     298 + options.ThreadsHold.Default = cast.ToInt(tactics["default"])
     299 + options.ThreadsHold.Aggressive = cast.ToInt(tactics["aggressive"])
     300 + options.ThreadsHold.Gently = cast.ToInt(tactics["gently"])
     301 + 
     302 + // try to autocorrect the tactic name
     303 + switch options.Tactics {
     304 + case "aggressive", "agg", "aggr", "aggrsive":
     305 + options.Tactics = "aggressive"
     306 + case "gently", "gen", "gent", "gentl":
     307 + options.Tactics = "gently"
     308 + }
     309 + defaultThreadsHold := cast.ToInt(tactics[options.Tactics])
     310 + 
     311 + if defaultThreadsHold == 0 {
     312 + utils.ErrorF("tactic %s not found, switching to the %v one", color.HiRedString(options.Tactics), color.HiYellowString("default"))
     313 + defaultThreadsHold = cast.ToInt(tactics["default"])
     314 + options.Tactics = "default"
     315 + // in case you're still using the old config
     316 + if defaultThreadsHold == 0 {
     317 + defaultThreadsHold = 4
     318 + }
     319 + }
     320 + 
     321 + // override if you put --threads-hold flag
     322 + if options.Threads == 0 {
     323 + options.Threads = defaultThreadsHold
     324 + }
     325 + 
    273 326   /* some special conditions below */
    274 327   
    275 328   // change {{.Storage}} from ~/.osmedeus/storages to ~/.osmedeus/destorages
    skipped 257 lines
    533 586   options.Git.DefaultUID = utils.StrToInt(git["default_uid"])
    534 587  }
    535 588   
    536  -// GetCdn get options for client
    537  -func GetCdn(options *libs.Options) {
    538  - cdn := v.GetStringMapString("Cdn")
    539  - options.Cdn.URL = cdn["osm_cdn_url"]
    540  - options.Cdn.WSURL = cdn["osm_cdn_wsurl"]
    541  - options.Cdn.Prefix = cdn["osm_cdn_prefix"]
    542  - options.Cdn.Index = cdn["osm_cdn_index"]
     589 +func SetTactic(options *libs.Options) {
     590 + v = LoadConfig(options)
     591 + if err := v.ReadInConfig(); err != nil {
     592 + utils.ErrorF("Error reading config file, %s", err)
     593 + }
    543 594   
    544  - // in case we have prefix
    545  - if options.Cdn.Prefix != "OSM_CDN_PREFIX" {
    546  - u, err := url.Parse(options.Cdn.URL)
    547  - if err == nil {
    548  - u.Path = path.Join(u.Path, options.Cdn.Prefix)
    549  - options.Cdn.URL = u.String()
    550  - }
    551  - 
    552  - u, err = url.Parse(options.Cdn.WSURL)
    553  - if err == nil {
    554  - u.Path = path.Join(u.Path, options.Cdn.Prefix)
    555  - options.Cdn.WSURL = u.String()
    556  - }
    557  - }
     595 + baseThreads := options.Threads
     596 + utils.InforF("Set base threads to %v", color.HiCyanString("%v", baseThreads))
     597 + v.Set("Tactic", map[string]any{
     598 + "default": baseThreads, // 2,4,8,16
     599 + "aggressive": baseThreads * 4,
     600 + "gently": int(baseThreads / 2),
     601 + })
    558 602   
    559  - options.Cdn.Auth = cdn["osm_cdn_auth"]
     603 + v.WriteConfig()
    560 604  }
    561 605   
    562 606  // ReloadConfig get credentials
    563  -func ReloadConfig(options libs.Options) {
    564  - utils.InforF("Reload Env for config file: %v", options.ConfigFile)
     607 +func ReloadConfig(options *libs.Options) {
     608 + v = LoadConfig(options)
     609 + utils.InforF("Reload Env to the config file: %v", options.ConfigFile)
    565 610   
    566  - // options.ConfigFile, _ = homedir.Expand(options.ConfigFile)
    567  - RootFolder := filepath.Dir(utils.NormalizePath(options.ConfigFile))
    568  - if !utils.FolderExists(RootFolder) {
    569  - os.MkdirAll(RootFolder, 0750)
    570  - }
    571  - // Base folder
    572  - BaseFolder := utils.NormalizePath(options.Env.BaseFolder)
    573  - if !utils.FolderExists(BaseFolder) {
    574  - os.MkdirAll(BaseFolder, 0750)
    575  - }
    576  - 
    577  - v.Set("Environments", map[string]string{
    578  - // RootFolder --> ~/.osmedeus/
    579  - "storages": path.Join(RootFolder, "storages"),
    580  - "workspaces": path.Join(RootFolder, "workspaces"),
    581  - "backups": path.Join(RootFolder, "backups"),
    582  - "provider_config": path.Join(RootFolder, "provider"),
    583  - 
    584  - // this update casually
    585  - // BaseFolder --> ~/osmedeus-base/
    586  - "workflows": path.Join(BaseFolder, "workflow"),
    587  - "binaries": path.Join(BaseFolder, "binaries"),
    588  - "data": path.Join(BaseFolder, "data"),
    589  - "cloud_config": path.Join(BaseFolder, "cloud"),
     611 + v.Set("Cdn", map[string]string{
     612 + // this is default s3 bucket for public report that generated by osmedeus
     613 + "public_s3_bucket": utils.GetOSEnv("PUBLIC_S3_BUCKET", "PUBLIC_S3_BUCKET"),
     614 + // this should be a private s3 bucket for private report that only own by you
     615 + "private_s3_bucket": utils.GetOSEnv("PRIVATE_S3_BUCKET", "PRIVATE_S3_BUCKET"),
     616 + "aws_access_key": utils.GetOSEnv("AWS_ACCESS_KEY", "AWS_ACCESS_KEY"),
     617 + "aws_secret_key": utils.GetOSEnv("AWS_SECRET_KEY", "AWS_SECRET_KEY"),
    590 618   })
    591 619   
    592  - // things should be reload by env
     620 + // things should be reloaded by env
    593 621   v.Set("Storages", map[string]string{
    594 622   // path of secret key for push result
    595 623   "secret_key": utils.GetOSEnv("SECRET_KEY", "SECRET_KEY"),
    skipped 49 lines
    645 673   "telegram_dirb_channel": utils.GetOSEnv("TELEGRAM_DIRB_CHANNEL", "TELEGRAM_DIRB_CHANNEL"),
    646 674   "telegram_mics_channel": utils.GetOSEnv("TELEGRAM_MICS_CHANNEL", "TELEGRAM_MICS_CHANNEL"),
    647 675   })
    648  - 
    649 676   v.WriteConfig()
    650 677  }
    651 678   
  • ■ ■ ■ ■ ■ ■
    core/flow.go
    skipped 10 lines
    11 11   "github.com/j3ssie/osmedeus/libs"
    12 12  )
    13 13   
     14 +func ListAllFlowName(options libs.Options) (result []string) {
     15 + rawWorkflows := ListModules(options)
     16 + for _, item := range rawWorkflows {
     17 + result = append(result, strings.ReplaceAll(filepath.Base(item), ".yaml", ""))
     18 + }
     19 + return result
     20 +}
     21 + 
     22 +func ListModuleName(options libs.Options) (result []string) {
     23 + rawResult := DefaultWorkflows(options)
     24 + for _, item := range rawResult {
     25 + result = append(result, strings.ReplaceAll(filepath.Base(item), ".yaml", ""))
     26 + }
     27 + return result
     28 +}
     29 + 
    14 30  // ListFlow list all available mode
    15 31  func ListFlow(options libs.Options) (result []string) {
    16 32   modePath := path.Join(options.Env.WorkFlowsFolder, "/*.yaml")
    skipped 189 lines
  • ■ ■ ■ ■ ■
    core/parse.go
    skipped 4 lines
    5 5   "fmt"
    6 6   "github.com/Jeffail/gabs/v2"
    7 7   "github.com/fatih/color"
     8 + "github.com/flosch/pongo2/v6"
    8 9   "github.com/spf13/cast"
    9 10   "golang.org/x/net/publicsuffix"
    10 11   "io/ioutil"
    skipped 12 lines
    23 24   
    24 25  // ResolveData resolve template from signature file
    25 26  func ResolveData(format string, data map[string]string) string {
    26  - //utils.DebugF("ResolveData: %s", format)
     27 + // for backward compatibility because new template using `{{variable}}` instead of `{{.variable}}`
     28 + if strings.Contains(format, "{{.") {
     29 + return OldResolveData(format, data)
     30 + }
     31 + 
     32 + variable := make(map[string]interface{})
     33 + for k, v := range data {
     34 + variable[k] = v
     35 + }
     36 + if tpl, err := pongo2.FromString(format); err == nil {
     37 + 
     38 + out, ok := tpl.Execute(variable)
     39 + 
     40 + if ok == nil {
     41 + return out
     42 + }
     43 + utils.ErrorF("Error when resolve template: %v", ok)
     44 + }
     45 + return format
     46 +}
     47 + 
     48 +// OldResolveData resolve template from signature file
     49 +func OldResolveData(format string, data map[string]string) string {
    27 50   t := template.Must(template.New("").Parse(format))
    28 51   
    29 52   buf := &bytes.Buffer{}
    skipped 62 lines
    92 115   return module, err
    93 116   }
    94 117   module.ModulePath = moduleFile
    95  - if module.Usage != "" && strings.Contains(module.Usage, "{{.this_file}}") {
    96  - module.Usage = strings.ReplaceAll(module.Usage, "{{.this_file}}", moduleFile)
     118 + if module.Usage != "" && strings.Contains(module.Usage, "{{this_file}}") {
     119 + module.Usage = strings.ReplaceAll(module.Usage, "{{this_file}}", moduleFile)
    97 120   }
    98 121   return module, err
    99 122  }
    skipped 38 lines
    138 161   if err == nil {
    139 162   ROptions["CWD"] = dir
    140 163   }
     164 + 
     165 + // default threads variables
     166 + ROptions["Threads"] = cast.ToString(options.Threads)
     167 + ROptions["threads"] = cast.ToString(options.Threads)
     168 + ROptions["thread"] = cast.ToString(options.Threads)
     169 + ROptions["baseThreads"] = cast.ToString(options.Threads)
     170 + 
    141 171   ROptions["Version"] = libs.VERSION
    142 172   ROptions["WSCDN"] = options.Cdn.WSURL
    143 173   ROptions["CDN"] = options.Cdn.URL
    skipped 141 lines
    285 315   }
    286 316   
    287 317   input := strings.ReplaceAll(raw, fmt.Sprintf(".%s", suffix), "")
    288  - if strings.Count(input, ".") == 1 {
     318 + if strings.Count(input, ".") == 1 && strings.Count(input, "/") == 0 {
    289 319   return true
    290 320   }
    291 321   return false
    skipped 2 lines
  • ■ ■ ■ ■ ■ ■
    core/parse_test.go
    skipped 1 lines
    2 2   
    3 3  import (
    4 4   "fmt"
     5 + "github.com/flosch/pongo2/v6"
     6 + "runtime"
    5 7   "testing"
    6 8  )
    7 9   
    skipped 37 lines
    45 47   }
    46 48  }
    47 49   
     50 +func TestRenderTemplate(t *testing.T) {
     51 + formatString := "Hello {{name}}! \n"
     52 + formatString += "--> Express: {{ 2 * cpu }} \n"
     53 + formatString += "--> Bool: {{ Skip }} \n"
     54 + target := map[string]any{
     55 + "name": "World",
     56 + "num": "2",
     57 + "cpu": runtime.NumCPU(),
     58 + "Skip": true,
     59 + }
     60 + fmt.Println(target)
     61 + 
     62 + if tpl, err := pongo2.FromString(formatString); err == nil {
     63 + // Now you can render the template with the given
     64 + // pongo2.Context how often you want to.
     65 + out, err := tpl.Execute(target)
     66 + if err != nil {
     67 + panic(err)
     68 + }
     69 + fmt.Println(out) // Output: Hello Florian!
     70 + }
     71 +}
     72 + 
  • ■ ■ ■ ■ ■
    core/runner.go
    skipped 70 lines
    71 71   
    72 72  // PrepareWorkflow prepare workflow file
    73 73  func (r *Runner) PrepareWorkflow() {
     74 + allFlows := ListAllFlowName(r.Opt)
     75 + 
    74 76   r.RoutineType = "flow"
    75 77   var err error
    76 78   flows := SelectFlow(r.Opt.Scan.Flow, r.Opt)
    skipped 57 lines
    134 136   if len(r.Routines) == 0 {
    135 137   if r.Opt.Scan.Flow != "cloud-distributed" {
    136 138   utils.WarnF("Your workflow %v doesn't exist", color.HiRedString(r.Opt.Scan.Flow))
     139 + utils.WarnF("Please select one of these flow: %v", color.HiMagentaString(strings.Join(allFlows, ", ")))
    137 140   }
    138 141   }
    139 142  }
    140 143   
    141 144  func (r *Runner) PrepareModule() {
     145 + allModules := ListModuleName(r.Opt)
    142 146   r.RoutineType = "module"
     147 + 
    143 148   var err error
    144 149   for _, rawModule := range r.Opt.Scan.Modules {
    145 150   var routine libs.Routine
    skipped 3 lines
    149 154   r.Opt.Module, err = ParseModules(module)
    150 155   if err != nil || r.Opt.Module.Name == "" {
    151 156   utils.WarnF("Your module %v doesn't exist", color.HiRedString(r.Opt.Scan.Modules[0]))
     157 + utils.WarnF("Please select one of these module: %v", color.HiMagentaString(strings.Join(allModules, ", ")))
    152 158   continue
    153 159   }
    154 160   if r.Opt.Module.NoDB {
    skipped 125 lines
    280 286   utils.InforF("Adding %v flag if you want to disable input validate", color.HiCyanString(`'--nv'`))
    281 287   return
    282 288   }
     289 + utils.InforF("Running %s tactic with baseline threads hold as %s ", color.YellowString(r.Opt.Tactics), color.HiMagentaString("%v", r.Opt.Threads))
    283 290   
    284 291   r.Opt.Scan.ROptions = r.Target
    285 292   // prepare some metadata files
    skipped 2 lines
    288 295   r.RuntimeFile = r.Target["Output"] + "/runtime"
    289 296   os.Remove(r.DoneFile)
    290 297   
    291  - utils.InforF("Running the routine %v on %v", color.CyanString(r.RoutineName), color.CyanString(r.Input))
     298 + utils.InforF("Running the routine %v on %v", color.HiYellowString(r.RoutineName), color.CyanString(r.Input))
    292 299   utils.InforF("Detailed runtime file can be found on %v", color.CyanString(r.RuntimeFile))
    293 300   execution.TeleSendMess(r.Opt, fmt.Sprintf("**%s** -- Start new scan: **%s** -- **%s**", r.Opt.Noti.ClientName, r.Opt.Scan.Flow, r.Target["Workspace"]), "#status", false)
    294 301   
    skipped 55 lines
  • ■ ■ ■ ■ ■
    core/validate.go
    skipped 61 lines
    62 62   
    63 63   if inputAsFile {
    64 64   utils.MakeDir(libs.TEMP)
    65  - dest := path.Join(libs.TEMP, fmt.Sprintf("%v-%v", utils.StripPath(r.Input), utils.RandomString(4)))
     65 + suffix := utils.RandomString(4)
     66 + if r.Opt.Scan.SuffixName != "" {
     67 + suffix = r.Opt.Scan.SuffixName + "-" + utils.RandomString(4)
     68 + }
     69 + dest := path.Join(libs.TEMP, fmt.Sprintf("%v-%v", utils.StripPath(r.Input), suffix))
    66 70   if r.Opt.Scan.CustomWorkspace != "" {
    67  - dest = path.Join(libs.TEMP, fmt.Sprintf("%v-%v", utils.StripPath(r.Opt.Scan.CustomWorkspace), utils.RandomString(4)))
     71 + dest = path.Join(libs.TEMP, fmt.Sprintf("%v-%v", utils.StripPath(r.Opt.Scan.CustomWorkspace), suffix))
    68 72   }
    69 73   utils.WriteToFile(dest, r.Input)
    70 74   utils.InforF("Convert input to a file: %v", dest)
    skipped 65 lines
  • ■ ■ ■ ■ ■ ■
    database/scan.go
    skipped 26 lines
    27 27   
    28 28   tx := DB.Create(&inputObj)
    29 29   if tx.Error != nil {
    30  - utils.ErrorF("error creating target -- %v", tx.Error)
     30 + utils.ErrorF("error creating new scan -- %v", tx.Error)
    31 31   }
    32 32   utils.DebugF("[DB] Creating new scan with ID: %v", inputObj.ID)
    33 33  }
    skipped 23 lines
    57 57   return
    58 58   }
    59 59   
    60  - err := DB.Create(&inputObj).Error
    61  - if err != nil {
    62  - utils.ErrorF("error creating target -- %v", err)
    63  - }
     60 + DB.Create(&inputObj)
     61 + //if err != nil {
     62 + // utils.ErrorF("error creating target -- %v", err)
     63 + //}
    64 64   utils.DebugF("[DB] Creating new target with ID: %v -- %v", inputObj.InputName, inputObj.ID)
    65 65  }
    66 66   
    skipped 60 lines
  • ■ ■ ■ ■
    execution/clean.go
    skipped 476 lines
    477 477   title = cast.ToString(rawTitle.Data())
    478 478   }
    479 479   
    480  - rawTechs := jsonParsed.S("technologies")
     480 + rawTechs := jsonParsed.S("tech")
    481 481   techs := "No-Tech"
    482 482   if rawTechs != nil {
    483 483   techs = strings.Join(cast.ToStringSlice(rawTechs.Data()), ";;")
    skipped 52 lines
  • ■ ■ ■ ■ ■ ■
    go.mod
    skipped 5 lines
    6 6   github.com/Jeffail/gabs/v2 v2.6.1
    7 7   github.com/Shopify/yaml v2.1.0+incompatible
    8 8   github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
    9  - github.com/cenkalti/backoff/v4 v4.1.3
     9 + github.com/cenkalti/backoff/v4 v4.2.0
    10 10   github.com/davecgh/go-spew v1.1.1
    11 11   github.com/dgrijalva/jwt-go v3.2.0+incompatible
    12  - github.com/digitalocean/godo v1.86.0
     12 + github.com/digitalocean/godo v1.90.0
    13 13   github.com/fatih/color v1.13.0
    14  - github.com/fsnotify/fsnotify v1.5.4
     14 + github.com/flosch/pongo2/v6 v6.0.0
     15 + github.com/fsnotify/fsnotify v1.6.0
    15 16   github.com/go-playground/validator/v10 v10.11.1
    16 17   github.com/go-resty/resty/v2 v2.7.0
    17 18   github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
    18  - github.com/gofiber/fiber/v2 v2.37.1
     19 + github.com/gofiber/fiber/v2 v2.40.0
    19 20   github.com/gofiber/jwt/v2 v2.2.7
    20 21   github.com/hashicorp/go-version v1.6.0
    21 22   github.com/jasonlvhit/gocron v0.0.1
    22 23   github.com/json-iterator/go v1.1.12
    23 24   github.com/kyokomi/emoji v2.2.4+incompatible
    24  - github.com/linode/linodego v1.9.2
     25 + github.com/linode/linodego v1.9.3
    25 26   github.com/mackerelio/go-osstat v0.2.3
    26 27   github.com/mitchellh/go-homedir v1.1.0
    27 28   github.com/mitchellh/go-ps v1.0.0
    28 29   github.com/olekukonko/tablewriter v0.0.5
    29 30   github.com/panjf2000/ants v1.3.0
    30 31   github.com/parnurzeal/gorequest v0.2.16
    31  - github.com/robertkrimen/otto v0.0.0-20211024170158-b87d35c0b86f
     32 + github.com/robertkrimen/otto v0.0.0-20221025135307-511d75fba9f8
    32 33   github.com/shirou/gopsutil v3.21.11+incompatible
    33 34   github.com/sirupsen/logrus v1.9.0
    34  - github.com/slack-go/slack v0.11.3
     35 + github.com/slack-go/slack v0.11.4
    35 36   github.com/spf13/cast v1.5.0
    36  - github.com/spf13/cobra v1.5.0
    37  - github.com/spf13/viper v1.13.0
    38  - github.com/swaggo/swag v1.8.6
     37 + github.com/spf13/cobra v1.6.1
     38 + github.com/spf13/viper v1.14.0
     39 + github.com/swaggo/swag v1.8.7
    39 40   github.com/thoas/go-funk v0.9.2
    40 41   github.com/x-cray/logrus-prefixed-formatter v0.5.2
    41  - github.com/xanzy/go-gitlab v0.73.1
    42  - golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7
    43  - golang.org/x/net v0.0.0-20220923203811-8be639271d50
    44  - golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1
    45  - golang.org/x/term v0.0.0-20220919170432-7a66f970e087
    46  - golang.org/x/text v0.3.7
     42 + github.com/xanzy/go-gitlab v0.75.0
     43 + golang.org/x/crypto v0.3.0
     44 + golang.org/x/net v0.2.0
     45 + golang.org/x/oauth2 v0.2.0
     46 + golang.org/x/term v0.2.0
     47 + golang.org/x/text v0.4.0
    47 48   gorm.io/datatypes v1.0.7
    48  - gorm.io/driver/mysql v1.3.6
    49  - gorm.io/driver/sqlite v1.3.6
    50  - gorm.io/gorm v1.23.10
     49 + gorm.io/driver/mysql v1.4.4
     50 + gorm.io/driver/sqlite v1.4.3
     51 + gorm.io/gorm v1.24.1
    51 52  )
    52 53   
    53 54  require (
    skipped 1 lines
    55 56   github.com/PuerkitoBio/purell v1.1.1 // indirect
    56 57   github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
    57 58   github.com/andybalholm/brotli v1.0.4 // indirect
    58  - github.com/elazarl/goproxy v0.0.0-20220901064549-fbd10ff4f5a1 // indirect
     59 + github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 // indirect
    59 60   github.com/go-ole/go-ole v1.2.6 // indirect
    60 61   github.com/go-openapi/jsonpointer v0.19.5 // indirect
    61 62   github.com/go-openapi/jsonreference v0.19.6 // indirect
    skipped 9 lines
    71 72   github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
    72 73   github.com/hashicorp/go-retryablehttp v0.7.1 // indirect
    73 74   github.com/hashicorp/hcl v1.0.0 // indirect
    74  - github.com/inconshreveable/mousetrap v1.0.0 // indirect
     75 + github.com/inconshreveable/mousetrap v1.0.1 // indirect
    75 76   github.com/jinzhu/inflection v1.0.0 // indirect
    76 77   github.com/jinzhu/now v1.1.5 // indirect
    77 78   github.com/josharian/intern v1.0.0 // indirect
    78  - github.com/klauspost/compress v1.15.0 // indirect
     79 + github.com/klauspost/compress v1.15.9 // indirect
    79 80   github.com/leodido/go-urn v1.2.1 // indirect
    80 81   github.com/magiconair/properties v1.8.6 // indirect
    81 82   github.com/mailru/easyjson v0.7.6 // indirect
    82  - github.com/mattn/go-colorable v0.1.12 // indirect
    83  - github.com/mattn/go-isatty v0.0.14 // indirect
    84  - github.com/mattn/go-runewidth v0.0.9 // indirect
    85  - github.com/mattn/go-sqlite3 v1.14.12 // indirect
     83 + github.com/mattn/go-colorable v0.1.13 // indirect
     84 + github.com/mattn/go-isatty v0.0.16 // indirect
     85 + github.com/mattn/go-runewidth v0.0.14 // indirect
     86 + github.com/mattn/go-sqlite3 v1.14.15 // indirect
    86 87   github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
    87 88   github.com/mitchellh/mapstructure v1.5.0 // indirect
    88 89   github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
    skipped 1 lines
    90 91   github.com/pelletier/go-toml v1.9.5 // indirect
    91 92   github.com/pelletier/go-toml/v2 v2.0.5 // indirect
    92 93   github.com/pkg/errors v0.9.1 // indirect
     94 + github.com/rivo/uniseg v0.2.0 // indirect
    93 95   github.com/smartystreets/goconvey v1.7.2 // indirect
    94  - github.com/spf13/afero v1.8.2 // indirect
     96 + github.com/spf13/afero v1.9.2 // indirect
    95 97   github.com/spf13/jwalterweatherman v1.1.0 // indirect
    96 98   github.com/spf13/pflag v1.0.5 // indirect
    97 99   github.com/subosito/gotenv v1.4.1 // indirect
    98 100   github.com/technoweenie/multipartstreamer v1.0.1 // indirect
    99  - github.com/tklauser/go-sysconf v0.3.10 // indirect
    100  - github.com/tklauser/numcpus v0.4.0 // indirect
     101 + github.com/tklauser/go-sysconf v0.3.11 // indirect
     102 + github.com/tklauser/numcpus v0.6.0 // indirect
    101 103   github.com/valyala/bytebufferpool v1.0.0 // indirect
    102  - github.com/valyala/fasthttp v1.40.0 // indirect
     104 + github.com/valyala/fasthttp v1.41.0 // indirect
    103 105   github.com/valyala/tcplisten v1.0.0 // indirect
    104 106   github.com/yusufpapurcu/wmi v1.2.2 // indirect
    105  - golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
    106  - golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect
    107  - golang.org/x/tools v0.1.10 // indirect
     107 + golang.org/x/sys v0.2.0 // indirect
     108 + golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect
     109 + golang.org/x/tools v0.1.12 // indirect
    108 110   google.golang.org/appengine v1.6.7 // indirect
    109 111   google.golang.org/protobuf v1.28.1 // indirect
    110 112   gopkg.in/ini.v1 v1.67.0 // indirect
    skipped 6 lines
  • ■ ■ ■ ■ ■ ■
    go.sum
    skipped 56 lines
    57 57  github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
    58 58  github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
    59 59  github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
    60  -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
    61  -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
     60 +github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
     61 +github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
    62 62  github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
    63 63  github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
     64 +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
    64 65  github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
    65 66  github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
    66 67  github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
    skipped 13 lines
    80 81  github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU=
    81 82  github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
    82 83  github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
    83  -github.com/digitalocean/godo v1.86.0 h1:GKB2HS+6lnYPn+9XLLsIVBWk3xk7v568EJnmdHuyhKA=
    84  -github.com/digitalocean/godo v1.86.0/go.mod h1:jELt1jkHVifd0rKaY0pt/m1QxGzbkkvoVVrDkR15/5A=
     84 +github.com/digitalocean/godo v1.90.0 h1:mnluEWL5eXFNYnLzHFuwsPuXZsWmzGoMNYSLZi9QPgc=
     85 +github.com/digitalocean/godo v1.90.0/go.mod h1:NRpFznZFvhHjBoqZAaOD3khVzsJ3EibzKqFL4R60dmA=
    85 86  github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
    86  -github.com/elazarl/goproxy v0.0.0-20220901064549-fbd10ff4f5a1 h1:ecIiM5NYeEOhy5trm8xel6wpUhYH+QWteUKnwcbCMl4=
    87  -github.com/elazarl/goproxy v0.0.0-20220901064549-fbd10ff4f5a1/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
     87 +github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0=
     88 +github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
    88 89  github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
    89 90  github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
    90 91  github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
    skipped 3 lines
    94 95  github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
    95 96  github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
    96 97  github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
     98 +github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU=
     99 +github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU=
    97 100  github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
    98 101  github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
    99  -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
    100  -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
     102 +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
     103 +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
    101 104  github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
    102 105  github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
    103 106  github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
    skipped 30 lines
    134 137  github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho=
    135 138  github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
    136 139  github.com/gofiber/fiber/v2 v2.17.0/go.mod h1:iftruuHGkRYGEXVISmdD7HTYWyfS2Bh+Dkfq4n/1Owg=
    137  -github.com/gofiber/fiber/v2 v2.37.1 h1:QK2032gjv0ulegpv/qlTEBoXQD3eFFzCHXcNN12UZCs=
    138  -github.com/gofiber/fiber/v2 v2.37.1/go.mod h1:j3UslgQeJQP3mNhBxHnLLE8TPqA1Fd/lrl4gD25rRUY=
     140 +github.com/gofiber/fiber/v2 v2.40.0 h1:fdU7w5hT6PLL7jiWIhtQ+S/k5WEFYoUZidptlPu8GBo=
     141 +github.com/gofiber/fiber/v2 v2.40.0/go.mod h1:Gko04sLksnHbzLSRBFWPFdzM9Ws9pRxvvIaohJK1dsk=
    139 142  github.com/gofiber/jwt/v2 v2.2.7 h1:MgXZV+ak+FiRVepD3btHBxWcyxlFzTDGXJv78dU1sIE=
    140 143  github.com/gofiber/jwt/v2 v2.2.7/go.mod h1:yaOHLccYXJidk1HX/EiIdIL+Z1xmY2wnIv6hgViw384=
    141 144  github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
    skipped 46 lines
    188 191  github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
    189 192  github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
    190 193  github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
    191  -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
     194 +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
    192 195  github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
    193 196  github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
    194 197  github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
    skipped 36 lines
    231 234  github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
    232 235  github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
    233 236  github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
    234  -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
    235  -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
     237 +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
     238 +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
    236 239  github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
    237 240  github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
    238 241  github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
    skipped 59 lines
    298 301  github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
    299 302  github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
    300 303  github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
    301  -github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U=
    302  -github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
     304 +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
     305 +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
    303 306  github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
    304 307  github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
    305 308  github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
    skipped 14 lines
    320 323  github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
    321 324  github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
    322 325  github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
    323  -github.com/linode/linodego v1.9.2 h1:ISQkC02Xjy8S8iCKti8d9+YYi5Zaz5EUQOz0QuxhYls=
    324  -github.com/linode/linodego v1.9.2/go.mod h1:h6AuFR/JpqwwM/vkj7s8KV3iGN8/jxn+zc437F8SZ8w=
     326 +github.com/linode/linodego v1.9.3 h1:+lxNZw4avRxhCqGjwfPgQ2PvMT+vOL0OMsTdzixR7hQ=
     327 +github.com/linode/linodego v1.9.3/go.mod h1:h6AuFR/JpqwwM/vkj7s8KV3iGN8/jxn+zc437F8SZ8w=
    325 328  github.com/mackerelio/go-osstat v0.2.3 h1:jAMXD5erlDE39kdX2CU7YwCGRcxIO33u/p8+Fhe5dJw=
    326 329  github.com/mackerelio/go-osstat v0.2.3/go.mod h1:DQbPOnsss9JHIXgBStc/dnhhir3gbd3YH+Dbdi7ptMA=
    327 330  github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
    skipped 5 lines
    333 336  github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
    334 337  github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
    335 338  github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
    336  -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
    337  -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
     339 +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
     340 +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
    338 341  github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
    339 342  github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
    340 343  github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
    341  -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
    342 344  github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
    343  -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
     345 +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
     346 +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
    344 347  github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
     348 +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
     349 +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
    345 350  github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
    346  -github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0=
    347 351  github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
     352 +github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI=
     353 +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
    348 354  github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
    349 355  github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
    350 356  github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
    skipped 33 lines
    384 390  github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
    385 391  github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
    386 392  github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
    387  -github.com/robertkrimen/otto v0.0.0-20211024170158-b87d35c0b86f h1:a7clxaGmmqtdNTXyvrp/lVO/Gnkzlhc/+dLs5v965GM=
    388  -github.com/robertkrimen/otto v0.0.0-20211024170158-b87d35c0b86f/go.mod h1:/mK7FZ3mFYEn9zvNPhpngTyatyehSwte5bJZ4ehL5Xw=
     393 +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
     394 +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
     395 +github.com/robertkrimen/otto v0.0.0-20221025135307-511d75fba9f8 h1:qD3uiYZ9HFRMIkjcmA5MnB3QxDQmf/r8TfoOx8BMtQ4=
     396 +github.com/robertkrimen/otto v0.0.0-20221025135307-511d75fba9f8/go.mod h1:nuq0maJQz2rTj3sA9EtJleKkkP0QIihFANdtAgTvmyc=
    389 397  github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
    390 398  github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
    391 399  github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
    skipped 12 lines
    404 412  github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
    405 413  github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
    406 414  github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
    407  -github.com/slack-go/slack v0.11.3 h1:GN7revxEMax4amCc3El9a+9SGnjmBvSUobs0QnO6ZO8=
    408  -github.com/slack-go/slack v0.11.3/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
     415 +github.com/slack-go/slack v0.11.4 h1:ojSa7KlPm3PqY2AomX4VTxEsK5eci5JaxCjlzGV5zoM=
     416 +github.com/slack-go/slack v0.11.4/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
    409 417  github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
    410 418  github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
    411 419  github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg=
    412 420  github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM=
    413  -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
    414  -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
     421 +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
     422 +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
    415 423  github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
    416 424  github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
    417  -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=
    418  -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=
     425 +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
     426 +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
    419 427  github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
    420 428  github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
    421 429  github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
    422 430  github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
    423  -github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU=
    424  -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw=
     431 +github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU=
     432 +github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As=
    425 433  github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
    426 434  github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
    427 435  github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
    skipped 5 lines
    433 441  github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    434 442  github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    435 443  github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    436  -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
    437 444  github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
     445 +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
    438 446  github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
    439 447  github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
    440  -github.com/swaggo/swag v1.8.6 h1:2rgOaLbonWu1PLP6G+/rYjSvPg0jQE0HtrEKuE380eg=
    441  -github.com/swaggo/swag v1.8.6/go.mod h1:jMLeXOOmYyjk8PvHTsXBdrubsNd9gUJTTCzL5iBnseg=
     448 +github.com/swaggo/swag v1.8.7 h1:2K9ivTD3teEO+2fXV6zrZKDqk5IuU2aJtBDo8U7omWU=
     449 +github.com/swaggo/swag v1.8.7/go.mod h1:ezQVUUhly8dludpVk+/PuwJWvLLanB13ygV5Pr9enSk=
    442 450  github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
    443 451  github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
    444 452  github.com/thoas/go-funk v0.9.2 h1:oKlNYv0AY5nyf9g+/GhMgS/UO2ces0QRdPKwkhY3VCk=
    445 453  github.com/thoas/go-funk v0.9.2/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
    446  -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw=
    447  -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
    448  -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o=
    449  -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
     454 +github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
     455 +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
     456 +github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
     457 +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
    450 458  github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
    451 459  github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
    452 460  github.com/valyala/fasthttp v1.26.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
    453  -github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc=
    454  -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I=
     461 +github.com/valyala/fasthttp v1.41.0 h1:zeR0Z1my1wDHTRiamBCXVglQdbUwgb9uWG3k1HQz6jY=
     462 +github.com/valyala/fasthttp v1.41.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seBFc2uWtgiY=
    455 463  github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
    456 464  github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
    457 465  github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
    458 466  github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
    459  -github.com/xanzy/go-gitlab v0.73.1 h1:UMagqUZLJdjss1SovIC+kJCH4k2AZWXl58gJd38Y/hI=
    460  -github.com/xanzy/go-gitlab v0.73.1/go.mod h1:d/a0vswScO7Agg1CZNz15Ic6SSvBG9vfw8egL99t4kA=
     467 +github.com/xanzy/go-gitlab v0.75.0 h1:U7ywGhvW+qdywQQ+lGJwGK93odDwkX81N5meh6EjaUc=
     468 +github.com/xanzy/go-gitlab v0.75.0/go.mod h1:d/a0vswScO7Agg1CZNz15Ic6SSvBG9vfw8egL99t4kA=
    461 469  github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
    462 470  github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
    463 471  github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
    skipped 35 lines
    499 507  golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
    500 508  golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
    501 509  golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
    502  -golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 h1:WJywXQVIb56P2kAvXeMGTIgQ1ZHQxR60+F9dLsodECc=
    503  -golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
     510 +golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A=
     511 +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
    504 512  golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
    505 513  golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
    506 514  golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
    skipped 27 lines
    534 542  golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
    535 543  golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
    536 544  golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
    537  -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
     545 +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
    538 546  golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    539 547  golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    540 548  golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    skipped 32 lines
    573 581  golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    574 582  golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    575 583  golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    576  -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
    577  -golang.org/x/net v0.0.0-20220923203811-8be639271d50 h1:vKyz8L3zkd+xrMeIaBsQ/MNVPVFSffdaU3ZyYlBGFnI=
    578  -golang.org/x/net v0.0.0-20220923203811-8be639271d50/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
     584 +golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
     585 +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
     586 +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
    579 587  golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
    580 588  golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    581 589  golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    skipped 3 lines
    585 593  golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
    586 594  golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
    587 595  golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
    588  -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 h1:lxqLZaMad/dJHMFZH0NiNpiEZI/nhgWhe4wgzpE+MuA=
    589  -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
     596 +golang.org/x/oauth2 v0.2.0 h1:GtQkldQ9m7yvzCL1V+LrYow3Khe0eJH0w7RbX/VbaIU=
     597 +golang.org/x/oauth2 v0.2.0/go.mod h1:Cwn6afJ8jrQwYMxQDTpISoXmXW9I6qF6vDeuuoX3Ibs=
    590 598  golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    591 599  golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    592 600  golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    skipped 52 lines
    645 653  golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    646 654  golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    647 655  golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    648  -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    649  -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    650  -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    651  -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    652  -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    653 656  golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    654  -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg=
    655 657  golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     658 +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     659 +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     660 +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
     661 +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    656 662  golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
    657 663  golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
    658 664  golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
    659  -golang.org/x/term v0.0.0-20220919170432-7a66f970e087 h1:tPwmk4vmvVCMdr98VgL4JH+qZxPL8fqlUOHnyOM8N3w=
    660  -golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
     665 +golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM=
     666 +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
    661 667  golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    662 668  golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    663 669  golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    skipped 1 lines
    665 671  golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
    666 672  golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
    667 673  golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
    668  -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
    669 674  golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
     675 +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
     676 +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
    670 677  golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    671 678  golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    672 679  golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    673  -golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ=
    674  -golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
     680 +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y=
     681 +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    675 682  golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
    676 683  golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
    677 684  golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
    skipped 47 lines
    725 732  golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
    726 733  golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
    727 734  golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
    728  -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
    729  -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
     735 +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
     736 +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
    730 737  golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    731 738  golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    732 739  golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    733 740  golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    734 741  golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    735 742  golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    736  -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618=
    737 743  google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
    738 744  google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
    739 745  google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
    skipped 116 lines
    856 862  gorm.io/datatypes v1.0.7 h1:8NhJN4+annFjwV1WufDhFiPjdUvV1lSGUdg1UCjQIWY=
    857 863  gorm.io/datatypes v1.0.7/go.mod h1:l9qkCuy0CdzDEop9HKUdcnC9gHC2sRlaFtHkTzsZRqg=
    858 864  gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=
    859  -gorm.io/driver/mysql v1.3.6 h1:BhX1Y/RyALb+T9bZ3t07wLnPZBukt+IRkMn8UZSNbGM=
    860  -gorm.io/driver/mysql v1.3.6/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c=
     865 +gorm.io/driver/mysql v1.4.4 h1:MX0K9Qvy0Na4o7qSC/YI7XxqUw5KDw01umqgID+svdQ=
     866 +gorm.io/driver/mysql v1.4.4/go.mod h1:BCg8cKI+R0j/rZRQxeKis/forqRwRSYOR8OM3Wo6hOM=
    861 867  gorm.io/driver/postgres v1.3.4 h1:evZ7plF+Bp+Lr1mO5NdPvd6M/N98XtwHixGB+y7fdEQ=
    862 868  gorm.io/driver/postgres v1.3.4/go.mod h1:y0vEuInFKJtijuSGu9e5bs5hzzSzPK+LancpKpvbRBw=
    863 869  gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg=
    864  -gorm.io/driver/sqlite v1.3.6 h1:Fi8xNYCUplOqWiPa3/GuCeowRNBRGTf62DEmhMDHeQQ=
    865  -gorm.io/driver/sqlite v1.3.6/go.mod h1:Sg1/pvnKtbQ7jLXxfZa+jSHvoX8hoZA8cn4xllOMTgE=
     870 +gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU=
     871 +gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI=
    866 872  gorm.io/driver/sqlserver v1.3.1 h1:F5t6ScMzOgy1zukRTIZgLZwKahgt3q1woAILVolKpOI=
    867 873  gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ=
    868 874  gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
    869  -gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
    870 875  gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
    871 876  gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
    872  -gorm.io/gorm v1.23.10 h1:4Ne9ZbzID9GUxRkllxN4WjJKpsHx8YbKvekVdgyWh24=
    873  -gorm.io/gorm v1.23.10/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
     877 +gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
     878 +gorm.io/gorm v1.24.1 h1:CgvzRniUdG67hBAzsxDGOAuq4Te1osVMYsa1eQbd4fs=
     879 +gorm.io/gorm v1.24.1/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
    874 880  honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
    875 881  honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
    876 882  honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
    skipped 10 lines
  • ■ ■ ■ ■ ■
    libs/flow.go
    skipped 11 lines
    12 12  // Flow struct to define specific field for a mode
    13 13  type Flow struct {
    14 14   NoDB bool `yaml:"nodb"`
     15 + SkipIndexed bool `yaml:"skip-indexed"`
    15 16   ForceParams bool `yaml:"force-params"`
    16 17   Input string
    17 18   Validator string // domain, cidr, ip or domain-file, cidr-file and so on
    skipped 52 lines
  • ■ ■ ■ ■ ■ ■
    libs/options.go
    skipped 5 lines
    6 6   LogFile string
    7 7   Concurrency int
    8 8   
     9 + // default threads hold for running module
     10 + Tactics string
     11 + Threads int
     12 + 
    9 13   Timeout string
    10 14   EnableFormatInput bool
    11 15   Verbose bool
    skipped 39 lines
    51 55   Cdn Cdn
    52 56   Update Update
    53 57   
     58 + ThreadsHold ThreadsHold
    54 59   Cloud Cloud
    55 60   Report Report
    56 61   CloudConfigFile string
    skipped 17 lines
    74 79   
    75 80   BaseWorkspace string
    76 81   CustomWorkspace string
     82 + SuffixName string
    77 83   Force bool
     84 +}
     85 + 
     86 +type ThreadsHold struct {
     87 + Default int
     88 + Aggressive int
     89 + Gently int
    78 90  }
    79 91   
    80 92  // Report sub options for report
    skipped 73 lines
  • ■ ■ ■ ■
    libs/version.go
    skipped 3 lines
    4 4   
    5 5  const (
    6 6   // VERSION of this project
    7  - VERSION = "v4.1.4"
     7 + VERSION = "v4.2.0"
    8 8   // DESC description of the tool
    9 9   DESC = "A Workflow Engine for Offensive Security"
    10 10   // BINARY name of osmedeus
    skipped 17 lines
  • ■ ■ ■ ■ ■
    server/router.go
    skipped 31 lines
    32 32   }
    33 33   
    34 34   if options.Server.NoAuthen {
    35  - fmt.Fprintf(os.Stderr, "[Critical] You're running the server with %v\n", color.RedString("NO AUTHENTICATION"))
     35 + fmt.Fprintf(os.Stderr, color.RedString("[Critical] You're running the server with %v\n", color.HiYellowString("NO AUTHENTICATION")))
    36 36   }
    37 37   
    38 38   app := fiber.New(fiber.Config{
    skipped 27 lines
    66 66   
    67 67   if enableSSL {
    68 68   utils.GoodF("Web UI available at: https://%v/ui/", options.Server.Bind)
     69 + utils.GoodF("Static Content available at: %v", color.HiMagentaString("https://%v/%s/workspaces/", options.Server.Bind, Opt.Server.StaticPrefix))
    69 70   log.Fatal(app.Listener(ln))
    70 71   } else {
    71 72   utils.GoodF("Web UI available at: http://%v/ui/", options.Server.Bind)
    skipped 84 lines
  • ■ ■ ■ ■
    test-workflows/general/archive.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportArchive("{{.testData}}/{{.Workspace}}/archive/archive.txt")
     10 + - ImportArchive("{{testData}}/{{Workspace}}/archive/archive.txt")
  • ■ ■ ■ ■
    test-workflows/general/cloudbrute.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportCloudBrute("{{.testData}}/{{.Workspace}}/clouds-data.txt")
     10 + - ImportCloudBrute("{{testData}}/{{Workspace}}/clouds-data.txt")
    11 11   
  • ■ ■ ■ ■
    test-workflows/general/credintel.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportCred("{{.testData}}/{{.Workspace}}/new-intel-cred.txt")
     10 + - ImportCred("{{testData}}/{{Workspace}}/new-intel-cred.txt")
    11 11   
  • ■ ■ ■ ■
    test-workflows/general/dirbscan.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportDirectoryJson("{{.testData}}/{{.Workspace}}/directory/directory-json.txt")
     10 + - ImportDirectoryJson("{{testData}}/{{Workspace}}/directory/directory-json.txt")
    11 11   
  • ■ ■ ■ ■ ■ ■
    test-workflows/general/fingerprint.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportTech("{{.testData}}/{{.Workspace}}/fingerprint/{{.Workspace}}-technologies.txt")
    11  - - ImportHTTPJson("{{.testData}}/{{.Workspace}}/fingerprint/{{.Workspace}}-technologies.txt")
    12  - - ImportScreenShotJson("{{.testData}}/{{.Workspace}}/screenshot/goverview/screenshot-summary.txt")
    13  - - ImportHTTPJson("{{.testData}}/{{.Workspace}}/screenshot/goverview/content-summary.txt")
     10 + - ImportTech("{{testData}}/{{Workspace}}/fingerprint/{{Workspace}}-technologies.txt")
     11 + - ImportHTTPJson("{{testData}}/{{Workspace}}/fingerprint/{{Workspace}}-technologies.txt")
     12 + - ImportScreenShotJson("{{testData}}/{{Workspace}}/screenshot/goverview/screenshot-summary.txt")
     13 + - ImportHTTPJson("{{testData}}/{{Workspace}}/screenshot/goverview/content-summary.txt")
  • ■ ■ ■ ■
    test-workflows/general/ipspace.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportIPRange("{{.testData}}/{{.Workspace}}/ipspace/ipspace-summary.txt")
     10 + - ImportIPRange("{{testData}}/{{Workspace}}/ipspace/ipspace-summary.txt")
  • ■ ■ ■ ■
    test-workflows/general/portscan.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportPortJson("{{.testData}}/{{.Workspace}}/portscan/portscan-json.txt")
     10 + - ImportPortJson("{{testData}}/{{Workspace}}/portscan/portscan-json.txt")
    11 11   
  • ■ ■ ■ ■
    test-workflows/general/probing.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportDns("{{.testData}}/{{.Workspace}}/probing/dns-{{.Workspace}}.txt")
     10 + - ImportDns("{{testData}}/{{Workspace}}/probing/dns-{{Workspace}}.txt")
    11 11   
  • ■ ■ ■ ■
    test-workflows/general/spider.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportLinks("{{.testData}}/{{.Workspace}}/linkfinding/links-json.txt")
     10 + - ImportLinks("{{testData}}/{{Workspace}}/linkfinding/links-json.txt")
    11 11   
  • ■ ■ ■ ■
    test-workflows/general/subdomain.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportSubdomain("{{.testData}}/{{.Workspace}}/subdomain/final-{{.Workspace}}.txt")
     10 + - ImportSubdomain("{{testData}}/{{Workspace}}/subdomain/final-{{Workspace}}.txt")
    11 11   
  • ■ ■ ■ ■ ■ ■
    test-workflows/general/vulnscan.yaml
    skipped 6 lines
    7 7  steps:
    8 8   # get data from cdn
    9 9   - scripts:
    10  - - ImportJaelesVulnJson("{{.testData}}/{{.Workspace}}/vuln/active/jaeles-summary.txt")
    11  - - ImportNucleiVulnJson("{{.testData}}/{{.Workspace}}/vuln/nuclei-sto.txt")
     10 + - ImportJaelesVulnJson("{{testData}}/{{Workspace}}/vuln/active/jaeles-summary.txt")
     11 + - ImportNucleiVulnJson("{{testData}}/{{Workspace}}/vuln/nuclei-sto.txt")
    12 12   
  • ■ ■ ■ ■ ■ ■
    test-workflows/loop-step.yaml
    skipped 7 lines
    8 8   - source: '/tmp/ott/source.txt'
    9 9   threads: '100'
    10 10   commands:
    11  - - "echo '---> {{.line}} '"
    12  - - "sleep 1 && echo '---> done {{.line}}'"
     11 + - "echo '---> {{line}} '"
     12 + - "sleep 1 && echo '---> done {{line}}'"
    13 13   
  • ■ ■ ■ ■ ■ ■
    test-workflows/pre-run-cloud.yaml
    skipped 6 lines
    7 7   - repo: "test-module"
    8 8   
    9 9  local_pre_run:
    10  - - 'RRSync("root@{{.RemoteIP}}", "/tmp/sam/", "/tmp/sam/")'
    11  - - ExecCmd('echo --> {{.repo}}')
     10 + - 'RRSync("root@{{RemoteIP}}", "/tmp/sam/", "/tmp/sam/")'
     11 + - ExecCmd('echo --> {{repo}}')
    12 12   
    13 13  routines:
    14 14   - modules:
    skipped 4 lines
  • ■ ■ ■ ■ ■ ■
    test-workflows/sample/parallel.yaml
    skipped 6 lines
    7 7  steps:
    8 8   - label: 'Start step 111'
    9 9   commands:
    10  - - "echo '---> {{.Target}} '"
    11  - - "seq {{.limit}} > /tmp/source.txt"
     10 + - "echo '---> {{Target}} '"
     11 + - "seq {{limit}} > /tmp/source.txt"
    12 12   
    13 13   - source: '/tmp/source.txt'
    14 14   threads: '200'
    skipped 6 lines
  • ■ ■ ■ ■
    test-workflows/sample/parallel2.yaml
    skipped 4 lines
    5 5   - label: 'Start step 222'
    6 6   commands:
    7 7   - "sleep 5"
    8  - - "echo '==>>>> {{.Target}} '"
     8 + - "echo '==>>>> {{Target}} '"
    9 9   
    10 10   - commands:
    11 11   - "echo 'done parallel 2222'"
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    test-workflows/with-threadshold.yaml
     1 +name: with-threads-hold
     2 + 
     3 +steps:
     4 + - commands:
     5 + - "echo 'calc ---> {{ 5555 * threads}} '"
     6 + scripts:
     7 + - "ExecCmd('mkdir -p /tmp/ott/')"
     8 + - "ExecCmd('seq 10 > /tmp/ott/source.txt')"
     9 + 
     10 + - source: '/tmp/ott/source.txt'
     11 + threads: '2'
     12 + commands:
     13 + - "echo '---> {{ 2 * threads}} '"
     14 + # - "sleep 1 && echo '---> done [[.line]]'"
     15 + 
Please wait...
Page is in error, reload to recover