Skip to content

Commit

Permalink
Merge pull request #1 from limanmys/feature/alternative-packages
Browse files Browse the repository at this point in the history
Feature/alternative packages
  • Loading branch information
zekiahmetbayar authored Jan 12, 2024
2 parents 55eb7ee + 14829b9 commit 36af4c4
Show file tree
Hide file tree
Showing 13 changed files with 134 additions and 27 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@ jobs:
mkdir -p $SERVER_BIN_PATH
mkdir -p $SERVER_BIN_PATH/reports
mkdir -p $SERVER_BIN_PATH/wmi
mkdir -p $SERVER_BIN_PATH/storage
mv wmi.so $SERVER_BIN_PATH/wmi/
mv storage/alternatives.csv $SERVER_BIN_PATH/storage/
cp ./scripts/debian/control $DEBIAN_PATH/control
sed -i s/%VERSION%/${{ github.run_number }}/g $DEBIAN_PATH/control
Expand Down
24 changes: 17 additions & 7 deletions app/controllers/packages/packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,33 @@ import (
"github.com/limanmys/inventory-server/internal/search"
"github.com/limanmys/inventory-server/pkg/jobs"
"github.com/limanmys/inventory-server/pkg/reporter"
"gorm.io/gorm/clause"
)

type PackageWithAssetCount struct {
entities.Package
Count int `json:"count"`
}

// Index, returns asset's packages
func Index(c *fiber.Ctx) error {
// Build sql query
sub_query := database.Connection().
Model(&entities.Package{}).
Select("packages.name", "count(*)", "null as updated_at", "null as deleted_at").
Select("packages.name", "count(*)", "null as updated_at", "null as deleted_at", "alternative_package_id").
Joins("inner join asset_packages ap on ap.package_id = packages.id").
Joins("inner join assets on assets.id = ap.asset_id").
Group("packages.name").Order("count desc")
Group("packages.name").Group("alternative_package_id").Order("count desc")

db := database.Connection().Table("(?) as t1", sub_query)
db := database.Connection().Preload(clause.Associations).Table("(?) as t1", sub_query)

// Apply search, if exists
if c.Query("search") != "" {
search.Search(c.Query("search"), db)
}

// Get data
var packages []map[string]interface{}
var packages []PackageWithAssetCount
page, err := paginator.New(db, c).Paginate(&packages)
if err != nil {
return err
Expand All @@ -47,13 +53,17 @@ func Report(c *fiber.Ctx) error {
// Build query
db := database.Connection().
Model(&entities.Package{}).
Select("packages.name", "count(*)").
Select(
"packages.name",
"count(*)",
"coalesce(alternative_packages.name, '-') as alternative_package").
Joins("inner join asset_packages ap on ap.package_id = packages.id").
Joins("inner join assets on assets.id = ap.asset_id").
Group("packages.name").Order("count desc")
Joins("left join alternative_packages on alternative_packages.id = packages.alternative_package_id ").
Group("packages.name, alternative_packages.name").Order("count desc")

// Create report as go routine
go reporter.CreatePackageReport(job, db, []string{"name", "count"})
go reporter.CreatePackageReport(job, db, []string{"name", "count", "alternative_package"})

return c.JSON(fiber.Map{"id": job.ID.String()})
}
9 changes: 9 additions & 0 deletions app/entities/AlternativePackage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package entities

type AlternativePackage struct {
Base
Name string `json:"name"`
URL string `json:"url"`
PackageName string `json:"package_name"`
Packages []*Package `json:"packages"`
}
12 changes: 8 additions & 4 deletions app/entities/Package.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package entities

import "github.com/google/uuid"

type Package struct {
Base
Name string `json:"name"`
Version string `json:"version"`
Vendor string `json:"vendor"`
Assets []*Asset `json:"assets" gorm:"many2many:asset_packages"`
Name string `json:"name"`
Version string `json:"version"`
Vendor string `json:"vendor"`
Assets []*Asset `json:"assets" gorm:"many2many:asset_packages"`
AlternativePackageID *uuid.UUID `json:"alternative_package_id"`
AlternativePackage *AlternativePackage `json:"alternative_package"`
}
22 changes: 19 additions & 3 deletions cmd/server/main.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"flag"
"log"

_ "github.com/joho/godotenv/autoload"
Expand All @@ -12,13 +13,23 @@ import (
"github.com/gofiber/fiber/v2/middleware/recover"
"github.com/limanmys/inventory-server/app/routes"
"github.com/limanmys/inventory-server/internal/migrations"
"github.com/limanmys/inventory-server/internal/seeds"
"github.com/limanmys/inventory-server/internal/server"
)

func main() {
runType := flag.String("type", "admin", "Server's run type.")
flag.Parse()

// Migrate tables
if !fiber.IsChild() {
migrations.Migrate()
//Migrate tables
if err := migrations.Migrate(); err != nil {
log.Println("error when migrating tables, ", err.Error())
}

// Seed alternative packages
seeds.Init()
}

// Create Fiber App
Expand All @@ -39,6 +50,11 @@ func main() {
// Mount routes
routes.Routes(app)

// Start server
log.Fatal(app.Listen("127.0.0.1:7806"))
if *runType == "admin" {
// Start server
log.Fatal(app.Listen("127.0.0.1:7806"))
} else if *runType == "test" {
// Start test server
log.Fatal(app.Listen("0.0.0.0:7825"))
}
}
5 changes: 3 additions & 2 deletions internal/constants/constants.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package constants

const (
REPORT_SAVE_PATH = "./reports/"
WMI_SO_PATH = "./wmi/wmi.so"
REPORT_SAVE_PATH = "./reports/"
WMI_SO_PATH = "./wmi/wmi.so"
ALTERNATIVES_CSV_PATH = "./storage/alternatives.csv"
)
3 changes: 3 additions & 0 deletions internal/migrations/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import (
)

func Migrate() error {
if err := database.Connection().AutoMigrate(&entities.AlternativePackage{}); err != nil {
return err
}
if err := database.Connection().AutoMigrate(&entities.Discovery{}); err != nil {
return err
}
Expand Down
47 changes: 47 additions & 0 deletions internal/seeds/seeds.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package seeds

import (
"encoding/csv"
"log"
"os"

"github.com/limanmys/inventory-server/app/entities"
"github.com/limanmys/inventory-server/internal/constants"
"github.com/limanmys/inventory-server/internal/database"
)

// Init, seeds alternative packages
func Init() {
// Open alternatives.csv
file, err := os.Open(constants.ALTERNATIVES_CSV_PATH)
if err != nil {
log.Println("error when reading package alternatives, " + err.Error())
return
}

// Close file after function end
defer file.Close()

// Read all rows from csv
records, err := csv.NewReader(file).ReadAll()
if err != nil {
log.Println("error when reading records, " + err.Error())
return
}

// Create records
for idx, record := range records {
// If row is wrong or title row
if len(record) != 3 || idx == 0 {
continue
}
// Create record on database
if err := database.Connection().Where("name = ?", record[0]).FirstOrCreate(&entities.AlternativePackage{
Name: record[0],
URL: record[1],
PackageName: record[2],
}).Error; err != nil {
log.Println("error when creating alternative package, " + err.Error())
}
}
}
13 changes: 13 additions & 0 deletions pkg/discovery/discovery.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import "C"
import (
"encoding/base64"
"encoding/json"
"fmt"

"github.com/limanmys/inventory-server/app/entities"
"github.com/limanmys/inventory-server/internal/constants"
Expand Down Expand Up @@ -125,12 +126,24 @@ func Start(discovery entities.Discovery) {

// If package does not exists
if count == 0 {

// Check package has alternative
var alternative entities.AlternativePackage
database.Connection().Model(&entities.AlternativePackage{}).
Where("LOWER(package_name) LIKE LOWER(?)", fmt.Sprintf("%%%s%%", pkg.Name)).
First(&alternative)

if alternative.ID != nil {
pkg.AlternativePackageID = alternative.ID
}

database.Connection().Clauses(clause.Returning{}).Create(&pkg)
} else {
// Find package
database.Connection().Model(&entities.Package{}).
Where("name = ? and version = ?", pkg.Name, pkg.Version).First(&pkg)
}

// Append package to asset packages
assetPackages = append(assetPackages, pkg)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/reporter/reporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func CreatePackageReport(job *entities.Job, db *gorm.DB, columns []string) {
// Build report body
body := map[string]interface{}{
"date": time.Now().Format("01-02-2006 15:04:05"),
"header": "Inventory Server | Packages Report",
"header": "Packages Report",
"readable_columns": humanize(columns),
"template_id": "template.docx",
"columns": columns,
Expand Down
10 changes: 5 additions & 5 deletions scripts/debian/postinst
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ fi

echo """
[Unit]
Description=Inventory Server
Description=Inventory Server (%I)
[Service]
Type=simple
WorkingDirectory=/opt/inventory-server
ExecStart=/opt/inventory-server/inventory-server
ExecStart=/opt/inventory-server/inventory-server -type=%i
Restart=always
RestartSec=10
SyslogIdentifier=inventory
Expand All @@ -20,8 +20,8 @@ User=root
Group=root
[Install]
WantedBy=multi-user.target
""" > /etc/systemd/system/inventory-server.service
""" > /etc/systemd/system/inventory-server@.service

systemctl daemon-reload
systemctl enable inventory-server.service
systemctl restart inventory-server.service
systemctl enable inventory-server@admin.service
systemctl restart inventory-server@admin.service
10 changes: 5 additions & 5 deletions scripts/redhat/inventory-server.spec
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ fi

echo """
[Unit]
Description=Inventory Server
Description=Inventory Server (%I)
[Service]
Type=simple
WorkingDirectory=/opt/inventory-server
ExecStart=/opt/inventory-server/inventory-server
ExecStart=/opt/inventory-server/inventory-server -type=%i
Restart=always
RestartSec=10
SyslogIdentifier=inventory
Expand All @@ -42,11 +42,11 @@ User=root
Group=root
[Install]
WantedBy=multi-user.target
""" > /etc/systemd/system/inventory-server.service
""" > /etc/systemd/system/inventory-server@.service

systemctl daemon-reload
systemctl enable inventory-server.service
systemctl restart inventory-server.service
systemctl enable inventory-server@admin.service
systemctl restart inventory-server@admin.service

%clean

Expand Down
2 changes: 2 additions & 0 deletions storage/alternatives.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Name,URL,Package Name
Okular,https://okular.kde.org/tr/,Adobe Acrobat (64-bit)

0 comments on commit 36af4c4

Please sign in to comment.