metalbear-co/mirrord

mirrord lets you easily mirror traffic from your Kubernetes cluster to your development environment

Click "Enable mirrord" on the status bar

. It comes as both a Visual Studio Code extension and a CLI tool.

Getting Started

  • VSCode Extension
  • CLI Tool

mirrord uses your machine's default kubeconfig for access to the Kubernetes API.

Make sure your local process is listening on the same port as the remote pod.


VSCode Extension

Installation

Get the extension here.

How To Use

  • Click "Enable mirrord" on the status bar
  • Start debugging your project
  • Choose pod to mirror traffic from
  • The debugged process will start with mirrord, and receive traffic


CLI Tool

Installation

curl -fsSL https://raw.githubusercontent.com/metalbear-co/mirrord/main/scripts/install.sh | bash
  • Windows isn't currently supported (you can use WSL)

How To Use

mirrord exec <process command> --pod-name <name of the pod to impersonate>

e.g.

mirrord exec node app.js --pod-name my-pod

How It Works

mirrord works by letting you select a pod to mirror traffic from. It launches a privileged pod on the same node which enters the namespace of the selected pod and captures traffic from it.

Contributing

Contributions are welcome via PRs.

Help & Community 🎉✉️

Join our Discord Server for questions, support and fun.

Code of Conduct

We take our community seriously and we are dedicated to providing a safe and welcoming environment for everyone. Please take a few minutes to review our Code of Conduct.

License

MIT

Issues

Collection of the latest Issues

meowjesty

meowjesty

bug
Comment Icon0

Bug Description

This crashes node apps when the fd belongs to stdout. The other _detours for file ops do not appear to break, so guess it's only this one.

Steps to Reproduce

  1. run node app with mirrord (file ops enabled [default]);
  2. crash.

Backtrace

Relevant Logs

Your operating system and version

Windows 10 wsl (Ubuntu 20.04.4 LTS)

Local process

test_outgoing_traffic_make_request_after_listen.mjs

Local process version

No response

Additional Info

No response

t4lz

t4lz

bug
Comment Icon1

Bug Description

Outgoing UDP messages fail if destination is specified by name, not address, because of a DNS error on the agent.

Steps to Reproduce

  1. Checkout a Node.js script that sends out 1 UDP message, e.g. by running:

  2. Run that node script with mirrord with any host name (here it's localhost):

  3. The script throws an error because DNS failed.

Backtrace

Relevant Logs

Agent logs:

Your operating system and version

macOS Monterey 12.5.1

Local process

/opt/homebrew/bin/node: Mach-O 64-bit executable arm64

Local process version

No response

Additional Info

I do not know if this issue is limited to attempts to send UDP messages.

eyalb181

eyalb181

bug
Comment Icon0

Bug Description

When debugging Go, the application hangs for a while and then crashes with a lot of errors, for example: 2022-09-14T13:52:01.961115Z DEBUG mirrord_layer::file: HookMessage::OpenFileHook path "/Users/eyalbukchin/Library/Application Support/go/env" | options OpenOptionsInternal { read: true, write: false, append: false, truncate: false, create: false, create_new: false, }

Steps to Reproduce

Try to debug a simple Go app in VS Code.

Backtrace

No response

Relevant Logs

No response

Your operating system and version

MacOS

Local process

Go

Local process version

No response

Additional Info

No response

aviramha

aviramha

ux
Comment Icon0

Right now we might have a weird UX where we just don't load. We can easily add simple verifications such as checking if the binary is protected by SIP (is in /usr/bin and other paths) and expand the functionality as we go.

infiniteregrets

infiniteregrets

bug
Comment Icon8

Bug Description

getaddrinfo returns a linkedlist of resolved addresses and seems like when the request is sent to curl localhost:80, it is resolved by the agent into both ipv4 and ipv6 addresses, and then the layer tries to create a socket based on the socket type of the resolved address, which for this context is ipv6, socket creation succeeds since locally ipv6 is supported but fails later when connect is called on the created ipv6 socket and the ipv6 address.

possible issue:

  • ipv6 is not enabled on the remote/agent pod and hence we should check the network stack of the remote and fail with -1 if the requested socket type is not supported on the remote.

inside the pod:

Steps to Reproduce

IRRORD_AGENT_IMAGE=test RUST_LOG=mirrord=trace ../mirrord/target/debug/mirrord exec -c --pod-name metalbear-deployment-85c754c75f-6k7mg curl localhost:80/users

Backtrace

shell Without reversing the iterator for the vector returned by the agent: [Call succeeds]

MIRRORD_AGENT_IMAGE=test RUST_LOG=mirrord=trace ../mirrord/target/debug/mirrord exec -c --pod-name metalbear-deployment-85c754c75f-6k7mg curl localhost:80/users 2022-09-12T04:30:20.501251Z INFO mirrord: Launching "curl" with arguments ["localhost:80/users"] 2022-09-12T04:30:20.952659Z DEBUG mirrord: Extracted library file to "/tmp/fstmgqejcc-libmirrord_layer.so" 2022-09-12T04:30:21.008922Z INFO mirrord_layer: Initializing mirrord-layer! 2022-09-12T04:30:21.009141Z INFO mirrord_layer: Using port 52843 for communication 2022-09-12T04:30:21.013534Z WARN mirrord_layer::pod_api: Accepting invalid certificates 2022-09-12T04:30:21.024691Z INFO mirrord_layer::pod_api: No container name specified, defaulting to first container found 2022-09-12T04:30:21.111927Z DEBUG mirrord_layer::pod_api: Pod Phase = "Pending" 2022-09-12T04:30:21.164023Z DEBUG mirrord_layer::pod_api: Pod Phase = "Pending" 2022-09-12T04:30:25.938030Z DEBUG mirrord_layer::pod_api: Pod Phase = "Running" 2022-09-12T04:30:25.966090Z TRACE mirrord_layer: replace -> hooking "close" 2022-09-12T04:30:25.966236Z TRACE mirrord_layer: replace -> hooked "close" true 2022-09-12T04:30:25.966268Z TRACE mirrord_layer::socket::hooks: replace -> hooking "socket" 2022-09-12T04:30:25.966310Z TRACE mirrord_layer::socket::hooks: replace -> hooked "socket" true 2022-09-12T04:30:25.966327Z TRACE mirrord_layer::socket::hooks: replace -> hooking "bind" 2022-09-12T04:30:25.966357Z TRACE mirrord_layer::socket::hooks: replace -> hooked "bind" true 2022-09-12T04:30:25.966375Z TRACE mirrord_layer::socket::hooks: replace -> hooking "listen" 2022-09-12T04:30:25.966406Z TRACE mirrord_layer::socket::hooks: replace -> hooked "listen" true 2022-09-12T04:30:25.966441Z TRACE mirrord_layer::socket::hooks: replace -> hooking "connect" 2022-09-12T04:30:25.966477Z TRACE mirrord_layer::socket::hooks: replace -> hooked "connect" true 2022-09-12T04:30:25.966499Z TRACE mirrord_layer::socket::hooks: replace -> hooking "fcntl" 2022-09-12T04:30:25.966551Z TRACE mirrord_layer::socket::hooks: replace -> hooked "fcntl" true 2022-09-12T04:30:25.966573Z TRACE mirrord_layer::socket::hooks: replace -> hooking "dup" 2022-09-12T04:30:25.966606Z TRACE mirrord_layer::socket::hooks: replace -> hooked "dup" true 2022-09-12T04:30:25.966623Z TRACE mirrord_layer::socket::hooks: replace -> hooking "dup2" 2022-09-12T04:30:25.966672Z TRACE mirrord_layer::socket::hooks: replace -> hooked "dup2" true 2022-09-12T04:30:25.966691Z TRACE mirrord_layer::socket::hooks: replace -> hooking "getpeername" 2022-09-12T04:30:25.966734Z TRACE mirrord_layer::socket::hooks: replace -> hooked "getpeername" true 2022-09-12T04:30:25.966752Z TRACE mirrord_layer::socket::hooks: replace -> hooking "getsockname" 2022-09-12T04:30:25.966783Z TRACE mirrord_layer::socket::hooks: replace -> hooked "getsockname" true 2022-09-12T04:30:25.966797Z TRACE mirrord_layer::socket::hooks: replace -> hooking "uv__accept4" 2022-09-12T04:30:25.966821Z TRACE mirrord_layer::socket::hooks: replace -> hooking "accept4" 2022-09-12T04:30:25.966855Z TRACE mirrord_layer::socket::hooks: replace -> hooked "accept4" true 2022-09-12T04:30:25.966874Z TRACE mirrord_layer::socket::hooks: replace -> hooking "dup3" 2022-09-12T04:30:25.966901Z TRACE mirrord_layer::socket::hooks: replace -> hooked "dup3" true 2022-09-12T04:30:25.966936Z TRACE mirrord_layer::socket::hooks: replace -> hooking "accept" 2022-09-12T04:30:25.966972Z TRACE mirrord_layer::socket::hooks: replace -> hooked "accept" true 2022-09-12T04:30:25.967009Z TRACE mirrord_layer::socket::hooks: replace -> hooking "getaddrinfo" 2022-09-12T04:30:25.967045Z TRACE mirrord_layer::socket::hooks: replace -> hooked "getaddrinfo" true 2022-09-12T04:30:25.967063Z TRACE mirrord_layer::socket::hooks: replace -> hooking "freeaddrinfo" 2022-09-12T04:30:25.967111Z TRACE mirrord_layer::socket::hooks: replace -> hooked "freeaddrinfo" true 2022-09-12T04:30:25.967132Z TRACE mirrord_layer::file::hooks: replace -> hooking "open" 2022-09-12T04:30:25.967177Z TRACE mirrord_layer::file::hooks: replace -> hooked "open" true 2022-09-12T04:30:25.967195Z TRACE mirrord_layer::file::hooks: replace -> hooking "openat" 2022-09-12T04:30:25.967228Z TRACE mirrord_layer::file::hooks: replace -> hooked "openat" true 2022-09-12T04:30:25.967244Z TRACE mirrord_layer::file::hooks: replace -> hooking "fopen" 2022-09-12T04:30:25.967302Z TRACE mirrord_layer::file::hooks: replace -> hooked "fopen" true 2022-09-12T04:30:25.967332Z TRACE mirrord_layer::file::hooks: replace -> hooking "fdopen" 2022-09-12T04:30:25.967382Z TRACE mirrord_layer::file::hooks: replace -> hooked "fdopen" true 2022-09-12T04:30:25.967402Z TRACE mirrord_layer::file::hooks: replace -> hooking "read" 2022-09-12T04:30:25.967435Z TRACE mirrord_layer::file::hooks: replace -> hooked "read" true 2022-09-12T04:30:25.967453Z TRACE mirrord_layer::file::hooks: replace -> hooking "fread" 2022-09-12T04:30:25.967482Z TRACE mirrord_layer::file::hooks: replace -> hooked "fread" true 2022-09-12T04:30:25.967497Z TRACE mirrord_layer::file::hooks: replace -> hooking "fileno" 2022-09-12T04:30:25.967532Z TRACE mirrord_layer::file::hooks: replace -> hooked "fileno" true 2022-09-12T04:30:25.967549Z TRACE mirrord_layer::file::hooks: replace -> hooking "lseek" 2022-09-12T04:30:25.967575Z TRACE mirrord_layer::file::hooks: replace -> hooked "lseek" true 2022-09-12T04:30:25.967587Z TRACE mirrord_layer::file::hooks: replace -> hooking "write" 2022-09-12T04:30:25.967613Z TRACE mirrord_layer::file::hooks: replace -> hooked "write" true 2022-09-12T04:30:25.967628Z TRACE mirrord_layer::file::hooks: replace -> hooking "access" 2022-09-12T04:30:25.967652Z TRACE mirrord_layer::file::hooks: replace -> hooked "access" true 2022-09-12T04:30:25.967664Z TRACE mirrord_layer::file::hooks: replace -> hooking "faccessat" 2022-09-12T04:30:25.967687Z TRACE mirrord_layer::file::hooks: replace -> hooked "faccessat" true 2022-09-12T04:30:25.969283Z INFO mirrord_layer::go_env: replace -> hooking "runtime.goenvs_unix" 2022-09-12T04:30:25.974911Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse { "USER_SERVICE_PORT_80_TCP_PROTO": "tcp", "BFF_USERS_SERVICE_PORT_3000_TCP_ADDR": "10.106.233.7", "USER_SERVICE_PORT_80_TCP_PORT": "80", "KUBERNETES_PORT": "#404", "KUBERNETES_SERVICE_PORT": "443", "KUBERNETES_SERVICE_PORT_HTTPS": "443", "LANG": "C.UTF-8", "BFF_USERS_SERVICE_PORT_3000_TCP_PORT": "3000", "USER_SERVICE_PORT_80_TCP_ADDR": "10.106.158.180", "BFF_USERS_SERVICE_PORT_3000_TCP": "#404", "USER_SERVICE_PORT": "#404", "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", "KUBERNETES_PORT_443_TCP_ADDR": "10.96.0.1", "BFF_USERS_SERVICE_SERVICE_PORT": "3000", "USER_SERVICE_SERVICE_PORT": "80", "KUBERNETES_PORT_443_TCP_PORT": "443", "PYTHON_PIP_VERSION": "22.0.4", "PYTHON_GET_PIP_SHA256": "5aefe6ade911d997af080b315ebcb7f882212d070465df544e1175ac2be519b4", "USER_SERVICE_PORT_80_TCP": "#404", "USER_SERVICE_SERVICE_HOST": "10.106.158.180", "BFF_USERS_SERVICE_PORT_3000_TCP_PROTO": "tcp", "KUBERNETES_PORT_443_TCP": "#404", "HOSTNAME": "metalbear-deployment-85c754c75f-6k7mg", "KUBERNETES_PORT_443_TCP_PROTO": "tcp", "PYTHON_VERSION": "3.9.13", "BFF_USERS_SERVICE_PORT": "#404", "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5eaac1050023df1f5c98b173b248c260023f2278/public/get-pip.py", "KUBERNETES_SERVICE_HOST": "10.96.0.1", "PYTHON_SETUPTOOLS_VERSION": "58.1.0", "BFF_USERS_SERVICE_SERVICE_HOST": "10.106.233.7", }! 2022-09-12T04:30:25.975026Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "USER_SERVICE_PORT_80_TCP_PROTO" value "tcp" 2022-09-12T04:30:25.975064Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "BFF_USERS_SERVICE_PORT_3000_TCP_ADDR" value "10.106.233.7" 2022-09-12T04:30:25.975093Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "USER_SERVICE_PORT_80_TCP_PORT" value "80" 2022-09-12T04:30:25.975119Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "KUBERNETES_PORT" value "#404" 2022-09-12T04:30:25.975143Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "KUBERNETES_SERVICE_PORT" value "443" 2022-09-12T04:30:25.975166Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "KUBERNETES_SERVICE_PORT_HTTPS" value "443" 2022-09-12T04:30:25.975192Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "LANG" value "C.UTF-8" 2022-09-12T04:30:25.975218Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "BFF_USERS_SERVICE_PORT_3000_TCP_PORT" value "3000" 2022-09-12T04:30:25.975245Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "USER_SERVICE_PORT_80_TCP_ADDR" value "10.106.158.180" 2022-09-12T04:30:25.975269Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "BFF_USERS_SERVICE_PORT_3000_TCP" value "#404" 2022-09-12T04:30:25.975295Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "USER_SERVICE_PORT" value "#404" 2022-09-12T04:30:25.975321Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "GPG_KEY" value "E3FF2839C048B25C084DEBE9B26995E310250568" 2022-09-12T04:30:25.975353Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "KUBERNETES_PORT_443_TCP_ADDR" value "10.96.0.1" 2022-09-12T04:30:25.975381Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "BFF_USERS_SERVICE_SERVICE_PORT" value "3000" 2022-09-12T04:30:25.975407Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "USER_SERVICE_SERVICE_PORT" value "80" 2022-09-12T04:30:25.975432Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "KUBERNETES_PORT_443_TCP_PORT" value "443" 2022-09-12T04:30:25.975453Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "PYTHON_PIP_VERSION" value "22.0.4" 2022-09-12T04:30:25.975472Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "PYTHON_GET_PIP_SHA256" value "5aefe6ade911d997af080b315ebcb7f882212d070465df544e1175ac2be519b4" 2022-09-12T04:30:25.975493Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "USER_SERVICE_PORT_80_TCP" value "#404" 2022-09-12T04:30:25.975513Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "USER_SERVICE_SERVICE_HOST" value "10.106.158.180" 2022-09-12T04:30:25.975533Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "BFF_USERS_SERVICE_PORT_3000_TCP_PROTO" value "tcp" 2022-09-12T04:30:25.975554Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "KUBERNETES_PORT_443_TCP" value "#404" 2022-09-12T04:30:25.975578Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "HOSTNAME" value "metalbear-deployment-85c754c75f-6k7mg" 2022-09-12T04:30:25.975602Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "KUBERNETES_PORT_443_TCP_PROTO" value "tcp" 2022-09-12T04:30:25.975624Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "PYTHON_VERSION" value "3.9.13" 2022-09-12T04:30:25.975646Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "BFF_USERS_SERVICE_PORT" value "#404" 2022-09-12T04:30:25.975668Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "PYTHON_GET_PIP_URL" value "https://github.com/pypa/get-pip/raw/5eaac1050023df1f5c98b173b248c260023f2278/public/get-pip.py" 2022-09-12T04:30:25.975693Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "KUBERNETES_SERVICE_HOST" value "10.96.0.1" 2022-09-12T04:30:25.975715Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "PYTHON_SETUPTOOLS_VERSION" value "58.1.0" 2022-09-12T04:30:25.975737Z DEBUG mirrord_layer: DaemonMessage::GetEnvVarsResponse set key "BFF_USERS_SERVICE_SERVICE_HOST" value "10.106.233.7" 2022-09-12T04:30:25.975827Z TRACE mirrord_layer: close_detour -> fd 10 2022-09-12T04:30:25.975868Z TRACE mirrord_layer: close_detour -> fd 11 2022-09-12T04:30:25.976788Z TRACE mirrord_layer::file::hooks: fopen_detour -> 2022-09-12T04:30:25.979578Z TRACE mirrord_layer::socket::hooks: socket_detour -> domain 10 | type:2 | protocol 0 2022-09-12T04:30:25.979958Z TRACE mirrord_layer::socket::ops: socket -> domain 10 | type:2 | protocol 0 2022-09-12T04:30:25.980264Z DEBUG mirrord_layer::socket::ops: socket -> socket_fd 10 | new_socket UserSocket { domain: 10, type_: 2, protocol: 0, state: Initialized, kind: Udp( 2, ), } 2022-09-12T04:30:25.984601Z TRACE mirrord_layer: close_detour -> fd 10 2022-09-12T04:30:25.985377Z TRACE mirrord_layer::file::hooks: fopen_detour -> 2022-09-12T04:30:25.986202Z TRACE mirrord_layer::file::hooks: fopen_detour -> 2022-09-12T04:30:25.988468Z TRACE mirrord_layer::file::ops: fopen -> path "/home/mehula/.curlrc" | open_options OpenOptionsInternal { read: true, write: false, append: false, truncate: false, create: false, create_new: false, } 2022-09-12T04:30:25.998987Z TRACE mirrord_layer::file::ops: open -> path "/home/mehula/.curlrc" | open_options OpenOptionsInternal { read: true, write: false, append: false, truncate: false, create: false, create_new: false, } 2022-09-12T04:30:26.000795Z TRACE mirrord_layer: Layer::handle_hook_message -> hook_message File(Open(Open { path: "/home/mehula/.curlrc", file_channel_tx: Sender { inner: Some(Inner { state: State { is_complete: false, is_closed: false, is_rx_task_set: false, is_tx_task_set: false } }) }, open_options: OpenOptionsInternal { read: true, write: false, append: false, truncate: false, create: false, create_new: false } })) 2022-09-12T04:30:26.000854Z DEBUG mirrord_layer::file: HookMessage::OpenFileHook path "/home/mehula/.curlrc" | options OpenOptionsInternal { read: true, write: false, append: false, truncate: false, create: false, create_new: false, } 2022-09-12T04:30:26.002168Z DEBUG mirrord_layer::file: DaemonMessage::OpenFileResponse Err( RemoteIO( RemoteIOError { raw_os_error: Some( 2, ), kind: NotFound, }, ), )! 2022-09-12T04:30:26.002488Z TRACE mirrord_layer::error: Error occured in Layer >> ResponseError(RemoteIO(RemoteIOError { raw_os_error: Some(2), kind: NotFound }))
2022-09-12T04:30:26.003052Z TRACE mirrord_layer::file::hooks: fileno_detour -> 2022-09-12T04:30:26.003291Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> fd 10 | cmd 3 2022-09-12T04:30:26.003500Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> result 2 2022-09-12T04:30:26.003706Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> fd 10 | cmd 4 2022-09-12T04:30:26.004102Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> result 0 2022-09-12T04:30:26.004399Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> fd 11 | cmd 3 2022-09-12T04:30:26.004539Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> result 2 2022-09-12T04:30:26.006012Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> fd 11 | cmd 4 2022-09-12T04:30:26.006047Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> result 0 2022-09-12T04:30:26.006253Z TRACE mirrord_layer::socket::hooks: getaddrinfo_detour -> raw_node 0x000055fa1d946e20 | raw_service 0x00007f5fe9c229dc | raw_hints addrinfo { ai_flags: 0, ai_family: 0, ai_socktype: 1, ai_protocol: 0, ai_addrlen: 0, ai_addr: 0x0000000000000000, ai_canonname: 0x0000000000000000, ai_next: 0x0000000000000000, } | out? false 2022-09-12T04:30:26.006310Z DEBUG mirrord_layer::socket::ops: getaddrinfo -> node Some( "localhost", ) | service Some( "80", ) | hints Some( AddrInfoHint { ai_family: 0, ai_socktype: 1, ai_protocol: 0, ai_flags: 0, }, ) 2022-09-12T04:30:26.006448Z TRACE mirrord_layer: Layer::handle_hook_message -> hook_message GetAddrInfoHook(GetAddrInfoHook { node: Some("localhost"), service: Some("80"), hints: Some(AddrInfoHint { ai_family: 0, ai_socktype: 1, ai_protocol: 0, ai_flags: 0 }), hook_channel_tx: Sender { inner: Some(Inner { state: State { is_complete: false, is_closed: false, is_rx_task_set: true, is_tx_task_set: false } }) } }) 2022-09-12T04:30:26.006683Z TRACE mirrord_layer: HookMessage::GetAddrInfo 2022-09-12T04:30:26.008254Z TRACE mirrord_layer: DaemonMessage::GetAddrInfoResponse Ok( [ AddrInfoInternal { socktype: 1, protocol: 6, address: 10, sockaddr: [::1]:80, canonname: None, flags: 0, }, AddrInfoInternal { socktype: 1, protocol: 6, address: 2, sockaddr: 127.0.0.1:80, canonname: None, flags: 0, }, ], ) 2022-09-12T04:30:26.008552Z INFO mirrord_layer::socket::ops: getaddrinfo -> result Ok( 0x00007f5fd4000d70, ) 2022-09-12T04:30:26.008592Z TRACE mirrord_layer::socket::hooks: result: 0 2022-09-12T04:30:26.008619Z TRACE mirrord_layer::socket::hooks: freeaddrinfo_detour -> addrinfo addrinfo { ai_flags: 0, ai_family: 2, ai_socktype: 1, ai_protocol: 6, ai_addrlen: 16, ai_addr: 0x00007f5fd4000d50, ai_canonname: 0x0000000000000000, ai_next: 0x00007f5fd4000d10, } 2022-09-12T04:30:26.009087Z TRACE mirrord_layer: close_detour -> fd 13 2022-09-12T04:30:26.009129Z TRACE mirrord_layer: close_detour -> fd 12 2022-09-12T04:30:26.009158Z TRACE mirrord_layer::socket::hooks: socket_detour -> domain 2 | type:1 | protocol 6 2022-09-12T04:30:26.009176Z TRACE mirrord_layer::socket::ops: socket -> domain 2 | type:1 | protocol 6 2022-09-12T04:30:26.009221Z DEBUG mirrord_layer::socket::ops: socket -> socket_fd 12 | new_socket UserSocket { domain: 2, type_: 1, protocol: 6, state: Initialized, kind: Tcp( 1, ), } 2022-09-12T04:30:26.009300Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> fd 12 | cmd 3 2022-09-12T04:30:26.009320Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> result 2 2022-09-12T04:30:26.009336Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> fd 12 | cmd 4 2022-09-12T04:30:26.009353Z TRACE mirrord_layer::socket::hooks: fcntl_detour -> result 0 2022-09-12T04:30:26.009376Z DEBUG mirrord_layer::socket::hooks: connect_detour -> sockfd 12 2022-09-12T04:30:26.009395Z DEBUG mirrord_layer::socket::ops: connect -> sockfd 12 | remote_address 127.0.0.1:80 2022-09-12T04:30:26.009418Z TRACE mirrord_layer::socket::ops: connect -> SocketState::Initialized UserSocket { domain: 2, type_: 1, protocol: 6, state: Initialized, kind: Tcp( 1, ), } 2022-09-12T04:30:26.009567Z TRACE mirrord_layer: Layer::handle_hook_message -> hook_message TcpOutgoing(Connect(Connect { remote_address: 127.0.0.1:80, channel_tx: Sender { inner: Some(Inner { state: State { is_complete: false, is_closed: false, is_rx_task_set: false, is_tx_task_set: false } }) } })) 2022-09-12T04:30:26.009626Z TRACE mirrord_layer::outgoing::tcp: handle_hook_message -> message Connect(Connect { remote_address: 127.0.0.1:80, channel_tx: Sender { inner: Some(Inner { state: State { is_complete: false, is_closed: false, is_rx_task_set: false, is_tx_task_set: false } }) } }) 2022-09-12T04:30:26.009652Z TRACE mirrord_layer::outgoing::tcp: Connect -> remote_address 127.0.0.1:80 2022-09-12T04:30:26.010689Z TRACE mirrord_layer::outgoing::tcp: handle_daemon_message -> message Connect(Ok(DaemonConnect { connection_id: 0, remote_address: 127.0.0.1:80 })) 2022-09-12T04:30:26.010750Z TRACE mirrord_layer::outgoing::tcp: Connect -> connect Ok( DaemonConnect { connection_id: 0, remote_address: 127.0.0.1:80, }, ) 2022-09-12T04:30:26.011255Z DEBUG mirrord_layer::socket::ops: connect -> connect_result -1 2022-09-12T04:30:26.011323Z TRACE mirrord_layer::socket::hooks: getpeername_detour -> sockfd 12 2022-09-12T04:30:26.011350Z TRACE mirrord_layer::socket::ops: getpeername -> sockfd 12 2022-09-12T04:30:26.011441Z TRACE mirrord_layer::socket::hooks: getsockname_detour -> sockfd 12 2022-09-12T04:30:26.011568Z TRACE mirrord_layer::socket::ops: getsockname -> sockfd 12 2022-09-12T04:30:26.031464Z TRACE mirrord_layer::outgoing::tcp: handle_daemon_message -> message Read(Ok(DaemonRead { connection_id: 0, bytes (length): 296 })) 2022-09-12T04:30:26.031863Z TRACE mirrord_layer::outgoing::tcp: Read -> read Ok(DaemonRead { connection_id: 0, bytes (length): 296 }) 2022-09-12T04:30:26.031950Z TRACE mirrord_layer::outgoing::tcp: handle_daemon_message -> message Close(0) 2022-09-12T04:30:26.031978Z TRACE mirrord_layer::outgoing::tcp: Close -> connection_id 0 2022-09-12T04:30:26.032065Z WARN mirrord_layer::outgoing::tcp: interceptor_task -> exiting due to remote stream closed! 2022-09-12T04:30:26.032093Z TRACE mirrord_layer::outgoing::tcp: interceptor_task done -> connection_id 0 [{"Last":"Arora","Name":"Mehul"},{"Last":"Arora","Name":"Mehul"},{"Last":"Arora","Name":"Mehul"},{"Last":"Arora","Name":"Mehul"}] 2022-09-12T04:30:26.032215Z TRACE mirrord_layer: close_detour -> fd 12 2022-09-12T04:30:26.032283Z TRACE mirrord_layer: close_detour -> fd 10 2022-09-12T04:30:26.032310Z TRACE mirrord_layer: close_detour -> fd 11


### Your operating system and version

[email protected]:~/mirrord-demo$ uname -a Linux mehul-machine 5.15.0-1019-azure #24~20.04.1-Ubuntu SMP Tue Aug 23 15:52:52 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

### Local process

IRRORD_AGENT_IMAGE=test RUST_LOG=mirrord=trace ../mirrord/target/debug/mirrord exec -c --pod-name metalbear-deployment-85c754c75f-6k7mg curl localhost:80/users ### Local process version

No response

### Additional Info

No response

tamasfe

tamasfe

enhancement
Comment Icon3

The CLI has a lot of options, especially if you include env var configuration, a lot of it could be moved to something like a mirrord.toml along with a --config cli flag for it.

tamasfe

tamasfe

enhancement
Comment Icon1

--impersonated-container-name is quite a mouthful with no short flags.

Instead of introducing a short flag for it, I'd suggest an alternative for --pod-name.

Since #293 is planned, something more general could work as a target selector.

Some ideas:

For deployments:

Or in case services are supported in the future:

tamasfe

tamasfe

enhancement
Comment Icon3

Currently it's not possible to silence logs from mirrord-layer when developing a rust application as it uses the RUST_LOG env variable.

Something like MIRRORD_RUST_LOG could be introduced that overrides RUST_LOG if present.

Alternatively logging to file could be preferred instead of silencing, as these messages are still important, but should not be mixed with the executed app's stderr or stdout.

tamasfe

tamasfe

bug
Comment Icon1

Bug Description

kube_client::client::builder: failed with error error trying to connect: presented server name type wasn't supported is reported when connecting to a GKE cluster.

--accept-invalid-certificates as suggested is a good workaround but the certificate is definitely valid.

If you are using rustls, I suspect it's https://github.com/rustls/rustls/issues/184.

Steps to Reproduce

  1. gcloud container clusters get-credentials foo: load cluster credentials into .kube/config
  2. k describe node: kubectl connects successfully
  3. try to mirrord exec anything in the cluster

Backtrace

No response

Relevant Logs

No response

Your operating system and version

Linux 5.19.7-arch1-1

Local process

/bin/bash

Local process version

No response

Additional Info

No response

aviramha

aviramha

bug
Comment Icon2

Bug Description

in the CI, go crashes sometimes:

Steps to Reproduce

Seems to happen on http mirror traffic test in e2e.

Backtrace


Relevant Logs

No response

Your operating system and version

ubuntu-latest

Local process

go-e2e

Local process version

No response

Additional Info

No response

aviramha

aviramha

Comment Icon0

Now that all features are basically enabled by default, we should have one sanity test for each framework combining all the abilities and best testable framework for settings/configurations checks (like steal, specific env vars, etc) as that logic doesn't really change from framework to framework.

meowjesty

meowjesty

bug
Comment Icon0

Bug Description

The outgoing traffic feature fails when a request is made for an IPv6 address, as the pod doesn't support it (apparently).

This may cause issues when resolving a DNS to some IPv6 address.

Steps to Reproduce

  1. Make a request resolving the address as IPv6;
  2. Crashes.

Backtrace

Relevant Logs

  • agent:

  • layer:

Your operating system and version

Windows 10 wsl (Ubuntu 20.04.4 LTS)

Local process

test_outgoing_traffic_single_request_ipv6.mjs

Local process version

No response

Additional Info

No response

infiniteregrets

infiniteregrets

bug
Comment Icon1

Bug Description

it seems like runtime.goenvs_unix is not hooked for go version go1.18.4 darwin/arm64 on macos M1 and we end up with no envs loaded into the go process

Steps to Reproduce

  1. go build
  2. RUST_LOG=debug target/debug/mirrord exec -c --override-env-vars-include="*" --pod-name py-serv-deployment-5c57fbdc98-kqgrz tests/go-e2e/go-e2e

Backtrace

No response

Relevant Logs

Your operating system and version

[email protected] mirrord % uname -a Darwin Mehuls-MacBook-Air.local 21.4.0 Darwin Kernel Version 21.4.0: Mon Feb 21 20:36:53 PST 2022; root:xnu-8020.101.4~2/RELEASE_ARM64_T8101 arm64 [email protected] mirrord %

Local process

[email protected] mirrord % file tests/go-e2e/go-e2e tests/go-e2e/go-e2e: Mach-O 64-bit executable arm64

Local process version

No response

Additional Info

No response

t4lz

t4lz

bug
Comment Icon4

Bug Description

With the https://github.com/istio/istio/tree/master/samples/bookinfo example running in the google cloud, and the agent in a different namespace than the target pod, remote dns fails. It does not fail when the agent is in the same namespace.

Steps to Reproduce

  1. Setup the cluster from the istio repo, but with this load balancer:

  2. Run productpage.py on the productpage... pod with mirrord, with the agent pod in the default namespace than the target pod:

  3. Run kubectl describe service example-service -n istio

  4. Find the IP address in the output (censored here):

  5. Surf with your browser to http://<Ingress-IP>:3000/productpage?u=normal

  6. The details and reviews on the page are missing because the service cannot complete the dns queries to the other microservices.

Backtrace

No response

Relevant Logs

Your operating system and version

macOS Monterey 12.5.1

Local process

Python

Local process version

3.9.13

Additional Info

No response

eyalb181

eyalb181

bug
Comment Icon2

Bug Description

When debugging a Node process with mirrord enabled (no matter which features are turned on), I get the attached crash. Screenshot 2022-09-07 at 22 38 23

When adding the runtimeExecutable env var as suggested, it works, but then breakpoints are grayed out like so: Screenshot 2022-09-07 at 22 45 28

Steps to Reproduce

Debug a Node process in VS Code with mirrord enabled.

Backtrace

No response

Relevant Logs

No response

Your operating system and version

MacOS M1

Local process

node

Local process version

No response

Additional Info

No response

t4lz

t4lz

enhancement
Comment Icon0

Currently, if you override the default agent image with one that does not exist (e.g. -i test when running in the cloud and test only exists locally), then the created agent pod has statusImagePullBackOff and mirrord continues running locally. Instead, it should log an error and exit.

DmitryDodzin

DmitryDodzin

enhancement
Comment Icon1

After mirrord connects it remaps the expected listen port to a different one, causing confusion when trying to access the local process and receiving results without stealing the traffic

eyalb181

eyalb181

enhancement
Comment Icon0

A lot of time is wasted running the e2e tests on fixes where it doesn't really apply (e.g. in the IDE extensions), so we should filter it to only run on relevant files.

t4lz

t4lz

enhancement
Comment Icon0

When mirrord gets the close frame currently it just keeps running uselessly, and even after the agent disconnects. Instead, when the connection is closed, mirrord should exit and display some helpful information.

This happens for example if you run mirrord against a local cluster on mac with an apple chip, without specifying an agent image (MIRRORD_AGENT_IMAGE) built for apple, and an x86 image is used by default.

infiniteregrets

infiniteregrets

enhancement
Comment Icon0

We need to add tests for a gRPC a simple client-server model to current suite of E2E tests

eyalb181

eyalb181

enhancement
Comment Icon1

After #278 is done, we need to complete the outgoing UDP functionality to support all relevant use cases, not only Go DNS.

Versions

Find the latest versions by id

3.0.4-alpha - Sep 14, 2022

Fixed

  • Fix crash in VS Code extension happening because the MIRRORD_OVERRIDE_ENV_VARS_INCLUDE and MIRRORD_OVERRIDE_ENV_VARS_EXCLUDE vars being populated with empty values (rather than not being populated at all).Closes [#413].
  • Add exception to gradle when dylib/so file is not found. Closes [#345]

3.0.3-alpha - Sep 13, 2022

Changed

  • Changed agent namespace to default to the pod namespace. Closes [#404].

3.0.2-alpha - Sep 13, 2022

Added

  • Code sign Apple binaries.

Changed

  • In go-e2e test, call os.Exit instead fo sending SIGINT to the process.

Fixed

  • Fix Environment parsing error when value contained '=' Closes [#387].
  • Fix bug in outgoing traffic with multiple requests in quick succession. Closes [#331].

3.0.1-alpha - Sep 09, 2022

Fixed

  • Add missing dependency breaking the VS Code release.

3.0.0-alpha - Sep 09, 2022

3.0.0-alpha

Added

  • New feature: UDP outgoing, mainly for Go DNS but should work for most use cases also!
  • E2E: add tests for python's fastapi with uvicorn
  • Socket ops - connect: ignore localhost and ports 50000 - 60000 (reserved for debugger)
  • Add "*.plist" to IGNORE_REGEX, refer [#350].

Changed

  • Change all functionality (incoming traffic mirroring, remote DNS outgoing traffic, environment variables, file reads) to be enabled by default. Note that flags now disable functionality

Fixed

  • mirrord-layer: User-friendly error for invalid kubernetes api certificate
  • mirrord-cli: Add random prefix to the generated shared lib to prevent Bus Error/EXC_BAD_ACCESS
  • Support for Go 1.19>= syscall hooking
  • Fix Python debugger crash in VS Code Extension. Closes [#350].

2.13.0 - Sep 07, 2022

Added

  • Release arm64 agent image.

Fixed

  • Use selected namespace in IntelliJ plugin instead of always using default namespace.

2.12.1 - Sep 06, 2022

Fixed

  • Fix bug where VS Code extension would crash on startup due to new configuration values not being the correct type.
  • Unset DYLD_INSERT_LIBRARIES/LD_PRELOAD when creating the agent. Closes [#330].
  • Fix NullPointerException in IntelliJ Extension. Closes [#335].
  • FIx dylib/so paths for the IntelliJ Extension. Closes [#337].

2.12.0 - Sep 06, 2022

Added

  • Add more configuration values to the VS Code extension.
  • Warning when using remote tcp without remote DNS (can cause ipv6/v4 issues). Closes #327

Fixed

  • VS Code needed restart to apply kubectl config/context change. Closes 316.
  • Fixed DNS feature causing crash on macOS on invalid DNS name due to mismatch of return codes. #321.
  • Fixed DNS feature not using impersonated container namespace, resulting with incorrect resolved DNS names.
  • mirrord-agent: Use IndexAllocator to properly generate ConnectionIds for the tcp outgoing feature.
  • tests: Fix outgoing and DNS tests that were passing invalid flags to mirrord.
  • Go Hooks - use global ENABLED_FILE_OPS
  • Support macOS with apple chip in the IntelliJ plugin. Closes #337.

New Contributors

2.11.0 - Sep 01, 2022

Added

  • New feature: mirrord now supports TCP traffic stealing instead of mirroring. You can enable it by passing --tcp-steal flag to cli.

Fixed

  • mirrord-layer: Go environment variables crash - run Go env setup in a different stack (should fix #292)

Changed

  • mirrord-layer: Add #![feature(let_chains)] to lib.rs to support new compiler version.

2.10.1 - Aug 30, 2022

Fixed

  • CI:Release - Fix typo that broke the build

2.10.0 - Aug 30, 2022

Added

  • New feature, tcp outgoing traffic. It's now possible to make requests to a remote host from the staging environment context. You can enable this feature setting the MIRRORD_TCP_OUTGOING variable to true, or using the -o option in mirrord-cli.
  • mirrord-cli add login command for logging in to metalbear-cloud
  • CI:Release - Provide zip and sha256 sums

Fixed

  • Environment variables feature on Golang programs. Issue #292 closed in #299

2.9.1 - Aug 28, 2022

Fixed

  • CI - set typescript version at 4.7.4 to fix broken release action

2.9.0 - Aug 28, 2022

Added

  • Support for Golang fileops
  • IntelliJ Extension for mirrord

Changed

  • mirrord-layer: Added common Result type to to reduce boilerplate, removed dependency of anyhow crate.
  • mirrord-layer: Split LayerError into LayerError and HookError to distinguish between errors that can be handled by the layer and errors that can be handled by the hook. (no more requiring libc errno for each error!). Closes #247

2.8.1 - Aug 22, 2022

Fixed

  • CI - remove usage of ubuntu-18.04 machines (deprecated)

2.8.0 - Aug 22, 2022

Added

  • E2E - add basic env tests for bash scripts

Fixed

  • mirrord-agent - Update pcap library, hopefully will fix dropped packets (syn sometimes missed in e2e).
  • mirrord-agent/layer - Sometimes layer tries to connect to agent before it finsihed loading, even though pod is running. Added watching the log stream for a "ready" log message before attempting to connect.

Changed

  • E2E - describe all pods on failure and add file name to print of logs.
  • E2E - print timestamp of stdout/stderr of TestProcess.
  • E2E - Don't delete pod/service on failure, instead leave them for debugging.
  • mirrord-agent - Don't use tokio::spawn for spawning sniffer (or any other namespace changing task) to avoid namespace-clashing/undefined behavior. Possibly fixing bugs.
  • Change the version check on the VS Code extension to happen when mirrord is enabled rather than when the IDE starts up.

2.7.0 - Aug 18, 2022

Added

  • mirrord-layer: You can now pass MIRRORD_AGENT_COMMUNICATION_TIMEOUT as environment variable to control agent timeout.
  • Expand file system operations with access and faccessat hooks for absolute paths

Fixed

  • Ephemeral Containers didn't wait for the right condition, leading to timeouts in many cases.
  • mirrord-layer: Wait for the correct condition in job creation, resolving startup/timeout issues.
  • mirrord-layer: Add a sleep on closing local socket after receiving close to let local application respond before closing.
  • mirrord-layer: Fix DNS issue where ai_addr would not live long enough (breaking the remote DNS feature).

Changed

  • Removed unused dependencies from mirrord-layer/Cargo.toml. (Closes #220)
  • reduce e2e flakiness (add message sent on tcp listen subscription, wait for that message)
  • reduce e2e flakiness - increase timeout time
  • mirrord-layer - increase agent creation timeout (to reduce e2e flakiness on macOS)
  • E2E - Don't do file stuff on http traffic to reduce flakiness (doesn't add any coverage value..)
  • mirrord-layer - Change tcp mirror tunnel select to be biased so it flushes all data before closing it (better testing, reduces e2e flakiness)
  • E2E - unify resolve_node_host for linux and macOS with support for wsl provided Docker & Kubernetes
  • E2E - add trace for tests to have paramaterized arguments printed
  • mirrord-agent - add debug print of args to identify runs
  • E2E - remove double --extract-path parameter in tests
  • E2E - macOS colima start with 3 cores and 8GB of RAM.
  • E2E - Increase agent communication timeout to reduce flakiness.
  • mirrord-layer - add DetourGuard to prevent unwanted calls to detours from our code.
  • mirrord-layer - extract reused detours to seperate logic functions
  • E2E - macOS run only sanity http mirror traffic with Python

New Contributors

2.6.0 - Aug 03, 2022

Added

  • Add a flag for the agent, --ephemeral-container, to correctly refer to the filesystem i.e. refer to root path as /proc/1/root when the flag is on, otherwise /.

Changed

  • Assign a random port number instead of 61337. (Reason: A forking process creates multiple agents sending traffic on the same port, causing addrinuse error.)
  • mirrord-layer/socket now uses socket2::SockAddr to comply with Rust's new IP format.

Fixed

  • Fix filesystem tests to only run if the default path exists.
  • Fix extension not running due to the node_modules directory not being packaged.

2.5.0 - Jul 20, 2022

Added

  • New feature, remote DNS resolving. It is now possible to use the remote's addrinfo by setting the MIRRORD_REMOTE_DNS variable to true, or using the -d option in mirrord-cli.
  • New feature, Ephemeral Containers. Use Kubernetes beta feature Ephemeral Containers to mirror traffic with the --ephemeral-container flag.
  • E2E tests on macos for Golang using the Gin framework.

Changed

  • Refactored mirrord-layer/socket into a module structure similar to mirrord-layer/file.
  • Refactored the error part of the many Result<Response, ResponseError>.
  • Refactored file related functions, created FileHandler and improved structure.
  • Refactored error handling in mirrord-layer.
  • E2E: Collect minikube logs and fix collecting container logs
  • E2E: macOS use colima instead of minikube.
  • Refactored mirrord-layer/lib.rs - no more passing many arguments! :)

Fixed

  • Handle unwraps in fileops to gracefully exit and enable python fileops tests.
  • Changed addrinfo to VecDeque - fixes a potential bug (loss of order)

2.4.1 - Jul 10, 2022

Added

  • mirrord-cli exec subcommand accepts --extract-path argument to set the directory to extract the library to. Used for tests mainly.
  • mirrord-layer provides MIRRORD_IMPERSONATED_CONTAINER_NAME environment variable to specify container name to impersonate. mirrord-cli accepts argument to set variable.
  • vscode-ext provides quick-select for setting MIRRORD_IMPERSONATED_CONTAINER_NAME

Changed

  • Refactor e2e, enable only Node HTTP mirroring test.
  • E2E: add macOS to E2E, support using minikube by env var.
  • E2E: Skip loading to docker before loading to minikube (load directly to minikube..)
  • layer: Environment variables now load before process starts, no more race conditions.

Fixed

  • Support connections that start with tcp flags in addition to Syn (on macOS CI we saw CWR + NS)
  • fcntl error on macOS #184 by a workaround.

2.4.0 - Jul 10, 2022

Added

  • mirrord-cli exec subcommand accepts --extract-path argument to set the directory to extract the library to. Used for tests mainly.
  • mirrord-layer provides MIRRORD_IMPERSONATED_CONTAINER_NAME environment variable to specify container name to impersonate. mirrord-cli accepts argument to set variable.
  • vscode-ext provides quick-select for setting MIRRORD_IMPERSONATED_CONTAINER_NAME

Changed

  • Refactor e2e, enable only Node HTTP mirroring test.
  • E2E: add macOS to E2E, support using minikube by env var.
  • E2E: Skip loading to docker before loading to minikube (load directly to minikube..)
  • layer: Environment variables now load before process starts, no more race conditions.

Fixed

  • Support connections that start with tcp flags in addition to Syn (on macOS CI we saw CWR + NS)
  • fcntl error on macOS #184 by a workaround.

2.3.1 - Jun 30, 2022

Changed

  • Refactor(agent) - change FileManager to be per peer, thus removing the need of it being in a different task, moving the handling to the peer logic, change structure of peer handling to a struct.
  • Don't fail environment variable request if none exists.
  • E2E: Don't assert jobs and pods length, to allow better debugging and less flakiness.
  • Refactor(agent) - Main loop doesn't pass messages around but instead spawned peers interact directly with tcp sniffer. Renamed Peer -> Client and ClientID.
  • Add context to agent/job creation errors (Fixes #112)
  • Add context to stream creation error (Fixes #110)
  • Change E2E to use real app, closes #149

2.3.0 - Jun 21, 2022

What's Changed

Full Changelog: https://github.com/metalbear-co/mirrord/compare/2.2.1...2.3.0

2.2.1 - Jun 12, 2022

What's Changed

New Contributors

Full Changelog: https://github.com/metalbear-co/mirrord/compare/2.2.0...2.2.1

2.2.0 - Jun 09, 2022

What's Changed

New Contributors

Full Changelog: https://github.com/metalbear-co/mirrord/compare/2.1.0...2.2.0

2.1.0 - Jun 03, 2022

What's Changed

Full Changelog: https://github.com/metalbear-co/mirrord/compare/2.0.4...2.1.0

2.0.4 - May 26, 2022

2.0.0 (or 2.0.4, because of VSCode..)

Complete refactor and re-write of everything.

  • The CLI/VSCode extension now use mirrord-layer which loads into debugged process using LD_PRELOAD/DYLD_INSERT_LIBRARIES. It hooks some of the syscalls in order to proxy incoming traffic into the process as if it was running in the remote pod.
  • Mono repo

Information - Updated Sep 17, 2022

Stars: 1.5K
Forks: 47
Issues: 61

Rust/Actix Example

REST server using the Rust language to give you an idea of how it all works

Rust/Actix Example

Kanidm is an identity management platform written in rust

We also publish limited code of conduct

Kanidm is an identity management platform written in rust

msgflo-rust: Rust participant support for MsgFlo

Flowhub visual programming IDE

msgflo-rust: Rust participant support for MsgFlo

Bitcoin Mining Pool Identification

This Rust crate implements a new PoolIdentification trait on rust-bitcoin's

Bitcoin Mining Pool Identification

A cryptographic framework for building secure messaging protocols

(Optional) An IDE that supports Rust autocompletion

A cryptographic framework for building secure messaging protocols

workload-identity-is-up Rust

The GKE metadata server needs a few seconds before it can start accepting requests on a newly created Pod

workload-identity-is-up Rust

Host Identity Protocol for bare-metal systems, using Rust

I've been evaluating TLS replacements in constrained environments for a while now

Host Identity Protocol for bare-metal systems, using Rust

A Rust utility library for some Lenovo IdeaPad specific functionality

This crate calls raw ACPI methods, which on the best case scenario when called on unsupported systems results in

A Rust utility library for some Lenovo IdeaPad specific functionality

const_cge: Neural Network Compiler

const_cge performs a symbolic evaluation of your neural network at compile time, producing efficient rust code with identical behavior

const_cge: Neural Network Compiler
Facebook Instagram Twitter GitHub Dribbble
Privacy