Split up the main page into different parts.
This commit is contained in:
		
							parent
							
								
									f7e94c21f9
								
							
						
					
					
						commit
						a4d5060163
					
				
							
								
								
									
										45
									
								
								cmd/templaterender/render.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								cmd/templaterender/render.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"converge/pkg/templates" | ||||
| 	"github.com/a-h/templ" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| ) | ||||
| 
 | ||||
| type RenderFunc func(secure string, host string, username string) templ.Component | ||||
| 
 | ||||
| type Params struct { | ||||
| 	secure   string | ||||
| 	host     string | ||||
| 	username string | ||||
| } | ||||
| 
 | ||||
| type Rendering struct { | ||||
| 	params Params | ||||
| 	render RenderFunc | ||||
| } | ||||
| 
 | ||||
| func render(dir string, name string, params Params, render RenderFunc) { | ||||
| 	fname := filepath.Join(dir, name) | ||||
| 	f, err := os.Create(fname) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	defer f.Close() | ||||
| 
 | ||||
| 	render(params.secure, params.host, params.username).Render(context.Background(), f) | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	dir := "html" | ||||
| 
 | ||||
| 	params := Params{ | ||||
| 		secure:   "s", | ||||
| 		host:     "example.com", | ||||
| 		username: "converge", | ||||
| 	} | ||||
| 
 | ||||
| 	render(dir, "index.html", params, templates.Index) | ||||
| } | ||||
							
								
								
									
										44
									
								
								pkg/templates/about.templ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								pkg/templates/about.templ
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | ||||
| package templates | ||||
| 
 | ||||
| templ About() { | ||||
|   <div> | ||||
|      <h1>About</h1> | ||||
|                       <p> | ||||
|                           Converge is a utility for troubleshooting builds on continuous integration servers. | ||||
|                           It solves a common problem where the cause of job failure is difficult to determine. | ||||
|                           This is complicated further by the fact that build jobs are usually run on a build | ||||
|                           farm where there is no access to the build agents or in more modern envrionments when | ||||
|                           jobs are run in ephemeral containers. | ||||
|                       </p> | ||||
| 
 | ||||
|                       <p> | ||||
|                           With Converge it is possible to get remote shell access to such jobs. This works | ||||
|                           by configuring the build job to connect to a Converge server using an agent program. | ||||
|                           The agent program can be downloaded from within the CI job using curl or wget. | ||||
|                           Next, an end-user can connect to the Converge server, a rendez-vous server, that connects | ||||
|                           the client and server together. | ||||
|                       </p> | ||||
| 
 | ||||
|                       <p> | ||||
|                           The setup is such that the connection from client (end-user) to server (agent on CI job) | ||||
|                           is end-to-end encrypted. The Converge server itself is no more than a bitpipe which pumps | ||||
|                           data between client and agent. | ||||
|                       </p> | ||||
| 
 | ||||
|                       <p> | ||||
|                           Both ssh and sftp are supported. Multiple shells are also allowed. | ||||
|                       </p> | ||||
| 
 | ||||
|                       <p> | ||||
|                           There is a timeout mechanism in the agent such that jobs do not hang indefinitely | ||||
|                           waiting for a connection. This mechanism is useful to make sure build agents do not keep | ||||
|                           build agents occupied for a long time. By default, the agent exits with status 0 when | ||||
|                           the first client exits after logging in. This behavior as well as general expiry can be | ||||
|                           controlled from within a shell session by touching a .hold file. After logging in, the | ||||
|                           user can control expiry of the session as instructed by messages in the ssh session. | ||||
|                           When the timeout of a session is near the user is informed about this with messages | ||||
|                           in the shell. | ||||
|                       </p> | ||||
|   </div> | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										39
									
								
								pkg/templates/downloads.templ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								pkg/templates/downloads.templ
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| package templates | ||||
| 
 | ||||
| 
 | ||||
| templ Downloads() { | ||||
|   <div> | ||||
| 
 | ||||
|                     <h1 id="downloads">Downloads</h1> | ||||
| 
 | ||||
|                     <table class="table"> | ||||
|                         <thead> | ||||
|                         <tr> | ||||
|                             <th>Component</th> | ||||
|                             <th>Purpose</th> | ||||
|                             <th>Linux</th> | ||||
|                             <th>Windows</th> | ||||
|                         </tr> | ||||
|                         </thead> | ||||
|                         <tr> | ||||
|                             <td>agent</td> | ||||
|                             <td>The agent to run inside aa CI job</td> | ||||
|                             <td><a href="docs/agent">agent</a></td> | ||||
|                             <td><a href="docs/agent.exe">agent.exe</a></td> | ||||
|                         </tr> | ||||
|                         <tr> | ||||
|                             <td>wsproxy</td> | ||||
|                             <td>SSH proxy command that can be directly used by ssh</td> | ||||
|                             <td><a href="docs/wsproxy">wsproxy</a></td> | ||||
|                             <td><a href="docs/wsproxy.exe">wsproxy.exe</a></td> | ||||
|                         </tr> | ||||
|                         <tr> | ||||
|                             <td>tcptows</td> | ||||
|                             <td>TCP to WS tunnel for allowing regular | ||||
|                                 SSH and SFTP clients to connect to converge</td> | ||||
|                             <td><a href="docs/tcptows">tcptows</a></td> | ||||
|                             <td><a href="docs/tcptows.exe">tcptows.exe</a></td> | ||||
|                         </tr> | ||||
|                     </table> | ||||
|   </div> | ||||
| } | ||||
| @ -18,194 +18,10 @@ templ Index(secure string, host string, username string) { | ||||
|     <div class="container-fluid"> | ||||
|         <div class="row"> | ||||
|             <div class="col"> | ||||
| 
 | ||||
|                 <div class="container"> | ||||
| 
 | ||||
|                     <h1>About</h1> | ||||
| 
 | ||||
|                     <p> | ||||
|                         Converge is a utility for troubleshooting builds on continuous integration servers. | ||||
|                         It solves a common problem where the cause of job failure is difficult to determine. | ||||
|                         This is complicated further by the fact that build jobs are usually run on a build | ||||
|                         farm where there is no access to the build agents or in more modern envrionments when | ||||
|                         jobs are run in ephemeral containers. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <p> | ||||
|                         With Converge it is possible to get remote shell access to such jobs. This works | ||||
|                         by configuring the build job to connect to a Converge server using an agent program. | ||||
|                         The agent program can be downloaded from within the CI job using curl or wget. | ||||
|                         Next, an end-user can connect to the Converge server, a rendez-vous server, that connects | ||||
|                         the client and server together. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <p> | ||||
|                         The setup is such that the connection from client (end-user) to server (agent on CI job) | ||||
|                         is end-to-end encrypted. The Converge server itself is no more than a bitpipe which pumps | ||||
|                         data between client and agent. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <p> | ||||
|                         Both ssh and sftp are supported. Multiple shells are also allowed. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <p> | ||||
|                         There is a timeout mechanism in the agent such that jobs do not hang indefinitely | ||||
|                         waiting for a connection. This mechanism is useful to make sure build agents do not keep | ||||
|                         build agents occupied for a long time. By default, the agent exits with status 0 when | ||||
|                         the first client exits after logging in. This behavior as well as general expiry can be | ||||
|                         controlled from within a shell session by touching a .hold file. After logging in, the | ||||
|                         user can control expiry of the session as instructed by messages in the ssh session. | ||||
|                         When the timeout of a session is near the user is informed about this with messages | ||||
|                         in the shell. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <h1>Usage</h1> | ||||
| 
 | ||||
|                     <h2>Continuous integration jobs</h2> | ||||
| 
 | ||||
|                     <p> | ||||
|                         In a | ||||
|                         continuous integration job, download the agent, chmod it and run it. | ||||
|                     </p> | ||||
|                     <pre>{` | ||||
|          # linux | ||||
|          `}curl http{secure}://{host}/docs/agent > agent{` | ||||
|          chmod 755 agent | ||||
|          `}./agent --id ID ws{secure}://{host}{` | ||||
| 
 | ||||
|          # windows | ||||
|          `}curl http{secure}://{host}/docs/agent.exe > agent.exe{` | ||||
|          `}agent --id ID ws{secure}://{host}{` | ||||
|         `}</pre> | ||||
|                     <p> | ||||
|                         Above, ID is a unique id for the job, the so-called rendez-cous ID. This should not conflict with IDs | ||||
|                         used by other agents. The ID is used for a rendez-vous between the end-user on a local system and | ||||
|                         the continuous integration job running on a build agent. If you don't specify an id, a random | ||||
|                         id will be generated. | ||||
| 
 | ||||
|                         The agent to the converge server and tells it the ID. Clients can now connect to the Converge | ||||
|                         server to establish a connection to the CI job through converge by also specifying the same | ||||
|                         ID. | ||||
| 
 | ||||
|                         Communication between | ||||
|                         end-user and agent is encrypted using SSH and the rendez-vous server is unable to | ||||
|                         read the contents. The rendez-vous server is nothing more then a glorified bit pipe, | ||||
|                         simply transferring data between end-user SSH client and the agent which runs an | ||||
|                         embedded SSH server. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <p> | ||||
|                         NOTE: When running the agent on windows, an exit of the remote session using | ||||
|                         exit in powershell or command prompt does not terminate the shell completely. | ||||
|                         To terminate the client ssh session must be killed by closing the terminal. | ||||
|                         Cleanup of remote processes on the agent appears to work properly despite this | ||||
|                         problem. It is just that exit of the windows shell (powershell or command prompt) | ||||
|                         is not detected properly. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <p> | ||||
|                         The agent has more options, download the agent and run it without arguments to | ||||
|                         see all options. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <h2>Local clients: using ssh with a proxy command </h2> | ||||
| 
 | ||||
|                     <p><code>wsproxy</code> is a command that can be used as a proxy command for SSH which performs the connection to the | ||||
|                         remote server. This command needs to be downloaded only once (see <a href="#downloads">downloads</a> below). It does not depend on | ||||
|                         the converge implementation but only on the websocket standards. Other tools that | ||||
|                         provide a mapping of stdio to a websocket can also be used instead of wsproxy. | ||||
|                     </p> | ||||
|                     <p> | ||||
|                         Next step is to run a local SSH or SFTP client: | ||||
|                     </p> | ||||
| 
 | ||||
|                     <pre> | ||||
|                                                                                                                             {` | ||||
|         `}ssh -oServerAliveInterval=10 -oProxyCommand="wsproxy ws{secure}://{host}/client/ID"  { username }{"@localhost"}   {` | ||||
|         `}sftp -oServerAliveInterval=10 -oProxyCommand="wsproxy ws{secure}://{host}/client/ID" { username }{"@localhost"}   {` | ||||
|         `}</pre> | ||||
| 
 | ||||
|                     <h2>Local clients: using SSH with a local TCP forwarding proxy</h2> | ||||
| 
 | ||||
|                     <p> | ||||
|                     This option is less convenient than the proxy command because it requires two separate | ||||
|                     commands to execute. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <p> | ||||
|                         Local clients can connect using regular ssh and sftp commands through a tunnel that | ||||
|                         translates a local TCP port to a websocket connection in converge. See | ||||
|                         the <a href="#downloads">downloads</a> section. | ||||
|                         This runs a local client that allows SSH to port 10000 and connects to converge using | ||||
|                         a websocket connection. | ||||
|                     </p> | ||||
| 
 | ||||
| 
 | ||||
|                     <p> | ||||
|                         Next step is to run a local SSH of SFTP client: | ||||
|                     </p> | ||||
| 
 | ||||
|                     <pre>                                                           {` | ||||
|         `}ssh -oServerAliveInterval=10 -p 10000 { username }{"@localhost"}          {` | ||||
|         `}sftp -oServerAliveInterval=10 -oPort=10000 { username }{"@localhost"}     {` | ||||
|         `}</pre> | ||||
| 
 | ||||
|                     <h2>Authentication</h2> | ||||
| 
 | ||||
|                     <p> | ||||
|                         The <code>{ username }</code> user above the Converge server and | ||||
|                         communicated to the agent when the agent is started. This is the | ||||
|                         username that must be used when setting up an ssh connection. | ||||
|                         Another way to authenticate is through an .authorized_keys file in the | ||||
|                         same directory as where the agent is started. | ||||
| 
 | ||||
|                         This can be setup as follows before starting the agent: | ||||
|                     </p> | ||||
|                     <pre>                                         {` | ||||
|         `}# linux                                                 {` | ||||
|         `}echo "ssh-rsa dkddkdkkk a@b.c" > .authorized_keys       {` | ||||
|         `}echo "ssh-rsa adfadjfdf d@e.f" >> .authorized_keys      {` | ||||
|         `}                                                        {` | ||||
|         `}# windows                                               {` | ||||
|         `}echo ssh-rsa dkddkdkkk a@b.c > .authorized_keys         {` | ||||
|         `}echo ssh-rsa adfadjfdf d@e.f >> .authorized_keys | ||||
|                     </pre> | ||||
|                     <p> | ||||
|                         Note that on windows you should not used quotes. | ||||
|                     </p> | ||||
| 
 | ||||
|                     <h1 id="downloads">Downloads</h1> | ||||
| 
 | ||||
|                     <table class="table"> | ||||
|                         <thead> | ||||
|                         <tr> | ||||
|                             <th>Component</th> | ||||
|                             <th>Purpose</th> | ||||
|                             <th>Linux</th> | ||||
|                             <th>Windows</th> | ||||
|                         </tr> | ||||
|                         </thead> | ||||
|                         <tr> | ||||
|                             <td>agent</td> | ||||
|                             <td>The agent to run inside aa CI job</td> | ||||
|                             <td><a href="/docs/agent">agent</a></td> | ||||
|                             <td><a href="/docs/agent.exe">agent.exe</a></td> | ||||
|                         </tr> | ||||
|                         <tr> | ||||
|                             <td>wsproxy</td> | ||||
|                             <td>SSH proxy command that can be directly used by ssh</td> | ||||
|                             <td><a href="/docs/wsproxy">wsproxy</a></td> | ||||
|                             <td><a href="/docs/wsproxy.exe">wsproxy.exe</a></td> | ||||
|                         </tr> | ||||
|                         <tr> | ||||
|                             <td>tcptows</td> | ||||
|                             <td>TCP to WS tunnel for allowing regular | ||||
|                                 SSH and SFTP clients to connect to converge</td> | ||||
|                             <td><a href="/docs/tcptows">tcptows</a></td> | ||||
|                             <td><a href="/docs/tcptows.exe">tcptows.exe</a></td> | ||||
|                         </tr> | ||||
|                     </table> | ||||
|                     @About() | ||||
|                     @Usage(secure, host, username) | ||||
|                     @Downloads() | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
							
								
								
									
										122
									
								
								pkg/templates/usage.templ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								pkg/templates/usage.templ
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| package templates | ||||
| 
 | ||||
| templ Usage(secure string, host string, username string) { | ||||
|   <div> | ||||
|                       <h1>Usage</h1> | ||||
| 
 | ||||
|                       <h2>Continuous integration jobs</h2> | ||||
| 
 | ||||
|                       <p> | ||||
|                           In a | ||||
|                           continuous integration job, download the agent, chmod it and run it. | ||||
|                       </p> | ||||
|                       <pre>{` | ||||
|            # linux | ||||
|            `}curl http{secure}://{host}/docs/agent > agent{` | ||||
|            chmod 755 agent | ||||
|            `}./agent --id ID ws{secure}://{host}{` | ||||
| 
 | ||||
|            # windows | ||||
|            `}curl http{secure}://{host}/docs/agent.exe > agent.exe{` | ||||
|            `}agent --id ID ws{secure}://{host}{` | ||||
|           `}</pre> | ||||
|                       <p> | ||||
|                           Above, ID is a unique id for the job, the so-called rendez-cous ID. This should not conflict with IDs | ||||
|                           used by other agents. The ID is used for a rendez-vous between the end-user on a local system and | ||||
|                           the continuous integration job running on a build agent. If you don't specify an id, a random | ||||
|                           id will be generated. | ||||
| 
 | ||||
|                           The agent to the converge server and tells it the ID. Clients can now connect to the Converge | ||||
|                           server to establish a connection to the CI job through converge by also specifying the same | ||||
|                           ID. | ||||
| 
 | ||||
|                           Communication between | ||||
|                           end-user and agent is encrypted using SSH and the rendez-vous server is unable to | ||||
|                           read the contents. The rendez-vous server is nothing more then a glorified bit pipe, | ||||
|                           simply transferring data between end-user SSH client and the agent which runs an | ||||
|                           embedded SSH server. | ||||
|                       </p> | ||||
| 
 | ||||
|                       <p> | ||||
|                           NOTE: When running the agent on windows, an exit of the remote session using | ||||
|                           exit in powershell or command prompt does not terminate the shell completely. | ||||
|                           To terminate the client ssh session must be killed by closing the terminal. | ||||
|                           Cleanup of remote processes on the agent appears to work properly despite this | ||||
|                           problem. It is just that exit of the windows shell (powershell or command prompt) | ||||
|                           is not detected properly. | ||||
|                       </p> | ||||
| 
 | ||||
|                       <p> | ||||
|                           The agent has more options, download the agent and run it without arguments to | ||||
|                           see all options. | ||||
|                       </p> | ||||
| 
 | ||||
|                       <h2>Local clients: using ssh with a proxy command </h2> | ||||
| 
 | ||||
|                       <p><code>wsproxy</code> is a command that can be used as a proxy command for SSH which performs the connection to the | ||||
|                           remote server. This command needs to be downloaded only once (see <a href="#downloads">downloads</a> below). It does not depend on | ||||
|                           the converge implementation but only on the websocket standards. Other tools that | ||||
|                           provide a mapping of stdio to a websocket can also be used instead of wsproxy. | ||||
|                       </p> | ||||
|                       <p> | ||||
|                           Next step is to run a local SSH or SFTP client: | ||||
|                       </p> | ||||
| 
 | ||||
|                       <pre> | ||||
|                                                                                                                               {` | ||||
|           `}ssh -oServerAliveInterval=10 -oProxyCommand="wsproxy ws{secure}://{host}/client/ID"  { username }{"@localhost"}   {` | ||||
|           `}sftp -oServerAliveInterval=10 -oProxyCommand="wsproxy ws{secure}://{host}/client/ID" { username }{"@localhost"}   {` | ||||
|           `}</pre> | ||||
| 
 | ||||
|                       <h2>Local clients: using SSH with a local TCP forwarding proxy</h2> | ||||
| 
 | ||||
|                       <p> | ||||
|                       This option is less convenient than the proxy command because it requires two separate | ||||
|                       commands to execute. | ||||
|                       </p> | ||||
| 
 | ||||
|                       <p> | ||||
|                           Local clients can connect using regular ssh and sftp commands through a tunnel that | ||||
|                           translates a local TCP port to a websocket connection in converge. See | ||||
|                           the <a href="#downloads">downloads</a> section. | ||||
|                           This runs a local client that allows SSH to port 10000 and connects to converge using | ||||
|                           a websocket connection. | ||||
|                       </p> | ||||
| 
 | ||||
| 
 | ||||
|                       <p> | ||||
|                           Next step is to run a local SSH of SFTP client: | ||||
|                       </p> | ||||
| 
 | ||||
|                       <pre>                                                           {` | ||||
|           `}ssh -oServerAliveInterval=10 -p 10000 { username }{"@localhost"}          {` | ||||
|           `}sftp -oServerAliveInterval=10 -oPort=10000 { username }{"@localhost"}     {` | ||||
|           `}</pre> | ||||
| 
 | ||||
|                       <h2>Authentication</h2> | ||||
| 
 | ||||
|                       <p> | ||||
|                           The <code>{ username }</code> user above the Converge server and | ||||
|                           communicated to the agent when the agent is started. This is the | ||||
|                           username that must be used when setting up an ssh connection. | ||||
|                           Another way to authenticate is through an .authorized_keys file in the | ||||
|                           same directory as where the agent is started. | ||||
| 
 | ||||
|                           This can be setup as follows before starting the agent: | ||||
|                       </p> | ||||
|                       <pre>                                         {` | ||||
|           `}# linux                                                 {` | ||||
|           `}echo "ssh-rsa dkddkdkkk a@b.c" > .authorized_keys       {` | ||||
|           `}echo "ssh-rsa adfadjfdf d@e.f" >> .authorized_keys      {` | ||||
|           `}                                                        {` | ||||
|           `}# windows                                               {` | ||||
|           `}echo ssh-rsa dkddkdkkk a@b.c > .authorized_keys         {` | ||||
|           `}echo ssh-rsa adfadjfdf d@e.f >> .authorized_keys | ||||
|                       </pre> | ||||
|                       <p> | ||||
|                           Note that on windows you should not used quotes. | ||||
|                       </p> | ||||
| 
 | ||||
|   </div> | ||||
| } | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user