foreman-export-systemd_user 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11f74fdac3bd7a100d7661abf975e439c516aa2a9b591c819e83724a022cbb86
4
- data.tar.gz: 7f5ba20c33815b77088d66c61b1ca80569703d95931de546b51d2ee3fd4c91d0
3
+ metadata.gz: b03ca222cc9bdd5faeb5b83d7502e8a474b0f17757027069a61d1ea371b97d34
4
+ data.tar.gz: b4ab848e3daff0171b3abac450a5927c978e7801e7f51c52bb3aa182855cb554
5
5
  SHA512:
6
- metadata.gz: 045717c6c7544c2c9e8ff61ce91d2b508a336b3697a562309f270ee0b9563ffe6195c1d9adb999c9e1075eea69b19d15c679ff498aa0cacc1db2deb43e740ddd
7
- data.tar.gz: 0b7dbf5081e562db851a87477df944135cc405df90bc71457bda8f2ca52d972f52adac893daeba960cfe1d5496271aaced427159b440748ca2d7d32f705f9b22
6
+ metadata.gz: 3d4e520fa7e89e7f0b09767eac6a0a00baf2f941d04e9e33e3bee9dd35cfe6bc438b8eaf761056c18d68f1a3f2f94bd6b9331d6ed9d64bf772f85ebcb2225914
7
+ data.tar.gz: cc120ed2047d131e3da8fc7c37be10adf9abf2d7d104d7e8804503f5021d580b7cf8b87c8c0a512a22f2f3bf7ed52ed16f18f42cb5f1f3db5ed59b6f923b33e4
@@ -0,0 +1,27 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-22.04
8
+
9
+ steps:
10
+ - uses: actions/checkout@v4
11
+
12
+ - name: Set up Ruby
13
+ uses: ruby/setup-ruby@v1
14
+ with:
15
+ ruby-version: 3.3
16
+ bundler-cache: true
17
+
18
+ - name: Install podman
19
+ run: |
20
+ sudo apt-get update
21
+ sudo apt-get install -y podman
22
+
23
+ - name: Install dependencies
24
+ run: bundle install
25
+
26
+ - name: Run tests
27
+ run: bundle exec rspec
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Foreman export scripts for user-level systemd on Ubuntu 16.04+
1
+ # Foreman export scripts for user-level systemd
2
2
 
3
3
  ```ruby
4
4
  # Gemfile
@@ -11,11 +11,34 @@ then
11
11
  bundle exec foreman export systemd-user --app <app-name>
12
12
  ```
13
13
 
14
- Note that this may break from foreman's protocol a bit, because it starts the processes after export. It does this by running the following:
14
+ After export, this runs the following to configure systemd:
15
15
  ```
16
+ systemctl --user daemon-reload
16
17
  loginctl enable-linger
17
18
  systemctl --user enable <app-name>.target
19
+ ```
20
+
21
+ To start or restart your services after export:
22
+ ```
18
23
  systemctl --user restart <app-name>.target
19
24
  ```
20
- After forgetting to run these steps enough times, I just decided to bake it into the export.
25
+
26
+ ## Including extra systemd files
27
+
28
+ Use `--include-dir` to copy additional systemd files (drop-in overrides, extra units, timers) after generating the main units:
29
+
30
+ ```
31
+ bundle exec foreman export systemd-user --app <app-name> --include-dir Procfile.systemd
32
+ ```
33
+
34
+ Example directory structure:
35
+ ```
36
+ Procfile.systemd/
37
+ <app-name>-web@.service.d/
38
+ override.conf # Drop-in override for the web service
39
+ <app-name>-restart.service # Extra standalone unit
40
+ <app-name>-restart.timer # Timer (will be enabled and started automatically)
41
+ ```
42
+
43
+ Any `.timer` files in the root of the include directory will be enabled with `--now`.
21
44
 
data/Rakefile CHANGED
@@ -1,2 +1,7 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: :spec
data/bin/foreman ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "foreman/cli"
5
+ require "foreman-export-systemd_user"
6
+
7
+ # Add --include-dir option to foreman export command
8
+ Foreman::CLI.class_eval do
9
+ option = Thor::Option.new(:include_dir, type: :string, desc: "Directory of additional systemd files to copy")
10
+ export_command = commands["export"]
11
+ export_command.options[:include_dir] = option
12
+ end
13
+
14
+ Foreman::CLI.start
data/bin/setup ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ echo "==> Installing gem dependencies..."
5
+ bundle install
6
+
7
+ echo "==> Building test container image..."
8
+ podman build -t foreman-export-systemd-user-test -f spec/Dockerfile.systemd spec/
9
+
10
+ echo "==> Setup complete! Run 'bundle exec rake spec' to run tests."
@@ -2,17 +2,19 @@ $:.push File.expand_path("../lib", __FILE__)
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "foreman-export-systemd_user"
5
- s.version = "0.1.2"
5
+ s.version = "0.2.1"
6
6
  s.authors = ["Micah Geisel"]
7
7
  s.email = ["micah@botandrose.com"]
8
8
  s.homepage = "http://github.com/botandrose/foreman-export-systemd_user"
9
- s.summary = "Upstart user-level export scripts for systemd on Ubuntu 16.04+"
10
- s.description = "Upstart user-level export scripts for systemd on Ubuntu 16.04+"
9
+ s.summary = "Foreman export scripts for user-level systemd"
10
+ s.description = "Foreman export scripts for user-level systemd"
11
11
 
12
12
  s.files = `git ls-files`.split("\n")
13
13
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
14
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
15
  s.require_paths = ["lib"]
16
16
 
17
- s.add_runtime_dependency "foreman"
17
+ s.add_runtime_dependency "foreman", ">= 0.90.0"
18
+
19
+ s.add_development_dependency "rspec"
18
20
  end
@@ -1,17 +1,13 @@
1
1
  require "erb"
2
2
  require "foreman/export"
3
3
 
4
- File.instance_eval { def exists?(p); exist?(p); end } # restore old method removed in Ruby 3.2, because foreman 0.87.2 uses it, and appears abandoned, and I don't want to maintain a fork.
5
-
6
4
  class Foreman::Export::SystemdUser < Foreman::Export::Base
7
- def initialize location, engine, options={}
8
- super
9
- # what a pain in the ass
10
- # template is obviously not intended to be overriden
11
- unless @options.has_key?(:template)
12
- template = File.expand_path("../../../../data/export/systemd_user", __FILE__)
13
- @options = { template: template }.merge(@options).freeze
14
- end
5
+ TEMPLATE_DIR = File.expand_path("../../../../data/export/systemd_user", __FILE__)
6
+
7
+ def initialize(location, engine, options = {})
8
+ options = options.dup
9
+ options[:template] ||= TEMPLATE_DIR
10
+ super(location, engine, options)
15
11
  end
16
12
 
17
13
  def app
@@ -24,7 +20,15 @@ class Foreman::Export::SystemdUser < Foreman::Export::Base
24
20
 
25
21
  def export
26
22
  super
23
+ clean_old_units
24
+ write_units
25
+ install_include_dir
26
+ configure_systemd
27
+ end
28
+
29
+ private
27
30
 
31
+ def clean_old_units
28
32
  Dir["#{location}/#{app}*.target"]
29
33
  .concat(Dir["#{location}/#{app}*.service"])
30
34
  .concat(Dir["#{location}/#{app}*.target.wants/#{app}*.service"])
@@ -35,7 +39,9 @@ class Foreman::Export::SystemdUser < Foreman::Export::Base
35
39
  Dir["#{location}/#{app}*.target.wants"].each do |file|
36
40
  clean_dir file
37
41
  end
42
+ end
38
43
 
44
+ def write_units
39
45
  process_master_names = []
40
46
 
41
47
  engine.each_process do |name, process|
@@ -55,17 +61,41 @@ class Foreman::Export::SystemdUser < Foreman::Export::Base
55
61
  end
56
62
 
57
63
  write_template "systemd_user/master.target.erb", "#{app}.target", binding
58
-
59
- run_command "test -f /var/lib/systemd/linger/$USER || loginctl enable-linger"
60
- run_command "systemctl --user enable #{app}.target"
61
- run_command "systemctl --user restart #{app}.target"
62
64
  end
63
65
 
64
- private
65
-
66
66
  def run_command command
67
67
  puts command
68
68
  raise unless system(command)
69
69
  end
70
+
71
+ def include_dir
72
+ dir = options[:include_dir]
73
+ return unless dir
74
+
75
+ raise "include_dir '#{dir}' is not a directory" unless File.directory?(dir)
76
+ dir
77
+ end
78
+
79
+ def install_include_dir
80
+ if include_dir
81
+ run_command "cp -r #{include_dir}/. #{location}/"
82
+ end
83
+ end
84
+
85
+ def configure_systemd
86
+ run_command "systemctl --user daemon-reload"
87
+ run_command "test -f /var/lib/systemd/linger/$USER || loginctl enable-linger"
88
+ run_command "systemctl --user enable #{app}.target"
89
+ enable_timers
90
+ end
91
+
92
+ def enable_timers
93
+ if include_dir
94
+ Dir.glob("#{include_dir}/*.timer").each do |timer|
95
+ timer_name = File.basename(timer)
96
+ run_command "systemctl --user enable --now #{timer_name}"
97
+ end
98
+ end
99
+ end
70
100
  end
71
101
 
@@ -0,0 +1,38 @@
1
+ FROM ubuntu:22.04
2
+
3
+ ENV DEBIAN_FRONTEND=noninteractive
4
+
5
+ RUN apt-get update && apt-get install -y \
6
+ systemd \
7
+ systemd-sysv \
8
+ dbus \
9
+ dbus-user-session \
10
+ ruby \
11
+ ruby-bundler \
12
+ git \
13
+ && apt-get clean \
14
+ && rm -rf /var/lib/apt/lists/*
15
+
16
+ # Create test user
17
+ RUN useradd -m -s /bin/bash testuser \
18
+ && mkdir -p /home/testuser/.config/systemd/user \
19
+ && chown -R testuser:testuser /home/testuser
20
+
21
+ # Enable linger for testuser so user services start at boot
22
+ RUN mkdir -p /var/lib/systemd/linger \
23
+ && touch /var/lib/systemd/linger/testuser
24
+
25
+ # Remove unnecessary systemd services that won't work in container
26
+ RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
27
+ /etc/systemd/system/*.wants/* \
28
+ /lib/systemd/system/local-fs.target.wants/* \
29
+ /lib/systemd/system/sockets.target.wants/*udev* \
30
+ /lib/systemd/system/sockets.target.wants/*initctl* \
31
+ /lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup* \
32
+ /lib/systemd/system/systemd-update-utmp*
33
+
34
+ VOLUME ["/sys/fs/cgroup"]
35
+
36
+ STOPSIGNAL SIGRTMIN+3
37
+
38
+ CMD ["/sbin/init"]
@@ -0,0 +1,160 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "foreman export systemd-user" do
4
+ let(:container) { SystemdContainer }
5
+ let(:app_name) { "testapp" }
6
+ let(:systemd_dir) { container.user_systemd_dir }
7
+
8
+ before(:all) do
9
+ # Copy gem files to container and install
10
+ @gem_path = SystemdContainer.copy_gem_to_container
11
+ SystemdContainer.exec("bash", "-c", "cd #{@gem_path} && bundle install --quiet 2>&1")
12
+
13
+ # Set up a minimal Procfile in the test user's app directory
14
+ SystemdContainer.exec_as_user("mkdir -p /home/testuser/app")
15
+ SystemdContainer.exec_as_user("echo 'web: ruby -run -e httpd . -p $PORT' > /home/testuser/app/Procfile")
16
+
17
+ # Create a Gemfile in the app dir that references our gem
18
+ SystemdContainer.exec_as_user("cat > /home/testuser/app/Gemfile << EOF
19
+ source 'https://rubygems.org'
20
+ gem 'foreman-export-systemd_user', path: '#{@gem_path}'
21
+ EOF")
22
+ SystemdContainer.exec_as_user("cd /home/testuser/app && bundle config set --local path 'vendor/bundle' && bundle install --quiet 2>&1")
23
+ end
24
+
25
+ describe "basic export" do
26
+ before(:all) do
27
+ stdout, stderr, status = SystemdContainer.exec_as_user(
28
+ "cd /home/testuser/app && bundle exec foreman export systemd-user --app testapp 2>&1"
29
+ )
30
+ @export_output = stdout
31
+ @export_status = status
32
+ end
33
+
34
+ it "succeeds" do
35
+ expect(@export_status).to be_success
36
+ end
37
+
38
+ it "creates the master target file" do
39
+ stdout, _, _ = container.exec_as_user("cat #{systemd_dir}/testapp.target")
40
+ expect(stdout).to include("[Unit]")
41
+ expect(stdout).to include("testapp-web.target")
42
+ end
43
+
44
+ it "creates the process target file" do
45
+ stdout, _, _ = container.exec_as_user("cat #{systemd_dir}/testapp-web.target")
46
+ expect(stdout).to include("[Unit]")
47
+ end
48
+
49
+ it "creates the process service template" do
50
+ stdout, _, _ = container.exec_as_user("cat #{systemd_dir}/testapp-web@.service")
51
+ expect(stdout).to include("[Service]")
52
+ expect(stdout).to include("ExecStart=")
53
+ end
54
+
55
+ it "creates the target.wants directory with symlinks" do
56
+ stdout, _, _ = container.exec_as_user("ls -la #{systemd_dir}/testapp-web.target.wants/")
57
+ expect(stdout).to include("testapp-web@")
58
+ expect(stdout).to include("-> ../testapp-web@.service")
59
+ end
60
+
61
+ it "runs daemon-reload" do
62
+ expect(@export_output).to include("systemctl --user daemon-reload")
63
+ end
64
+
65
+ it "enables linger" do
66
+ expect(@export_output).to include("loginctl enable-linger")
67
+ end
68
+
69
+ it "enables the target" do
70
+ expect(@export_output).to include("systemctl --user enable testapp.target")
71
+ end
72
+
73
+ it "the target can be started" do
74
+ stdout, _, _ = container.exec_as_user("systemctl --user start testapp.target && systemctl --user is-active testapp.target")
75
+ expect(stdout.strip).to eq("active")
76
+ end
77
+ end
78
+
79
+ describe "with --include-dir" do
80
+ before(:all) do
81
+ # Create include-dir with drop-in and timer
82
+ SystemdContainer.exec_as_user("mkdir -p /home/testuser/app/Procfile.systemd/testapp-web@.service.d")
83
+ SystemdContainer.exec_as_user("echo '[Service]\nEnvironment=EXTRA=value' > /home/testuser/app/Procfile.systemd/testapp-web@.service.d/override.conf")
84
+
85
+ # Create a simple timer
86
+ SystemdContainer.exec_as_user("cat > /home/testuser/app/Procfile.systemd/testapp-cleanup.timer << 'EOF'
87
+ [Unit]
88
+ Description=Cleanup timer
89
+
90
+ [Timer]
91
+ OnCalendar=daily
92
+
93
+ [Install]
94
+ WantedBy=timers.target
95
+ EOF")
96
+
97
+ SystemdContainer.exec_as_user("cat > /home/testuser/app/Procfile.systemd/testapp-cleanup.service << 'EOF'
98
+ [Unit]
99
+ Description=Cleanup service
100
+
101
+ [Service]
102
+ Type=oneshot
103
+ ExecStart=/bin/true
104
+ EOF")
105
+
106
+ # Stop any existing target first
107
+ SystemdContainer.exec_as_user("systemctl --user stop testapp.target 2>/dev/null || true")
108
+
109
+ # Run export with --include-dir
110
+ stdout, stderr, status = SystemdContainer.exec_as_user(
111
+ "cd /home/testuser/app && bundle exec foreman export systemd-user --app testapp --include-dir Procfile.systemd 2>&1"
112
+ )
113
+ @export_output = stdout
114
+ @export_status = status
115
+ end
116
+
117
+ it "succeeds" do
118
+ expect(@export_status).to be_success
119
+ end
120
+
121
+ it "copies the drop-in directory" do
122
+ stdout, _, _ = container.exec_as_user("cat #{systemd_dir}/testapp-web@.service.d/override.conf")
123
+ expect(stdout).to include("EXTRA=value")
124
+ end
125
+
126
+ it "copies the timer file" do
127
+ stdout, _, _ = container.exec_as_user("cat #{systemd_dir}/testapp-cleanup.timer")
128
+ expect(stdout).to include("OnCalendar=daily")
129
+ end
130
+
131
+ it "copies the service file" do
132
+ stdout, _, _ = container.exec_as_user("cat #{systemd_dir}/testapp-cleanup.service")
133
+ expect(stdout).to include("ExecStart=/bin/true")
134
+ end
135
+
136
+ it "enables the timer with --now" do
137
+ expect(@export_output).to include("systemctl --user enable --now testapp-cleanup.timer")
138
+ end
139
+
140
+ it "the timer is active" do
141
+ stdout, _, _ = container.exec_as_user("systemctl --user is-active testapp-cleanup.timer")
142
+ expect(stdout.strip).to eq("active")
143
+ end
144
+
145
+ it "the drop-in is applied" do
146
+ stdout, _, _ = container.exec_as_user("systemctl --user show testapp-web@5000.service -p Environment")
147
+ expect(stdout).to include("EXTRA=value")
148
+ end
149
+ end
150
+
151
+ describe "error handling" do
152
+ it "raises error when include-dir is not a directory" do
153
+ stdout, _, status = container.exec_as_user(
154
+ "cd /home/testuser/app && bundle exec foreman export systemd-user --app testapp --include-dir /nonexistent 2>&1"
155
+ )
156
+ expect(status).not_to be_success
157
+ expect(stdout).to include("not a directory")
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,102 @@
1
+ require "open3"
2
+ require "fileutils"
3
+ require "tmpdir"
4
+
5
+ module SystemdContainer
6
+ DOCKERFILE_PATH = File.expand_path("Dockerfile.systemd", __dir__)
7
+ IMAGE_NAME = "foreman-export-systemd-user-test"
8
+ CONTAINER_NAME = "foreman-export-systemd-user-test-container"
9
+ TEST_USER = "testuser"
10
+
11
+ class << self
12
+ def start
13
+ build_image
14
+ stop
15
+
16
+ cmd = [
17
+ "podman", "run", "-d",
18
+ "--name", CONTAINER_NAME,
19
+ "--privileged",
20
+ "-v", "/sys/fs/cgroup:/sys/fs/cgroup:rw",
21
+ IMAGE_NAME
22
+ ]
23
+ run_command(cmd)
24
+ wait_for_systemd
25
+ end
26
+
27
+ def stop
28
+ system("podman", "stop", CONTAINER_NAME, out: File::NULL, err: File::NULL)
29
+ system("podman", "rm", CONTAINER_NAME, out: File::NULL, err: File::NULL)
30
+ end
31
+
32
+ def exec(*command)
33
+ cmd = ["podman", "exec", CONTAINER_NAME] + command.flatten
34
+ stdout, stderr, status = Open3.capture3(*cmd)
35
+ [stdout, stderr, status]
36
+ end
37
+
38
+ def exec_as_user(command)
39
+ exec("su", "-", TEST_USER, "-c", command)
40
+ end
41
+
42
+ def user_systemd_dir
43
+ "/home/#{TEST_USER}/.config/systemd/user"
44
+ end
45
+
46
+ def copy_to_container(src, dest)
47
+ run_command(["podman", "cp", src, "#{CONTAINER_NAME}:#{dest}"])
48
+ end
49
+
50
+ def copy_gem_to_container(dest = "/tmp/gem")
51
+ gem_root = File.expand_path("../..", __FILE__)
52
+
53
+ # Copy entire gem directory (including .git for gemspec)
54
+ copy_to_container(gem_root, dest)
55
+
56
+ # Remove Gemfile.lock to avoid bundler version mismatch
57
+ exec("rm", "-f", "#{dest}/Gemfile.lock")
58
+
59
+ # Fix permissions so test user can read the gem files
60
+ exec("chmod", "-R", "a+rX", dest)
61
+
62
+ # Fix git safe.directory for root and test user
63
+ exec("git", "config", "--global", "--add", "safe.directory", dest)
64
+ exec_as_user("git config --global --add safe.directory #{dest}")
65
+
66
+ dest
67
+ end
68
+
69
+ private
70
+
71
+ def run_command(cmd)
72
+ stdout, stderr, status = Open3.capture3(*cmd)
73
+ raise "Command failed: #{cmd.join(' ')}\n#{stderr}" unless status.success?
74
+ stdout
75
+ end
76
+
77
+ def build_image
78
+ run_command(["podman", "build", "-t", IMAGE_NAME, "-f", DOCKERFILE_PATH, File.dirname(DOCKERFILE_PATH)])
79
+ end
80
+
81
+ def wait_for_systemd(timeout: 30)
82
+ deadline = Time.now + timeout
83
+ loop do
84
+ stdout, _, status = exec("systemctl", "is-system-running")
85
+ state = stdout.strip
86
+ break if %w[running degraded].include?(state)
87
+ raise "Timed out waiting for systemd" if Time.now > deadline
88
+ sleep 0.5
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ RSpec.configure do |config|
95
+ config.before(:suite) do
96
+ SystemdContainer.start
97
+ end
98
+
99
+ config.after(:suite) do
100
+ SystemdContainer.stop
101
+ end
102
+ end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman-export-systemd_user
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Geisel
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-12-29 00:00:00.000000000 Z
10
+ date: 2026-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: foreman
@@ -16,36 +15,57 @@ dependencies:
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '0'
18
+ version: 0.90.0
20
19
  type: :runtime
21
20
  prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 0.90.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: rspec
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
22
35
  version_requirements: !ruby/object:Gem::Requirement
23
36
  requirements:
24
37
  - - ">="
25
38
  - !ruby/object:Gem::Version
26
39
  version: '0'
27
- description: Upstart user-level export scripts for systemd on Ubuntu 16.04+
40
+ description: Foreman export scripts for user-level systemd
28
41
  email:
29
42
  - micah@botandrose.com
30
- executables: []
43
+ executables:
44
+ - foreman
45
+ - setup
31
46
  extensions: []
32
47
  extra_rdoc_files: []
33
48
  files:
49
+ - ".github/workflows/ci.yml"
34
50
  - ".gitignore"
35
51
  - Gemfile
36
52
  - LICENSE
37
53
  - README.md
38
54
  - Rakefile
55
+ - bin/foreman
56
+ - bin/setup
39
57
  - data/export/systemd_user/master.target.erb
40
58
  - data/export/systemd_user/process.service.erb
41
59
  - data/export/systemd_user/process_master.target.erb
42
60
  - foreman-export-systemd_user.gemspec
43
61
  - lib/foreman-export-systemd_user.rb
44
62
  - lib/foreman/export/systemd_user.rb
63
+ - spec/Dockerfile.systemd
64
+ - spec/foreman/export/systemd_user_spec.rb
65
+ - spec/spec_helper.rb
45
66
  homepage: http://github.com/botandrose/foreman-export-systemd_user
46
67
  licenses: []
47
68
  metadata: {}
48
- post_install_message:
49
69
  rdoc_options: []
50
70
  require_paths:
51
71
  - lib
@@ -60,8 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
80
  - !ruby/object:Gem::Version
61
81
  version: '0'
62
82
  requirements: []
63
- rubygems_version: 3.2.32
64
- signing_key:
83
+ rubygems_version: 3.6.2
65
84
  specification_version: 4
66
- summary: Upstart user-level export scripts for systemd on Ubuntu 16.04+
85
+ summary: Foreman export scripts for user-level systemd
67
86
  test_files: []