Skip to content
This repository has been archived by the owner on Jun 21, 2022. It is now read-only.

Commit

Permalink
check OS
Browse files Browse the repository at this point in the history
  • Loading branch information
tomoyamachi committed Apr 24, 2019
1 parent 8f51fe2 commit 7c77fce
Show file tree
Hide file tree
Showing 8 changed files with 352 additions and 4 deletions.
51 changes: 51 additions & 0 deletions analyzer/os/amazonlinux/amazonlinux.go
Original file line number Diff line number Diff line change
@@ -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 changes: 43 additions & 0 deletions analyzer/os/const.go
Original file line number Diff line number Diff line change
@@ -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"
)
44 changes: 44 additions & 0 deletions analyzer/os/debian/debian.go
Original file line number Diff line number Diff line change
@@ -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"}
}
57 changes: 57 additions & 0 deletions analyzer/os/opensuse/opensuse.go
Original file line number Diff line number Diff line change
@@ -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"}
}
101 changes: 101 additions & 0 deletions analyzer/os/redhatbase/redhatbase.go
Original file line number Diff line number Diff line change
@@ -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",
}
}
49 changes: 49 additions & 0 deletions analyzer/os/ubuntu/ubuntu.go
Original file line number Diff line number Diff line change
@@ -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"}
}
4 changes: 0 additions & 4 deletions analyzer/pkg/dpkg/dpkg.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"bufio"
"bytes"
"errors"
"fmt"
"log"
"regexp"
"strings"
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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: ") {
Expand Down
7 changes: 7 additions & 0 deletions cmd/fanal/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down

0 comments on commit 7c77fce

Please sign in to comment.