diff --git a/.cargo/config.toml b/.cargo/config.toml index 318eb3d..09842cd 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,7 +1,28 @@ +[target.aarch64-apple-darwin] +linker = "rust-lld" +rustflags = ["-C", "target-feature=+crt-static"] + +[target.aarch64-unknown-linux-musl] +linker = "rust-lld" +rustflags = ["-C", "target-feature=+crt-static"] + +# apt install build-essential libc6-armhf-cross libc6-dev-armhf-cross gcc-arm-linux-gnueabihf [target.armv7-unknown-linux-gnueabihf] linker = "arm-linux-gnueabihf-gcc" rustflags = ["-C", "target-feature=+crt-static"] +[target.armv7-unknown-linux-musleabihf] +linker = "rust-lld" +rustflags = ["-C", "target-feature=+crt-static"] + +[target.x86_64-apple-darwin] +linker = "rust-lld" +rustflags = ["-C", "target-feature=+crt-static"] + +[target.x86_64-unknown-linux-musl] +linker = "rust-lld" +rustflags = ["-C", "target-feature=+crt-static"] + # optimizations to reduce the binary size [profile.release] strip = true diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index cc875a2..e9388f3 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -56,18 +56,13 @@ jobs: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: - targets: armv7-unknown-linux-gnueabihf - - name: Install cross-compilation dependencies - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: build-essential libc6-armhf-cross libc6-dev-armhf-cross gcc-arm-linux-gnueabihf - version: 1.0 + targets: armv7-unknown-linux-musleabihf - name: Build rootshell (arm32) - run: cargo build --bin rootshell --target armv7-unknown-linux-gnueabihf --release + run: cargo build --bin rootshell --target armv7-unknown-linux-musleabihf --release - uses: actions/upload-artifact@v4 with: name: rootshell - path: target/armv7-unknown-linux-gnueabihf/release/rootshell + path: target/armv7-unknown-linux-musleabihf/release/rootshell if-no-files-found: error build_rayhunter: strategy: @@ -80,23 +75,18 @@ jobs: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: - targets: armv7-unknown-linux-gnueabihf - - name: Install cross-compilation dependencies - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: build-essential libc6-armhf-cross libc6-dev-armhf-cross gcc-arm-linux-gnueabihf - version: 1.0 + targets: armv7-unknown-linux-musleabihf - name: Build rayhunter-daemon (arm32) run: | pushd bin/web npm install npm run build popd - cargo build --bin rayhunter-daemon --target armv7-unknown-linux-gnueabihf --release --no-default-features --features ${{ matrix.device.name }} + cargo build --bin rayhunter-daemon --target armv7-unknown-linux-musleabihf --release --no-default-features --features ${{ matrix.device.name }} - uses: actions/upload-artifact@v4 with: name: rayhunter-daemon-${{ matrix.device.name }} - path: target/armv7-unknown-linux-gnueabihf/release/rayhunter-daemon + path: target/armv7-unknown-linux-musleabihf/release/rayhunter-daemon if-no-files-found: error build_release_zip: needs: diff --git a/.github/workflows/check-and-test.yml b/.github/workflows/check-and-test.yml index 0e64986..a00a807 100644 --- a/.github/workflows/check-and-test.yml +++ b/.github/workflows/check-and-test.yml @@ -34,6 +34,8 @@ jobs: npm run build popd cargo test --verbose --no-default-features --features=${{ matrix.device.name }} + - name: Run clippy + run: cargo clippy --verbose --no-default-features --features=${{ matrix.device.name }} windows_serial_check_and_test: runs-on: windows-latest diff --git a/Cargo.lock b/Cargo.lock index b52f96c..9d67f4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -365,7 +365,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.0", + "strsim", ] [[package]] @@ -450,9 +450,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.14.4" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -460,51 +460,53 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.14.4" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 1.0.109", + "strsim", + "syn 2.0.50", ] [[package]] name = "darling_macro" -version = "0.14.4" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 1.0.109", + "syn 2.0.50", ] [[package]] name = "deku" -version = "0.16.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819b87cc7a05b3abe3fc38e59b3980a5fd3162f25a247116441a9171d3e84481" +checksum = "a9711031e209dc1306d66985363b4397d4c7b911597580340b93c9729b55f6eb" dependencies = [ "bitvec", "deku_derive", "log", + "no_std_io2", + "rustversion", ] [[package]] name = "deku_derive" -version = "0.16.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2ca12572239215a352a74ad7c776d7e8a914f8a23511c6cbedddd887e5009e" +checksum = "58cb0719583cbe4e81fb40434ace2f0d22ccc3e39a74bb3796c22b451b4f139d" dependencies = [ "darling", "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.50", ] [[package]] @@ -717,6 +719,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "heck" version = "0.4.1" @@ -882,12 +890,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.2", ] [[package]] @@ -956,9 +964,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "mach2" @@ -1039,6 +1047,15 @@ dependencies = [ "libc", ] +[[package]] +name = "no_std_io2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3564ce7035b1e4778d8cb6cacebb5d766b5e8fe5a75b9e441e33fb61a872c6" +dependencies = [ + "memchr", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -1205,19 +1222,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -1352,9 +1368,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" @@ -1411,9 +1427,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -1493,15 +1509,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strsim" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" @@ -1684,7 +1694,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "hashbrown", + "hashbrown 0.14.3", "pin-project-lite", "tokio", ] @@ -1698,40 +1708,29 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.6", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.2", + "winnow", ] [[package]] @@ -2071,18 +2070,9 @@ checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" [[package]] name = "winnow" -version = "0.5.40" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" dependencies = [ "memchr", ] diff --git a/README.md b/README.md index c3e7536..ce5ef2d 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,17 @@ Rayhunter is an IMSI Catcher Catcher for the Orbic mobile hotspot. ## The Hardware -Rayhunter has been built and tested for the Orbic RC400L mobile hotspot. It may work on other Orbics and other -Linux/Qualcom devices, but this is the only one we have tested on. -You can buy the orbic [using bezos bucks](https://www.amazon.com/Orbic-Verizon-Hotspot-Connect-Enabled/dp/B08N3CHC4Y), -or on [eBay](https://www.ebay.com/sch/i.html?_nkw=orbic+rc400l). +Rayhunter has been built and tested for the Orbic RC400L mobile hotspot. It may +work on other Orbics and other Linux/Qualcom devices, but this is the only one +we have tested on. You can buy the orbic [using bezos +bucks](https://www.amazon.com/Orbic-Verizon-Hotspot-Connect-Enabled/dp/B08N3CHC4Y), +or on [eBay](https://www.ebay.com/sch/i.html?_nkw=orbic+rc400l). Please ensure +that the [Orbic works in your country](#orbic) before buying. ## Setup (macOS, Linux) 1. Download the latest `release.tar` from the [Rayhunter releases page](https://github.com/EFForg/rayhunter/releases) -2. Unzip the `release.tar`. Open the terminal and navigate to the folder +2. Decompress the `release.tar` archive. Open the terminal and navigate to the folder ```bash mkdir ~/Downloads/release @@ -84,18 +86,20 @@ If you've received a Rayhunter warning and would like to help us with our resear Please note that this file may contain sensitive information such as your IMSI and the unique IDs of cell towers you were near which could be used to ascertain your location at the time. -### Does Rayhunter work outside of the US? + -**Probably**. Some Rayhunter users have reported successfully using it in other countries with unlocked devices and SIM cards from local telcos. We can't guarantee whether or not it will work for you though. +### Does Rayhunter work outside of the US, or on any other devices besides the Orbic RC400L? + +**Maybe**. Rayhunter currently only supports the Orbic RC400L, which itself only works in the US and some other countries. Please check whether the Orbic RC400L supports the right frequency bands for your purpose before buying. + +We have not tested Rayhunter on any other hardware but we would love to expand the supported platforms. We will consider giving official support to any hardware platform that can be bought for around $20-30USD. The Rayhunter daemon should theoretically work on any Linux/Android device that has a qualcomm chip with a `/dev/diag` interface and root access, though our installer script has only been tested with an Orbic. If you get it working on another device, please let us know! + +There is work underway to support [TP-Link M7350](https://github.com/EFForg/rayhunter/issues/186) to support more frequency bands and therefore support most of Europe. ### Should I get a locked or unlocked orbic device? What is the difference? If you want to use a non-Verizon SIM card you will probably need an unlocked device. But it's not clear how locked the locked devices are nor how to unlock them, we welcome any experimentation and information regarding the use of unlocked devices. -### Does Rayhunter work on any other devices besides the Orbic RC400L? - -**Maybe**. We have not tested Rayhunter on any other hardware but we would love to expand the supported platforms. We will consider giving official support to any hardware platform that can be bought for around $20-30USD. The Rayhunter daemon should theoretically work on any Linux/Android device that has a qualcomm chip with a `/dev/diag` interface and root access, though our installer script has only been tested with an Orbic. If you get it working on another device, please let us know! - ### How do I delete capture files from the Rayhunter device? You can get a shell on the device by inputting `adb shell` to a terminal with the device connected, you can check if it is detected with `adb devices`. @@ -112,15 +116,27 @@ Building Rayhunter from source, either for development or because the install sc * [linux](https://askubuntu.com/questions/652936/adding-android-sdk-platform-tools-to-path-downloaded-from-umake) * [macOS](https://www.repeato.app/setting-up-adb-on-macos-a-step-by-step-guide/) * [Windows](https://medium.com/@yadav-ajay/a-step-by-step-guide-to-setting-up-adb-path-on-windows-0b833faebf18) +* Install `curl` on your computer to run the install scripts. It is not needed to build binaries. -### If you're on x86 linux +### Install Rust targets -Install Rust the usual way and then install cross compiling dependences: +[Install Rust the usual way](https://www.rust-lang.org/tools/install). Then, -```bash -sudo apt install curl build-essential libc6-armhf-cross libc6-dev-armhf-cross gcc-arm-linux-gnueabihf -rustup target add x86_64-unknown-linux-gnu -rustup target add armv7-unknown-linux-gnueabihf +- install the cross-compilation target for the device rayhunter will run on: +```sh +rustup target add armv7-unknown-linux-musleabihf +``` + +- install the statically compiled target for your host machine to build the binary installer [`serial`](./serial). +```sh +# check which toolchain you have installed by default with +rustup show +# now install the correct variant for your host platform, one of: +rustup target add x86_64-unknown-linux-musl +rustup target add aarch64-unknown-linux-musl +rustup target add aarch64-apple-darwin +rustup target add x86_64-apple-darwin +rustup target add x86_64-pc-windows-gnu ``` Now you can root your device and install Rayhunter by running `./tools/install-dev.sh` diff --git a/lib/Cargo.toml b/lib/Cargo.toml index ba6af3f..1bb19da 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -18,7 +18,7 @@ tplink = [] bytes = "1.5.0" chrono = "0.4.31" crc = "3.0.1" -deku = { version = "0.16.0", features = ["logging"] } +deku = { version = "0.18.0", features = ["logging"] } env_logger = "0.10.1" libc = "0.2.150" log = "0.4.20" diff --git a/lib/src/diag.rs b/lib/src/diag.rs index baa765e..c50ac54 100644 --- a/lib/src/diag.rs +++ b/lib/src/diag.rs @@ -25,14 +25,14 @@ pub struct RequestContainer { } #[derive(Debug, Clone, PartialEq, DekuWrite)] -#[deku(type = "u32")] +#[deku(id_type = "u32")] pub enum Request { #[deku(id = "115")] LogConfig(LogConfigRequest), } #[derive(Debug, Clone, PartialEq, DekuWrite)] -#[deku(type = "u32", endian = "little")] +#[deku(id_type = "u32", endian = "little")] pub enum LogConfigRequest { #[deku(id = "1")] RetrieveIdRanges, @@ -46,7 +46,7 @@ pub enum LogConfigRequest { } #[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)] -#[deku(type = "u32", endian = "little")] +#[deku(id_type = "u32", endian = "little")] pub enum DataType { #[deku(id = "32")] UserSpace, @@ -121,7 +121,7 @@ pub struct HdlcEncapsulatedMessage { } #[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)] -#[deku(type = "u8")] +#[deku(id_type = "u8")] pub enum Message { #[deku(id = "16")] Log { diff --git a/lib/src/diag_device.rs b/lib/src/diag_device.rs index 7dd68f0..8d4557a 100644 --- a/lib/src/diag_device.rs +++ b/lib/src/diag_device.rs @@ -59,18 +59,22 @@ pub const LOG_CODES_FOR_RAW_PACKET_LOGGING: [u32; 11] = [ const BUFFER_LEN: usize = 1024 * 1024 * 10; const MEMORY_DEVICE_MODE: u32 = 2; -#[cfg(target_arch = "arm")] +#[cfg(target_env = "musl")] +const DIAG_IOCTL_REMOTE_DEV: i32 = 32; +#[cfg(all(not(target_env = "musl"), target_arch = "arm"))] const DIAG_IOCTL_REMOTE_DEV: u32 = 32; -#[cfg(target_arch = "x86_64")] +#[cfg(all(not(target_env = "musl"), target_arch = "x86_64"))] const DIAG_IOCTL_REMOTE_DEV: u64 = 32; -#[cfg(target_arch = "aarch64")] +#[cfg(all(not(target_env = "musl"), target_arch = "aarch64"))] const DIAG_IOCTL_REMOTE_DEV: u64 = 32; -#[cfg(target_arch = "arm")] +#[cfg(target_env = "musl")] +const DIAG_IOCTL_SWITCH_LOGGING: i32 = 7; +#[cfg(all(not(target_env = "musl"), target_arch = "arm"))] const DIAG_IOCTL_SWITCH_LOGGING: u32 = 7; -#[cfg(target_arch = "x86_64")] +#[cfg(all(not(target_env = "musl"), target_arch = "x86_64"))] const DIAG_IOCTL_SWITCH_LOGGING: u64 = 7; -#[cfg(target_arch = "aarch64")] +#[cfg(all(not(target_env = "musl"), target_arch = "aarch64"))] const DIAG_IOCTL_SWITCH_LOGGING: u64 = 7; pub struct DiagDevice { @@ -126,8 +130,8 @@ impl DiagDevice { ); match MessagesContainer::from_bytes((&self.read_buf[0..bytes_read], 0)) { - Ok((_, container)) => return Ok(container), - Err(err) => return Err(DiagDeviceError::ParseMessagesContainerError(err)), + Ok((_, container)) => Ok(container), + Err(err) => Err(DiagDeviceError::ParseMessagesContainerError(err)), } } diff --git a/make.sh b/make.sh index 3012844..7b4e1e5 100755 --- a/make.sh +++ b/make.sh @@ -2,8 +2,8 @@ pushd bin/web npm run build popd -cargo build --release --target="armv7-unknown-linux-gnueabihf" #--features debug +cargo build --release --target="armv7-unknown-linux-musleabihf" #--features debug adb shell '/bin/rootshell -c "/etc/init.d/rayhunter_daemon stop"' -adb push target/armv7-unknown-linux-gnueabihf/release/rayhunter-daemon /data/rayhunter/rayhunter-daemon +adb push target/armv7-unknown-linux-musleabihf/release/rayhunter-daemon /data/rayhunter/rayhunter-daemon echo "rebooting the device..." adb shell '/bin/rootshell -c "reboot"' diff --git a/tools/devenv.dockerfile b/tools/devenv.dockerfile index e5dfaa3..78c430a 100644 --- a/tools/devenv.dockerfile +++ b/tools/devenv.dockerfile @@ -1,5 +1,3 @@ FROM rust:1.86-bullseye -RUN apt-get update -RUN apt-get install -y build-essential libc6-armhf-cross libc6-dev-armhf-cross gcc-arm-linux-gnueabihf -RUN rustup target add armv7-unknown-linux-gnueabihf +RUN rustup target add armv7-unknown-linux-musleabihf diff --git a/tools/run-docker-devenv b/tools/run-docker-devenv index 954fd47..bfec3d9 100755 --- a/tools/run-docker-devenv +++ b/tools/run-docker-devenv @@ -9,9 +9,9 @@ # ./tools/run-docker-devenv # # Inside the shell: -# cargo build --bin rayhunter-daemon --target armv7-unknown-linux-gnueabihf --release +# cargo build --bin rayhunter-daemon --target armv7-unknown-linux-musleabihf --release # -# Your output binary is in ./target/armv7-unknown-linux-gnueabihf/release/rayhunter-daemon +# Your output binary is in ./target/armv7-unknown-linux-musleabihf/release/rayhunter-daemon docker build -t rayhunter-devenv -f tools/devenv.dockerfile . exec docker run --user $UID:$GID -v ./:/workdir -w /workdir -it rayhunter-devenv "$@"