mirror of
https://github.com/lunchcat/sif.git
synced 2026-03-12 21:23:04 -07:00
Use nuclei API to scan nuclei templates
This commit is contained in:
73
internal/nuclei/templates/templates.go
Normal file
73
internal/nuclei/templates/templates.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package templates
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"compress/gzip"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/charmbracelet/log"
|
||||
)
|
||||
|
||||
const (
|
||||
archive = "https://github.com/projectdiscovery/nuclei-templates/archive/refs/tags/v%s.tar.gz"
|
||||
ref = "9.6.2"
|
||||
)
|
||||
|
||||
func Install(logger *log.Logger) error {
|
||||
// Check if already exists
|
||||
if _, err := os.Stat("nuclei-templates"); err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
logger.Infof("nuclei-templates directory not found. Installing...")
|
||||
|
||||
resp, err := http.Get(fmt.Sprintf(archive, ref))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
tarball, err := gzip.NewReader(resp.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tarball.Close()
|
||||
|
||||
data := tar.NewReader(tarball)
|
||||
|
||||
for {
|
||||
header, err := data.Next()
|
||||
if errors.Is(io.EOF, err) {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch header.Typeflag {
|
||||
case tar.TypeDir:
|
||||
if err := os.Mkdir(header.Name, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
case tar.TypeReg:
|
||||
file, err := os.Create(header.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := io.Copy(file, data); err != nil {
|
||||
return err
|
||||
}
|
||||
file.Close()
|
||||
}
|
||||
}
|
||||
|
||||
if err = os.Rename(fmt.Sprintf("nuclei-templates-%s", ref), "nuclei-templates"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user