Add support for Linux ARM64 (#19931)

#1845

Co-authored-by: Lucas Manuel Rodriguez <lucas@fleetdm.com>
Co-authored-by: Roberto Dip <rroperzh@gmail.com>
This commit is contained in:
Dante Catalfamo
2024-07-17 16:07:59 -04:00
committed by GitHub
co-authored by Lucas Manuel Rodriguez Roberto Dip
parent d20ccd65d7
commit ecf2346ace
27 changed files with 424 additions and 38 deletions
+1 -1
View File
@@ -296,7 +296,7 @@ jobs:
- name: Build Repository and run TUF server
env:
SYSTEMS: "macos windows linux"
SYSTEMS: "macos windows linux linux-arm64"
PKG_FLEET_URL: ${{ needs.gen.outputs.address }}
PKG_TUF_URL: http://localhost:8081
DEB_FLEET_URL: ${{ needs.gen.outputs.address }}
@@ -157,3 +157,31 @@ jobs:
with:
name: desktop.tar.gz
path: desktop.tar.gz
desktop-linux-arm64:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0
with:
egress-policy: audit
- name: Install Go
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
with:
go-version: ${{ vars.GO_VERSION }}
- name: Checkout
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
- name: Generate desktop.tar.gz
run: |
FLEET_DESKTOP_VERSION=$FLEET_DESKTOP_VERSION \
make desktop-linux-arm64
- name: Upload desktop.tar.gz
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # 4.3.3
with:
name: desktop-arm64.tar.gz
path: desktop.tar.gz
@@ -76,6 +76,35 @@ jobs:
name: osqueryd
path: opt/osquery/bin/osqueryd
generate-linux-arm64:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0
with:
egress-policy: audit
- name: Checkout
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
- name: Install file
run: |
sudo apt-get install -y file
- name: Download and extract osqueryd for linux-arm64
run: |
curl -L https://github.com/osquery/osquery/releases/download/${{ env.OSQUERY_VERSION }}/osquery_${{ env.OSQUERY_VERSION }}-1.linux_arm64.deb --output osquery.deb
ar x osquery.deb
tar xf data.tar.gz
chmod +x ./opt/osquery/bin/osqueryd
file ./opt/osquery/bin/osqueryd | grep aarch64
- name: Upload osqueryd for linux-arm64
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v2
with:
name: osqueryd-arm64
path: opt/osquery/bin/osqueryd
generate-windows:
runs-on: windows-latest
steps:
+33
View File
@@ -106,6 +106,39 @@ jobs:
name: orbit-linux
path: dist/orbit_linux_amd64_v1/orbit
goreleaser-linux-arm64:
runs-on: ubuntu-20.04
permissions:
contents: read
steps:
- name: Harden Runner
uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0
with:
egress-policy: audit
- name: Checkout
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
# Note that goreleaser does not like the orbit- prefixed flag unless you use the closed-source
# paid version. We pay for goreleaser, but using the closed source build would weaken our
# supply-chain integrity goals, so we hack around it by replacing the tag.
- name: Replace tag
run: git tag $(echo ${{ github.ref_name }} | sed -e 's/orbit-//g') && git tag -d ${{ github.ref_name }}
- name: Set up Go
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
with:
go-version: ${{ vars.GO_VERSION }}
- name: Run GoReleaser
run: go run github.com/goreleaser/goreleaser@56c9d09a1b925e2549631c6d180b0a1c2ebfac82 release --debug --rm-dist --skip-publish -f orbit/goreleaser-linux-arm64.yml # v1.20.0
- name: Upload
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # 4.3.3
with:
name: orbit-linux-arm64
path: dist/orbit_linux_arm64_v1/orbit
goreleaser-windows:
runs-on: windows-2022
permissions:
+18 -1
View File
@@ -249,13 +249,15 @@ fleetd-tables-windows:
GOOS=windows GOARCH=amd64 go build -o fleetd_tables_windows.exe ./orbit/cmd/fleetd_tables
fleetd-tables-linux:
GOOS=linux GOARCH=amd64 go build -o fleetd_tables_linux.ext ./orbit/cmd/fleetd_tables
fleetd-tables-linux-arm64:
GOOS=linux GOARCH=arm64 go build -o fleetd_tables_linux_arm64.ext ./orbit/cmd/fleetd_tables
fleetd-tables-darwin:
GOOS=darwin GOARCH=amd64 go build -o fleetd_tables_darwin.ext ./orbit/cmd/fleetd_tables
fleetd-tables-darwin_arm:
GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build -o fleetd_tables_darwin_arm.ext ./orbit/cmd/fleetd_tables
fleetd-tables-darwin-universal: fleetd-tables-darwin fleetd-tables-darwin_arm
lipo -create fleetd_tables_darwin.ext fleetd_tables_darwin_arm.ext -output fleetd_tables_darwin_universal.ext
fleetd-tables-all: fleetd-tables-windows fleetd-tables-linux fleetd-tables-darwin-universal
fleetd-tables-all: fleetd-tables-windows fleetd-tables-linux fleetd-tables-darwin-universal fleetd-tables-linux-arm64
fleetd-tables-clean:
rm -f fleetd_tables_windows.exe fleetd_tables_linux.ext fleetd_tables_darwin.ext fleetd_tables_darwin_arm.ext fleetd_tables_darwin_universal.ext
@@ -465,6 +467,21 @@ desktop-linux:
tar czf desktop.tar.gz fleet-desktop && \
rm -r fleet-desktop"
# Build desktop executable for Linux ARM.
#
# Usage:
# FLEET_DESKTOP_VERSION=0.0.1 make desktop-linux-arm64
#
# Output: desktop.tar.gz
desktop-linux-arm64:
docker build -f Dockerfile-desktop-linux -t desktop-linux-builder .
docker run --rm -v $(shell pwd):/output desktop-linux-builder /bin/bash -c "\
mkdir /output/fleet-desktop && \
GOARCH=arm64 go build -o /output/fleet-desktop/fleet-desktop -ldflags "-X=main.version=$(FLEET_DESKTOP_VERSION)" /usr/src/fleet/orbit/cmd/desktop && \
cd /output && \
tar czf desktop.tar.gz fleet-desktop && \
rm -r fleet-desktop"
# Build orbit executable for Windows.
# This generates orbit executable for Windows that includes versioninfo binary properties
# These properties can be displayed when right-click on the binary in Windows Explorer.
+2
View File
@@ -0,0 +1,2 @@
* Added support for generating fleetd packages for Linux ARM64
* fleetctl: New `fleetctl package` --arch flag
+20
View File
@@ -38,6 +38,12 @@ func packageCommand() *cli.Command {
Usage: "Type of package to build",
Required: true,
},
&cli.StringFlag{
Name: "arch",
Usage: "Target CPU Architecture for the installer package (Only supported with '--type' deb or rpm)",
Destination: &opt.Architecture,
Value: "amd64",
},
&cli.StringFlag{
Name: "enroll-secret",
Usage: "Enroll secret for authenticating to Fleet server",
@@ -331,6 +337,20 @@ func packageCommand() *cli.Command {
return errors.New("--use-system-configuration is only available for pkg installers")
}
linuxPackage := false
switch c.String("type") {
case "deb", "rpm":
linuxPackage = true
}
if opt.Architecture != packaging.ArchAmd64 && !linuxPackage {
return fmt.Errorf("can't use '--arch' with '--type %s'", c.String("type"))
}
if opt.Architecture != packaging.ArchAmd64 && opt.Architecture != packaging.ArchArm64 {
return errors.New("arch must be one of ('amd64', 'arm64')")
}
var buildFunc func(packaging.Options) (string, error)
switch c.String("type") {
case "pkg":
+2 -2
View File
@@ -259,7 +259,7 @@ func updatesAddFunc(c *cli.Context) error {
case name == "desktop" && platform == "windows":
// This is a special case for the desktop target on Windows.
dstPath = filepath.Join(filepath.Dir(dstPath), constant.DesktopAppExecName+".exe")
case name == "desktop" && platform == "linux":
case name == "desktop" && (platform == "linux" || platform == "linux-arm64"):
// This is a special case for the desktop target on Linux.
dstPath += ".tar.gz"
// The convention for Windows extensions is to use the extension `.ext.exe`
@@ -352,7 +352,7 @@ func updatesRotateCommand() *cli.Command {
Usage: "Rotate signing keys",
ArgsUsage: "<role>",
Description: `Rotate the signing keys used for updates metadata signing. This should be used when keys are compromised or expiring.
role must be one of ['root', 'targets', 'timestamp', 'snapshot']
`,
Flags: updatesFlags(),
+1
View File
@@ -16,6 +16,7 @@ For reference, here are the build configuration files:
- [Goreleaser github workflow](../.github/workflows/goreleaser-orbit.yml)
- Goreleaser configuration file for each platform:
- [goreleaser-linux.yml](./goreleaser-linux.yml)
- [goreleaser-linux-arm64.yml](./goreleaser-linux-arm64.yml)
- [goreleaser-macos.yml](./goreleaser-macos.yml)
- [goreleaser-windows.yml](./goreleaser-windows.yml)
+1
View File
@@ -0,0 +1 @@
* Added support for Linux ARM64
+5 -1
View File
@@ -431,7 +431,11 @@ func main() {
case "windows":
opt.Targets["desktop"] = update.DesktopWindowsTarget
case "linux":
opt.Targets["desktop"] = update.DesktopLinuxTarget
if runtime.GOARCH == "arm64" {
opt.Targets["desktop"] = update.DesktopLinuxArm64Target
} else {
opt.Targets["desktop"] = update.DesktopLinuxTarget
}
default:
log.Fatal().Str("GOOS", runtime.GOOS).Msg("unsupported GOOS for desktop target")
}
+40
View File
@@ -0,0 +1,40 @@
project_name: orbit
#################################################################################################
# If this is updated make sure to update the "How to build from source" section in the README.md.
#################################################################################################
builds:
- id: orbit
dir: ./orbit/cmd/orbit/
binary: orbit
env:
# CGO is enabled intentionally for Linux because some users need to be
# able to use the cgo versions of the networking libraries (see
# https://github.com/fleetdm/fleet/issues/8992)
- CGO_ENABLED=1
goos:
- linux
goarch:
- arm64
flags:
- -trimpath
ldflags:
- -X github.com/fleetdm/fleet/v4/orbit/pkg/build.Version={{.Version}}
- -X github.com/fleetdm/fleet/v4/orbit/pkg/build.Commit={{.Commit}}
- -X github.com/fleetdm/fleet/v4/orbit/pkg/build.Date={{.Date}}
archives:
- id: orbit
builds:
- orbit
name_template: orbit_{{.Version}}_{{.Os}}
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: "{{ .Tag }}-untagged"
changelog:
skip: true
+16 -4
View File
@@ -36,11 +36,19 @@ func buildNFPM(opt Options, pkger nfpm.Packager) (string, error) {
return "", fmt.Errorf("create orbit dir: %w", err)
}
if opt.Architecture != ArchAmd64 && opt.Architecture != ArchArm64 {
return "", fmt.Errorf("Invalid architecture: %s", opt.Architecture)
}
// Initialize autoupdate metadata
updateOpt := update.DefaultOptions
updateOpt.RootDirectory = orbitRoot
updateOpt.Targets = update.LinuxTargets
if opt.Architecture == ArchArm64 {
updateOpt.Targets = update.LinuxArm64Targets
} else {
updateOpt.Targets = update.LinuxTargets
}
updateOpt.ServerCertificatePath = opt.UpdateTLSServerCertificate
if opt.UpdateTLSClientCertificate != "" {
@@ -52,7 +60,11 @@ func buildNFPM(opt Options, pkger nfpm.Packager) (string, error) {
}
if opt.Desktop {
updateOpt.Targets["desktop"] = update.DesktopLinuxTarget
if opt.Architecture == ArchArm64 {
updateOpt.Targets["desktop"] = update.DesktopLinuxArm64Target
} else {
updateOpt.Targets["desktop"] = update.DesktopLinuxTarget
}
// Override default channel with the provided value.
updateOpt.Targets.SetTargetChannel("desktop", opt.DesktopChannel)
}
@@ -157,7 +169,7 @@ func buildNFPM(opt Options, pkger nfpm.Packager) (string, error) {
},
// Symlink current into /opt/orbit/bin/orbit/orbit
&files.Content{
Source: "/opt/orbit/bin/orbit/linux/" + opt.OrbitChannel + "/orbit",
Source: "/opt/orbit/bin/orbit/" + updateOpt.Targets["orbit"].Platform + "/" + opt.OrbitChannel + "/orbit",
Destination: "/opt/orbit/bin/orbit/orbit",
Type: "symlink",
FileInfo: &files.ContentFileInfo{
@@ -214,7 +226,7 @@ func buildNFPM(opt Options, pkger nfpm.Packager) (string, error) {
Name: "fleet-osquery",
Version: opt.Version,
Description: "Fleet osquery -- runtime and autoupdater",
Arch: "amd64",
Arch: opt.Architecture,
Maintainer: "Fleet Device Management",
Vendor: "Fleet Device Management",
License: "https://github.com/fleetdm/fleet/blob/main/LICENSE",
+7
View File
@@ -127,8 +127,15 @@ type Options struct {
// OsqueryDB is the directory to use for the osquery database.
// If not set, then the default is `$ORBIT_ROOT_DIR/osquery.db`.
OsqueryDB string
// Architecture that the package is being built for. (amd64, arm64)
Architecture string
}
const (
ArchAmd64 string = "amd64"
ArchArm64 string = "arm64"
)
func initializeTempDir() (string, error) {
// Initialize directories
tmpDir, err := os.MkdirTemp("", "orbit-package")
+27
View File
@@ -41,6 +41,19 @@ var (
},
}
LinuxArm64Targets = Targets{
"orbit": TargetInfo{
Platform: "linux-arm64",
Channel: "stable",
TargetFile: "orbit",
},
"osqueryd": TargetInfo{
Platform: "linux-arm64",
Channel: "stable",
TargetFile: "osqueryd",
},
}
WindowsTargets = Targets{
"orbit": TargetInfo{
Platform: "windows",
@@ -82,6 +95,20 @@ var (
},
}
DesktopLinuxArm64Target = TargetInfo{
Platform: "linux-arm64",
Channel: "stable",
TargetFile: "desktop.tar.gz",
ExtractedExecSubPath: []string{"fleet-desktop", constant.DesktopAppExecName},
CustomCheckExec: func(execPath string) error {
cmd := exec.Command(execPath, "--help")
if out, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("exec new version: %s: %w", string(out), err)
}
return nil
},
}
NudgeMacOSTarget = TargetInfo{
Platform: "macos",
Channel: "stable",
+14
View File
@@ -0,0 +1,14 @@
package update
import (
"github.com/theupdateframework/go-tuf/client"
)
var defaultOptions = Options{
RootDirectory: "/opt/orbit",
ServerURL: defaultURL,
RootKeys: defaultRootKeys,
LocalStore: client.MemoryLocalStore(),
InsecureTransport: false,
Targets: LinuxArm64Targets,
}
+34
View File
@@ -493,11 +493,28 @@ func goosFromPlatform(platform string) (string, error) {
return "darwin", nil
case "windows", "linux":
return platform, nil
case "linux-arm64":
return "linux", nil
default:
return "", fmt.Errorf("unknown platform: %s", platform)
}
}
func goarchFromPlatform(platform string) ([]string, error) {
switch platform {
case "macos", "macos-app":
return []string{"amd64", "arm64"}, nil
case "windows":
return []string{"amd64"}, nil
case "linux":
return []string{"amd64"}, nil
case "linux-arm64":
return []string{"arm64"}, nil
default:
return nil, fmt.Errorf("unknown platform: %s", platform)
}
}
// checkExec checks/verifies a downloaded executable target by executing it.
func (u *Updater) checkExec(target, tmpPath string, customCheckExec func(execPath string) error) error {
localTarget, err := u.localTarget(target)
@@ -515,6 +532,23 @@ func (u *Updater) checkExec(target, tmpPath string, customCheckExec func(execPat
return nil
}
platformGOARCH, err := goarchFromPlatform(localTarget.Info.Platform)
if err != nil {
return err
}
var containsArch bool
for _, arch := range platformGOARCH {
if arch == runtime.GOARCH {
containsArch = true
}
}
if !containsArch && strings.HasSuffix(os.Args[0], "fleetctl") {
// Nothing to do, we can't reliably execute a
// cross-architecture binary. This happens when cross-building
// packages
return nil
}
if strings.HasSuffix(tmpPath, ".tar.gz") {
if err := extractTarGz(tmpPath); err != nil {
return fmt.Errorf("extract %q: %w", tmpPath, err)
+7
View File
@@ -39,6 +39,7 @@ func TestMakeRepoPath(t *testing.T) {
}{
{platform: "linux", name: "osqueryd", version: "4.6.0", expected: "osqueryd/linux/4.6.0/osqueryd"},
{platform: "linux", name: "osqueryd", version: "3.3.2", expected: "osqueryd/linux/3.3.2/osqueryd"},
{platform: "linux-arm64", name: "osqueryd", version: "3.3.2", expected: "osqueryd/linux-arm64/3.3.2/osqueryd"},
{platform: "macos", name: "osqueryd", version: "4.6.0", expected: "osqueryd/macos/4.6.0/osqueryd"},
{platform: "macos", name: "osqueryd", version: "3.3.2", expected: "osqueryd/macos/3.3.2/osqueryd"},
{platform: "macos-app", name: "osqueryd", version: "3.3.2", expected: "osqueryd/macos-app/3.3.2/osqueryd.app.tar.gz"},
@@ -89,6 +90,12 @@ func TestLocalTargetPaths(t *testing.T) {
"root/bin/target/linux/stable/fleet-desktop/fleet-desktop",
"root/bin/target/linux/stable/fleet-desktop",
},
{
DesktopLinuxArm64Target,
"root/bin/target/linux-arm64/stable/desktop.tar.gz",
"root/bin/target/linux-arm64/stable/fleet-desktop/fleet-desktop",
"root/bin/target/linux-arm64/stable/fleet-desktop",
},
{
SwiftDialogMacOSTarget,
"root/bin/target/macos/stable/swiftDialog.app.tar.gz",
+7 -1
View File
@@ -23,7 +23,13 @@ if [ "$1" = "remove" ]; then
# Give the parent process time to report the success before removing
echo "inside remove process" >>/tmp/fleet_remove_log.txt
sleep 15
remove_fleet >>/tmp/fleet_remove_log.txt 2>&1
if [ -z "$GITHUB_ACTIONS" ]; then
# We are root
remove_fleet >>/tmp/fleet_remove_log.txt 2>&1
else
# Inside a github action, sudo is passwordless
sudo remove_fleet >>/tmp/fleet_remove_log.txt 2>&1
fi
else
# We are in the parent shell, start the detached child and return success
echo "Removing fleet, system will be unenrolled in 15 seconds..."
+3 -1
View File
@@ -2,11 +2,13 @@
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
mkdir -p $SCRIPT_DIR/macos $SCRIPT_DIR/windows $SCRIPT_DIR/linux
mkdir -p $SCRIPT_DIR/macos $SCRIPT_DIR/windows $SCRIPT_DIR/linux $SCRIPT_DIR/linux-arm64
GOOS=darwin GOARCH=amd64 go build -o $SCRIPT_DIR/macos/hello_world_macos.ext $SCRIPT_DIR
GOOS=windows GOARCH=amd64 go build -o $SCRIPT_DIR/windows/hello_world_windows.ext.exe $SCRIPT_DIR
GOOS=linux GOARCH=amd64 go build -o $SCRIPT_DIR/linux/hello_world_linux.ext $SCRIPT_DIR
GOOS=linux GOARCH=arm64 go build -o $SCRIPT_DIR/linux-arm64/hello_world_linux.ext $SCRIPT_DIR
GOOS=darwin GOARCH=amd64 go build -ldflags '-X "main.extensionName=test_extensions.hello_mars" -X "main.tableName=hello_mars" -X "main.columnValue=mars"' -o $SCRIPT_DIR/macos/hello_mars_macos.ext $SCRIPT_DIR
GOOS=windows GOARCH=amd64 go build -ldflags '-X "main.extensionName=test_extensions.hello_mars" -X "main.tableName=hello_mars" -X "main.columnValue=mars"' -o $SCRIPT_DIR/windows/hello_mars_windows.ext.exe $SCRIPT_DIR
GOOS=linux GOARCH=amd64 go build -ldflags '-X "main.extensionName=test_extensions.hello_mars" -X "main.tableName=hello_mars" -X "main.columnValue=mars"' -o $SCRIPT_DIR/linux/hello_mars_linux.ext $SCRIPT_DIR
GOOS=linux GOARCH=arm64 go build -ldflags '-X "main.extensionName=test_extensions.hello_mars" -X "main.tableName=hello_mars" -X "main.columnValue=mars"' -o $SCRIPT_DIR/linux-arm64/hello_mars_linux.ext $SCRIPT_DIR
@@ -81,9 +81,10 @@ func orbitCommand() *cli.Command {
},
Action: func(c *cli.Context) error {
return downloadComponents("goreleaser-orbit.yaml", gitTag, map[string]string{
"macos": "orbit-macos",
"linux": "orbit-linux",
"windows": "orbit-windows",
"macos": "orbit-macos",
"linux": "orbit-linux",
"linux-arm64": "orbit-linux-arm64",
"windows": "orbit-windows",
}, outputDirectory, githubUsername, githubAPIToken, retry)
},
}
@@ -138,9 +139,10 @@ func desktopCommand() *cli.Command {
},
Action: func(c *cli.Context) error {
return downloadComponents("generate-desktop-targets.yml", gitBranch, map[string]string{
"macos": "desktop.app.tar.gz",
"linux": "desktop.tar.gz",
"windows": "fleet-desktop.exe",
"macos": "desktop.app.tar.gz",
"linux": "desktop.tar.gz",
"linux-arm64": "desktop-arm64.tar.gz",
"windows": "fleet-desktop.exe",
}, outputDirectory, githubUsername, githubAPIToken, retry)
},
}
@@ -250,7 +252,7 @@ func downloadComponents(workflowName string, headBranch string, artifactNames ma
if err := os.RemoveAll(outputDirectory); err != nil {
return err
}
for _, osPath := range []string{"macos", "windows", "linux"} {
for _, osPath := range []string{"macos", "windows", "linux", "linux-arm64"} {
if err := os.MkdirAll(filepath.Join(outputDirectory, osPath), constant.DefaultDirMode); err != nil {
return err
}
@@ -292,6 +294,8 @@ func downloadComponents(workflowName string, headBranch string, artifactNames ma
for _, artifact := range artifactList.Artifacts {
if *artifact.Name == artifactNames["linux"] {
urls["linux"] = *artifact.ArchiveDownloadURL
} else if *artifact.Name == artifactNames["linux-arm64"] {
urls["linux-arm64"] = *artifact.ArchiveDownloadURL
} else if *artifact.Name == artifactNames["macos"] {
urls["macos"] = *artifact.ArchiveDownloadURL
} else if *artifact.Name == artifactNames["windows"] {
@@ -300,13 +304,13 @@ func downloadComponents(workflowName string, headBranch string, artifactNames ma
fmt.Printf("skipping artifact name: %q\n", *artifact.Name)
}
}
if len(urls) == 3 || !retry {
if len(urls) == 4 || !retry {
break
}
fmt.Printf("All artifacts are not available yet, the workflow might still be running, retrying in 60s...\n")
time.Sleep(60 * time.Second)
}
if len(urls) != 3 {
if len(urls) != 4 {
return fmt.Errorf("missing some artifact: %+v", urls)
}
for osName, downloadURL := range urls {
@@ -368,9 +372,10 @@ func osquerydCommand() *cli.Command {
},
Action: func(c *cli.Context) error {
return downloadComponents("generate-osqueryd-targets.yml", gitBranch, map[string]string{
"macos": "osqueryd.app.tar.gz",
"linux": "osqueryd",
"windows": "osqueryd.exe",
"macos": "osqueryd.app.tar.gz",
"linux": "osqueryd",
"linux-arm64": "osqueryd-arm64",
"windows": "osqueryd.exe",
}, outputDirectory, githubUsername, githubAPIToken, retry)
},
}
+11 -5
View File
@@ -38,7 +38,7 @@ clean_up () {
rm -rf "$GO_TOOLS_DIRECTORY"
ARG=$?
exit $ARG
}
}
setup () {
echo "Running setup..."
@@ -90,7 +90,7 @@ setup () {
FLEET_TIMESTAMP_PASSPHRASE=$(op read "op://$TIMESTAMP_PASSPHRASE_1PASSWORD_PATH")
export FLEET_TIMESTAMP_PASSPHRASE
go build -o "$GO_TOOLS_DIRECTORY/replace" "$SCRIPT_DIR/../../tools/tuf/replace"
go build -o "$GO_TOOLS_DIRECTORY/replace" "$SCRIPT_DIR/../../tools/tuf/replace"
go build -o "$GO_TOOLS_DIRECTORY/download-artifacts" "$SCRIPT_DIR/../../tools/tuf/download-artifacts"
}
@@ -106,24 +106,27 @@ promote_component_edge_to_stable () {
component_version=$2
IFS='.' read -r -a version_parts <<< "$component_version"
major=${version_parts[0]}
minor=${version_parts[1]}
major=${version_parts[0]}
minor=${version_parts[1]}
pushd "$TUF_DIRECTORY"
case $component_name in
orbit)
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/orbit/macos/edge/orbit" --platform macos --name orbit --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/orbit/linux/edge/orbit" --platform linux --name orbit --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/orbit/linux-arm64/edge/orbit" --platform linux-arm64 --name orbit --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/orbit/windows/edge/orbit.exe" --platform windows --name orbit --version "$component_version" -t "$major.$minor" -t "$major" -t stable
;;
desktop)
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/desktop/macos/edge/desktop.app.tar.gz" --platform macos --name desktop --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/desktop/linux/edge/desktop.tar.gz" --platform linux --name desktop --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/desktop/linux-arm64/edge/desktop.tar.gz" --platform linux-arm64 --name desktop --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/desktop/windows/edge/fleet-desktop.exe" --platform windows --name desktop --version "$component_version" -t "$major.$minor" -t "$major" -t stable
;;
osqueryd)
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/osqueryd/macos-app/edge/osqueryd.app.tar.gz" --platform macos-app --name osqueryd --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/osqueryd/linux/edge/osqueryd" --platform linux --name osqueryd --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/osqueryd/linux-arm64/edge/osqueryd" --platform linux-arm64 --name osqueryd --version "$component_version" -t "$major.$minor" -t "$major" -t stable
fleetctl updates add --target "$REPOSITORY_DIRECTORY/targets/osqueryd/windows/edge/osqueryd.exe" --platform windows --name osqueryd --version "$component_version" -t "$major.$minor" -t "$major" -t stable
;;
*)
@@ -188,9 +191,11 @@ release_fleetd_to_edge () {
pushd "$TUF_DIRECTORY"
fleetctl updates add --target "$ORBIT_ARTIFACT_DOWNLOAD_DIRECTORY/macos/orbit" --platform macos --name orbit --version "$VERSION" -t edge
fleetctl updates add --target "$ORBIT_ARTIFACT_DOWNLOAD_DIRECTORY/linux/orbit" --platform linux --name orbit --version "$VERSION" -t edge
fleetctl updates add --target "$ORBIT_ARTIFACT_DOWNLOAD_DIRECTORY/linux-arm64/orbit" --platform linux-arm64 --name orbit --version "$VERSION" -t edge
fleetctl updates add --target "$ORBIT_ARTIFACT_DOWNLOAD_DIRECTORY/windows/orbit.exe" --platform windows --name orbit --version "$VERSION" -t edge
fleetctl updates add --target "$DESKTOP_ARTIFACT_DOWNLOAD_DIRECTORY/macos/desktop.app.tar.gz" --platform macos --name desktop --version "$VERSION" -t edge
fleetctl updates add --target "$DESKTOP_ARTIFACT_DOWNLOAD_DIRECTORY/linux/desktop.tar.gz" --platform linux --name desktop --version "$VERSION" -t edge
fleetctl updates add --target "$DESKTOP_ARTIFACT_DOWNLOAD_DIRECTORY/linux-arm64/desktop.tar.gz" --platform linux-arm64 --name desktop --version "$VERSION" -t edge
fleetctl updates add --target "$DESKTOP_ARTIFACT_DOWNLOAD_DIRECTORY/windows/fleet-desktop.exe" --platform windows --name desktop --version "$VERSION" -t edge
popd
}
@@ -221,6 +226,7 @@ release_osqueryd_to_edge () {
pushd "$TUF_DIRECTORY"
fleetctl updates add --target "$OSQUERYD_ARTIFACT_DOWNLOAD_DIRECTORY/macos/osqueryd.app.tar.gz" --platform macos-app --name osqueryd --version "$VERSION" -t edge
fleetctl updates add --target "$OSQUERYD_ARTIFACT_DOWNLOAD_DIRECTORY/linux/osqueryd" --platform linux --name osqueryd --version "$VERSION" -t edge
fleetctl updates add --target "$OSQUERYD_ARTIFACT_DOWNLOAD_DIRECTORY/linux-arm64/osqueryd" --platform linux-arm64 --name osqueryd --version "$VERSION" -t edge
fleetctl updates add --target "$OSQUERYD_ARTIFACT_DOWNLOAD_DIRECTORY/windows/osqueryd.exe" --platform windows --name osqueryd --version "$VERSION" -t edge
popd
}
@@ -331,4 +337,4 @@ else
exit 1
fi
push_to_remote
push_to_remote
+48 -3
View File
@@ -1,6 +1,6 @@
#!/bin/bash
set -e
set -xe
# This script initializes a test Fleet TUF repository.
# All targets are created with version 42.
@@ -23,7 +23,10 @@ if [[ -d "$TUF_PATH" ]]; then
exit 0
fi
SYSTEMS=${SYSTEMS:-macos linux windows}
SYSTEMS=${SYSTEMS:-macos linux linux-arm64 windows}
echo "Generating packages for $SYSTEMS"
NUDGE_VERSION=stable
SWIFT_DIALOG_MACOS_APP_VERSION=2.2.1
SWIFT_DIALOG_MACOS_APP_BUILD_VERSION=4591
@@ -46,8 +49,15 @@ for system in $SYSTEMS; do
elif [[ $system == "macos" ]]; then
osqueryd="$osqueryd.app.tar.gz"
osqueryd_system="macos-app"
elif [[ $system == "linux-arm64" ]]; then
osqueryd_system="linux-arm64"
fi
if [[ $system == "linux-arm64" ]]; then
osqueryd_path="$TUF_PATH/tmp/${osqueryd}-arm64"
else
osqueryd_path="$TUF_PATH/tmp/$osqueryd"
fi
osqueryd_path="$TUF_PATH/tmp/$osqueryd"
curl https://tuf.fleetctl.com/targets/osqueryd/$osqueryd_system/$OSQUERY_VERSION/$osqueryd --output $osqueryd_path
major=$(echo "$OSQUERY_VERSION" | cut -d "." -f 1)
@@ -65,6 +75,13 @@ for system in $SYSTEMS; do
if [[ $system == "macos" ]]; then
goose_value="darwin"
fi
if [[ $system == "linux" ]]; then
goarch_value="amd64"
fi
if [[ $system == "linux-arm64" ]]; then
goose_value="linux"
goarch_value="arm64"
fi
orbit_target=orbit-$system
if [[ $system == "windows" ]]; then
orbit_target="${orbit_target}.exe"
@@ -162,6 +179,19 @@ for system in $SYSTEMS; do
rm desktop.tar.gz
fi
# Add Fleet Desktop application on linux-arm64 (if enabled).
if [[ $system == "linux-arm64" && -n "$FLEET_DESKTOP" ]]; then
FLEET_DESKTOP_VERSION=42.0.0 \
make desktop-linux-arm64
./build/fleetctl updates add \
--path $TUF_PATH \
--target desktop.tar.gz \
--platform linux-arm64 \
--name desktop \
--version 42.0.0 -t 42.0 -t 42 -t stable
rm desktop.tar.gz
fi
# Add extensions on macos (if set).
if [[ $system == "macos" && -n "$MACOS_TEST_EXTENSIONS" ]]; then
for extension in ${MACOS_TEST_EXTENSIONS//,/ }
@@ -192,6 +222,21 @@ for system in $SYSTEMS; do
done
fi
# Add extensions on linux (if set).
if [[ $system == "linux-arm64" && -n "$LINUX_TEST_EXTENSIONS" ]]; then
for extension in ${LINUX_TEST_EXTENSIONS//,/ }
do
extensionName=$(basename $extension)
extensionName=$(echo "$extensionName" | cut -d'.' -f1)
./build/fleetctl updates add \
--path $TUF_PATH \
--target $extension \
--platform linux-arm64 \
--name "extensions/$extensionName" \
--version 42.0.0 -t 42.0 -t 42 -t stable
done
fi
# Add extensions on windows (if set).
if [[ $system == "windows" && -n "$WINDOWS_TEST_EXTENSIONS" ]]; then
for extension in ${WINDOWS_TEST_EXTENSIONS//,/ }
+1 -1
View File
@@ -15,7 +15,7 @@ BASE_FLEET_URL=$2
rm -rf test_tuf desktop.tar.gz
SYSTEMS="macos windows linux" \
SYSTEMS="macos windows linux linux-arm64" \
PKG_FLEET_URL=$BASE_FLEET_URL \
PKG_TUF_URL=$BASE_TUF_URL \
DEB_FLEET_URL=$BASE_FLEET_URL \
+50 -4
View File
@@ -24,7 +24,7 @@ set -ex
#
# ENROLL_SECRET: Fleet server enroll secret.
# ROOT_KEYS: TUF repository root keys.
# FLEET_DESKTOP: Whether to build with Fleet Desktop support.
# FLEET_DESKTOP: Whether to build with Fleet Desktop support.
# INSECURE: Whether to use the --insecure flag.
# USE_FLEET_SERVER_CERTIFICATE: Whether to use a custom certificate bundle.
# USE_UPDATE_SERVER_CERTIFICATE: Whether to use a custom certificate bundle.
@@ -61,9 +61,32 @@ if [ -n "$GENERATE_PKG" ]; then
fi
if [ -n "$GENERATE_DEB" ]; then
echo "Generating deb..."
echo "Generating deb (amd64)..."
./build/fleetctl package \
--type=deb \
--arch=amd64 \
${FLEET_DESKTOP:+--fleet-desktop} \
--fleet-url=$DEB_FLEET_URL \
--enroll-secret=$ENROLL_SECRET \
${USE_FLEET_SERVER_CERTIFICATE:+--fleet-certificate=./tools/osquery/fleet.crt} \
${USE_UPDATE_SERVER_CERTIFICATE:+--update-tls-certificate=./tools/osquery/fleet.crt} \
${INSECURE:+--insecure} \
${DEBUG:+--debug} \
--update-roots="$ROOT_KEYS" \
--update-interval=10s \
--disable-open-folder \
${USE_FLEET_CLIENT_CERTIFICATE:+--fleet-tls-client-certificate=./tools/test-orbit-mtls/client.crt} \
${USE_FLEET_CLIENT_CERTIFICATE:+--fleet-tls-client-key=./tools/test-orbit-mtls/client.key} \
${USE_UPDATE_CLIENT_CERTIFICATE:+--update-tls-client-certificate=./tools/test-orbit-mtls/client.crt} \
${USE_UPDATE_CLIENT_CERTIFICATE:+--update-tls-client-key=./tools/test-orbit-mtls/client.key} \
${FLEET_DESKTOP_ALTERNATIVE_BROWSER_HOST:+--fleet-desktop-alternative-browser-host=$FLEET_DESKTOP_ALTERNATIVE_BROWSER_HOST} \
${ENABLE_SCRIPTS:+--enable-scripts} \
--update-url=$DEB_TUF_URL
echo "Generating deb (arm64)..."
./build/fleetctl package \
--type=deb \
--arch=arm64 \
${FLEET_DESKTOP:+--fleet-desktop} \
--fleet-url=$DEB_FLEET_URL \
--enroll-secret=$ENROLL_SECRET \
@@ -84,9 +107,32 @@ if [ -n "$GENERATE_DEB" ]; then
fi
if [ -n "$GENERATE_RPM" ]; then
echo "Generating rpm..."
echo "Generating rpm (amd64)..."
./build/fleetctl package \
--type=rpm \
--arch=amd64 \
${FLEET_DESKTOP:+--fleet-desktop} \
--fleet-url=$RPM_FLEET_URL \
--enroll-secret=$ENROLL_SECRET \
${USE_FLEET_SERVER_CERTIFICATE:+--fleet-certificate=./tools/osquery/fleet.crt} \
${USE_UPDATE_SERVER_CERTIFICATE:+--update-tls-certificate=./tools/osquery/fleet.crt} \
${INSECURE:+--insecure} \
${DEBUG:+--debug} \
--update-roots="$ROOT_KEYS" \
--update-interval=10s \
--disable-open-folder \
${USE_FLEET_CLIENT_CERTIFICATE:+--fleet-tls-client-certificate=./tools/test-orbit-mtls/client.crt} \
${USE_FLEET_CLIENT_CERTIFICATE:+--fleet-tls-client-key=./tools/test-orbit-mtls/client.key} \
${USE_UPDATE_CLIENT_CERTIFICATE:+--update-tls-client-certificate=./tools/test-orbit-mtls/client.crt} \
${USE_UPDATE_CLIENT_CERTIFICATE:+--update-tls-client-key=./tools/test-orbit-mtls/client.key} \
${FLEET_DESKTOP_ALTERNATIVE_BROWSER_HOST:+--fleet-desktop-alternative-browser-host=$FLEET_DESKTOP_ALTERNATIVE_BROWSER_HOST} \
${ENABLE_SCRIPTS:+--enable-scripts} \
--update-url=$RPM_TUF_URL
echo "Generating rpm (arm64)..."
./build/fleetctl package \
--type=rpm \
--arch=arm64 \
${FLEET_DESKTOP:+--fleet-desktop} \
--fleet-url=$RPM_FLEET_URL \
--enroll-secret=$ENROLL_SECRET \
@@ -133,4 +179,4 @@ echo "Packages generated."
if [[ $OSTYPE == 'darwin'* && -n "$INSTALL_PKG" ]]; then
sudo installer -pkg fleet-osquery.pkg -target /
fi
fi
+2 -2
View File
@@ -1,6 +1,6 @@
#!/bin/bash
set -e
set -ex
export FLEET_ROOT_PASSPHRASE=p4ssphr4s3
export FLEET_TARGETS_PASSPHRASE=p4ssphr4s3
@@ -30,5 +30,5 @@ if [ -z "$SKIP_SERVER" ]; then
fi
if [ -n "$GENERATE_PKG" ] || [ -n "$GENERATE_DEB" ] || [ -n "$GENERATE_RPM" ] || [ -n "$GENERATE_MSI" ]; then
./tools/tuf/test/gen_pkgs.sh
bash ./tools/tuf/test/gen_pkgs.sh
fi