ypadlyak-foreman 0.81.0

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.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +53 -0
  3. data/bin/foreman +7 -0
  4. data/bin/foreman-runner +41 -0
  5. data/data/example/Procfile +4 -0
  6. data/data/example/Procfile.without_colon +2 -0
  7. data/data/example/error +7 -0
  8. data/data/example/log/neverdie.log +4 -0
  9. data/data/example/spawnee +14 -0
  10. data/data/example/spawner +7 -0
  11. data/data/example/ticker +14 -0
  12. data/data/example/utf8 +11 -0
  13. data/data/export/bluepill/master.pill.erb +28 -0
  14. data/data/export/daemon/master.conf.erb +14 -0
  15. data/data/export/daemon/process.conf.erb +8 -0
  16. data/data/export/daemon/process_master.conf.erb +2 -0
  17. data/data/export/launchd/launchd.plist.erb +33 -0
  18. data/data/export/runit/log/run.erb +7 -0
  19. data/data/export/runit/run.erb +4 -0
  20. data/data/export/supervisord/app.conf.erb +32 -0
  21. data/data/export/systemd/master.target.erb +5 -0
  22. data/data/export/systemd/process.service.erb +15 -0
  23. data/data/export/systemd/process_master.target.erb +3 -0
  24. data/data/export/upstart/master.conf.erb +2 -0
  25. data/data/export/upstart/process.conf.erb +18 -0
  26. data/data/export/upstart/process_master.conf.erb +2 -0
  27. data/lib/foreman/cli.rb +160 -0
  28. data/lib/foreman/distribution.rb +9 -0
  29. data/lib/foreman/engine/cli.rb +104 -0
  30. data/lib/foreman/engine.rb +486 -0
  31. data/lib/foreman/env.rb +29 -0
  32. data/lib/foreman/export/base.rb +156 -0
  33. data/lib/foreman/export/bluepill.rb +12 -0
  34. data/lib/foreman/export/daemon.rb +28 -0
  35. data/lib/foreman/export/inittab.rb +42 -0
  36. data/lib/foreman/export/launchd.rb +22 -0
  37. data/lib/foreman/export/runit.rb +34 -0
  38. data/lib/foreman/export/supervisord.rb +16 -0
  39. data/lib/foreman/export/systemd.rb +32 -0
  40. data/lib/foreman/export/upstart.rb +43 -0
  41. data/lib/foreman/export.rb +36 -0
  42. data/lib/foreman/helpers.rb +45 -0
  43. data/lib/foreman/process.rb +80 -0
  44. data/lib/foreman/procfile.rb +94 -0
  45. data/lib/foreman/version.rb +5 -0
  46. data/lib/foreman.rb +17 -0
  47. data/man/foreman.1 +284 -0
  48. data/spec/foreman/cli_spec.rb +111 -0
  49. data/spec/foreman/engine_spec.rb +114 -0
  50. data/spec/foreman/export/base_spec.rb +19 -0
  51. data/spec/foreman/export/bluepill_spec.rb +37 -0
  52. data/spec/foreman/export/daemon_spec.rb +97 -0
  53. data/spec/foreman/export/inittab_spec.rb +40 -0
  54. data/spec/foreman/export/launchd_spec.rb +31 -0
  55. data/spec/foreman/export/runit_spec.rb +36 -0
  56. data/spec/foreman/export/supervisord_spec.rb +38 -0
  57. data/spec/foreman/export/systemd_spec.rb +91 -0
  58. data/spec/foreman/export/upstart_spec.rb +118 -0
  59. data/spec/foreman/export_spec.rb +24 -0
  60. data/spec/foreman/helpers_spec.rb +26 -0
  61. data/spec/foreman/process_spec.rb +71 -0
  62. data/spec/foreman/procfile_spec.rb +50 -0
  63. data/spec/foreman_spec.rb +16 -0
  64. data/spec/helper_spec.rb +19 -0
  65. data/spec/resources/Procfile +5 -0
  66. data/spec/resources/Procfile.bad +2 -0
  67. data/spec/resources/bin/echo +2 -0
  68. data/spec/resources/bin/env +2 -0
  69. data/spec/resources/bin/test +2 -0
  70. data/spec/resources/bin/utf8 +2 -0
  71. data/spec/resources/export/bluepill/app-concurrency.pill +49 -0
  72. data/spec/resources/export/bluepill/app.pill +81 -0
  73. data/spec/resources/export/daemon/app-alpha-1.conf +7 -0
  74. data/spec/resources/export/daemon/app-alpha-2.conf +7 -0
  75. data/spec/resources/export/daemon/app-alpha.conf +2 -0
  76. data/spec/resources/export/daemon/app-bravo-1.conf +7 -0
  77. data/spec/resources/export/daemon/app-bravo.conf +2 -0
  78. data/spec/resources/export/daemon/app.conf +14 -0
  79. data/spec/resources/export/inittab/inittab.concurrency +4 -0
  80. data/spec/resources/export/inittab/inittab.default +6 -0
  81. data/spec/resources/export/launchd/launchd-a.default +29 -0
  82. data/spec/resources/export/launchd/launchd-b.default +29 -0
  83. data/spec/resources/export/launchd/launchd-c.default +30 -0
  84. data/spec/resources/export/runit/app-alpha-1/log/run +7 -0
  85. data/spec/resources/export/runit/app-alpha-1/run +4 -0
  86. data/spec/resources/export/runit/app-alpha-2/log/run +7 -0
  87. data/spec/resources/export/runit/app-alpha-2/run +4 -0
  88. data/spec/resources/export/runit/app-bravo-1/log/run +7 -0
  89. data/spec/resources/export/runit/app-bravo-1/run +4 -0
  90. data/spec/resources/export/supervisord/app-alpha-1.conf +46 -0
  91. data/spec/resources/export/supervisord/app-alpha-2.conf +24 -0
  92. data/spec/resources/export/systemd/concurrency/app-alpha-1.service +14 -0
  93. data/spec/resources/export/systemd/concurrency/app-alpha-2.service +14 -0
  94. data/spec/resources/export/systemd/concurrency/app-alpha.target +3 -0
  95. data/spec/resources/export/systemd/concurrency/app.target +5 -0
  96. data/spec/resources/export/systemd/standard/app-alpha-1.service +14 -0
  97. data/spec/resources/export/systemd/standard/app-alpha.target +3 -0
  98. data/spec/resources/export/systemd/standard/app-bravo-1.service +14 -0
  99. data/spec/resources/export/systemd/standard/app-bravo.target +3 -0
  100. data/spec/resources/export/systemd/standard/app.target +5 -0
  101. data/spec/resources/export/upstart/app-alpha-1.conf +11 -0
  102. data/spec/resources/export/upstart/app-alpha-2.conf +11 -0
  103. data/spec/resources/export/upstart/app-alpha.conf +2 -0
  104. data/spec/resources/export/upstart/app-bravo-1.conf +11 -0
  105. data/spec/resources/export/upstart/app-bravo.conf +2 -0
  106. data/spec/resources/export/upstart/app.conf +2 -0
  107. data/spec/spec_helper.rb +180 -0
  108. metadata +164 -0
@@ -0,0 +1,81 @@
1
+ Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepill.log") do |app|
2
+
3
+ app.uid = "app"
4
+ app.gid = "app"
5
+
6
+
7
+
8
+
9
+ app.process("alpha-1") do |process|
10
+ process.start_command = %Q{./alpha}
11
+
12
+ process.working_dir = "/tmp/app"
13
+ process.daemonize = true
14
+ process.environment = {"PORT"=>"5000"}
15
+ process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
16
+ process.stop_grace_time = 45.seconds
17
+
18
+ process.stdout = process.stderr = "/var/log/app/app-alpha-1.log"
19
+
20
+ process.monitor_children do |children|
21
+ children.stop_command "kill {{PID}}"
22
+ end
23
+
24
+ process.group = "app-alpha"
25
+ end
26
+
27
+ app.process("bravo-1") do |process|
28
+ process.start_command = %Q{./bravo}
29
+
30
+ process.working_dir = "/tmp/app"
31
+ process.daemonize = true
32
+ process.environment = {"PORT"=>"5100"}
33
+ process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
34
+ process.stop_grace_time = 45.seconds
35
+
36
+ process.stdout = process.stderr = "/var/log/app/app-bravo-1.log"
37
+
38
+ process.monitor_children do |children|
39
+ children.stop_command "kill {{PID}}"
40
+ end
41
+
42
+ process.group = "app-bravo"
43
+ end
44
+
45
+ app.process("foo_bar-1") do |process|
46
+ process.start_command = %Q{./foo_bar}
47
+
48
+ process.working_dir = "/tmp/app"
49
+ process.daemonize = true
50
+ process.environment = {"PORT"=>"5200"}
51
+ process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
52
+ process.stop_grace_time = 45.seconds
53
+
54
+ process.stdout = process.stderr = "/var/log/app/app-foo_bar-1.log"
55
+
56
+ process.monitor_children do |children|
57
+ children.stop_command "kill {{PID}}"
58
+ end
59
+
60
+ process.group = "app-foo_bar"
61
+ end
62
+
63
+ app.process("foo-bar-1") do |process|
64
+ process.start_command = %Q{./foo-bar}
65
+
66
+ process.working_dir = "/tmp/app"
67
+ process.daemonize = true
68
+ process.environment = {"PORT"=>"5300"}
69
+ process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
70
+ process.stop_grace_time = 45.seconds
71
+
72
+ process.stdout = process.stderr = "/var/log/app/app-foo-bar-1.log"
73
+
74
+ process.monitor_children do |children|
75
+
76
+ children.stop_command "kill {{PID}}"
77
+ end
78
+
79
+ process.group = "app-foo-bar"
80
+ end
81
+ end
@@ -0,0 +1,7 @@
1
+ start on starting app-alpha
2
+ stop on stopping app-alpha
3
+ respawn
4
+
5
+ env PORT=5000
6
+
7
+ exec start-stop-daemon --start --chuid app --chdir /tmp/app --make-pidfile --pidfile /var/run/app/app-alpha-1.pid --exec ./alpha >> /var/log/app/app-alpha-1.log 2>&1
@@ -0,0 +1,7 @@
1
+ start on starting app-alpha
2
+ stop on stopping app-alpha
3
+ respawn
4
+
5
+ env PORT=5001
6
+
7
+ exec start-stop-daemon --start --chuid app --chdir /tmp/app --make-pidfile --pidfile /var/run/app/app-alpha-2.pid --exec ./alpha >> /var/log/app/app-alpha-2.log 2>&1
@@ -0,0 +1,2 @@
1
+ start on starting app
2
+ stop on stopping app
@@ -0,0 +1,7 @@
1
+ start on starting app-bravo
2
+ stop on stopping app-bravo
3
+ respawn
4
+
5
+ env PORT=5100
6
+
7
+ exec start-stop-daemon --start --chuid app --chdir /tmp/app --make-pidfile --pidfile /var/run/app/app-bravo-1.pid --exec ./bravo >> /var/log/app/app-bravo-1.log 2>&1
@@ -0,0 +1,2 @@
1
+ start on starting app
2
+ stop on stopping app
@@ -0,0 +1,14 @@
1
+ pre-start script
2
+
3
+ bash << "EOF"
4
+ mkdir -p /var/log/app
5
+ chown -R app /var/log/app
6
+ mkdir -p /var/run/app
7
+ chown -R app /var/run/app
8
+ EOF
9
+
10
+ end script
11
+
12
+ start on runlevel [2345]
13
+
14
+ stop on runlevel [016]
@@ -0,0 +1,4 @@
1
+ # ----- foreman app processes -----
2
+ AP01:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5000;./alpha >> /var/log/app/alpha-1.log 2>&1'
3
+ AP02:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5001;./alpha >> /var/log/app/alpha-2.log 2>&1'
4
+ # ----- end foreman app processes -----
@@ -0,0 +1,6 @@
1
+ # ----- foreman app processes -----
2
+ AP01:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5000;./alpha >> /var/log/app/alpha-1.log 2>&1'
3
+ AP02:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5100;./bravo >> /var/log/app/bravo-1.log 2>&1'
4
+ AP03:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5200;./foo_bar >> /var/log/app/foo_bar-1.log 2>&1'
5
+ AP04:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5300;./foo-bar >> /var/log/app/foo-bar-1.log 2>&1'
6
+ # ----- end foreman app processes -----
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>app-alpha-1</string>
7
+ <key>EnvironmentVariables</key>
8
+ <dict>
9
+ <key>PORT</key>
10
+ <string>5000</string>
11
+ </dict>
12
+ <key>ProgramArguments</key>
13
+ <array>
14
+ <string>./alpha</string>
15
+ </array>
16
+ <key>KeepAlive</key>
17
+ <true/>
18
+ <key>RunAtLoad</key>
19
+ <true/>
20
+ <key>StandardOutPath</key>
21
+ <string>/var/log/app/app-alpha-1.log</string>
22
+ <key>StandardErrorPath</key>
23
+ <string>/var/log/app/app-alpha-1.log</string>
24
+ <key>UserName</key>
25
+ <string>app</string>
26
+ <key>WorkingDirectory</key>
27
+ <string>/tmp/app</string>
28
+ </dict>
29
+ </plist>
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>app-bravo-1</string>
7
+ <key>EnvironmentVariables</key>
8
+ <dict>
9
+ <key>PORT</key>
10
+ <string>5100</string>
11
+ </dict>
12
+ <key>ProgramArguments</key>
13
+ <array>
14
+ <string>./bravo</string>
15
+ </array>
16
+ <key>KeepAlive</key>
17
+ <true/>
18
+ <key>RunAtLoad</key>
19
+ <true/>
20
+ <key>StandardOutPath</key>
21
+ <string>/var/log/app/app-bravo-1.log</string>
22
+ <key>StandardErrorPath</key>
23
+ <string>/var/log/app/app-bravo-1.log</string>
24
+ <key>UserName</key>
25
+ <string>app</string>
26
+ <key>WorkingDirectory</key>
27
+ <string>/tmp/app</string>
28
+ </dict>
29
+ </plist>
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>app-alpha-1</string>
7
+ <key>EnvironmentVariables</key>
8
+ <dict>
9
+ <key>PORT</key>
10
+ <string>5000</string>
11
+ </dict>
12
+ <key>ProgramArguments</key>
13
+ <array>
14
+ <string>./alpha</string>
15
+ <string>charlie</string>
16
+ </array>
17
+ <key>KeepAlive</key>
18
+ <true/>
19
+ <key>RunAtLoad</key>
20
+ <true/>
21
+ <key>StandardOutPath</key>
22
+ <string>/var/log/app/app-alpha-1.log</string>
23
+ <key>StandardErrorPath</key>
24
+ <string>/var/log/app/app-alpha-1.log</string>
25
+ <key>UserName</key>
26
+ <string>app</string>
27
+ <key>WorkingDirectory</key>
28
+ <string>/tmp/app</string>
29
+ </dict>
30
+ </plist>
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ LOG=/var/log/app/alpha-1
5
+
6
+ test -d "$LOG" || mkdir -p -m 2750 "$LOG" && chown app "$LOG"
7
+ exec chpst -u app svlogd "$LOG"
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+ cd /tmp/app
3
+ exec 2>&1
4
+ exec chpst -u app -e /tmp/init/app-alpha-1/env ./alpha bar=baz
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ LOG=/var/log/app/alpha-2
5
+
6
+ test -d "$LOG" || mkdir -p -m 2750 "$LOG" && chown app "$LOG"
7
+ exec chpst -u app svlogd "$LOG"
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+ cd /tmp/app
3
+ exec 2>&1
4
+ exec chpst -u app -e /tmp/init/app-alpha-2/env ./alpha bar=baz
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ LOG=/var/log/app/bravo-1
5
+
6
+ test -d "$LOG" || mkdir -p -m 2750 "$LOG" && chown app "$LOG"
7
+ exec chpst -u app svlogd "$LOG"
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+ cd /tmp/app
3
+ exec 2>&1
4
+ exec chpst -u app -e /tmp/init/app-bravo-1/env ./bravo
@@ -0,0 +1,46 @@
1
+ [program:app-alpha-1]
2
+ command=./alpha
3
+ autostart=true
4
+ autorestart=true
5
+ stopsignal=QUIT
6
+ stdout_logfile=/var/log/app/alpha-1.log
7
+ stderr_logfile=/var/log/app/alpha-1.error.log
8
+ user=app
9
+ directory=/tmp/app
10
+ environment=FOO="bar",URL="http://example.com/api?foo=bar&baz=1",PORT="5000"
11
+
12
+ [program:app-bravo-1]
13
+ command=./bravo
14
+ autostart=true
15
+ autorestart=true
16
+ stopsignal=QUIT
17
+ stdout_logfile=/var/log/app/bravo-1.log
18
+ stderr_logfile=/var/log/app/bravo-1.error.log
19
+ user=app
20
+ directory=/tmp/app
21
+ environment=FOO="bar",URL="http://example.com/api?foo=bar&baz=1",PORT="5100"
22
+
23
+ [program:app-foo_bar-1]
24
+ command=./foo_bar
25
+ autostart=true
26
+ autorestart=true
27
+ stopsignal=QUIT
28
+ stdout_logfile=/var/log/app/foo_bar-1.log
29
+ stderr_logfile=/var/log/app/foo_bar-1.error.log
30
+ user=app
31
+ directory=/tmp/app
32
+ environment=FOO="bar",URL="http://example.com/api?foo=bar&baz=1",PORT="5200"
33
+
34
+ [program:app-foo-bar-1]
35
+ command=./foo-bar
36
+ autostart=true
37
+ autorestart=true
38
+ stopsignal=QUIT
39
+ stdout_logfile=/var/log/app/foo-bar-1.log
40
+ stderr_logfile=/var/log/app/foo-bar-1.error.log
41
+ user=app
42
+ directory=/tmp/app
43
+ environment=FOO="bar",URL="http://example.com/api?foo=bar&baz=1",PORT="5300"
44
+
45
+ [group:app]
46
+ programs=app-alpha-1,app-bravo-1,app-foo_bar-1,app-foo-bar-1
@@ -0,0 +1,24 @@
1
+ [program:app-alpha-1]
2
+ command=./alpha
3
+ autostart=true
4
+ autorestart=true
5
+ stopsignal=QUIT
6
+ stdout_logfile=/var/log/app/alpha-1.log
7
+ stderr_logfile=/var/log/app/alpha-1.error.log
8
+ user=app
9
+ directory=/tmp/app
10
+ environment=PORT="5000"
11
+
12
+ [program:app-alpha-2]
13
+ command=./alpha
14
+ autostart=true
15
+ autorestart=true
16
+ stopsignal=QUIT
17
+ stdout_logfile=/var/log/app/alpha-2.log
18
+ stderr_logfile=/var/log/app/alpha-2.error.log
19
+ user=app
20
+ directory=/tmp/app
21
+ environment=PORT="5001"
22
+
23
+ [group:app]
24
+ programs=app-alpha-1,app-alpha-2
@@ -0,0 +1,14 @@
1
+ [Unit]
2
+ PartOf=app-alpha.target
3
+
4
+ [Service]
5
+ User=app
6
+ WorkingDirectory=/tmp/app
7
+ Environment=PORT=5000
8
+ ExecStart=/bin/bash -lc './alpha'
9
+ Restart=always
10
+ StandardInput=null
11
+ StandardOutput=syslog
12
+ StandardError=syslog
13
+ SyslogIdentifier=%n
14
+ KillMode=process
@@ -0,0 +1,14 @@
1
+ [Unit]
2
+ PartOf=app-alpha.target
3
+
4
+ [Service]
5
+ User=app
6
+ WorkingDirectory=/tmp/app
7
+ Environment=PORT=5001
8
+ ExecStart=/bin/bash -lc './alpha'
9
+ Restart=always
10
+ StandardInput=null
11
+ StandardOutput=syslog
12
+ StandardError=syslog
13
+ SyslogIdentifier=%n
14
+ KillMode=process
@@ -0,0 +1,3 @@
1
+ [Unit]
2
+ PartOf=app.target
3
+ Wants=app-alpha-1.service app-alpha-2.service
@@ -0,0 +1,5 @@
1
+ [Unit]
2
+ Wants=app-alpha.target
3
+
4
+ [Install]
5
+ WantedBy=multi-user.target
@@ -0,0 +1,14 @@
1
+ [Unit]
2
+ PartOf=app-alpha.target
3
+
4
+ [Service]
5
+ User=app
6
+ WorkingDirectory=/tmp/app
7
+ Environment=PORT=5000
8
+ ExecStart=/bin/bash -lc './alpha'
9
+ Restart=always
10
+ StandardInput=null
11
+ StandardOutput=syslog
12
+ StandardError=syslog
13
+ SyslogIdentifier=%n
14
+ KillMode=process
@@ -0,0 +1,3 @@
1
+ [Unit]
2
+ PartOf=app.target
3
+ Wants=app-alpha-1.service
@@ -0,0 +1,14 @@
1
+ [Unit]
2
+ PartOf=app-bravo.target
3
+
4
+ [Service]
5
+ User=app
6
+ WorkingDirectory=/tmp/app
7
+ Environment=PORT=5100
8
+ ExecStart=/bin/bash -lc './bravo'
9
+ Restart=always
10
+ StandardInput=null
11
+ StandardOutput=syslog
12
+ StandardError=syslog
13
+ SyslogIdentifier=%n
14
+ KillMode=process
@@ -0,0 +1,3 @@
1
+ [Unit]
2
+ PartOf=app.target
3
+ Wants=app-bravo-1.service
@@ -0,0 +1,5 @@
1
+ [Unit]
2
+ Wants=app-alpha.target app-bravo.target app-foo_bar.target app-foo-bar.target
3
+
4
+ [Install]
5
+ WantedBy=multi-user.target
@@ -0,0 +1,11 @@
1
+ start on starting app-alpha
2
+ stop on stopping app-alpha
3
+ respawn
4
+
5
+ env PORT=5000
6
+
7
+ setuid app
8
+
9
+ chdir /tmp/app
10
+
11
+ exec ./alpha
@@ -0,0 +1,11 @@
1
+ start on starting app-alpha
2
+ stop on stopping app-alpha
3
+ respawn
4
+
5
+ env PORT=5001
6
+
7
+ setuid app
8
+
9
+ chdir /tmp/app
10
+
11
+ exec ./alpha
@@ -0,0 +1,2 @@
1
+ start on starting app
2
+ stop on stopping app
@@ -0,0 +1,11 @@
1
+ start on starting app-bravo
2
+ stop on stopping app-bravo
3
+ respawn
4
+
5
+ env PORT=5100
6
+
7
+ setuid app
8
+
9
+ chdir /tmp/app
10
+
11
+ exec ./bravo
@@ -0,0 +1,2 @@
1
+ start on starting app
2
+ stop on stopping app
@@ -0,0 +1,2 @@
1
+ start on runlevel [2345]
2
+ stop on runlevel [!2345]
@@ -0,0 +1,180 @@
1
+ require "codeclimate-test-reporter"
2
+ CodeClimate::TestReporter.start
3
+
4
+ require "simplecov"
5
+ SimpleCov.start do
6
+ add_filter "/spec/"
7
+ end
8
+
9
+ require "rspec"
10
+ require "timecop"
11
+ require "fakefs/safe"
12
+ require "fakefs/spec_helpers"
13
+
14
+ $:.unshift File.expand_path("../../lib", __FILE__)
15
+
16
+ def mock_export_error(message)
17
+ expect { yield }.to raise_error(Foreman::Export::Exception, message)
18
+ end
19
+
20
+ def mock_error(subject, message)
21
+ mock_exit do
22
+ mock(subject).puts("ERROR: #{message}")
23
+ yield
24
+ end
25
+ end
26
+
27
+ def make_pipe
28
+ IO.method(:pipe).arity.zero? ? IO.pipe : IO.pipe("BINARY")
29
+ end
30
+
31
+ def foreman(args)
32
+ capture_stdout do
33
+ begin
34
+ Foreman::CLI.start(args.split(" "))
35
+ rescue SystemExit
36
+ end
37
+ end
38
+ end
39
+
40
+ def forked_foreman(args)
41
+ rd, wr = make_pipe
42
+ Process.spawn("bundle exec bin/foreman #{args}", :out => wr, :err => wr)
43
+ wr.close
44
+ rd.read
45
+ end
46
+
47
+ def fork_and_capture(&blk)
48
+ rd, wr = make_pipe
49
+ pid = fork do
50
+ rd.close
51
+ wr.sync = true
52
+ $stdout.reopen wr
53
+ $stderr.reopen wr
54
+ blk.call
55
+ $stdout.flush
56
+ $stdout.close
57
+ end
58
+ wr.close
59
+ Process.wait pid
60
+ buffer = ""
61
+ until rd.eof?
62
+ buffer += rd.gets
63
+ end
64
+ end
65
+
66
+ def fork_and_get_exitstatus(args)
67
+ pid = Process.spawn("bundle exec bin/foreman #{args}", :out => "/dev/null", :err => "/dev/null")
68
+ Process.wait(pid)
69
+ $?.exitstatus
70
+ end
71
+
72
+ def mock_exit(&block)
73
+ expect(block).to raise_error(SystemExit)
74
+ end
75
+
76
+ def write_foreman_config(app)
77
+ File.open("/etc/foreman/#{app}.conf", "w") do |file|
78
+ file.puts %{#{app}_processes="alpha bravo"}
79
+ file.puts %{#{app}_alpha="1"}
80
+ file.puts %{#{app}_bravo="2"}
81
+ end
82
+ end
83
+
84
+ def write_procfile(procfile="Procfile", alpha_env="")
85
+ FileUtils.mkdir_p(File.dirname(procfile))
86
+ File.open(procfile, "w") do |file|
87
+ file.puts "alpha: ./alpha" + " #{alpha_env}".rstrip
88
+ file.puts "\n"
89
+ file.puts "bravo:\t./bravo"
90
+ file.puts "foo_bar:\t./foo_bar"
91
+ file.puts "foo-bar:\t./foo-bar"
92
+ end
93
+ File.expand_path(procfile)
94
+ end
95
+
96
+ def write_file(file)
97
+ FileUtils.mkdir_p(File.dirname(file))
98
+ File.open(file, 'w') do |f|
99
+ yield(f)
100
+ end
101
+ end
102
+
103
+ def write_env(env=".env", options={"FOO"=>"bar"})
104
+ File.open(env, "w") do |file|
105
+ options.each do |key, val|
106
+ file.puts "#{key}=#{val}"
107
+ end
108
+ end
109
+ end
110
+
111
+ def without_fakefs
112
+ FakeFS.deactivate!
113
+ ret = yield
114
+ FakeFS.activate!
115
+ ret
116
+ end
117
+
118
+ def load_export_templates_into_fakefs(type)
119
+ without_fakefs do
120
+ Dir[File.expand_path("../../data/export/#{type}/**/*", __FILE__)].inject({}) do |hash, file|
121
+ next(hash) if File.directory?(file)
122
+ hash.update(file => File.read(file))
123
+ end
124
+ end.each do |filename, contents|
125
+ FileUtils.mkdir_p File.dirname(filename)
126
+ File.open(filename, "w") do |f|
127
+ f.puts contents
128
+ end
129
+ end
130
+ end
131
+
132
+ def resource_path(filename)
133
+ File.expand_path("../resources/#{filename}", __FILE__)
134
+ end
135
+
136
+ def example_export_file(filename)
137
+ FakeFS.deactivate!
138
+ data = File.read(File.expand_path(resource_path("export/#{filename}"), __FILE__))
139
+ FakeFS.activate!
140
+ data
141
+ end
142
+
143
+ def preserving_env
144
+ old_env = ENV.to_hash
145
+ begin
146
+ yield
147
+ ensure
148
+ ENV.clear
149
+ ENV.update(old_env)
150
+ end
151
+ end
152
+
153
+ def normalize_space(s)
154
+ s.gsub(/\n[\n\s]*/, "\n")
155
+ end
156
+
157
+ def capture_stdout
158
+ old_stdout = $stdout.dup
159
+ rd, wr = make_pipe
160
+ $stdout = wr
161
+ yield
162
+ wr.close
163
+ rd.read
164
+ ensure
165
+ $stdout = old_stdout
166
+ end
167
+
168
+ RSpec.configure do |config|
169
+ config.treat_symbols_as_metadata_keys_with_true_values = true
170
+ config.color = true
171
+ config.order = 'rand'
172
+ config.include FakeFS::SpecHelpers, :fakefs
173
+ config.mock_with :rr
174
+ config.before(:each) do
175
+ FileUtils.mkdir_p('/tmp')
176
+ end
177
+ config.after(:each) do
178
+ FileUtils.rm_rf('/tmp')
179
+ end
180
+ end