-
j3ssie committed 2 years ago
Showing first 30 files as there are too many
-
-
-
-
1 + package cmd 2 + 3 + import ( 4 + "fmt" 5 + "github.com/j3ssie/osmedeus/database" 6 + "github.com/j3ssie/osmedeus/execution" 7 + "os" 8 + "sort" 9 + 10 + "github.com/j3ssie/osmedeus/core" 11 + "github.com/j3ssie/osmedeus/utils" 12 + "github.com/spf13/cobra" 13 + ) 14 + 15 + func init() { 16 + var configCmd = &cobra.Command{ 17 + Use: "config", 18 + Short: "Do some config stuff", 19 + Long: core.Banner(), 20 + RunE: runConfig, 21 + } 22 + 23 + configCmd.Flags().StringP("action", "a", "", "Action") 24 + configCmd.Flags().StringP("pluginsRepo", "p", "[email protected]:j3ssie/osmedeus-plugins.git", "Osmedeus Plugins repository") 25 + // for cred action 26 + configCmd.Flags().String("user", "", "Username") 27 + configCmd.Flags().String("pass", "", "Password") 28 + configCmd.Flags().StringP("workspace", "w", "", "Name of workspace") 29 + 30 + configCmd.SetHelpFunc(ConfigHelp) 31 + RootCmd.AddCommand(configCmd) 32 + } 33 + 34 + func runConfig(cmd *cobra.Command, args []string) error { 35 + sort.Strings(args) 36 + action, _ := cmd.Flags().GetString("action") 37 + //pluginsRepo, _ := cmd.Flags().GetString("pluginsRepo") 38 + workspace, _ := cmd.Flags().GetString("workspace") 39 + DBInit() 40 + 41 + // backward compatible 42 + if action == "" && len(args) > 0 { 43 + action = args[0] 44 + } 45 + 46 + switch action { 47 + case "init": 48 + if utils.FolderExists(fmt.Sprintf("%vcore", options.Env.RootFolder)) { 49 + utils.GoodF("Look like you got properly setup.") 50 + } 51 + break 52 + case "cred": 53 + username, _ := cmd.Flags().GetString("user") 54 + password, _ := cmd.Flags().GetString("pass") 55 + //database.CreateUser(username, password) 56 + utils.GoodF("Create new credentials %v:%v \n", username, password) 57 + break 58 + 59 + case "reload": 60 + core.ReloadConfig(options) 61 + break 62 + 63 + case "delete": 64 + options.Scan.Input = workspace 65 + options.Scan.ROptions = core.ParseInput(options.Scan.Input, options) 66 + utils.InforF("Delete Workspace: %v", options.Scan.ROptions["Workspace"]) 67 + os.RemoveAll(options.Scan.ROptions["Output"]) 68 + //ws := database.SelectScan(options.Scan.ROptions["Workspace"]) 69 + //database.DeleteScan(int(ws.ID)) 70 + break 71 + 72 + case "pull": 73 + for repo := range options.Storages { 74 + execution.PullResult(repo, options) 75 + } 76 + break 77 + 78 + case "update": 79 + core.Update(options) 80 + break 81 + 82 + case "clean", "cl", "c": 83 + database.ClearDB() 84 + break 85 + } 86 + 87 + return nil 88 + } 89 + -
-
-
-
-
-
-
-
-
-
-
-
-
1 + package core 2 + 3 + import ( 4 + "fmt" 5 + "net/url" 6 + "os" 7 + "path" 8 + "path/filepath" 9 + "strings" 10 + 11 + "github.com/mitchellh/go-homedir" 12 + 13 + "github.com/j3ssie/osmedeus/execution" 14 + "github.com/j3ssie/osmedeus/libs" 15 + "github.com/j3ssie/osmedeus/utils" 16 + 17 + "github.com/spf13/viper" 18 + ) 19 + 20 + // InitConfig Init the config 21 + func InitConfig(options *libs.Options) { 22 + RootFolder := filepath.Dir(utils.NormalizePath(options.ConfigFile)) 23 + if !utils.FolderExists(RootFolder) { 24 + os.MkdirAll(RootFolder, 0750) 25 + } 26 + 27 + // Base folder 28 + BaseFolder := utils.NormalizePath(options.Env.BaseFolder) 29 + if !utils.FolderExists(BaseFolder) { 30 + os.MkdirAll(BaseFolder, 0750) 31 + } 32 + 33 + // init config 34 + v := viper.New() 35 + v.AddConfigPath(RootFolder) 36 + v.SetConfigName("config") 37 + v.SetConfigType("yaml") 38 + 39 + if !utils.FileExists(options.ConfigFile) { 40 + // Some default config if config file doesn't exist 41 + secret := utils.GenHash(utils.RandomString(8) + utils.GetTS()) 42 + prefix := secret[len(secret)-20 : len(secret)-1] 43 + 44 + v.SetDefault("Server", map[string]string{ 45 + "bind": "0.0.0.0:8000", 46 + "cors": "*", 47 + "secret": secret, 48 + "prefix": prefix, 49 + "ui": path.Join(RootFolder, "server/ui"), 50 + "cert_file": path.Join(RootFolder, "server/ssl/cert.pem"), 51 + "key_file": path.Join(RootFolder, "server/ssl/key.pem"), 52 + "master_pass": "", 53 + }) 54 + 55 + // DB connection config 56 + dbPath := utils.NormalizePath(path.Join(RootFolder, "sqlite.db")) 57 + v.SetDefault("Database", map[string]string{ 58 + "db_host": utils.GetOSEnv("DB_HOST", "127.0.0.1"), 59 + "db_port": utils.GetOSEnv("DB_PORT", "3306"), 60 + "db_name": utils.GetOSEnv("DB_NAME", "osm-core"), 61 + "db_user": utils.GetOSEnv("DB_USER", "root"), 62 + "db_pass": utils.GetOSEnv("DB_PASS", ""), 63 + // sqlite or mysql 64 + "db_path": utils.GetOSEnv("DB_PATH", dbPath), 65 + "db_type": utils.GetOSEnv("DB_TYPE", "sqlite"), 66 + }) 67 + 68 + // default user 69 + password := utils.GenHash(utils.GetTS())[:15] 70 + v.SetDefault("Client", map[string]string{ 71 + "username": "osmedeus", 72 + "password": password, 73 + "jwt": "", 74 + "dest": "http://127.0.0.1:8000", 75 + }) 76 + 77 + v.SetDefault("Environments", map[string]string{ 78 + // RootFolder --> ~/.osmedeus/ 79 + "storages": path.Join(RootFolder, "storages"), 80 + "workspaces": path.Join(RootFolder, "workspaces"), 81 + "backups": path.Join(RootFolder, "backups"), 82 + "cloud_data": path.Join(RootFolder, "clouds"), 83 + "provider_config": path.Join(RootFolder, "provider"), 84 + 85 + // this update casually 86 + // BaseFolder --> ~/osmedeus-base/ 87 + "workflows": path.Join(BaseFolder, "workflow"), 88 + "binaries": path.Join(BaseFolder, "binaries"), 89 + "data": path.Join(BaseFolder, "data"), 90 + "cloud_config": path.Join(BaseFolder, "cloud"), 91 + }) 92 + 93 + // things should be reloaded by env 94 + v.SetDefault("Storages", map[string]string{ 95 + // path of secret key for push result 96 + // the repo format should be like this "[email protected]:j3ssie/example.git", 97 + "secret_key": utils.GetOSEnv("SECRET_KEY", "SECRET_KEY"), 98 + "summary_storage": path.Join(options.Env.RootFolder, "storages/summary"), 99 + "summary_repo": utils.GetOSEnv("SUMMARY_REPO", "SUMMARY_REPO"), 100 + "subdomain_storage": path.Join(options.Env.RootFolder, "storages/subdomain"), 101 + "subdomain_repo": utils.GetOSEnv("SUBDOMAIN_REPO", "SUBDOMAIN_REPO"), 102 + "assets_storage": path.Join(options.Env.RootFolder, "storages/assets"), 103 + "assets_repo": utils.GetOSEnv("ASSETS_REPO", "ASSETS_REPO"), 104 + "ports_storage": path.Join(options.Env.RootFolder, "storages/ports"), 105 + "ports_repo": utils.GetOSEnv("PORTS_REPO", "PORTS_REPO"), 106 + "http_storage": path.Join(options.Env.RootFolder, "storages/http"), 107 + "http_repo": utils.GetOSEnv("HTTP_REPO", "HTTP_REPO"), 108 + "vuln_storage": path.Join(options.Env.RootFolder, "storages/vuln"), 109 + "vuln_repo": utils.GetOSEnv("VULN_REPO", "VULN_REPO"), 110 + "paths_storage": path.Join(options.Env.RootFolder, "storages/paths"), 111 + "paths_repo": utils.GetOSEnv("PATHS_REPO", "PATHS_REPO"), 112 + "mics_storage": path.Join(options.Env.RootFolder, "storages/mics"), 113 + "mics_repo": utils.GetOSEnv("MICS_REPO", "MICS_REPO"), 114 + }) 115 + 116 + v.SetDefault("Tokens", map[string]string{ 117 + "slack": utils.GetOSEnv("SLACK_API_TOKEN", "SLACK_API_TOKEN"), 118 + "telegram": utils.GetOSEnv("TELEGRAM_API_TOKEN", "TELEGRAM_API_TOKEN"), 119 + "gitlab": utils.GetOSEnv("GITLAB_API_TOKEN", "GITLAB_API_TOKEN"), 120 + "github": utils.GetOSEnv("GITHUB_API_KEY", "GITHUB_API_KEY"), 121 + "discord": utils.GetOSEnv("DISCORD_API_TOKEN", "DISCORD_API_TOKEN"), 122 + }) 123 + 124 + // dedicated storages 125 + v.SetDefault("Git", map[string]string{ 126 + "base_url": utils.GetOSEnv("GITLAB_BASE_URL", "https://gitlab.com"), 127 + "api": utils.GetOSEnv("GITLAB_API_TOKEN", "GITLAB_API_TOKEN"), 128 + "username": utils.GetOSEnv("GITLAB_USER", "GITLAB_USER"), 129 + "password": utils.GetOSEnv("GITLAB_PASS", "GITLAB_PASS"), 130 + "group": utils.GetOSEnv("GITLAB_GROUP", "GITLAB_GROUP"), 131 + "prefix_name": utils.GetOSEnv("GITLAB_PREFIX_NAME", "deosm"), 132 + "default_tag": utils.GetOSEnv("GITLAB_DEFAULT_TAG", "osmd"), 133 + "default_user": utils.GetOSEnv("GITLAB_DEFAULT_USER", "j3ssie"), 134 + "default_uid": utils.GetOSEnv("GITLAB_DEFAULT_UID", "3537075"), 135 + "destorage": path.Join(options.Env.RootFolder, "destorage"), 136 + }) 137 + 138 + v.Set("Notification", map[string]string{ 139 + "client_name": utils.GetOSEnv("CLIENT_NAME", "CLIENT_NAME"), 140 + "slack_status_channel": utils.GetOSEnv("SLACK_STATUS_CHANNEL", "SLACK_STATUS_CHANNEL"), 141 + "slack_report_channel": utils.GetOSEnv("SLACK_REPORT_CHANNEL", "SLACK_REPORT_CHANNEL"), 142 + "slack_diff_channel": utils.GetOSEnv("SLACK_DIFF_CHANNEL", "SLACK_DIFF_CHANNEL"), 143 + "slack_webhook": utils.GetOSEnv("SLACK_WEBHOOK", "SLACK_WEBHOOK"), 144 + "discord_channel": utils.GetOSEnv("DISCORD_CHANNEL", "DISCORD_CHANNEL"), 145 + "telegram_channel": utils.GetOSEnv("TELEGRAM_CHANNEL", "TELEGRAM_CHANNEL"), 146 + "telegram_status_channel": utils.GetOSEnv("TELEGRAM_STATUS_CHANNEL", "TELEGRAM_STATUS_CHANNEL"), 147 + "telegram_report_channel": utils.GetOSEnv("TELEGRAM_REPORT_CHANNEL", "TELEGRAM_REPORT_CHANNEL"), 148 + "telegram_sensitive_channel": utils.GetOSEnv("TELEGRAM_SENSITIVE_CHANNEL", "TELEGRAM_SENSITIVE_CHANNEL"), 149 + "telegram_dirb_channel": utils.GetOSEnv("TELEGRAM_DIRB_CHANNEL", "TELEGRAM_DIRB_CHANNEL"), 150 + "telegram_mics_channel": utils.GetOSEnv("TELEGRAM_MICS_CHANNEL", "TELEGRAM_MICS_CHANNEL"), 151 + }) 152 + 153 + // used for scaling 154 + //v.SetDefault("Master", map[string]string{ 155 + // "host": utils.GetOSEnv("MASTER_HOST", "MASTER_HOST"), 156 + // "cred": utils.GetOSEnv("MASTER_CRED", "MASTER_CRED"), 157 + //}) 158 + //v.SetDefault("Pool", map[string]string{ 159 + // "host": utils.GetOSEnv("POOL_HOST", "POOL_HOST"), 160 + // "cred": utils.GetOSEnv("POOL_CRED", "POOL_CRED"), 161 + //}) 162 + // enable sync 163 + //v.SetDefault("Sync", map[string]string{ 164 + // "firebase_url": utils.GetOSEnv("FIREBASE_URL", "FIREBASE_URL"), 165 + // "firebase_prefix": utils.GetOSEnv("FIREBASE_PREFIX", "FIREBASE_PREFIX"), 166 + // "firebase_pool": utils.GetOSEnv("FIREBASE_POOL", "FIREBASE_POOL"), 167 + //}) 168 + 169 + v.SetDefault("Cdn", map[string]string{ 170 + "osm_cdn_url": utils.GetOSEnv("OSM_CDN_URL", "OSM_CDN_URL"), 171 + "osm_cdn_wsurl": utils.GetOSEnv("OSM_CDN_WSURL", "OSM_CDN_WSURL"), 172 + "osm_cdn_auth": utils.GetOSEnv("OSM_CDN_AUTH", "OSM_CDN_AUTH"), 173 + "osm_cdn_prefix": utils.GetOSEnv("OSM_CDN_PREFIX", "OSM_CDN_PREFIX"), 174 + "osm_cdn_index": utils.GetOSEnv("OSM_CDN_INDEX", "OSM_CDN_INDEX"), 175 + "osm_cdn_secret": utils.GetOSEnv("OSM_CDN_SECRET", "OSM_CDN_SECRET"), 176 + }) 177 + 178 + v.SetDefault("Cloud", map[string]string{ 179 + "cloud_public_key": utils.GetOSEnv("CLOUD_PUBLIC_KEY", "CLOUD_PUBLIC_KEY"), 180 + "cloud_secret_key": utils.GetOSEnv("CLOUD_SECRET_KEY", "CLOUD_SECRET_KEY"), 181 + "build_repo": utils.GetOSEnv("CLOUD_BUILD_REPO", "CLOUD_BUILD_REPO"), 182 + }) 183 + 184 + v.SetDefault("Update", map[string]string{ 185 + "update_type": "git", 186 + "update_url": utils.GetOSEnv("UPDATE_BASE_URL", "UPDATE_BASE_URL"), 187 + "update_date": utils.GetOSEnv("UPDATE_DATE", "UPDATE_DATE"), 188 + "update_meta": utils.GetOSEnv("META_URL", "META_URL"), 189 + "workflow": utils.GetOSEnv("UPDATE_URL", "UPDATE_URL"), 190 + }) 191 + 192 + v.SetDefault("Mics", map[string]string{ 193 + "docs": utils.GetOSEnv("OSM_DOCS", libs.DOCS), 194 + }) 195 + 196 + v.WriteConfigAs(options.ConfigFile) 197 + } 198 + 199 + GetEnv(options) 200 + GetStorages(options) 201 + GetNotification(options) 202 + GetServer(options) 203 + GetClient(options) 204 + GetRemote(options) 205 + GetGit(options) 206 + //GetSync(options) 207 + GetCdn(options) 208 + SetupOpt(options) 209 + 210 + } 211 + 212 + // LoadConfig load config 213 + func LoadConfig(options libs.Options) (*viper.Viper, error) { 214 + options.ConfigFile, _ = homedir.Expand(options.ConfigFile) 215 + RootFolder := filepath.Dir(options.ConfigFile) 216 + v := viper.New() 217 + v.SetConfigName("config") 218 + v.SetConfigType("yaml") 219 + v.AddConfigPath(RootFolder) 220 + // InitConfig(&options) 221 + if err := v.ReadInConfig(); err != nil { 222 + InitConfig(&options) 223 + return v, nil 224 + } 225 + return v, nil 226 + } 227 + 228 + // GetEnv get environment options 229 + func GetEnv(options *libs.Options) { 230 + v, _ := LoadConfig(*options) 231 + envs := v.GetStringMapString("Environments") 232 + 233 + // config 234 + options.Env.BinariesFolder = utils.NormalizePath(envs["binaries"]) 235 + utils.MakeDir(options.Env.BinariesFolder) 236 + 237 + options.Env.DataFolder = utils.NormalizePath(envs["data"]) 238 + utils.MakeDir(options.Env.DataFolder) 239 + // ose folder 240 + options.Env.OseFolder = path.Join(options.Env.BaseFolder, "ose") 241 + utils.MakeDir(options.Env.DataFolder) 242 + 243 + options.Env.ScriptsFolder = path.Join(options.Env.BaseFolder, "scripts") 244 + options.Env.UIFolder = path.Join(options.Env.BaseFolder, "ui") 245 + 246 + // local data 247 + options.Env.StoragesFolder = utils.NormalizePath(envs["storages"]) 248 + utils.MakeDir(options.Env.StoragesFolder) 249 + options.Env.WorkspacesFolder = utils.NormalizePath(envs["workspaces"]) 250 + utils.MakeDir(options.Env.WorkspacesFolder) 251 + options.Env.WorkFlowsFolder = utils.NormalizePath(envs["workflows"]) 252 + 253 + if utils.FileExists(path.Join(options.Env.WorkFlowsFolder, "premium.md")) { 254 + options.PremiumPackage = true 255 + } 256 + 257 + // backup data 258 + options.Env.BackupFolder = utils.NormalizePath(envs["backups"]) 259 + utils.MakeDir(options.Env.BackupFolder) 260 + 261 + // cloud stuff 262 + options.Env.ProviderFolder = utils.NormalizePath(envs["provider_config"]) 263 + utils.MakeDir(options.Env.ProviderFolder) 264 + options.Env.CloudDataFolder = utils.NormalizePath(envs["cloud_data"]) 265 + utils.MakeDir(options.Env.CloudDataFolder) 266 + options.Env.CloudConfigFolder = utils.NormalizePath(envs["cloud_config"]) 267 + 268 + cloud := v.GetStringMapString("Cloud") 269 + options.Cloud.BuildRepo = cloud["build_repo"] 270 + 271 + // load the config file here 272 + options.Cloud.SecretKey = utils.NormalizePath(cloud["cloud_secret_key"]) 273 + options.Cloud.PublicKey = utils.NormalizePath(cloud["cloud_public_key"]) 274 + if utils.FileExists(options.Cloud.SecretKey) { 275 + options.Cloud.SecretKeyContent = strings.TrimSpace(utils.GetFileContent(options.Cloud.SecretKey)) 276 + options.Cloud.PublicKeyContent = strings.TrimSpace(utils.GetFileContent(options.Cloud.PublicKey)) 277 + } 278 + 279 + // 280 + //options.Env.RootFolder = utils.NormalizePath(options.Env.RootFolder) 281 + //options.Env.BaseFolder = utils.NormalizePath(options.Env.BaseFolder) 282 + 283 + update := v.GetStringMapString("Update") 284 + options.Update.UpdateURL = update["update_url"] 285 + options.Update.UpdateType = update["update_type"] 286 + options.Update.UpdateDate = update["update_date"] 287 + options.Update.UpdateKey = update["update_key"] 288 + options.Update.MetaDataURL = update["update_meta"] 289 + UpdateMetadata(*options) 290 + } 291 + 292 + // SetupOpt get storage repos 293 + func SetupOpt(options *libs.Options) { 294 + // auto append PATH with Plugin folder 295 + osPATH := utils.GetOSEnv("PATH", "PATH") 296 + if !strings.Contains(osPATH, options.Env.BinariesFolder) { 297 + utils.DebugF("Append $PATH with: %s", options.Env.BinariesFolder) 298 + os.Setenv("PATH", fmt.Sprintf("%s:%s", osPATH, options.Env.BinariesFolder)) 299 + } 300 + 301 + /* some special conditions below */ 302 + 303 + // change {{.Storage}} from ~/.osmedeus/storages to ~/.osmedeus/destorages 304 + if options.EnableDeStorage { 305 + utils.DebugF("Dedicated Storage Enabled") 306 + options.Env.StoragesFolder = options.Git.DeStorage 307 + if !utils.FolderExists(options.Env.StoragesFolder) { 308 + utils.MakeDir(options.Env.StoragesFolder) 309 + } 310 + } 311 + } 312 + 313 + func GetStorages(options *libs.Options) { 314 + v, _ := LoadConfig(*options) 315 + storages := v.GetStringMapString("Storages") 316 + 317 + for k, v := range storages { 318 + storages[k], _ = homedir.Expand(v) 319 + } 320 + storagesOptions := make(map[string]string) 321 + // cloning stuff 322 + // path to private to push result 323 + storagesOptions["secret_key"] = storages["secret_key"] 324 + options.Storages = storagesOptions 325 + 326 + // load default existing key if it exists 327 + if options.Storages["secret_key"] == "" || options.Storages["secret_key"] == "SECRET_KEY" { 328 + // ~/.osmedeus/secret_key.private 329 + secretKey := path.Join(options.Env.RootFolder, "secret_key.private") 330 + if utils.FileExists(secretKey) { 331 + options.Storages["secret_key"] = secretKey 332 + } else { 333 + secretKey = path.Join(options.Env.BaseFolder, "secret/secret_key.private") 334 + if utils.FileExists(secretKey) { 335 + options.Storages["secret_key"] = secretKey 336 + } 337 + } 338 + } 339 + 340 + // disable git feature or no secret key found 341 + if options.NoGit { 342 + options.Storages["secret_key"] = "" 343 + } 344 + if options.Storages["secret_key"] == "" { 345 + options.NoGit = true 346 + } 347 + 348 + if options.CustomGit { 349 + // in case custom repo is set 350 + for _, env := range os.Environ() { 351 + // the ENV should be OSM_SUMMARY_STORAGE, OSM_SUMMARY_REPO 352 + if strings.HasSuffix(env, "OSM_") { 353 + data := strings.Split(env, "=") 354 + key := strings.ToLower(data[0]) 355 + value := strings.Replace(env, data[0]+"=", "", -1) 356 + 357 + if strings.HasSuffix(key, "summary_storage") { 358 + storagesOptions["summary_storage"] = value 359 + } 360 + if strings.HasSuffix(key, "summary_repo") { 361 + storagesOptions["summary_repo"] = value 362 + } 363 + 364 + if strings.HasSuffix(key, "assets_storage") { 365 + storagesOptions["assets_storage"] = value 366 + } 367 + if strings.HasSuffix(key, "assets_repo") { 368 + storagesOptions["assets_repo"] = value 369 + } 370 + 371 + if strings.HasSuffix(key, "ports_storage") { 372 + storagesOptions["ports_storage"] = value 373 + } 374 + if strings.HasSuffix(key, "ports_repo") { 375 + storagesOptions["ports_repo"] = value 376 + } 377 + } 378 + } 379 + } 380 + 381 + storagesOptions[storages["summary_storage"]] = storages["summary_repo"] 382 + storagesOptions[storages["subdomain_storage"]] = storages["subdomain_repo"] 383 + storagesOptions[storages["http_storage"]] = storages["http_repo"] 384 + storagesOptions[storages["assets_storage"]] = storages["assets_repo"] 385 + storagesOptions[storages["mics_storage"]] = storages["mics_repo"] 386 + storagesOptions[storages["ports_storage"]] = storages["ports_repo"] 387 + storagesOptions[storages["paths_storage"]] = storages["paths_repo"] 388 + storagesOptions[storages["vuln_storage"]] = storages["vuln_repo"] 389 + 390 + options.Storages = storagesOptions 391 + if options.NoGit { 392 + return 393 + } 394 + 395 + execution.CloneRepo(storages["summary_repo"], storages["summary_storage"], *options) 396 + execution.CloneRepo(storages["http_repo"], storages["http_storage"], *options) 397 + execution.CloneRepo(storages["assets_repo"], storages["assets_storage"], *options) 398 + execution.CloneRepo(storages["subdomain_repo"], storages["subdomain_storage"], *options) 399 + execution.CloneRepo(storages["ports_repo"], storages["ports_storage"], *options) 400 + execution.CloneRepo(storages["mics_repo"], storages["mics_storage"], *options) 401 + execution.CloneRepo(storages["paths_repo"], storages["paths_storage"], *options) 402 + execution.CloneRepo(storages["vuln_repo"], storages["vuln_storage"], *options) 403 + } 404 + 405 + // GetNotification get storge repos 406 + func GetNotification(options *libs.Options) { 407 + v, _ := LoadConfig(*options) 408 + noti := v.GetStringMapString("Notification") 409 + tokens := v.GetStringMapString("Tokens") 410 + 411 + options.Noti.SlackToken = tokens["slack"] 412 + options.Noti.TelegramToken = tokens["telegram"] 413 + options.Noti.DiscordToken = tokens["discord"] 414 + options.Noti.ClientName = noti["client_name"] 415 + 416 + options.Noti.SlackStatusChannel = noti["slack_status_channel"] 417 + options.Noti.SlackReportChannel = noti["slack_report_channel"] 418 + options.Noti.SlackDiffChannel = noti["slack_diff_channel"] 419 + options.Noti.SlackWebHook = noti["slack_webhook"] 420 + options.Noti.TelegramChannel = noti["telegram_channel"] 421 + options.Noti.TelegramSensitiveChannel = noti["telegram_sensitive_channel"] 422 + options.Noti.TelegramReportChannel = noti["telegram_report_channel"] 423 + options.Noti.TelegramStatusChannel = noti["telegram_status_channel"] 424 + options.Noti.TelegramDirbChannel = noti["telegram_dirb_channel"] 425 + options.Noti.TelegramMicsChannel = noti["telegram_mics_channel"] 426 + } 427 + 428 + // GetServer get server options 429 + func GetServer(options *libs.Options) { 430 + v, _ := LoadConfig(*options) 431 + server := v.GetStringMapString("Server") 432 + 433 + options.Server.Bind = server["bind"] 434 + options.Server.Cors = server["cors"] 435 + options.Server.JWTSecret = server["secret"] 436 + options.Server.StaticPrefix = server["prefix"] 437 + options.Server.UIPath = utils.NormalizePath(server["ui"]) 438 + utils.MakeDir(path.Dir(options.Server.UIPath)) 439 + 440 + options.Server.MasterPassword = server["master_pass"] 441 + options.Server.CertFile = utils.NormalizePath(server["cert_file"]) 442 + options.Server.KeyFile = utils.NormalizePath(server["key_file"]) 443 + utils.MakeDir(path.Dir(options.Server.CertFile)) 444 + 445 + db := v.GetStringMapString("Database") 446 + 447 + options.Server.DBPath = utils.NormalizePath(db["db_path"]) 448 + options.Server.DBType = db["db_type"] 449 + // this should be remote one 450 + if options.Server.DBType == "mysql" { 451 + options.Server.DBUser = db["db_user"] 452 + options.Server.DBPass = db["db_pass"] 453 + options.Server.DBHost = db["db_host"] 454 + options.Server.DBPort = db["db_port"] 455 + options.Server.DBName = db["db_name"] 456 + 457 + // âuser:password@/dbname?charset=utf8&parseTime=True&loc=Localâ 458 + cred := fmt.Sprintf("%v:%v", options.Server.DBUser, options.Server.DBPass) 459 + dest := fmt.Sprintf("%v:%v", options.Server.DBHost, options.Server.DBPort) 460 + dbURL := fmt.Sprintf("%v@tcp(%v)/%v?charset=utf8&parseTime=True&loc=Local", cred, dest, options.Server.DBName) 461 + options.Server.DBConnection = dbURL 462 + } 463 + } 464 + 465 + // GetRemote get server remote options 466 + func GetRemote(options *libs.Options) { 467 + v, _ := LoadConfig(*options) 468 + master := v.GetStringMapString("Master") 469 + pool := v.GetStringMapString("Pool") 470 + 471 + options.Remote.MasterHost = master["host"] 472 + options.Remote.MasterCred = master["cred"] 473 + options.Remote.PoolHost = pool["host"] 474 + options.Remote.PoolCred = pool["cred"] 475 + } 476 + 477 + // GetClient get options for client 478 + func GetClient(options *libs.Options) map[string]string { 479 + v, _ := LoadConfig(*options) 480 + client := v.GetStringMapString("Client") 481 + options.Client.Username = client["username"] 482 + options.Client.Password = client["password"] 483 + return client 484 + } 485 + 486 + // GetGit get options for client 487 + func GetGit(options *libs.Options) { 488 + v, _ := LoadConfig(*options) 489 + git := v.GetStringMapString("Git") 490 + options.Git.BaseURL = git["base_url"] 491 + options.Git.DeStorage = git["destorage"] 492 + options.Git.Token = git["api"] 493 + options.Git.Username = git["username"] 494 + options.Git.Password = git["password"] 495 + options.Git.Group = git["group"] 496 + options.Git.DefaultPrefix = git["prefix_name"] 497 + options.Git.DefaultTag = git["default_tag"] 498 + options.Git.DefaultUser = git["default_user"] 499 + options.Git.DefaultUID = utils.StrToInt(git["default_uid"]) 500 + } 501 + 502 + // GetSync get options for client 503 + func GetSync(options *libs.Options) { 504 + v, _ := LoadConfig(*options) 505 + fb := v.GetStringMapString("Sync") 506 + options.Sync.BaseURL = fb["firebase_url"] 507 + options.Sync.Prefix = fb["firebase_prefix"] 508 + options.Sync.Pool = fb["firebase_pool"] 509 + } 510 + 511 + // GetCdn get options for client 512 + func GetCdn(options *libs.Options) { 513 + v, _ := LoadConfig(*options) 514 + cdn := v.GetStringMapString("Cdn") 515 + options.Cdn.URL = cdn["osm_cdn_url"] 516 + options.Cdn.WSURL = cdn["osm_cdn_wsurl"] 517 + options.Cdn.Prefix = cdn["osm_cdn_prefix"] 518 + options.Cdn.Index = cdn["osm_cdn_index"] 519 + 520 + // in case we have prefix 521 + if options.Cdn.Prefix != "OSM_CDN_PREFIX" { 522 + u, err := url.Parse(options.Cdn.URL) 523 + if err == nil { 524 + u.Path = path.Join(u.Path, options.Cdn.Prefix) 525 + options.Cdn.URL = u.String() 526 + } 527 + 528 + u, err = url.Parse(options.Cdn.WSURL) 529 + if err == nil { 530 + u.Path = path.Join(u.Path, options.Cdn.Prefix) 531 + options.Cdn.WSURL = u.String() 532 + } 533 + } 534 + 535 + options.Cdn.Auth = cdn["osm_cdn_auth"] 536 + } 537 + 538 + // ReloadConfig get credentials 539 + func ReloadConfig(options libs.Options) { 540 + utils.InforF("Reload Env for config file: %v", options.ConfigFile) 541 + v, _ := LoadConfig(options) 542 + 543 + // options.ConfigFile, _ = homedir.Expand(options.ConfigFile) 544 + RootFolder := filepath.Dir(utils.NormalizePath(options.ConfigFile)) 545 + if !utils.FolderExists(RootFolder) { 546 + os.MkdirAll(RootFolder, 0750) 547 + } 548 + // Base folder 549 + BaseFolder := utils.NormalizePath(options.Env.BaseFolder) 550 + if !utils.FolderExists(BaseFolder) { 551 + os.MkdirAll(BaseFolder, 0750) 552 + } 553 + 554 + v.Set("Environments", map[string]string{ 555 + // RootFolder --> ~/.osmedeus/ 556 + "storages": path.Join(RootFolder, "storages"), 557 + "workspaces": path.Join(RootFolder, "workspaces"), 558 + "backups": path.Join(RootFolder, "backups"), 559 + "cloud_data": path.Join(RootFolder, "clouds"), 560 + "provider_config": path.Join(RootFolder, "provider"), 561 + 562 + // this update casually 563 + // BaseFolder --> ~/osmedeus-base/ 564 + "workflows": path.Join(BaseFolder, "workflow"), 565 + "binaries": path.Join(BaseFolder, "binaries"), 566 + "data": path.Join(BaseFolder, "data"), 567 + "cloud_config": path.Join(BaseFolder, "cloud"), 568 + }) 569 + 570 + // 571 + //v.Set("Environments", map[string]string{ 572 + // //"workflows": path.Join(RootFolder, "core/workflow"), 573 + // "workflows": path.Join(BaseFolder, "core/workflow"), 574 + // "binaries": path.Join(BaseFolder, "binaries"), 575 + // "storages": path.Join(RootFolder, "storages"), 576 + // "workspaces": path.Join(RootFolder, "workspaces"), 577 + // "plugins": path.Join(BaseFolder, "plugins"), 578 + // "data": path.Join(BaseFolder, "data"), 579 + // "cloud_data": path.Join(RootFolder, "clouds"), 580 + // "provider_config": path.Join(RootFolder, "provider"), 581 + // "cloud_config": path.Join(BaseFolder, "cloud"), 582 + // // 583 + // "backups": path.Join(RootFolder, "backups"), 584 + //}) 585 + 586 + v.Set("Cloud", map[string]string{ 587 + "cloud_secret_key": utils.GetOSEnv("CLOUD_SECRET_KEY", "CLOUD_SECRET_KEY"), 588 + "cloud_public_key": utils.GetOSEnv("CLOUD_PUBLIC_KEY", "CLOUD_PUBLIC_KEY"), 589 + "build_repo": utils.GetOSEnv("CLOUD_BUILD_REPO", "CLOUD_BUILD_REPO"), 590 + }) 591 + 592 + // things should be reload by env 593 + v.Set("Storages", map[string]string{ 594 + // path of secret key for push result 595 + // the repo format should be like this "[email protected]:j3ssie/example.git", 596 + "secret_key": utils.GetOSEnv("SECRET_KEY", "SECRET_KEY"), 597 + "summary_storage": path.Join(options.Env.RootFolder, "storages/summary"), 598 + "summary_repo": utils.GetOSEnv("SUMMARY_REPO", "SUMMARY_REPO"), 599 + "subdomain_storage": path.Join(options.Env.RootFolder, "storages/subdomain"), 600 + "subdomain_repo": utils.GetOSEnv("SUBDOMAIN_REPO", "SUBDOMAIN_REPO"), 601 + "assets_storage": path.Join(options.Env.RootFolder, "storages/assets"), 602 + "assets_repo": utils.GetOSEnv("ASSETS_REPO", "ASSETS_REPO"), 603 + "ports_storage": path.Join(options.Env.RootFolder, "storages/ports"), 604 + "ports_repo": utils.GetOSEnv("PORTS_REPO", "PORTS_REPO"), 605 + "http_storage": path.Join(options.Env.RootFolder, "storages/http"), 606 + "http_repo": utils.GetOSEnv("HTTP_REPO", "HTTP_REPO"), 607 + "vuln_storage": path.Join(options.Env.RootFolder, "storages/vuln"), 608 + "vuln_repo": utils.GetOSEnv("VULN_REPO", "VULN_REPO"), 609 + "paths_storage": path.Join(options.Env.RootFolder, "storages/paths"), 610 + "paths_repo": utils.GetOSEnv("PATHS_REPO", "PATHS_REPO"), 611 + "mics_storage": path.Join(options.Env.RootFolder, "storages/mics"), 612 + "mics_repo": utils.GetOSEnv("MICS_REPO", "MICS_REPO"), 613 + }) 614 + 615 + v.Set("Tokens", map[string]string{ 616 + "slack": utils.GetOSEnv("SLACK_API_TOKEN", "SLACK_API_TOKEN"), 617 + "gitlab": utils.GetOSEnv("GITLAB_API_TOKEN", "GITLAB_API_TOKEN"), 618 + "github": utils.GetOSEnv("GITHUB_API_KEY", "GITHUB_API_KEY"), 619 + "discord": utils.GetOSEnv("DISCORD_API_TOKEN", "DISCORD_API_TOKEN"), 620 + "telegram": utils.GetOSEnv("TELEGRAM_API_TOKEN", "TELEGRAM_API_TOKEN"), 621 + }) 622 + 623 + v.Set("Git", map[string]string{ 624 + "base_url": utils.GetOSEnv("GITLAB_BASE_URL", "https://gitlab.com"), 625 + "api": utils.GetOSEnv("GITLAB_API_TOKEN", "GITLAB_API_TOKEN"), 626 + "username": utils.GetOSEnv("GITLAB_USER", "GITLAB_USER"), 627 + "password": utils.GetOSEnv("GITLAB_PASS", "GITLAB_PASS"), 628 + "group": utils.GetOSEnv("GITLAB_GROUP", "GITLAB_GROUP"), 629 + "prefix_name": utils.GetOSEnv("GITLAB_PREFIX_NAME", "deosm"), 630 + "default_tag": utils.GetOSEnv("GITLAB_DEFAULT_TAG", "osmd"), 631 + "default_user": utils.GetOSEnv("GITLAB_DEFAULT_USER", "j3ssie"), 632 + "default_uid": utils.GetOSEnv("GITLAB_DEFAULT_UID", "3537075"), 633 + "destorage": path.Join(options.Env.RootFolder, "destorage"), 634 + }) 635 + 636 + v.Set("Notification", map[string]string{ 637 + "client_name": utils.GetOSEnv("CLIENT_NAME", "CLIENT_NAME"), 638 + "slack_status_channel": utils.GetOSEnv("SLACK_STATUS_CHANNEL", "SLACK_STATUS_CHANNEL"), 639 + "slack_report_channel": utils.GetOSEnv("SLACK_REPORT_CHANNEL", "SLACK_REPORT_CHANNEL"), 640 + "slack_diff_channel": utils.GetOSEnv("SLACK_DIFF_CHANNEL", "SLACK_DIFF_CHANNEL"), 641 + "slack_webhook": utils.GetOSEnv("SLACK_WEBHOOK", "SLACK_WEBHOOK"), 642 + "discord_channel": utils.GetOSEnv("DISCORD_CHANNEL", "DISCORD_CHANNEL"), 643 + "telegram_channel": utils.GetOSEnv("TELEGRAM_CHANNEL", "TELEGRAM_CHANNEL"), 644 + "telegram_status_channel": utils.GetOSEnv("TELEGRAM_STATUS_CHANNEL", "TELEGRAM_STATUS_CHANNEL"), 645 + "telegram_report_channel": utils.GetOSEnv("TELEGRAM_REPORT_CHANNEL", "TELEGRAM_REPORT_CHANNEL"), 646 + "telegram_sensitive_channel": utils.GetOSEnv("TELEGRAM_SENSITIVE_CHANNEL", "TELEGRAM_SENSITIVE_CHANNEL"), 647 + "telegram_dirb_channel": utils.GetOSEnv("TELEGRAM_DIRB_CHANNEL", "TELEGRAM_DIRB_CHANNEL"), 648 + "telegram_mics_channel": utils.GetOSEnv("TELEGRAM_MICS_CHANNEL", "TELEGRAM_MICS_CHANNEL"), 649 + }) 650 + 651 + v.Set("Cdn", map[string]string{ 652 + "osm_cdn_url": utils.GetOSEnv("OSM_CDN_URL", "OSM_CDN_URL"), 653 + "osm_cdn_wsurl": utils.GetOSEnv("OSM_CDN_WSURL", "OSM_CDN_WSURL"), 654 + "osm_cdn_auth": utils.GetOSEnv("OSM_CDN_AUTH", "OSM_CDN_AUTH"), 655 + "osm_cdn_prefix": utils.GetOSEnv("OSM_CDN_PREFIX", "OSM_CDN_PREFIX"), 656 + "osm_cdn_index": utils.GetOSEnv("OSM_CDN_INDEX", "OSM_CDN_INDEX"), 657 + "osm_cdn_secret": utils.GetOSEnv("OSM_CDN_SECRET", "OSM_CDN_SECRET"), 658 + }) 659 + 660 + v.Set("Update", map[string]string{ 661 + "update_url": utils.GetOSEnv("UPDATE_BASE_URL", "UPDATE_BASE_URL"), 662 + "update_date": utils.GetOSEnv("UPDATE_DATE", "UPDATE_DATE"), 663 + "update_meta": utils.GetOSEnv("META_URL", "META_URL"), 664 + "workflow": utils.GetOSEnv("UPDATE_URL", "UPDATE_URL"), 665 + }) 666 + 667 + // 668 + //v.Set("Sync", map[string]string{ 669 + // "firebase_url": utils.GetOSEnv("FIREBASE_URL", "FIREBASE_URL"), 670 + // "firebase_prefix": utils.GetOSEnv("FIREBASE_PREFIX", "FIREBASE_PREFIX"), 671 + // "firebase_pool": utils.GetOSEnv("FIREBASE_POOL", "FIREBASE_POOL"), 672 + //}) 673 + // 674 + //v.Set("Master", map[string]string{ 675 + // "host": utils.GetOSEnv("MASTER_HOST", "MASTER_HOST"), 676 + // "cred": utils.GetOSEnv("MASTER_CRED", "MASTER_CRED"), 677 + //}) 678 + //v.Set("Pool", map[string]string{ 679 + // "host": utils.GetOSEnv("POOL_HOST", "POOL_HOST"), 680 + // "cred": utils.GetOSEnv("POOL_CRED", "POOL_CRED"), 681 + //}) 682 + 683 + v.WriteConfig() 684 + } 685 + -
-
-
1 + package core 2 + 3 + import ( 4 + "fmt" 5 + "github.com/j3ssie/osmedeus/execution" 6 + "github.com/j3ssie/osmedeus/utils" 7 + "github.com/robertkrimen/otto" 8 + "path" 9 + "time" 10 + ) 11 + 12 + func (r *Runner) LoadExternalScripts() string { 13 + var output string 14 + vm := r.VM 15 + 16 + // special scripts 17 + vm.Set(Cleaning, func(call otto.FunctionCall) otto.Value { 18 + execution.Cleaning(call.Argument(0).String(), r.Opt) 19 + return otto.Value{} 20 + }) 21 + 22 + // scripts for cleaning modules 23 + vm.Set(CleanAmass, func(call otto.FunctionCall) otto.Value { 24 + src := call.Argument(0).String() 25 + dest := call.Argument(1).String() 26 + execution.CleanAmass(src, dest) 27 + return otto.Value{} 28 + }) 29 + 30 + vm.Set(CleanRustScan, func(call otto.FunctionCall) otto.Value { 31 + src := call.Argument(0).String() 32 + dest := call.Argument(1).String() 33 + execution.CleanRustScan(src, dest) 34 + return otto.Value{} 35 + }) 36 + 37 + vm.Set(CleanGoBuster, func(call otto.FunctionCall) otto.Value { 38 + src := call.Argument(0).String() 39 + dest := call.Argument(1).String() 40 + execution.CleanGoBuster(src, dest) 41 + return otto.Value{} 42 + }) 43 + vm.Set(CleanMassdns, func(call otto.FunctionCall) otto.Value { 44 + src := call.Argument(0).String() 45 + dest := call.Argument(1).String() 46 + execution.CleanMassdns(src, dest) 47 + return otto.Value{} 48 + }) 49 + 50 + vm.Set(CleanSWebanalyze, func(call otto.FunctionCall) otto.Value { 51 + src := call.Argument(0).String() 52 + dest := call.Argument(1).String() 53 + execution.CleanSWebanalyze(src, dest) 54 + return otto.Value{} 55 + }) 56 + vm.Set(CleanJSONDnsx, func(call otto.FunctionCall) otto.Value { 57 + src := call.Argument(0).String() 58 + dest := call.Argument(1).String() 59 + execution.CleanJSONDnsx(src, dest) 60 + return otto.Value{} 61 + }) 62 + 63 + vm.Set(CleanJSONHttpx, func(call otto.FunctionCall) otto.Value { 64 + src := call.Argument(0).String() 65 + dest := call.Argument(1).String() 66 + execution.CleanJSONHttpx(src, dest) 67 + return otto.Value{} 68 + }) 69 + 70 + // Deprecated 71 + vm.Set(CleanWebanalyze, func(call otto.FunctionCall) otto.Value { 72 + src := call.Argument(0).String() 73 + dest := call.Argument(1).String() 74 + args := call.ArgumentList 75 + 76 + techSum := path.Join(path.Dir(dest), fmt.Sprintf("tech-overview-%v.txt", r.Target["Workspace"])) 77 + if len(args) > 3 { 78 + techSum = args[2].String() 79 + } 80 + execution.CleanWebanalyze(src, dest, techSum) 81 + return otto.Value{} 82 + }) 83 + 84 + vm.Set(CleanArjun, func(call otto.FunctionCall) otto.Value { 85 + // src mean folder contain arjun output 86 + src := call.Argument(0).String() 87 + dest := call.Argument(1).String() 88 + execution.CleanArjun(src, dest) 89 + return otto.Value{} 90 + }) 91 + 92 + vm.Set(GenNucleiReport, func(call otto.FunctionCall) otto.Value { 93 + src := call.Argument(0).String() 94 + dest := call.Argument(1).String() 95 + args := call.ArgumentList 96 + 97 + templateFile := "" 98 + if len(args) >= 3 { 99 + templateFile = args[2].String() 100 + } 101 + execution.GenNucleiReport(r.Opt, src, dest, templateFile) 102 + return otto.Value{} 103 + }) 104 + 105 + return output 106 + } 107 + 108 + func (r *Runner) LoadGitScripts() string { 109 + var output string 110 + vm := r.VM 111 + options := r.Opt 112 + 113 + // Clone("[email protected]", "/tmp/dest") 114 + vm.Set(Clone, func(call otto.FunctionCall) otto.Value { 115 + execution.GitClone(call.Argument(0).String(), call.Argument(1).String(), false, options) 116 + return otto.Value{} 117 + }) 118 + // like clone but delete the destination folder first 119 + vm.Set(FClone, func(call otto.FunctionCall) otto.Value { 120 + execution.GitClone(call.Argument(0).String(), call.Argument(1).String(), true, options) 121 + return otto.Value{} 122 + }) 123 + 124 + vm.Set(PushResult, func(call otto.FunctionCall) otto.Value { 125 + for folder := range options.Storages { 126 + execution.PullResult(folder, options) 127 + time.Sleep(3 * time.Second) 128 + execution.PullResult(folder, options) 129 + commitMess := fmt.Sprintf("%v|%v|%v", options.Module.Name, options.Scan.ROptions["Workspace"], utils.GetCurrentDay()) 130 + execution.PushResult(folder, commitMess, options) 131 + } 132 + return otto.Value{} 133 + }) 134 + // push result but specific folder 135 + vm.Set(PushFolder, func(call otto.FunctionCall) otto.Value { 136 + folder := call.Argument(0).String() 137 + execution.PullResult(folder, options) 138 + time.Sleep(3 * time.Second) 139 + execution.PullResult(folder, options) 140 + commitMess := fmt.Sprintf("%v|%v|%v", options.Module.Name, options.Scan.ROptions["Workspace"], utils.GetCurrentDay()) 141 + execution.PushResult(folder, commitMess, options) 142 + return otto.Value{} 143 + }) 144 + 145 + // push result but specific folder 146 + vm.Set(PullFolder, func(call otto.FunctionCall) otto.Value { 147 + folder := call.Argument(0).String() 148 + execution.PullResult(folder, options) 149 + time.Sleep(3 * time.Second) 150 + execution.PullResult(folder, options) 151 + return otto.Value{} 152 + }) 153 + 154 + vm.Set(DiffCompare, func(call otto.FunctionCall) otto.Value { 155 + src := call.Argument(0).String() 156 + dest := call.Argument(1).String() 157 + output := call.Argument(2).String() 158 + execution.DiffCompare(src, dest, output, options) 159 + return otto.Value{} 160 + }) 161 + 162 + vm.Set(GitDiff, func(call otto.FunctionCall) otto.Value { 163 + args := call.ArgumentList 164 + src := args[0].String() 165 + output := call.Argument(1).String() 166 + history := "1" 167 + if len(args) < 2 { 168 + history = call.Argument(2).String() 169 + } 170 + execution.GitDiff(src, output, history, options) 171 + return otto.Value{} 172 + }) 173 + vm.Set(LoopGitDiff, func(call otto.FunctionCall) otto.Value { 174 + args := call.ArgumentList 175 + src := args[0].String() 176 + output := call.Argument(1).String() 177 + execution.LoopGitDiff(src, output, options) 178 + return otto.Value{} 179 + }) 180 + 181 + vm.Set(GetFileFromCDN, func(call otto.FunctionCall) otto.Value { 182 + args := call.ArgumentList 183 + src := args[0].String() 184 + output := args[1].String() 185 + execution.GetFileFromCDN(options, src, output) 186 + return otto.Value{} 187 + }) 188 + 189 + vm.Set(GetWSFromCDN, func(call otto.FunctionCall) otto.Value { 190 + args := call.ArgumentList 191 + src := args[0].String() 192 + output := args[1].String() 193 + execution.GetWSFromCDN(options, src, output) 194 + return otto.Value{} 195 + }) 196 + 197 + vm.Set(DownloadFile, func(call otto.FunctionCall) otto.Value { 198 + args := call.ArgumentList 199 + src := args[0].String() 200 + output := args[1].String() 201 + execution.DownloadFile(options, src, output) 202 + return otto.Value{} 203 + }) 204 + /* --- Gitlab API --- */ 205 + 206 + // CreateRepo("repo-name") 207 + // CreateRepo("repo-name", "tags") 208 + vm.Set(CreateRepo, func(call otto.FunctionCall) otto.Value { 209 + args := call.ArgumentList 210 + repoName := args[0].String() 211 + tags := "" 212 + if len(args) > 1 { 213 + tags = args[1].String() 214 + } 215 + execution.CreateGitlabRepo(repoName, tags, options) 216 + return otto.Value{} 217 + }) 218 + 219 + vm.Set(DeleteRepo, func(call otto.FunctionCall) otto.Value { 220 + args := call.ArgumentList 221 + repoName := args[0].String() 222 + execution.DeleteRepo(repoName, 0, options) 223 + return otto.Value{} 224 + }) 225 + vm.Set(DeleteRepoByPid, func(call otto.FunctionCall) otto.Value { 226 + args := call.ArgumentList 227 + pid, err := args[0].ToInteger() 228 + if err != nil { 229 + return otto.Value{} 230 + } 231 + execution.DeleteRepo("", int(pid), options) 232 + return otto.Value{} 233 + }) 234 + vm.Set(ListProjects, func(call otto.FunctionCall) otto.Value { 235 + args := call.ArgumentList 236 + if len(args) > 0 { 237 + uid, err := args[0].ToInteger() 238 + if err == nil { 239 + execution.ListProjects(int(uid), options) 240 + } 241 + return otto.Value{} 242 + } 243 + execution.ListProjects(0, options) 244 + return otto.Value{} 245 + }) 246 + 247 + return output 248 + } 249 + -
-
-
-
-
-
-
-
-