diff --git a/.gitignore b/.gitignore
index 50876d0..00cebf9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-SOURCES/rhc-0.2.0.tar.gz
+SOURCES/rhc-0.2.1.tar.gz
+SOURCES/yggdrasil-0.2.1.tar.gz
+SOURCES/yggdrasil-worker-package-manager-0.1.0.tar.gz
diff --git a/.rhc.metadata b/.rhc.metadata
index b1110d3..bce74d3 100644
--- a/.rhc.metadata
+++ b/.rhc.metadata
@@ -1 +1,3 @@
-8f9f437c9d7ee2afe09b2000aa77fd384fc91d2f SOURCES/rhc-0.2.0.tar.gz
+2209827b582aff0a0ddea854c116de223e8ee604 SOURCES/rhc-0.2.1.tar.gz
+55a3abc8515dede8b7ff41905447e08f5e6c01d7 SOURCES/yggdrasil-0.2.1.tar.gz
+0582350e1001af0d608772860045f7f4964aa321 SOURCES/yggdrasil-worker-package-manager-0.1.0.tar.gz
diff --git a/SOURCES/0001-feat-default-config-file-location.patch b/SOURCES/0001-feat-default-config-file-location.patch
new file mode 100644
index 0000000..07ab750
--- /dev/null
+++ b/SOURCES/0001-feat-default-config-file-location.patch
@@ -0,0 +1,28 @@
+--- main.go.orig 2022-02-11 15:41:53.199642591 -0500
++++ main.go 2022-02-11 15:42:43.738219604 -0500
+@@ -6,6 +6,7 @@
+ "fmt"
+ "net"
+ "os"
++ "path/filepath"
+ "strconv"
+ "strings"
+ "time"
+@@ -21,7 +22,7 @@
+ )
+
+ func main() {
+- fs := flag.NewFlagSet("yggd-package-manager-worker", flag.ExitOnError)
++ fs := flag.NewFlagSet(filepath.Base(os.Args[0]), flag.ExitOnError)
+
+ var (
+ socketAddr = ""
+@@ -32,7 +33,7 @@
+ fs.StringVar(&socketAddr, "socket-addr", "", "dispatcher socket address")
+ fs.Var(&logLevel, "log-level", "log verbosity level (error (default), warn, info, debug, trace)")
+ fs.Var(&allowPatterns, "allow-pattern", "regular expression pattern to allow package operations\n(can be specified multiple times)")
+- _ = fs.String("config", "", "path to `file` containing configuration values (optional)")
++ _ = fs.String("config", filepath.Join("etc", "rhc", "workers", fs.Name()+".toml"), "path to `file` containing configuration values (optional)")
+
+ ff.Parse(fs, os.Args[1:], ff.WithEnvVarPrefix("YGG"), ff.WithConfigFileFlag("config"), ff.WithConfigFileParser(fftoml.Parser))
+
diff --git a/SOURCES/0001-fix-Improve-output-during-disconnect.patch b/SOURCES/0001-fix-Improve-output-during-disconnect.patch
deleted file mode 100644
index 2059b7e..0000000
--- a/SOURCES/0001-fix-Improve-output-during-disconnect.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 31db6e5a21afb62183ea6721fd79d515fc9b77b9 Mon Sep 17 00:00:00 2001
-From: Link Dupont
-Date: Wed, 30 Jun 2021 12:36:17 -0400
-Subject: [PATCH 1/2] fix: Improve output during 'disconnect'
-
-Now print the status of the disconnection process, including the results afterwards.
-
-Fixes ESSNTL-837
-
-Signed-off-by: Link Dupont
----
- cmd/ygg/main.go | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/cmd/ygg/main.go b/cmd/ygg/main.go
-index 5226bce..f5c5c47 100644
---- a/cmd/ygg/main.go
-+++ b/cmd/ygg/main.go
-@@ -162,17 +162,21 @@ func main() {
- fmt.Printf("Disconnecting %v from %v.\nThis might take a few seconds.\n\n", hostname, yggdrasil.Provider)
-
- s := spinner.New(spinner.CharSets[9], 100*time.Millisecond)
-- defer s.Stop()
-- s.Suffix = " Disconnecting..."
-+ s.Suffix = fmt.Sprintf(" Deactivating the %v daemon", yggdrasil.BrandName)
- s.Start()
- if err := deactivate(); err != nil {
- return cli.Exit(err, 1)
- }
-+ s.Stop()
-+ fmt.Printf(failPrefix+" Deactivated the %v daemon\n", yggdrasil.BrandName)
-
-+ s.Suffix = " Disconnecting from Red Hat Subscription Management..."
-+ s.Start()
- if err := unregister(); err != nil {
- return cli.Exit(err, 1)
- }
- s.Stop()
-+ fmt.Printf(failPrefix + " Disconnected from Red Hat Subscription Management\n")
-
- fmt.Printf("\nManage your Red Hat connector systems: https://red.ht/connector\n")
-
---
-2.31.1
-
diff --git a/SOURCES/0002-feat-Include-Description-in-help-output.patch b/SOURCES/0002-feat-Include-Description-in-help-output.patch
deleted file mode 100644
index bb66650..0000000
--- a/SOURCES/0002-feat-Include-Description-in-help-output.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 1d2d42276b6acc8cba062da9536e8acae69034be Mon Sep 17 00:00:00 2001
-From: Link Dupont
-Date: Wed, 30 Jun 2021 14:47:00 -0400
-Subject: [PATCH 2/2] feat: Include Description in help output
-
-Fixes ESSNTL-838
-
-Signed-off-by: Link Dupont
----
- cmd/ygg/main.go | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/cmd/ygg/main.go b/cmd/ygg/main.go
-index f5c5c47..5524347 100644
---- a/cmd/ygg/main.go
-+++ b/cmd/ygg/main.go
-@@ -28,6 +28,14 @@ func main() {
- app.Name = yggdrasil.ShortName
- app.Version = yggdrasil.Version
- app.Usage = "control the system's connection to " + yggdrasil.Provider
-+ app.Description = "The " + app.Name + " command controls the system's connection to " + yggdrasil.Provider + ".\n\n" +
-+ "To connect the system using an activation key:\n" +
-+ "\t" + app.Name + " connect --organization ID --activation-key KEY\n\n" +
-+ "To connect the system using a username and password:\n" +
-+ "\t" + app.Name + " connect --username USERNAME --password PASSWORD\n\n" +
-+ "To disconnect the system:\n" +
-+ "\t" + app.Name + " disconnect\n\n" +
-+ "Run '" + app.Name + " command --help' for more details."
-
- log.SetFlags(0)
- log.SetPrefix("")
---
-2.31.1
-
diff --git a/SOURCES/0003-fix-collect-error-messages-during-disconnect.patch b/SOURCES/0003-fix-collect-error-messages-during-disconnect.patch
new file mode 100644
index 0000000..19d2a5b
--- /dev/null
+++ b/SOURCES/0003-fix-collect-error-messages-during-disconnect.patch
@@ -0,0 +1,102 @@
+From 0e3ce2489f92cc037936866a1d6d7901fb14d440 Mon Sep 17 00:00:00 2001
+From: Link Dupont
+Date: Mon, 14 Feb 2022 15:15:54 -0500
+Subject: [PATCH] fix: collect error messages during disconnect
+
+If an error occurs during disconnect, the error is collected and
+reported at the end of the operation instead of aborting the operation
+part-way through.
+
+Fixes: ESSNTL-2281
+---
+ main.go | 42 +++++++++++++++++++++++++++++++++---------
+ 1 file changed, 33 insertions(+), 9 deletions(-)
+
+diff --git a/main.go b/main.go
+index 0e6cc07..db5a34d 100644
+--- a/main.go
++++ b/main.go
+@@ -6,6 +6,7 @@ import (
+ "fmt"
+ "os"
+ "strings"
++ "text/tabwriter"
+ "time"
+
+ "git.sr.ht/~spc/go-log"
+@@ -18,6 +19,7 @@ import (
+
+ const successPrefix = "\033[32m●\033[0m"
+ const failPrefix = "\033[31m●\033[0m"
++const errorPrefix = "\033[31m!\033[0m"
+
+ func main() {
+ app := cli.NewApp()
+@@ -169,6 +171,7 @@ func main() {
+ UsageText: fmt.Sprintf("%v disconnect", app.Name),
+ Description: fmt.Sprintf("The disconnect command disconnects the system from Red Hat Subscription Management, Red Hat Insights and %v and deactivates the %v daemon. %v will no longer be able to interact with the system.", Provider, BrandName, Provider),
+ Action: func(c *cli.Context) error {
++ errorMessages := make(map[string]error)
+ hostname, err := os.Hostname()
+ if err != nil {
+ return cli.Exit(err, 1)
+@@ -180,29 +183,50 @@ func main() {
+ s.Suffix = fmt.Sprintf(" Deactivating the %v daemon", BrandName)
+ s.Start()
+ if err := deactivate(); err != nil {
+- return cli.Exit(err, 1)
++ errorMessages[BrandName] = fmt.Errorf("cannot deactivate daemon: %w", err)
++ s.Stop()
++ fmt.Printf(errorPrefix+" Cannot deactivate the %v daemon\n", BrandName)
++ } else {
++ s.Stop()
++ fmt.Printf(failPrefix+" Deactivated the %v daemon\n", BrandName)
+ }
+- s.Stop()
+- fmt.Printf(failPrefix+" Deactivated the %v daemon\n", BrandName)
+
+ s.Suffix = " Disconnecting from Red Hat Insights..."
+ s.Start()
+ if err := unregisterInsights(); err != nil {
+- return cli.Exit(err, 1)
++ errorMessages["insights"] = fmt.Errorf("cannot disconnect from Red Hat Insights: %w", err)
++ s.Stop()
++ fmt.Printf(errorPrefix + " Cannot disconnect from Red Hat Insights\n")
++ } else {
++ s.Stop()
++ fmt.Print(failPrefix + " Disconnected from Red Hat Insights\n")
+ }
+- s.Stop()
+- fmt.Print(failPrefix + " Disconnected from Red Hat Insights\n")
+
+ s.Suffix = " Disconnecting from Red Hat Subscription Management..."
+ s.Start()
+ if err := unregister(); err != nil {
+- return cli.Exit(err, 1)
++ errorMessages["rhsm"] = fmt.Errorf("cannot disconnect from Red Hat Subscription Management: %w", err)
++ s.Stop()
++ fmt.Printf(errorPrefix + " Cannot disconnect from Red Hat Subscription Management\n")
++ } else {
++ s.Stop()
++ fmt.Printf(failPrefix + " Disconnected from Red Hat Subscription Management\n")
+ }
+- s.Stop()
+- fmt.Printf(failPrefix + " Disconnected from Red Hat Subscription Management\n")
+
+ fmt.Printf("\nManage your Red Hat connector systems: https://red.ht/connector\n")
+
++ if len(errorMessages) > 0 {
++ fmt.Println()
++ fmt.Printf("The following errors were encountered during disconnect:\n\n")
++ w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
++ fmt.Fprintln(w, "STEP\tERROR\t")
++ for svc, err := range errorMessages {
++ fmt.Fprintf(w, "%v\t%v\n", svc, err)
++ }
++ w.Flush()
++ return cli.Exit("", 1)
++ }
++
+ return nil
+ },
+ },
diff --git a/SOURCES/0003-fix-report-active-dispatchers-when-connecting-to-bro.patch b/SOURCES/0003-fix-report-active-dispatchers-when-connecting-to-bro.patch
deleted file mode 100644
index 34fe42a..0000000
--- a/SOURCES/0003-fix-report-active-dispatchers-when-connecting-to-bro.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 7c742868fbcb0f7fbd2d9d1e02991bbb01e2d763 Mon Sep 17 00:00:00 2001
-From: Link Dupont
-Date: Fri, 24 Sep 2021 15:12:45 -0400
-Subject: [PATCH] fix: report active dispatchers when connecting to broker
-
-Include the current dispatchers map when publishing connection status during the reconnect handler instead of always publishing an empty map.
-
-Fixes RHBZ#2007667
-
-Signed-off-by: Link Dupont
----
- cmd/yggd/main.go | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/cmd/yggd/main.go b/cmd/yggd/main.go
-index 5f0a931..4999f98 100644
---- a/cmd/yggd/main.go
-+++ b/cmd/yggd/main.go
-@@ -238,7 +238,7 @@ func main() {
- })
- log.Tracef("subscribed to topic: %v", topic)
-
-- go publishConnectionStatus(client, map[string]map[string]string{})
-+ go publishConnectionStatus(client, d.makeDispatchersMap())
- })
- mqttClientOpts.SetDefaultPublishHandler(func(c mqtt.Client, m mqtt.Message) {
- log.Errorf("unhandled message: %v", string(m.Payload()))
---
-2.31.1
-
diff --git a/SOURCES/rhc-package-manager.toml b/SOURCES/rhc-package-manager.toml
new file mode 100644
index 0000000..1abdda4
--- /dev/null
+++ b/SOURCES/rhc-package-manager.toml
@@ -0,0 +1,5 @@
+# regular expression patterns to allow package operations
+allow-pattern = ["^rhc-worker-playbook$"]
+
+# log verbosity level (error (default), warn, info, debug, trace)
+log-level = "error"
diff --git a/SPECS/rhc.spec b/SPECS/rhc.spec
index 086e921..35dd18e 100644
--- a/SPECS/rhc.spec
+++ b/SPECS/rhc.spec
@@ -1,73 +1,111 @@
%define debug_package %{nil}
+%global buildflags -buildmode pie -compiler gc -a -v -x
+%global goldflags %{expand:-linkmode=external -compressdwarf=false -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '%__global_ldflags'}
+
+%global yggdrasil_ver 0.2.1
+%global ygg_pkg_mgr_ver 0.1.0
+
Name: rhc
-Version: 0.2.0
-Release: 3%{?dist}
+Version: 0.2.1
+Release: 7%{?dist}
Epoch: 1
-Summary: Message dispatch agent for cloud-connected systems
+Summary: rhc connects the system to Red Hat hosted services
License: GPLv3
-URL: https://github.com/redhatinsights/yggdrasil
+URL: https://github.com/redhatinsights/rhc
-Source0: %{name}-%{version}.tar.gz
+Source0: https://github.com/RedHatInsights/rhc/releases/download/%{version}/%{name}-%{version}.tar.gz
Source1: config.toml
+Source2: https://github.com/RedHatInsights/yggdrasil/releases/download/%{yggdrasil_ver}/yggdrasil-%{yggdrasil_ver}.tar.gz
+Source3: https://github.com/RedHatInsights/yggdrasil-worker-package-manager/releases/download/%{ygg_pkg_mgr_ver}/yggdrasil-worker-package-manager-%{ygg_pkg_mgr_ver}.tar.gz
+Source4: rhc-package-manager.toml
-# Fixed upstream
-Patch0: 0001-fix-Improve-output-during-disconnect.patch
-Patch1: 0002-feat-Include-Description-in-help-output.patch
-Patch2: 0003-fix-report-active-dispatchers-when-connecting-to-bro.patch
+# Fixed upstream https://github.com/RedHatInsights/yggdrasil-worker-package-manager/commit/22105b0016abfc7c743c1eadb0372e4ef93cc65e
+Patch0: 0001-feat-default-config-file-location.patch
+# Fixed upstream https://github.com/RedHatInsights/rhc/commit/0e3ce2489f92cc037936866a1d6d7901fb14d440
+Patch1: 0003-fix-collect-error-messages-during-disconnect.patch
ExclusiveArch: %{go_arches}
+Requires: insights-client
+
BuildRequires: git
BuildRequires: golang
BuildRequires: dbus-devel
BuildRequires: systemd-devel
+%define _description %{expand:%{name} is a client tool and daemon that connects the system to Red Hat hosted
+services enabling system and subscription management.}
%description
-%{name} is pair of utilities that register systems with RHSM and establishes
-a receiving queue for instructions to be sent to the system via a broker.
+%{_description}
+
+%global makeflags %{expand:PREFIX=%{_prefix} \\
+ SYSCONFDIR=%{_sysconfdir} \\
+ LOCALSTATEDIR=%{_localstatedir} \\
+ SHORTNAME=%{name} \\
+ LONGNAME=%{name} \\
+ PKGNAME=%{name} \\
+ 'BRANDNAME=Red Hat connector' \\
+ TOPICPREFIX=redhat/insights \\
+ VERSION=%{version} \\
+ DATAHOST=cert.cloud.redhat.com \\
+ 'PROVIDER=Red Hat'}
+
%prep
-%autosetup -p1
+%setup -T -D -c -n %{name} -a 0
+%setup -T -D -c -n %{name} -a 2
+%setup -T -D -c -n %{name} -a 3
+sed -i -e "s/LDFLAGS :=/LDFLAGS ?=/" %{_builddir}/%{name}/yggdrasil-%{yggdrasil_ver}/Makefile
+sed -i -e "s/LDFLAGS :=/LDFLAGS ?=/" %{_builddir}/%{name}/%{name}-%{version}/Makefile
+cd %{_builddir}/%{name}/yggdrasil-worker-package-manager
+%patch0 -p0
+cd %{_builddir}/%{name}/%{name}-%{version}
+%patch1 -p1
%build
-make PREFIX=%{_prefix} \
- SYSCONFDIR=%{_sysconfdir} \
- LOCALSTATEDIR=%{_localstatedir} \
- SHORTNAME=%{name} \
- LONGNAME=%{name} \
- PKGNAME=%{name} \
- 'BRANDNAME=Red Hat connector' \
- TOPICPREFIX=redhat/insights \
- VERSION=%{version} \
- DATAHOST=cert.cloud.redhat.com \
- 'PROVIDER=Red Hat'
+%set_build_flags
+export BUILDFLAGS="%{buildflags}"
+export LDFLAGS="%{goldflags}"
+cd %{_builddir}/%{name}/yggdrasil-%{yggdrasil_ver}
+make %{makeflags}
+
+cd %{_builddir}/%{name}/yggdrasil-worker-package-manager
+go build %{buildflags} -ldflags="%{goldflags}" -o rhc-package-manager-worker -mod=vendor .
+
+cd %{_builddir}/%{name}/%{name}-%{version}
+make %{makeflags}
%install
-make PREFIX=%{_prefix} \
- SYSCONFDIR=%{_sysconfdir} \
- LOCALSTATEDIR=%{_localstatedir} \
+%set_build_flags
+export BUILDFLAGS="%{buildflags}"
+export LDFLAGS="%{goldflags}"
+cd %{_builddir}/%{name}/yggdrasil-%{yggdrasil_ver}
+make %{makeflags} \
DESTDIR=%{buildroot} \
- SHORTNAME=%{name} \
- LONGNAME=%{name} \
- PKGNAME=%{name} \
- 'BRANDNAME=Red Hat connector' \
- TOPICPREFIX=redhat/insights \
- VERSION=%{version} \
- DATAHOST=cert.cloud.redhat.com \
- 'PROVIDER=Red Hat' \
install
+
%{__install} -m 644 %{SOURCE1} %{buildroot}%{_sysconfdir}/%{name}/
+cd %{_builddir}/%{name}/yggdrasil-worker-package-manager
+%{__install} -D -m 755 rhc-package-manager-worker %{buildroot}%{_libexecdir}/%{name}/
+%{__install} -D -m 644 %{SOURCE4} %{buildroot}%{_sysconfdir}/%{name}/workers/rhc-package-manager.toml
+
+cd %{_builddir}/%{name}/%{name}-%{version}
+make %{makeflags} \
+ DESTDIR=%{buildroot} \
+ install
+
%files
-%doc README.md
+%doc %{name}-%{version}/README.md yggdrasil-%{yggdrasil_ver}/doc/tags.toml
%{_bindir}/%{name}
%{_sbindir}/%{name}d
%config(noreplace) %{_sysconfdir}/%{name}/config.toml
+%config(noreplace) %{_sysconfdir}/%{name}/workers/rhc-package-manager.toml
%{_unitdir}/%{name}d.service
%{_datadir}/bash-completion/completions/*
%{_mandir}/man1/*
@@ -76,8 +114,29 @@ make PREFIX=%{_prefix} \
%changelog
-* Fri Sep 24 2021 Link Dupont - 0.2.0-3
-- Fix an issue reporting workers on reconnect (Resolves: RHBZ#2007667)
+* Mon Mar 21 2022 Link Dupont - 0.2.1-7
+- Use correct macro syntax for ldflags (RHBZ#2059690)
+
+* Tue Mar 1 2022 Link Dupont - 0.2.1-6
+- Ensure worker is built with hardening compiler flags (RHBZ#2059690)
+
+* Tue Feb 22 2022 Link Dupont - 0.2.1-4
+- Update summary and description (RHBZ#2057153)
+
+* Tue Feb 15 2022 Link Dupont - 0.2.1-3
+- Include patch to collect and report errors during disconnect
+
+* Fri Feb 11 2022 Link Dupont - 0.2.1-2
+- Include patch to default worker config location
+
+* Fri Feb 11 2022 Link Dupont - 0.2.1-1
+- New upstream version
+
+* Tue Nov 16 2021 Link Dupont - 0.2.0-5
+- Enable building with PIE and other build flags (Resolves: RHBZ#2023489)
+
+* Fri Sep 24 2021 Link Dupont - 0.2.0-4
+- Fix an issue reporting workers on reconnect (Resolves: RHBZ#2009641)
* Thu Jul 1 2021 Link Dupont - 0.2.0-2
- Add two patches that fix some UX issues