This commit is contained in:
Tomoya AMACHI
2019-04-25 01:05:15 +09:00
parent 5529c83920
commit 6a2ca8f74f
8 changed files with 352 additions and 4 deletions

View File

@@ -0,0 +1,51 @@
package amazonlinux
import (
"bufio"
"bytes"
"errors"
"fmt"
"strings"
"github.com/knqyf263/fanal/analyzer/os"
"github.com/knqyf263/fanal/analyzer"
"github.com/knqyf263/fanal/extractor"
)
func init() {
analyzer.RegisterOSAnalyzer(&amazonlinuxOSAnalyzer{})
}
type amazonlinuxOSAnalyzer struct{}
func (a amazonlinuxOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
for _, filename := range a.RequiredFiles() {
file, ok := fileMap[filename]
if !ok {
continue
}
scanner := bufio.NewScanner(bytes.NewBuffer(file))
for scanner.Scan() {
line := scanner.Text()
fields := strings.Fields(line)
// Amazon Linuxという名称が確認できたときのみ
if strings.HasPrefix(line, "Amazon Linux release 2") {
return analyzer.OS{
Family: os.Amazon,
Name: fmt.Sprintf("%s %s", fields[3], fields[4]),
}, nil
} else if strings.HasPrefix(line, "Amazon Linux") {
return analyzer.OS{
Family: os.Amazon,
Name: strings.Join(fields[2:], " "),
}, nil
}
}
}
return analyzer.OS{}, errors.New("amzn: Not match")
}
func (a amazonlinuxOSAnalyzer) RequiredFiles() []string {
return []string{"etc/system-release"}
}

43
analyzer/os/const.go Normal file
View File

@@ -0,0 +1,43 @@
package os
const (
// RedHat is done
RedHat = "redhat"
// Debian is done
Debian = "debian"
// Ubuntu is done
Ubuntu = "ubuntu"
// CentOS is done
CentOS = "centos"
// Fedora is done
Fedora = "fedora"
// Amazon is done
Amazon = "amazon"
// Oracle is done
Oracle = "oracle"
// FreeBSD currently doesn't support docker
// FreeBSD = "freebsd"
// Windows only run windows os
// TODO : support windows
Windows = "windows"
// OpenSUSE is done
OpenSUSE = "opensuse"
// OpenSUSELeap is
OpenSUSELeap = "opensuse.leap"
// OpenSUSETumbleweed is done
OpenSUSETumbleweed = "opensuse.tumbleweed"
// Alpine is done
Alpine = "alpine"
)

View File

@@ -0,0 +1,44 @@
package debian
import (
"bufio"
"bytes"
"errors"
"regexp"
"strings"
"github.com/knqyf263/fanal/analyzer/os"
"github.com/knqyf263/fanal/analyzer"
"github.com/knqyf263/fanal/extractor"
)
func init() {
analyzer.RegisterOSAnalyzer(&debianOSAnalyzer{})
}
type debianOSAnalyzer struct{}
func (a debianOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
for _, filename := range a.RequiredFiles() {
file, ok := fileMap[filename]
if !ok {
continue
}
scanner := bufio.NewScanner(bytes.NewBuffer(file))
for scanner.Scan() {
line := scanner.Text()
// Ubuntu also exist debian_version, but format is not number
re := regexp.MustCompile(`(\d+).(\d+)`)
if re.MatchString(strings.TrimSpace(line)) {
return analyzer.OS{Family: os.Debian, Name: line}, nil
}
}
}
return analyzer.OS{}, errors.New("debian: Not match")
}
func (a debianOSAnalyzer) RequiredFiles() []string {
return []string{"etc/debian_version"}
}

View File

@@ -0,0 +1,57 @@
package opensuse
import (
"bufio"
"bytes"
"errors"
"strings"
"github.com/knqyf263/fanal/analyzer/os"
"github.com/knqyf263/fanal/analyzer"
"github.com/knqyf263/fanal/extractor"
)
func init() {
analyzer.RegisterOSAnalyzer(&opensuseOSAnalyzer{})
}
type opensuseOSAnalyzer struct{}
// TODO : opensuse/tumbleweed, opensuse/leap のimageのときうまくいかないので調査
// そもそも os-release のファイル自体が認識されていない
func (a opensuseOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
for _, filename := range a.RequiredFiles() {
file, ok := fileMap[filename]
if !ok {
continue
}
suseName := ""
scanner := bufio.NewScanner(bytes.NewBuffer(file))
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, "NAME=\"openSUSE") {
if strings.Contains(line, "Leap") {
suseName = os.OpenSUSELeap
} else if strings.Contains(line, "Tumbleweed") {
suseName = os.OpenSUSETumbleweed
} else {
suseName = os.OpenSUSE
}
continue
}
if suseName != "" && strings.HasPrefix(line, "VERSION_ID=") {
return analyzer.OS{
Family: suseName,
Name: strings.TrimSpace(line[12 : len(line)-1]),
}, nil
}
}
}
return analyzer.OS{}, errors.New("opensuse: Not match")
}
func (a opensuseOSAnalyzer) RequiredFiles() []string {
return []string{"etc/os-release"}
}

View File

@@ -0,0 +1,101 @@
package redhatbase
import (
"bufio"
"bytes"
"errors"
"regexp"
"strings"
"github.com/knqyf263/fanal/analyzer/os"
"github.com/knqyf263/fanal/analyzer"
"github.com/knqyf263/fanal/extractor"
)
func init() {
analyzer.RegisterOSAnalyzer(&redhatOSAnalyzer{})
}
type redhatOSAnalyzer struct{}
var redhatRe = regexp.MustCompile(`(.*) release (\d[\d\.]*)`)
func (a redhatOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
if file, ok := fileMap["etc/centos-release"]; ok {
scanner := bufio.NewScanner(bytes.NewBuffer(file))
for scanner.Scan() {
line := scanner.Text()
result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
if len(result) != 3 {
return analyzer.OS{}, errors.New("cent: Invalid centos-release")
}
switch strings.ToLower(result[1]) {
case "centos", "centos linux":
return analyzer.OS{Family: os.CentOS, Name: result[2]}, nil
}
}
}
if file, ok := fileMap["etc/oracle-release"]; ok {
scanner := bufio.NewScanner(bytes.NewBuffer(file))
for scanner.Scan() {
line := scanner.Text()
result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
if len(result) != 3 {
return analyzer.OS{}, errors.New("oracle: Invalid oracle-release")
}
return analyzer.OS{Family: os.Oracle, Name: result[2]}, nil
}
}
if file, ok := fileMap["etc/fedora-release"]; ok {
scanner := bufio.NewScanner(bytes.NewBuffer(file))
for scanner.Scan() {
line := scanner.Text()
result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
if len(result) != 3 {
return analyzer.OS{}, errors.New("cent: Invalid fedora-release")
}
switch strings.ToLower(result[1]) {
case "fedora", "fedora linux":
return analyzer.OS{Family: os.Fedora, Name: result[2]}, nil
}
}
}
if file, ok := fileMap["etc/redhat-release"]; ok {
scanner := bufio.NewScanner(bytes.NewBuffer(file))
for scanner.Scan() {
line := scanner.Text()
result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
if len(result) != 3 {
return analyzer.OS{}, errors.New("redhat: Invalid redhat-release")
}
switch strings.ToLower(result[1]) {
case "centos", "centos linux":
return analyzer.OS{Family: os.CentOS, Name: result[2]}, nil
case "oracle", "oracle linux", "oracle linux server":
return analyzer.OS{Family: os.Oracle, Name: result[2]}, nil
case "fedora", "fedora linux":
return analyzer.OS{Family: os.Fedora, Name: result[2]}, nil
default:
return analyzer.OS{Family: os.RedHat, Name: result[2]}, nil
}
}
}
return analyzer.OS{}, errors.New("redhatbase : Not match")
}
func (a redhatOSAnalyzer) RequiredFiles() []string {
return []string{
"etc/redhat-release",
"etc/oracle-release",
"etc/fedora-release",
"etc/centos-release",
}
}

View File

@@ -0,0 +1,49 @@
package ubuntu
import (
"bufio"
"bytes"
"errors"
"strings"
"github.com/knqyf263/fanal/analyzer/os"
"github.com/knqyf263/fanal/analyzer"
"github.com/knqyf263/fanal/extractor"
)
func init() {
analyzer.RegisterOSAnalyzer(&ubuntuOSAnalyzer{})
}
type ubuntuOSAnalyzer struct{}
func (a ubuntuOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
for _, filename := range a.RequiredFiles() {
file, ok := fileMap[filename]
if !ok {
continue
}
isUbuntu := false
scanner := bufio.NewScanner(bytes.NewBuffer(file))
for scanner.Scan() {
line := scanner.Text()
if line == "DISTRIB_ID=Ubuntu" {
isUbuntu = true
continue
}
if isUbuntu && strings.HasPrefix(line, "DISTRIB_RELEASE=") {
return analyzer.OS{
Family: os.Ubuntu,
Name: strings.TrimSpace(line[16:]),
}, nil
}
}
}
return analyzer.OS{}, errors.New("ubuntu: Not match")
}
func (a ubuntuOSAnalyzer) RequiredFiles() []string {
return []string{"etc/lsb-release"}
}

View File

@@ -4,7 +4,6 @@ import (
"bufio"
"bytes"
"errors"
"fmt"
"log"
"regexp"
"strings"
@@ -33,7 +32,6 @@ func (a debianPkgAnalyzer) Analyze(fileMap extractor.FileMap) (pkgs []analyzer.P
detected := false
for _, filename := range a.RequiredFiles() {
file, ok := fileMap[filename]
fmt.Println(filename)
if !ok {
continue
}
@@ -96,8 +94,6 @@ func (a debianPkgAnalyzer) parseDpkgPkg(scanner *bufio.Scanner) (binPkg *analyze
if line == "" {
break
}
fmt.Println(line)
if strings.HasPrefix(line, "Package: ") {
name = strings.TrimSpace(strings.TrimPrefix(line, "Package: "))
} else if strings.HasPrefix(line, "Source: ") {

View File

@@ -8,7 +8,14 @@ import (
"github.com/knqyf263/fanal/analyzer"
_ "github.com/knqyf263/fanal/analyzer/os/alpine"
_ "github.com/knqyf263/fanal/analyzer/os/amazonlinux"
_ "github.com/knqyf263/fanal/analyzer/os/debian"
_ "github.com/knqyf263/fanal/analyzer/os/opensuse"
_ "github.com/knqyf263/fanal/analyzer/os/redhatbase"
_ "github.com/knqyf263/fanal/analyzer/os/ubuntu"
_ "github.com/knqyf263/fanal/analyzer/pkg/apk"
_ "github.com/knqyf263/fanal/analyzer/pkg/dpkg"
_ "github.com/knqyf263/fanal/analyzer/pkg/rpm"
"golang.org/x/crypto/ssh/terminal"
)