upstart-exporter 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,175 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.7.4
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ relpath = '';
19
+ if (relpath != '') relpath += '/';
20
+ </script>
21
+
22
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
25
+
26
+
27
+ </head>
28
+ <body>
29
+ <script type="text/javascript" charset="utf-8">
30
+ if (window.top.frames.main) document.body.className = 'frames';
31
+ </script>
32
+
33
+ <div id="header">
34
+ <div id="menu">
35
+
36
+ <a href="_index.html" title="Index">Index</a> &raquo;
37
+ <span class="title">File: README</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a id="class_list_link" href="#">Class List</a>
46
+
47
+ <a id="method_list_link" href="#">Method List</a>
48
+
49
+ <a id="file_list_link" href="#">File List</a>
50
+
51
+ </div>
52
+ <div class="clear"></div>
53
+ </div>
54
+
55
+ <iframe id="search_frame"></iframe>
56
+
57
+ <div id="content"><div id='filecontents'><h1>Gem for exporting user-scripts as Upstart scripts</h1>
58
+
59
+ <h2>Purpose</h2>
60
+
61
+ <p>It is often neccessary to run some supporting background tasks for rails projects alongside with the webserver. One of the solutions is use of Foreman gem, which allows to export tasks as Upstart scripts. This solution is dangerous,because it requires root priveleges for foreman executable (in order to add scripts to /etc/init), so it the depoloing user to run any code as root (by placing appropriate script into /etc/init).</p>
62
+
63
+ <p>This gem is an attempt to provide a safe way for installing backround jobs, so that they run under some fixed user wwithout root priveleges.</p>
64
+
65
+ <p>The only interface to the gem is the script it provides.</p>
66
+
67
+ <h2>Installing</h2>
68
+
69
+ <pre class="code"><span class='rubyid_gem identifier id'>gem</span> <span class='rubyid_install identifier id'>install</span> <span class='rubyid_upstart identifier id'>upstart</span><span class='minus op'>-</span><span class='rubyid_exporter identifier id'>exporter</span>
70
+ </pre>
71
+
72
+ <h2>Configuration</h2>
73
+
74
+ <p>The export process is configured through the only config, /etc/upstart-exporter.yaml, which is a simple YAML file of the following format:</p>
75
+
76
+ <pre class="code"><span class='minus op'>-</span><span class='minus op'>-</span><span class='minus op'>-</span>
77
+ <span class='rubyid_run_user identifier id'>run_user</span><span class='colon op'>:</span> <span class='rubyid_www identifier id'>www</span> <span class='comment val'># The user under which all installed through upstart-exporter background jobs are run </span>
78
+ <span class='rubyid_helper_dir identifier id'>helper_dir</span><span class='colon op'>:</span> <span class='regexp val'>/var/</span><span class='rubyid_helper_dir identifier id'>helper_dir</span> <span class='comment val'># Auxilary directory for scripts incapsulating background jobs</span>
79
+ <span class='rubyid_upstart_dir identifier id'>upstart_dir</span><span class='colon op'>:</span> <span class='regexp val'>/var/</span><span class='rubyid_upstart_dir identifier id'>upstart_dir</span> <span class='comment val'># Directory where upstart scripts should be placed</span>
80
+ </pre>
81
+
82
+ <p>The config is not installed by default. If this config is absent, the default values are the following:</p>
83
+
84
+ <pre class="code"><span class='rubyid_helper_dir identifier id'>helper_dir</span><span class='colon op'>:</span> <span class='regexp val'>/var/</span><span class='rubyid_local identifier id'>local</span><span class='div op'>/</span><span class='rubyid_upstart_helpers identifier id'>upstart_helpers</span><span class='div op'>/</span>
85
+ <span class='rubyid_upstart_dir identifier id'>upstart_dir</span><span class='colon op'>:</span> <span class='regexp val'>/etc/i</span><span class='rubyid_nit identifier id'>nit</span><span class='div op'>/</span>
86
+ <span class='rubyid_run_user identifier id'>run_user</span><span class='colon op'>:</span> <span class='rubyid_service identifier id'>service</span>
87
+ </pre>
88
+
89
+ <p>To give a user (i.e. deployuser) ability to use this script, one can place </p>
90
+
91
+ <pre class="code"><span class='comment val'># Commands required for manipulating jobs</span>
92
+ <span class='rubyid_Cmnd_Alias constant id'>Cmnd_Alias</span> <span class='rubyid_UPSTART constant id'>UPSTART</span> <span class='assign token'>=</span> <span class='regexp val'>/sbin/s</span><span class='rubyid_tart identifier id'>tart</span><span class='comma token'>,</span> <span class='regexp val'>/sbin/s</span><span class='rubyid_top identifier id'>top</span><span class='comma token'>,</span> <span class='regexp val'>/sbin/</span><span class='rubyid_restart identifier id'>restart</span>
93
+ <span class='rubyid_Cmnd_Alias constant id'>Cmnd_Alias</span> <span class='rubyid_UPEXPORT constant id'>UPEXPORT</span> <span class='assign token'>=</span> <span class='regexp val'>/usr/</span><span class='rubyid_local identifier id'>local</span><span class='div op'>/</span><span class='rubyid_bin identifier id'>bin</span><span class='div op'>/</span><span class='rubyid_upstart identifier id'>upstart</span><span class='minus op'>-</span><span class='rubyid_export identifier id'>export</span>
94
+
95
+ <span class='dot3 op'>...</span>
96
+
97
+ <span class='comment val'># Add gem's binary path to this</span>
98
+ <span class='rubyid_Defaults constant id'>Defaults</span> <span class='rubyid_secure_path identifier id'>secure_path</span> <span class='assign token'>=</span> <span class='regexp val'>/sbin:/</span><span class='rubyid_bin identifier id'>bin</span><span class='symbol val'>:/</span><span class='rubyid_usr identifier id'>usr</span><span class='div op'>/</span><span class='rubyid_sbin identifier id'>sbin</span><span class='symbol val'>:/</span><span class='rubyid_usr identifier id'>usr</span><span class='div op'>/</span><span class='rubyid_bin identifier id'>bin</span><span class='symbol val'>:/</span><span class='rubyid_usr identifier id'>usr</span><span class='div op'>/</span><span class='rubyid_local identifier id'>local</span><span class='div op'>/</span><span class='rubyid_bin identifier id'>bin</span>
99
+
100
+ <span class='dot3 op'>...</span>
101
+
102
+ <span class='comment val'># Allow deploy user to manipulate jobs </span>
103
+ <span class='rubyid_deployuser identifier id'>deployuser</span> <span class='rubyid_ALL constant id'>ALL</span><span class='assign token'>=</span><span class='lparen token'>(</span><span class='rubyid_deployuser identifier id'>deployuser</span><span class='rparen token'>)</span> <span class='rubyid_NOPASSWD constant id'>NOPASSWD</span><span class='colon op'>:</span> <span class='rubyid_ALL constant id'>ALL</span><span class='comma token'>,</span> <span class='lparen token'>(</span><span class='rubyid_root identifier id'>root</span><span class='rparen token'>)</span> <span class='rubyid_NOPASSWD constant id'>NOPASSWD</span><span class='colon op'>:</span> <span class='rubyid_UPSTART constant id'>UPSTART</span><span class='comma token'>,</span> <span class='rubyid_UPEXPORT constant id'>UPEXPORT</span>
104
+ </pre>
105
+
106
+ <h2>Usage</h2>
107
+
108
+ <p>After upstart-exporter is installed and configured, one may export background jobs from an arbitrary Procfile-like file of the following format:</p>
109
+
110
+ <pre class="code"><span class='rubyid_cmdlabel1 identifier id'>cmdlabel1</span><span class='colon op'>:</span> <span class='rubyid_cmd1 identifier id'>cmd1</span>
111
+ <span class='rubyid_cmdlabel2 identifier id'>cmdlabel2</span><span class='colon op'>:</span> <span class='rubyid_cmd2 identifier id'>cmd2</span>
112
+ </pre>
113
+
114
+ <p>i.e. a file ./myprocfile containing:</p>
115
+
116
+ <pre class="code"><span class='rubyid_my_tail_cmd identifier id'>my_tail_cmd</span><span class='colon op'>:</span> <span class='regexp val'>/usr/</span><span class='rubyid_bin identifier id'>bin</span><span class='div op'>/</span><span class='rubyid_tail identifier id'>tail</span> <span class='minus op'>-</span><span class='rubyid_F constant id'>F</span> <span class='regexp val'>/var/</span><span class='rubyid_log identifier id'>log</span><span class='div op'>/</span><span class='rubyid_messages identifier id'>messages</span>
117
+ <span class='rubyid_my_another_tail_cmd identifier id'>my_another_tail_cmd</span><span class='colon op'>:</span> <span class='regexp val'>/usr/</span><span class='rubyid_bin identifier id'>bin</span><span class='div op'>/</span><span class='rubyid_tail identifier id'>tail</span> <span class='minus op'>-</span><span class='rubyid_F constant id'>F</span> <span class='regexp val'>/var/</span><span class='rubyid_log identifier id'>log</span><span class='div op'>/</span><span class='rubyid_messages identifier id'>messages</span>
118
+ </pre>
119
+
120
+ <p>For security purposes, command labels are allowed to contain only letters, digits and underscores.</p>
121
+
122
+ <p>To export this file one should run</p>
123
+
124
+ <pre class="code"><span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_upstart identifier id'>upstart</span><span class='minus op'>-</span><span class='rubyid_export identifier id'>export</span> <span class='minus op'>-</span><span class='rubyid_p identifier id'>p</span> <span class='dot token'>.</span><span class='div op'>/</span><span class='rubyid_myprocfile identifier id'>myprocfile</span> <span class='minus op'>-</span><span class='rubyid_n identifier id'>n</span> <span class='rubyid_myapp identifier id'>myapp</span>
125
+ </pre>
126
+
127
+ <p>-hore myapp is the application name. This name only affects the names of generated files. For security purposes, app name is also allowed to contain only letters, digits and underscores. Assuming that default options are used, the following files and folders will be generated:</p>
128
+
129
+ <p>in /etc/init/:
130
+ fb-myapp-my<em>another</em>tail<em>cmd-real.conf
131
+ fb-myapp-my</em>another<em>tail</em>cmd.conf
132
+ fb-myapp-my<em>tail</em>cmd-real.conf
133
+ fb-myapp-my<em>tail</em>cmd.conf
134
+ fb-myapp.conf</p>
135
+
136
+ <p>in /var/local/upstart_helpers:</p>
137
+
138
+ <pre class="code"><span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span><span class='minus op'>-</span><span class='rubyid_my_another_tail_cmd identifier id'>my_another_tail_cmd</span><span class='dot token'>.</span><span class='rubyid_sh identifier id'>sh</span>
139
+ <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span><span class='minus op'>-</span><span class='rubyid_my_tail_cmd identifier id'>my_tail_cmd</span><span class='dot token'>.</span><span class='rubyid_sh identifier id'>sh</span>
140
+ </pre>
141
+
142
+ <p>Prefix fb- is added to avoid collisions with other upstart jobs. After this my_tail_cmd, for example, will be able to be started as an upstart script:</p>
143
+
144
+ <pre class="code"><span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_start identifier id'>start</span> <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span><span class='minus op'>-</span><span class='rubyid_my_tail_cmd identifier id'>my_tail_cmd</span>
145
+
146
+ <span class='dot2 op'>..</span>
147
+
148
+ <span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_stop identifier id'>stop</span> <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span><span class='minus op'>-</span><span class='rubyid_my_tail_cmd identifier id'>my_tail_cmd</span>
149
+ </pre>
150
+
151
+ <p>It&#39;s stdout/stderr will be redirected to /var/log/fb-myapp/my_tail_cmd.log. </p>
152
+
153
+ <p>To start/stop all application commands at once, one can run:</p>
154
+
155
+ <pre class="code"><span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_start identifier id'>start</span> <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span>
156
+ <span class='dot3 op'>...</span>
157
+ <span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_stop identifier id'>stop</span> <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span>
158
+ </pre>
159
+
160
+ <p>To remove upstart scripts and helpers for a particular application one can run</p>
161
+
162
+ <pre class="code"><span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_upstart identifier id'>upstart</span><span class='minus op'>-</span><span class='rubyid_export identifier id'>export</span> <span class='minus op'>-</span><span class='rubyid_c identifier id'>c</span> <span class='minus op'>-</span><span class='rubyid_n identifier id'>n</span> <span class='rubyid_myapp identifier id'>myapp</span>
163
+ </pre>
164
+
165
+ <p>The logs will not be cleared. </p>
166
+ </div></div>
167
+
168
+ <div id="footer">
169
+ Generated on Thu Dec 15 17:00:57 2011 by
170
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
171
+ 0.7.4 (ruby-1.8.7).
172
+ </div>
173
+
174
+ </body>
175
+ </html>
@@ -0,0 +1,49 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <base id="base_target" target="_parent" />
19
+ </head>
20
+ <body>
21
+ <script type="text/javascript" charset="utf-8">
22
+ if (window.top.frames.main) {
23
+ document.getElementById('base_target').target = 'main';
24
+ document.body.className = 'frames';
25
+ }
26
+ </script>
27
+ <div id="content">
28
+ <h1 id="full_list_header">File List</h1>
29
+ <div id="nav">
30
+
31
+ <a target="_self" href="class_list.html">Classes</a>
32
+
33
+ <a target="_self" href="method_list.html">Methods</a>
34
+
35
+ <a target="_self" href="file_list.html">Files</a>
36
+
37
+ </div>
38
+ <div id="search">Search: <input type="text" /></div>
39
+
40
+ <ul id="full_list" class="files">
41
+
42
+
43
+ <li class="r1"><a href="index.html" title="README">README</a></li>
44
+
45
+
46
+ </ul>
47
+ </div>
48
+ </body>
49
+ </html>
data/doc/frames.html ADDED
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title>Documentation by YARD 0.7.4</title>
8
+ </head>
9
+ <frameset cols="20%,*">
10
+ <frame name="list" src="class_list.html" />
11
+ <frame name="main" src="index.html" />
12
+ </frameset>
13
+ </html>
data/doc/index.html ADDED
@@ -0,0 +1,175 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.7.4
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ relpath = '';
19
+ if (relpath != '') relpath += '/';
20
+ </script>
21
+
22
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
25
+
26
+
27
+ </head>
28
+ <body>
29
+ <script type="text/javascript" charset="utf-8">
30
+ if (window.top.frames.main) document.body.className = 'frames';
31
+ </script>
32
+
33
+ <div id="header">
34
+ <div id="menu">
35
+
36
+ <a href="_index.html" title="Index">Index</a> &raquo;
37
+ <span class="title">File: README</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a id="class_list_link" href="#">Class List</a>
46
+
47
+ <a id="method_list_link" href="#">Method List</a>
48
+
49
+ <a id="file_list_link" href="#">File List</a>
50
+
51
+ </div>
52
+ <div class="clear"></div>
53
+ </div>
54
+
55
+ <iframe id="search_frame"></iframe>
56
+
57
+ <div id="content"><div id='filecontents'><h1>Gem for exporting user-scripts as Upstart scripts</h1>
58
+
59
+ <h2>Purpose</h2>
60
+
61
+ <p>It is often neccessary to run some supporting background tasks for rails projects alongside with the webserver. One of the solutions is use of Foreman gem, which allows to export tasks as Upstart scripts. This solution is dangerous,because it requires root priveleges for foreman executable (in order to add scripts to /etc/init), so it the depoloing user to run any code as root (by placing appropriate script into /etc/init).</p>
62
+
63
+ <p>This gem is an attempt to provide a safe way for installing backround jobs, so that they run under some fixed user wwithout root priveleges.</p>
64
+
65
+ <p>The only interface to the gem is the script it provides.</p>
66
+
67
+ <h2>Installing</h2>
68
+
69
+ <pre class="code"><span class='rubyid_gem identifier id'>gem</span> <span class='rubyid_install identifier id'>install</span> <span class='rubyid_upstart identifier id'>upstart</span><span class='minus op'>-</span><span class='rubyid_exporter identifier id'>exporter</span>
70
+ </pre>
71
+
72
+ <h2>Configuration</h2>
73
+
74
+ <p>The export process is configured through the only config, /etc/upstart-exporter.yaml, which is a simple YAML file of the following format:</p>
75
+
76
+ <pre class="code"><span class='minus op'>-</span><span class='minus op'>-</span><span class='minus op'>-</span>
77
+ <span class='rubyid_run_user identifier id'>run_user</span><span class='colon op'>:</span> <span class='rubyid_www identifier id'>www</span> <span class='comment val'># The user under which all installed through upstart-exporter background jobs are run </span>
78
+ <span class='rubyid_helper_dir identifier id'>helper_dir</span><span class='colon op'>:</span> <span class='regexp val'>/var/</span><span class='rubyid_helper_dir identifier id'>helper_dir</span> <span class='comment val'># Auxilary directory for scripts incapsulating background jobs</span>
79
+ <span class='rubyid_upstart_dir identifier id'>upstart_dir</span><span class='colon op'>:</span> <span class='regexp val'>/var/</span><span class='rubyid_upstart_dir identifier id'>upstart_dir</span> <span class='comment val'># Directory where upstart scripts should be placed</span>
80
+ </pre>
81
+
82
+ <p>The config is not installed by default. If this config is absent, the default values are the following:</p>
83
+
84
+ <pre class="code"><span class='rubyid_helper_dir identifier id'>helper_dir</span><span class='colon op'>:</span> <span class='regexp val'>/var/</span><span class='rubyid_local identifier id'>local</span><span class='div op'>/</span><span class='rubyid_upstart_helpers identifier id'>upstart_helpers</span><span class='div op'>/</span>
85
+ <span class='rubyid_upstart_dir identifier id'>upstart_dir</span><span class='colon op'>:</span> <span class='regexp val'>/etc/i</span><span class='rubyid_nit identifier id'>nit</span><span class='div op'>/</span>
86
+ <span class='rubyid_run_user identifier id'>run_user</span><span class='colon op'>:</span> <span class='rubyid_service identifier id'>service</span>
87
+ </pre>
88
+
89
+ <p>To give a user (i.e. deployuser) ability to use this script, one can place </p>
90
+
91
+ <pre class="code"><span class='comment val'># Commands required for manipulating jobs</span>
92
+ <span class='rubyid_Cmnd_Alias constant id'>Cmnd_Alias</span> <span class='rubyid_UPSTART constant id'>UPSTART</span> <span class='assign token'>=</span> <span class='regexp val'>/sbin/s</span><span class='rubyid_tart identifier id'>tart</span><span class='comma token'>,</span> <span class='regexp val'>/sbin/s</span><span class='rubyid_top identifier id'>top</span><span class='comma token'>,</span> <span class='regexp val'>/sbin/</span><span class='rubyid_restart identifier id'>restart</span>
93
+ <span class='rubyid_Cmnd_Alias constant id'>Cmnd_Alias</span> <span class='rubyid_UPEXPORT constant id'>UPEXPORT</span> <span class='assign token'>=</span> <span class='regexp val'>/usr/</span><span class='rubyid_local identifier id'>local</span><span class='div op'>/</span><span class='rubyid_bin identifier id'>bin</span><span class='div op'>/</span><span class='rubyid_upstart identifier id'>upstart</span><span class='minus op'>-</span><span class='rubyid_export identifier id'>export</span>
94
+
95
+ <span class='dot3 op'>...</span>
96
+
97
+ <span class='comment val'># Add gem's binary path to this</span>
98
+ <span class='rubyid_Defaults constant id'>Defaults</span> <span class='rubyid_secure_path identifier id'>secure_path</span> <span class='assign token'>=</span> <span class='regexp val'>/sbin:/</span><span class='rubyid_bin identifier id'>bin</span><span class='symbol val'>:/</span><span class='rubyid_usr identifier id'>usr</span><span class='div op'>/</span><span class='rubyid_sbin identifier id'>sbin</span><span class='symbol val'>:/</span><span class='rubyid_usr identifier id'>usr</span><span class='div op'>/</span><span class='rubyid_bin identifier id'>bin</span><span class='symbol val'>:/</span><span class='rubyid_usr identifier id'>usr</span><span class='div op'>/</span><span class='rubyid_local identifier id'>local</span><span class='div op'>/</span><span class='rubyid_bin identifier id'>bin</span>
99
+
100
+ <span class='dot3 op'>...</span>
101
+
102
+ <span class='comment val'># Allow deploy user to manipulate jobs </span>
103
+ <span class='rubyid_deployuser identifier id'>deployuser</span> <span class='rubyid_ALL constant id'>ALL</span><span class='assign token'>=</span><span class='lparen token'>(</span><span class='rubyid_deployuser identifier id'>deployuser</span><span class='rparen token'>)</span> <span class='rubyid_NOPASSWD constant id'>NOPASSWD</span><span class='colon op'>:</span> <span class='rubyid_ALL constant id'>ALL</span><span class='comma token'>,</span> <span class='lparen token'>(</span><span class='rubyid_root identifier id'>root</span><span class='rparen token'>)</span> <span class='rubyid_NOPASSWD constant id'>NOPASSWD</span><span class='colon op'>:</span> <span class='rubyid_UPSTART constant id'>UPSTART</span><span class='comma token'>,</span> <span class='rubyid_UPEXPORT constant id'>UPEXPORT</span>
104
+ </pre>
105
+
106
+ <h2>Usage</h2>
107
+
108
+ <p>After upstart-exporter is installed and configured, one may export background jobs from an arbitrary Procfile-like file of the following format:</p>
109
+
110
+ <pre class="code"><span class='rubyid_cmdlabel1 identifier id'>cmdlabel1</span><span class='colon op'>:</span> <span class='rubyid_cmd1 identifier id'>cmd1</span>
111
+ <span class='rubyid_cmdlabel2 identifier id'>cmdlabel2</span><span class='colon op'>:</span> <span class='rubyid_cmd2 identifier id'>cmd2</span>
112
+ </pre>
113
+
114
+ <p>i.e. a file ./myprocfile containing:</p>
115
+
116
+ <pre class="code"><span class='rubyid_my_tail_cmd identifier id'>my_tail_cmd</span><span class='colon op'>:</span> <span class='regexp val'>/usr/</span><span class='rubyid_bin identifier id'>bin</span><span class='div op'>/</span><span class='rubyid_tail identifier id'>tail</span> <span class='minus op'>-</span><span class='rubyid_F constant id'>F</span> <span class='regexp val'>/var/</span><span class='rubyid_log identifier id'>log</span><span class='div op'>/</span><span class='rubyid_messages identifier id'>messages</span>
117
+ <span class='rubyid_my_another_tail_cmd identifier id'>my_another_tail_cmd</span><span class='colon op'>:</span> <span class='regexp val'>/usr/</span><span class='rubyid_bin identifier id'>bin</span><span class='div op'>/</span><span class='rubyid_tail identifier id'>tail</span> <span class='minus op'>-</span><span class='rubyid_F constant id'>F</span> <span class='regexp val'>/var/</span><span class='rubyid_log identifier id'>log</span><span class='div op'>/</span><span class='rubyid_messages identifier id'>messages</span>
118
+ </pre>
119
+
120
+ <p>For security purposes, command labels are allowed to contain only letters, digits and underscores.</p>
121
+
122
+ <p>To export this file one should run</p>
123
+
124
+ <pre class="code"><span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_upstart identifier id'>upstart</span><span class='minus op'>-</span><span class='rubyid_export identifier id'>export</span> <span class='minus op'>-</span><span class='rubyid_p identifier id'>p</span> <span class='dot token'>.</span><span class='div op'>/</span><span class='rubyid_myprocfile identifier id'>myprocfile</span> <span class='minus op'>-</span><span class='rubyid_n identifier id'>n</span> <span class='rubyid_myapp identifier id'>myapp</span>
125
+ </pre>
126
+
127
+ <p>-hore myapp is the application name. This name only affects the names of generated files. For security purposes, app name is also allowed to contain only letters, digits and underscores. Assuming that default options are used, the following files and folders will be generated:</p>
128
+
129
+ <p>in /etc/init/:
130
+ fb-myapp-my<em>another</em>tail<em>cmd-real.conf
131
+ fb-myapp-my</em>another<em>tail</em>cmd.conf
132
+ fb-myapp-my<em>tail</em>cmd-real.conf
133
+ fb-myapp-my<em>tail</em>cmd.conf
134
+ fb-myapp.conf</p>
135
+
136
+ <p>in /var/local/upstart_helpers:</p>
137
+
138
+ <pre class="code"><span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span><span class='minus op'>-</span><span class='rubyid_my_another_tail_cmd identifier id'>my_another_tail_cmd</span><span class='dot token'>.</span><span class='rubyid_sh identifier id'>sh</span>
139
+ <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span><span class='minus op'>-</span><span class='rubyid_my_tail_cmd identifier id'>my_tail_cmd</span><span class='dot token'>.</span><span class='rubyid_sh identifier id'>sh</span>
140
+ </pre>
141
+
142
+ <p>Prefix fb- is added to avoid collisions with other upstart jobs. After this my_tail_cmd, for example, will be able to be started as an upstart script:</p>
143
+
144
+ <pre class="code"><span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_start identifier id'>start</span> <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span><span class='minus op'>-</span><span class='rubyid_my_tail_cmd identifier id'>my_tail_cmd</span>
145
+
146
+ <span class='dot2 op'>..</span>
147
+
148
+ <span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_stop identifier id'>stop</span> <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span><span class='minus op'>-</span><span class='rubyid_my_tail_cmd identifier id'>my_tail_cmd</span>
149
+ </pre>
150
+
151
+ <p>It&#39;s stdout/stderr will be redirected to /var/log/fb-myapp/my_tail_cmd.log. </p>
152
+
153
+ <p>To start/stop all application commands at once, one can run:</p>
154
+
155
+ <pre class="code"><span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_start identifier id'>start</span> <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span>
156
+ <span class='dot3 op'>...</span>
157
+ <span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_stop identifier id'>stop</span> <span class='rubyid_fb identifier id'>fb</span><span class='minus op'>-</span><span class='rubyid_myapp identifier id'>myapp</span>
158
+ </pre>
159
+
160
+ <p>To remove upstart scripts and helpers for a particular application one can run</p>
161
+
162
+ <pre class="code"><span class='rubyid_sudo identifier id'>sudo</span> <span class='rubyid_upstart identifier id'>upstart</span><span class='minus op'>-</span><span class='rubyid_export identifier id'>export</span> <span class='minus op'>-</span><span class='rubyid_c identifier id'>c</span> <span class='minus op'>-</span><span class='rubyid_n identifier id'>n</span> <span class='rubyid_myapp identifier id'>myapp</span>
163
+ </pre>
164
+
165
+ <p>The logs will not be cleared. </p>
166
+ </div></div>
167
+
168
+ <div id="footer">
169
+ Generated on Thu Dec 15 17:00:57 2011 by
170
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
171
+ 0.7.4 (ruby-1.8.7).
172
+ </div>
173
+
174
+ </body>
175
+ </html>
data/doc/js/app.js ADDED
@@ -0,0 +1,205 @@
1
+ function createSourceLinks() {
2
+ $('.method_details_list .source_code').
3
+ before("<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>");
4
+ $('.toggleSource').toggle(function() {
5
+ $(this).parent().nextAll('.source_code').slideDown(100);
6
+ $(this).text("Hide source");
7
+ },
8
+ function() {
9
+ $(this).parent().nextAll('.source_code').slideUp(100);
10
+ $(this).text("View source");
11
+ });
12
+ }
13
+
14
+ function createDefineLinks() {
15
+ var tHeight = 0;
16
+ $('.defines').after(" <a href='#' class='toggleDefines'>more...</a>");
17
+ $('.toggleDefines').toggle(function() {
18
+ tHeight = $(this).parent().prev().height();
19
+ $(this).prev().show();
20
+ $(this).parent().prev().height($(this).parent().height());
21
+ $(this).text("(less)");
22
+ },
23
+ function() {
24
+ $(this).prev().hide();
25
+ $(this).parent().prev().height(tHeight);
26
+ $(this).text("more...");
27
+ });
28
+ }
29
+
30
+ function createFullTreeLinks() {
31
+ var tHeight = 0;
32
+ $('.inheritanceTree').toggle(function() {
33
+ tHeight = $(this).parent().prev().height();
34
+ $(this).parent().toggleClass('showAll');
35
+ $(this).text("(hide)");
36
+ $(this).parent().prev().height($(this).parent().height());
37
+ },
38
+ function() {
39
+ $(this).parent().toggleClass('showAll');
40
+ $(this).parent().prev().height(tHeight);
41
+ $(this).text("show all");
42
+ });
43
+ }
44
+
45
+ function fixBoxInfoHeights() {
46
+ $('dl.box dd.r1, dl.box dd.r2').each(function() {
47
+ $(this).prev().height($(this).height());
48
+ });
49
+ }
50
+
51
+ function searchFrameLinks() {
52
+ $('#method_list_link').click(function() {
53
+ toggleSearchFrame(this, relpath + 'method_list.html');
54
+ });
55
+
56
+ $('#class_list_link').click(function() {
57
+ toggleSearchFrame(this, relpath + 'class_list.html');
58
+ });
59
+
60
+ $('#file_list_link').click(function() {
61
+ toggleSearchFrame(this, relpath + 'file_list.html');
62
+ });
63
+ }
64
+
65
+ function toggleSearchFrame(id, link) {
66
+ var frame = $('#search_frame');
67
+ $('#search a').removeClass('active').addClass('inactive');
68
+ if (frame.attr('src') == link && frame.css('display') != "none") {
69
+ frame.slideUp(100);
70
+ $('#search a').removeClass('active inactive');
71
+ }
72
+ else {
73
+ $(id).addClass('active').removeClass('inactive');
74
+ frame.attr('src', link).slideDown(100);
75
+ }
76
+ }
77
+
78
+ function linkSummaries() {
79
+ $('.summary_signature').click(function() {
80
+ document.location = $(this).find('a').attr('href');
81
+ });
82
+ }
83
+
84
+ function framesInit() {
85
+ if (window.top.frames.main) {
86
+ document.body.className = 'frames';
87
+ $('#menu .noframes a').attr('href', document.location);
88
+ $('html head title', window.parent.document).text($('html head title').text());
89
+ }
90
+ }
91
+
92
+ function keyboardShortcuts() {
93
+ if (window.top.frames.main) return;
94
+ $(document).keypress(function(evt) {
95
+ if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;
96
+ if (typeof evt.target !== "undefined" &&
97
+ (evt.target.nodeName == "INPUT" ||
98
+ evt.target.nodeName == "TEXTAREA")) return;
99
+ switch (evt.charCode) {
100
+ case 67: case 99: $('#class_list_link').click(); break; // 'c'
101
+ case 77: case 109: $('#method_list_link').click(); break; // 'm'
102
+ case 70: case 102: $('#file_list_link').click(); break; // 'f'
103
+ default: break;
104
+ }
105
+ });
106
+ }
107
+
108
+ function summaryToggle() {
109
+ $('.summary_toggle').click(function() {
110
+ localStorage.summaryCollapsed = $(this).text();
111
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
112
+ var next = $(this).parent().parent().nextAll('ul.summary').first();
113
+ if (next.hasClass('compact')) {
114
+ next.toggle();
115
+ next.nextAll('ul.summary').first().toggle();
116
+ }
117
+ else if (next.hasClass('summary')) {
118
+ var list = $('<ul class="summary compact" />');
119
+ list.html(next.html());
120
+ list.find('.summary_desc, .note').remove();
121
+ list.find('a').each(function() {
122
+ $(this).html($(this).find('strong').html());
123
+ $(this).parent().html($(this)[0].outerHTML);
124
+ });
125
+ next.before(list);
126
+ next.toggle();
127
+ }
128
+ return false;
129
+ });
130
+ if (localStorage) {
131
+ if (localStorage.summaryCollapsed == "collapse") $('.summary_toggle').click();
132
+ else localStorage.summaryCollapsed = "expand";
133
+ }
134
+ }
135
+
136
+ function fixOutsideWorldLinks() {
137
+ $('a').each(function() {
138
+ if (window.location.host != this.host) this.target = '_parent';
139
+ });
140
+ }
141
+
142
+ function generateTOC() {
143
+ if ($('#filecontents').length === 0) return;
144
+ var _toc = $('<ol class="top"></ol>');
145
+ var show = false;
146
+ var toc = _toc;
147
+ var counter = 0;
148
+ var tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
149
+ var i;
150
+ if ($('#filecontents h1').length > 1) tags.unshift('h1');
151
+ for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; }
152
+ var lastTag = parseInt(tags[0][1], 10);
153
+ $(tags.join(', ')).each(function() {
154
+ if (this.id == "filecontents") return;
155
+ show = true;
156
+ var thisTag = parseInt(this.tagName[1], 10);
157
+ if (this.id.length === 0) {
158
+ var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_');
159
+ if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; }
160
+ this.id = proposedId;
161
+ }
162
+ if (thisTag > lastTag) {
163
+ for (i = 0; i < thisTag - lastTag; i++) {
164
+ var tmp = $('<ol/>'); toc.append(tmp); toc = tmp;
165
+ }
166
+ }
167
+ if (thisTag < lastTag) {
168
+ for (i = 0; i < lastTag - thisTag; i++) toc = toc.parent();
169
+ }
170
+ toc.append('<li><a href="#' + this.id + '">' + $(this).text() + '</a></li>');
171
+ lastTag = thisTag;
172
+ });
173
+ if (!show) return;
174
+ html = '<div id="toc"><p class="title"><a class="hide_toc" href="#"><strong>Table of Contents</strong></a> <small>(<a href="#" class="float_toc">left</a>)</small></p></div>';
175
+ $('#content').prepend(html);
176
+ $('#toc').append(_toc);
177
+ $('#toc .hide_toc').toggle(function() {
178
+ $('#toc .top').slideUp('fast');
179
+ $('#toc').toggleClass('hidden');
180
+ $('#toc .title small').toggle();
181
+ }, function() {
182
+ $('#toc .top').slideDown('fast');
183
+ $('#toc').toggleClass('hidden');
184
+ $('#toc .title small').toggle();
185
+ });
186
+ $('#toc .float_toc').toggle(function() {
187
+ $(this).text('float');
188
+ $('#toc').toggleClass('nofloat');
189
+ }, function() {
190
+ $(this).text('left');
191
+ $('#toc').toggleClass('nofloat');
192
+ });
193
+ }
194
+
195
+ $(framesInit);
196
+ $(createSourceLinks);
197
+ $(createDefineLinks);
198
+ $(createFullTreeLinks);
199
+ $(fixBoxInfoHeights);
200
+ $(searchFrameLinks);
201
+ $(linkSummaries);
202
+ $(keyboardShortcuts);
203
+ $(summaryToggle);
204
+ $(fixOutsideWorldLinks);
205
+ $(generateTOC);