Skip to content

Commit 11a7ccc

Browse files
committed
Release v4.5.0 with a new markdown summary report
1 parent 3ae029a commit 11a7ccc

22 files changed

+709
-173
lines changed

Makefile

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,23 @@ build:
99

1010
release:
1111
go install
12-
# this is only for local build
12+
@echo "==> Clean up old builds"
1313
rm -rf ./dist/* ~/myGit/premium-osmedeus-base/dist/* ~/org-osmedeus/osmedeus-base/dist/*
14+
@echo "==> building binaries for for mac intel"
1415
GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -tags netgo -trimpath -buildmode=pie -o dist/osmedeus
15-
zip -9 -j dist/osmedeus-macos.zip dist/osmedeus
16-
rm -rf ./dist/osmedeus
17-
# for linux build on mac
16+
zip -9 -j dist/osmedeus-macos-amd64.zip dist/osmedeus && rm -rf ./dist/osmedeus
17+
@echo "==> building binaries for for mac M1 chip"
18+
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -tags netgo -trimpath -buildmode=pie -o dist/osmedeus
19+
zip -9 -j dist/osmedeus-macos-arm64.zip dist/osmedeus&& rm -rf ./dist/osmedeus
20+
@echo "==> building binaries for linux intel build on mac"
1821
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -tags netgo -trimpath -buildmode=pie -o dist/osmedeus
19-
zip -j dist/osmedeus-linux.zip dist/osmedeus
20-
rm -rf ./dist/osmedeus
22+
zip -j dist/osmedeus-linux.zip dist/osmedeus&& rm -rf ./dist/osmedeus
2123
cp dist/* ~/myGit/premium-osmedeus-base/dist/
2224
cp dist/* ~/org-osmedeus/osmedeus-base/dist/
25+
@echo "==> Generating metadata info"
2326
$(TARGET) update --gen dist/public.json
24-
mv dist/osmedeus-macos.zip dist/osmedeus-$(VERSION)-macos.zip
27+
mv dist/osmedeus-macos-amd64.zip dist/osmedeus-$(VERSION)-macos-amd64.zip
28+
mv dist/osmedeus-macos-arm64.zip dist/osmedeus-$(VERSION)-macos-arm64.zip
2529
mv dist/osmedeus-linux.zip dist/osmedeus-$(VERSION)-linux.zip
2630
run:
2731
$(GO) $(GOFLAGS) run *.go

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<a href="https://docs.osmedeus.org/donation/"><img src="https://img.shields.io/badge/Sponsors-0078D4?style=for-the-badge&logo=GitHub-Sponsors&logoColor=39ff14&labelColor=black&color=black"></a>
1111
<a href="https://twitter.com/OsmedeusEngine"><img src="https://img.shields.io/badge/%40OsmedeusEngine-0078D4?style=for-the-badge&logo=Twitter&logoColor=39ff14&labelColor=black&color=black"></a>
1212
<a href="https://discord.gg/gy4SWhpaPU"><img src="https://img.shields.io/badge/Discord%20Server-0078D4?style=for-the-badge&logo=Discord&logoColor=39ff14&labelColor=black&color=black"></a>
13-
<a href="https://discord.gg/gy4SWhpaPU"><img src="https://img.shields.io/github/release/j3ssie/osmedeus?style=for-the-badge&labelColor=black&color=2fc414&logo=Github"></a>
13+
<a href="https://github.com/j3ssie/osmedeus/releases"><img src="https://img.shields.io/github/release/j3ssie/osmedeus?style=for-the-badge&labelColor=black&color=2fc414&logo=Github"></a>
1414
</p>
1515
</p>
1616

cmd/health.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ func listFlows() error {
227227
row := []string{
228228
parsedFlow.Name, parsedFlow.Desc,
229229
}
230+
230231
content = append(content, row)
231232
}
232233
fmt.Printf("\nFound %v available workflows at: %s \n\n", color.HiGreenString("%v", len(content)), color.HiCyanString(options.Env.WorkFlowsFolder))

cmd/root.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,15 @@ func init() {
7575
RootCmd.PersistentFlags().BoolVar(&options.DisableValidateInput, "nv", false, "Disable Validate Input")
7676
RootCmd.PersistentFlags().BoolVar(&options.Update.NoUpdate, "nu", false, "Disable Update options")
7777
RootCmd.PersistentFlags().BoolVarP(&options.EnableFormatInput, "format-input", "J", false, "Enable special input format")
78+
RootCmd.PersistentFlags().IntVar(&options.MDCodeBlockLimit, "block-size", 10000, "Size limit for code block tags to before it's automatic truncation")
7879

7980
// disable options
8081
RootCmd.PersistentFlags().BoolVar(&options.NoNoti, "nn", false, "No notification")
8182
RootCmd.PersistentFlags().BoolVar(&options.NoBanner, "nb", false, "No banner")
8283
RootCmd.PersistentFlags().BoolVarP(&options.NoGit, "no-git", "N", false, "No git storage")
8384
RootCmd.PersistentFlags().BoolVarP(&options.NoClean, "no-clean", "C", false, "No clean junk output")
85+
RootCmd.PersistentFlags().BoolVar(&options.NoPreRun, "no-prerun", false, "Disable pre run scripts")
86+
RootCmd.PersistentFlags().BoolVar(&options.NoPostRun, "no-postrun", false, "Disable post run scripts")
8487
RootCmd.PersistentFlags().StringSliceVarP(&options.Exclude, "exclude", "x", []string{}, "Exclude module name (Multiple -x flags are accepted)")
8588
RootCmd.PersistentFlags().BoolVarP(&options.CustomGit, "git", "g", false, "Use custom Git repo")
8689

cmd/usage.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ func UtilsUsage() string {
117117
h += " osmedeus update --vuln\n"
118118
h += " osmedeus update --force --clean \n"
119119

120+
h += color.HiBlackString(" ## Workflow utilities\n")
121+
h += " osmedeus workflow list \n"
122+
h += " osmedeus workflow view -f general\n"
123+
120124
h += color.HiBlackString(" ## Other utilities\n")
121125
h += " osmedeus utils tmux ls \n"
122126
h += " osmedeus utils tmux logs -A -l 10 \n"
@@ -126,7 +130,6 @@ func UtilsUsage() string {
126130
h += " osmedeus utils ps --proc 'jaeles' \n"
127131
h += " osmedeus utils cron --cmd 'osmdeus scan -t example.com' --sch 60\n"
128132
h += " osmedeus utils cron --for --cmd 'osmedeus scan -t example.com'\n"
129-
h += " osmedeus utils workflow\n"
130133
h += " osmedeus config set --threads-hold=10\n"
131134
return h
132135
}

cmd/utils.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,23 +54,13 @@ func init() {
5454
cronCmd.Flags().BoolVar(&options.Cron.Forever, "for", false, "Keep running forever right after the command done")
5555
cronCmd.Flags().StringVar(&options.Cron.Command, "cmd", "", "Command to run")
5656

57-
var workflowCmd = &cobra.Command{
58-
Use: "workflow",
59-
Aliases: []string{"wf", "wl", "workflows", "wfs", "work", "works"},
60-
Short: "Listing all available workflows",
61-
Long: core.Banner(),
62-
RunE: runWorkflow,
63-
}
64-
6557
// add command
6658
utilsCmd.PersistentFlags().BoolVar(&options.JsonOutput, "json", false, "Output as JSON")
6759
utilsCmd.AddCommand(cronCmd)
6860
utilsCmd.AddCommand(tmuxCmd)
6961
utilsCmd.AddCommand(psCmd)
70-
utilsCmd.AddCommand(workflowCmd)
7162
utilsCmd.SetHelpFunc(UtilsHelp)
7263
RootCmd.AddCommand(utilsCmd)
73-
RootCmd.AddCommand(workflowCmd)
7464

7565
utilsCmd.PreRun = func(cmd *cobra.Command, args []string) {
7666
if options.FullHelp {
@@ -147,11 +137,3 @@ func runCron(_ *cobra.Command, _ []string) error {
147137
core.RunCron(options.Cron.Command, options.Cron.Schedule)
148138
return nil
149139
}
150-
151-
func runWorkflow(_ *cobra.Command, _ []string) error {
152-
listFlows()
153-
fmt.Printf("\n------------------------------------------------------------\n")
154-
listDefaultModules()
155-
fmt.Printf("💡 For full help message, please run: %s or %s\n", color.GreenString("osmedeus --hh"), color.GreenString("osmedeus scan --hh"))
156-
return nil
157-
}

cmd/workflow.go

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/fatih/color"
9+
"github.com/j3ssie/osmedeus/core"
10+
"github.com/j3ssie/osmedeus/utils"
11+
"github.com/olekukonko/tablewriter"
12+
"github.com/spf13/cobra"
13+
)
14+
15+
func init() {
16+
17+
var workflowCmd = &cobra.Command{
18+
Use: "workflow",
19+
Aliases: []string{"wf", "wl", "workflows", "wfs", "work", "works"},
20+
Short: "Listing all available workflows",
21+
Long: core.Banner(),
22+
}
23+
24+
var workflowListCmd = &cobra.Command{
25+
Use: "list",
26+
Aliases: []string{"ls"},
27+
Short: "Listing all available workflows",
28+
Long: core.Banner(),
29+
RunE: runWorkflow,
30+
}
31+
32+
var workflowViewCmd = &cobra.Command{
33+
Use: "view",
34+
Aliases: []string{"viwe", "ve", "vi", "v"},
35+
Short: "View details of a workflow",
36+
Long: core.Banner(),
37+
RunE: runWorkflowView,
38+
}
39+
workflowViewCmd.Flags().Bool("all", false, "View all of the workflows")
40+
41+
workflowCmd.AddCommand(workflowViewCmd)
42+
workflowCmd.AddCommand(workflowListCmd)
43+
workflowCmd.SetHelpFunc(UtilsHelp)
44+
RootCmd.AddCommand(workflowCmd)
45+
46+
workflowCmd.PreRun = func(cmd *cobra.Command, args []string) {
47+
if options.FullHelp {
48+
cmd.Help()
49+
os.Exit(0)
50+
}
51+
}
52+
}
53+
54+
func runWorkflow(cmd *cobra.Command, _ []string) error {
55+
listFlows()
56+
fmt.Printf("\n------------------------------------------------------------\n")
57+
listDefaultModules()
58+
fmt.Printf("💡 For full help message, please run: %s or %s\n", color.GreenString("osmedeus --hh"), color.GreenString("osmedeus scan --hh"))
59+
return nil
60+
}
61+
62+
func runWorkflowView(cmd *cobra.Command, _ []string) error {
63+
allFlows := core.ListFlow(options)
64+
viewAll, _ := cmd.Flags().GetBool("all")
65+
66+
if viewAll {
67+
for _, flow := range allFlows {
68+
err := viewWorkflow(flow)
69+
if err != nil {
70+
utils.ErrorF("Error viewing workflow: %v", err)
71+
}
72+
fmt.Printf("\n------------------------------------------------------------\n\n")
73+
}
74+
} else {
75+
err := viewWorkflow(options.Scan.Flow)
76+
if err != nil {
77+
utils.ErrorF("Error viewing workflow: %v", err)
78+
}
79+
}
80+
81+
h := color.HiCyanString("\n📄 Sample Usage:\n")
82+
h += color.HiGreenString(" osmedeus scan -f %v", color.HiMagentaString(options.Scan.Flow)) + color.HiGreenString(" -t ") + color.HiMagentaString("[target]") + "\n"
83+
h += color.HiGreenString(" osmedeus scan -f %v", color.HiMagentaString(options.Scan.Flow)) + color.HiGreenString(" -t ") + color.HiMagentaString("[target]") + color.HiGreenString(" -p ") + color.HiMagentaString("'enableSomething=false'") + "\n\n"
84+
fmt.Printf(h)
85+
86+
fmt.Printf("💡 To list all of the workflows available, please run: %s\n", color.GreenString("osmedeus workflow ls"))
87+
fmt.Printf("💡 For full help message, please run: %s or %s\n", color.GreenString("osmedeus --hh"), color.GreenString("osmedeus scan --hh"))
88+
return nil
89+
}
90+
91+
func viewWorkflow(workflowName string) error {
92+
fmt.Printf("📖 Viewing workflow detail: %v\n\n", color.GreenString(workflowName))
93+
allFlows := core.ListFlow(options)
94+
flows := core.SelectFlow(workflowName, options)
95+
if len(flows) == 0 {
96+
utils.ErrorF("Flow not found in any of existing workflow [%v]", color.HiYellowString(strings.Join(allFlows, ", ")))
97+
return fmt.Errorf("Flow %s not found", workflowName)
98+
}
99+
selectedWorkflow := flows[0]
100+
101+
var content [][]string
102+
parsedFlow, err := core.ParseFlow(selectedWorkflow)
103+
if err != nil {
104+
utils.ErrorF("Error parsing flow: %v", selectedWorkflow)
105+
return err
106+
}
107+
108+
var totalSteps, totalModules int
109+
parameters := make(map[string]string)
110+
for _, param := range parsedFlow.Params {
111+
for k, v := range param {
112+
parameters[k] = v
113+
}
114+
}
115+
116+
for _, routine := range parsedFlow.Routines {
117+
// select module depend on the flow type
118+
if routine.FlowFolder != "" {
119+
parsedFlow.Type = routine.FlowFolder
120+
} else {
121+
parsedFlow.Type = parsedFlow.DefaultType
122+
}
123+
124+
modules := core.SelectModules(routine.Modules, options)
125+
126+
// loop through all modules to get the parameters
127+
for _, module := range modules {
128+
parsedModule, err := core.ParseModules(module)
129+
if err != nil || parsedModule.Name == "" {
130+
continue
131+
}
132+
for _, param := range parsedModule.Params {
133+
for k, v := range param {
134+
135+
_, exist := parameters[k]
136+
if parsedFlow.ForceParams && exist {
137+
utils.DebugF("Skip override param: %v --> %v", k, v)
138+
continue
139+
}
140+
parameters[k] = v
141+
}
142+
143+
}
144+
totalSteps += len(parsedModule.Steps)
145+
totalModules++
146+
}
147+
}
148+
149+
var toggleFlags, skippingFlags []string
150+
for key, value := range parameters {
151+
if value == "true" {
152+
value = color.GreenString(value)
153+
} else if value == "false" {
154+
value = color.RedString(value)
155+
} else {
156+
157+
value = color.CyanString(value)
158+
}
159+
160+
if strings.HasPrefix(key, "enable") {
161+
toggleFlags = append(toggleFlags, fmt.Sprintf("%v=%v", key, value))
162+
}
163+
164+
if strings.HasPrefix(key, "skip") {
165+
skippingFlags = append(skippingFlags, fmt.Sprintf("%v=%v", key, value))
166+
}
167+
}
168+
169+
workflowInfo := fmt.Sprintf("Name: %v", color.HiCyanString(parsedFlow.Name)) + ", " + fmt.Sprintf("Total Steps: %v", color.HiCyanString("%v", totalSteps)) + ", " + fmt.Sprintf("Total Modules: %v", color.HiCyanString("%v", totalModules))
170+
content = append(content, []string{
171+
"Workflow Information", workflowInfo,
172+
})
173+
content = append(content, []string{
174+
"Description", parsedFlow.Desc,
175+
})
176+
177+
content = append(content, []string{
178+
"Toggleable parameter", strings.Join(toggleFlags, ", "),
179+
})
180+
181+
content = append(content, []string{
182+
"Skippable parameter", strings.Join(skippingFlags, ", "),
183+
})
184+
185+
if parsedFlow.Usage != "" {
186+
content = append(content, []string{
187+
"Examples Commands", strings.TrimSpace(parsedFlow.Usage),
188+
})
189+
}
190+
191+
table := tablewriter.NewWriter(os.Stdout)
192+
table.SetRowLine(true)
193+
table.SetBorders(tablewriter.Border{Left: true, Top: true, Right: true, Bottom: true})
194+
table.SetColWidth(120)
195+
table.SetAutoWrapText(false)
196+
table.AppendBulk(content)
197+
table.Render()
198+
199+
return nil
200+
}

core/db.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ func (r *Runner) DBNewScan() {
119119
InputName: r.Input,
120120
InputType: r.InputType,
121121

122+
MarkDownSunmmary: path.Join(r.WorkspaceFolder, "summary.md"),
123+
MarkDownReport: path.Join(r.WorkspaceFolder, "summary.html"),
124+
122125
LogFile: r.Opt.LogFile,
123126
Target: r.TargetObj,
124127
ProcessID: os.Getpid(),
@@ -178,6 +181,13 @@ func (r *Runner) DBDoneScan() {
178181
utils.WriteToFile(r.DoneFile, runtimeData)
179182
utils.WriteToFile(r.RuntimeFile, runtimeData)
180183
}
184+
185+
if utils.FileExists(r.ScanObj.MarkDownReport) {
186+
utils.InforF("Markdown summary has been generated at: %v", color.GreenString(r.ScanObj.MarkDownReport))
187+
}
188+
if utils.FileExists(r.ScanObj.MarkDownSunmmary) {
189+
utils.InforF("HTML summary has been generated at: %v", color.GreenString(r.ScanObj.MarkDownSunmmary))
190+
}
181191
}
182192

183193
func (r *Runner) DBRuntimeUpdate() {

core/external.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,5 +285,14 @@ func (r *Runner) LoadGitScripts() string {
285285

286286
/* --- end Gitlab API --- */
287287

288+
// GenMarkdownReport("markdown.md", "output.html")
289+
vm.Set(GenMarkdownReport, func(call otto.FunctionCall) otto.Value {
290+
args := call.ArgumentList
291+
markdownFile := args[0].String()
292+
outputHTML := args[1].String()
293+
r.GenMarkdownReport(markdownFile, outputHTML)
294+
return otto.Value{}
295+
})
296+
288297
return output
289298
}

0 commit comments

Comments
 (0)