handleRPC handles unary RPCs from the manager, sending a reply back to the manager.
(req *request[*TunnelMessage, *ManagerMessage])
| 120 | |
| 121 | // handleRPC handles unary RPCs from the manager, sending a reply back to the manager. |
| 122 | func (t *Tunnel) handleRPC(req *request[*TunnelMessage, *ManagerMessage]) { |
| 123 | resp := &TunnelMessage{} |
| 124 | resp.Rpc = &RPC{ResponseTo: req.msg.Rpc.MsgId} |
| 125 | switch msg := req.msg.GetMsg().(type) { |
| 126 | case *ManagerMessage_GetPeerUpdate: |
| 127 | err := t.updater.sendUpdateResponse(req) |
| 128 | if err != nil { |
| 129 | t.logger.Error(t.ctx, "failed to send peer update", slog.Error(err)) |
| 130 | } |
| 131 | // Reply has already been sent. |
| 132 | return |
| 133 | case *ManagerMessage_Start: |
| 134 | startReq := msg.Start |
| 135 | t.logger.Info(t.ctx, "starting CoderVPN tunnel", |
| 136 | slog.F("url", startReq.CoderUrl), |
| 137 | slog.F("tunnel_fd", startReq.TunnelFileDescriptor), |
| 138 | ) |
| 139 | err := t.start(startReq) |
| 140 | var errStr string |
| 141 | if err != nil { |
| 142 | t.logger.Error(t.ctx, "failed to start tunnel", slog.Error(err)) |
| 143 | errStr = err.Error() |
| 144 | } |
| 145 | resp.Msg = &TunnelMessage_Start{ |
| 146 | Start: &StartResponse{ |
| 147 | Success: err == nil, |
| 148 | ErrorMessage: errStr, |
| 149 | }, |
| 150 | } |
| 151 | case *ManagerMessage_Stop: |
| 152 | t.logger.Info(t.ctx, "stopping CoderVPN tunnel") |
| 153 | err := t.stop(msg.Stop) |
| 154 | var errStr string |
| 155 | if err != nil { |
| 156 | t.logger.Error(t.ctx, "failed to stop tunnel", slog.Error(err)) |
| 157 | errStr = err.Error() |
| 158 | } else { |
| 159 | t.logger.Info(t.ctx, "coderVPN tunnel stopped") |
| 160 | } |
| 161 | resp.Msg = &TunnelMessage_Stop{ |
| 162 | Stop: &StopResponse{ |
| 163 | Success: err == nil, |
| 164 | ErrorMessage: errStr, |
| 165 | }, |
| 166 | } |
| 167 | default: |
| 168 | t.logger.Warn(t.ctx, "unhandled manager request", slog.F("request", msg)) |
| 169 | } |
| 170 | if err := req.sendReply(resp); err != nil { |
| 171 | t.logger.Debug(t.ctx, "failed to send RPC reply", slog.Error(err)) |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | type NetworkStack struct { |
| 176 | WireguardMonitor *netmon.Monitor |
no test coverage detected