( ctx context.Context, agentID uuid.UUID, derpMap *tailcfg.DERPMap, derpForceWebSockets, disableDirectConnections bool, keySeed int64, )
| 1721 | } |
| 1722 | |
| 1723 | func (a *agent) createTailnet( |
| 1724 | ctx context.Context, |
| 1725 | agentID uuid.UUID, |
| 1726 | derpMap *tailcfg.DERPMap, |
| 1727 | derpForceWebSockets, disableDirectConnections bool, |
| 1728 | keySeed int64, |
| 1729 | ) (_ *tailnet.Conn, err error) { |
| 1730 | // Inject `CODER_AGENT_HEADER` into the DERP header. |
| 1731 | var header http.Header |
| 1732 | if client, ok := a.client.(*agentsdk.Client); ok { |
| 1733 | if headerTransport, ok := client.SDK.HTTPClient.Transport.(*codersdk.HeaderTransport); ok { |
| 1734 | header = headerTransport.Header |
| 1735 | } |
| 1736 | } |
| 1737 | network, err := tailnet.NewConn(&tailnet.Options{ |
| 1738 | ID: agentID, |
| 1739 | Addresses: a.wireguardAddresses(agentID), |
| 1740 | DERPMap: derpMap, |
| 1741 | DERPForceWebSockets: derpForceWebSockets, |
| 1742 | DERPHeader: &header, |
| 1743 | DERPTLSConfig: a.derpTLSConfig, |
| 1744 | Logger: a.logger.Named("net.tailnet"), |
| 1745 | ListenPort: a.tailnetListenPort, |
| 1746 | BlockEndpoints: disableDirectConnections, |
| 1747 | }) |
| 1748 | if err != nil { |
| 1749 | return nil, xerrors.Errorf("create tailnet: %w", err) |
| 1750 | } |
| 1751 | defer func() { |
| 1752 | if err != nil { |
| 1753 | network.Close() |
| 1754 | } |
| 1755 | }() |
| 1756 | |
| 1757 | if err := a.sshServer.UpdateHostSigner(keySeed); err != nil { |
| 1758 | return nil, xerrors.Errorf("update host signer: %w", err) |
| 1759 | } |
| 1760 | |
| 1761 | for _, port := range []int{workspacesdk.AgentSSHPort, workspacesdk.AgentStandardSSHPort} { |
| 1762 | sshListener, err := network.Listen("tcp", ":"+strconv.Itoa(port)) |
| 1763 | if err != nil { |
| 1764 | return nil, xerrors.Errorf("listen on the ssh port (%v): %w", port, err) |
| 1765 | } |
| 1766 | // nolint:revive // We do want to run the deferred functions when createTailnet returns. |
| 1767 | defer func() { |
| 1768 | if err != nil { |
| 1769 | _ = sshListener.Close() |
| 1770 | } |
| 1771 | }() |
| 1772 | if err = a.trackGoroutine(func() { |
| 1773 | _ = a.sshServer.Serve(sshListener) |
| 1774 | }); err != nil { |
| 1775 | return nil, err |
| 1776 | } |
| 1777 | } |
| 1778 | |
| 1779 | reconnectingPTYListener, err := network.Listen("tcp", ":"+strconv.Itoa(workspacesdk.AgentReconnectingPTYPort)) |
| 1780 | if err != nil { |
no test coverage detected