├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .gitmodules ├── README.md ├── build ├── firmware └── 3.4.2_0062 │ └── tf_recovery.img ├── images ├── MJSXJ02CM.jpg └── itshappening.gif └── sdcard ├── hacks ├── framegrabber │ └── bin │ │ ├── .build │ │ └── framegrabber ├── motor-control │ ├── bin │ │ └── .build │ └── meta │ │ └── service │ │ ├── .enable │ │ └── motor-control ├── onvif-server │ ├── bin │ │ └── .build │ └── meta │ │ └── service │ │ ├── .enable │ │ └── onvif-server ├── rtsp-server │ ├── bin │ │ └── .build │ ├── config │ │ └── config.json │ └── meta │ │ ├── config │ │ ├── config.json │ │ └── config.json.template │ │ └── service │ │ ├── framegrabber-mainstream │ │ ├── framegrabber-substream │ │ └── rtsp-server ├── runit │ └── bin │ │ └── .build ├── sftp-server │ └── bin │ │ └── .build ├── ssh-server │ ├── bin │ │ └── .build │ ├── config │ │ └── config.json │ └── meta │ │ ├── config │ │ ├── config.json │ │ └── config.json.template │ │ └── service │ │ └── ssh-server ├── web-config │ ├── bin │ │ └── .build │ ├── meta │ │ └── service │ │ │ ├── .enable │ │ │ └── web-config │ └── www │ │ └── .build └── websocket-stream-server │ ├── bin │ └── .build │ └── meta │ ├── config │ └── config.json │ └── service │ ├── framegrabber-mainstream │ ├── framegrabber-substream │ └── websocket-stream-server └── manu_test ├── configure_services.sh ├── disable_factory_mode.sh ├── entrypoint.sh ├── manu.bin ├── manu.sh └── md5sum.dat /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - '*' 7 | 8 | env: 9 | sourceBranch: ${{ github.ref }} 10 | isNightly: ${{ contains(github.ref, 'dev') }} 11 | isFinalRelease: ${{ contains(github.ref, 'master') }} 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-18.04 16 | steps: 17 | - name: Check out source code 18 | uses: actions/checkout@v2 19 | 20 | # - name: Build 21 | # uses: dawidd6/action-ansible-playbook@v2 22 | # with: 23 | # playbook: build.yml 24 | # directory: ./ 25 | # options: | 26 | # --extra-vars branch=${{ github.ref }} 27 | 28 | - name: Build latest 29 | if: ${{ env.isNightly == 'true' }} 30 | env: 31 | THAT_HASH: ${{ secrets.THAT_HASH }} 32 | run: chmod +x build && ./build dev 33 | 34 | - name: Build stable 35 | if: ${{ env.isFinalRelease == 'true' }} 36 | env: 37 | THAT_HASH: ${{ secrets.THAT_HASH }} 38 | run: chmod +x build && ./build final 39 | 40 | - name: Release latest 41 | uses: marvinpinto/action-automatic-releases@latest 42 | if: env.isNightly == 'true' 43 | with: 44 | automatic_release_tag: latest-rc 45 | files: dist/sdcard.zip 46 | prerelease: true 47 | repo_token: "${{ secrets.GITHUB_TOKEN }}" 48 | title: latest-rc 49 | 50 | - name: Release stable 51 | uses: marvinpinto/action-automatic-releases@latest 52 | if: env.isFinalRelease == 'true' 53 | with: 54 | automatic_release_tag: stable 55 | files: dist/sdcard.zip 56 | prerelease: false 57 | repo_token: "${{ secrets.GITHUB_TOKEN }}" 58 | title: stable 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.ini 2 | *.xcf 3 | dist -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "submodules/x360h1080p-rtsp-server"] 2 | path = submodules/x360h1080p-rtsp-server 3 | url = https://github.com/telmomarques/x360h1080p-rtsp-server.git 4 | [submodule "submodules/mija-framegrabber"] 5 | path = submodules/mija-framegrabber 6 | url = https://github.com/crckmc/mija-framegrabber.git 7 | [submodule "submodules/x360h1080p-websocket-stream-server"] 8 | path = submodules/x360h1080p-websocket-stream-server 9 | url = https://github.com/telmomarques/x360h1080p-websocket-stream-server.git 10 | [submodule "submodules/x360h1080p-web-config-client"] 11 | path = submodules/x360h1080p-web-config-client 12 | url = https://github.com/telmomarques/x360h1080p-web-config-client 13 | [submodule "submodules/x360h1080p-web-config-server"] 14 | path = submodules/x360h1080p-web-config-server 15 | url = https://github.com/telmomarques/x360h1080p-web-config-server 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![discord](https://img.shields.io/discord/713125176971231233?label=discord)](http://discord.gg/qggupzu) 2 | 3 | Stable: ![CI](https://github.com/cmiguelcabral/mjsxj05cm-hacks/workflows/CI/badge.svg?branch=master) 4 | 5 | Latest: ![CI](https://github.com/cmiguelcabral/mjsxj05cm-hacks/workflows/CI/badge.svg?tag=latest-rc) 6 | 7 | # Mi Camera Hacks (MJSXJ05CM) 8 | 9 | - [Supported Cameras](#supported-cameras) 10 | - [Features](#features) 11 | - [Install Instructions](#install-instructions) 12 | - [FAQ](#faq) 13 | - [These Guys are Awesome](#these-guys-are-awesome) 14 | 15 | 16 | Keep calm and follow the procedure! 17 | 18 | Seriously now: it's still in beta, please read everything before continuing. 19 | 20 | ## Supported Cameras 21 | For now this is it, I'm working on supporting more cameras. 22 | 23 | Model Name(s) | Picture 24 | --- | --- 25 | MJSXJ05CM|![MJSXJ05CM](images/MJSXJ02CM.jpg) 26 | 27 | 28 | ## Features 29 | Feature | Latest | Stable 30 | --- | --- | --- 31 | Motor Control | ![C/C++ CI](https://github.com/cmiguelcabral/mjsxj05cm-motor-control/workflows/C/C++%20CI/badge.svg?tag=latest-rc) | ![C/C++ CI](https://github.com/cmiguelcabral/mjsxj05cm-motor-control/workflows/C/C++%20CI/badge.svg?branch=master) 32 | Onvif Server | ![C/C++ CI](https://github.com/cmiguelcabral/mjsxj05cm-onvif_srvd/workflows/C/C++%20CI/badge.svg?tag=latest-rc) | ![C/C++ CI](https://github.com/cmiguelcabral/mjsxj05cm-onvif_srvd/workflows/C/C++%20CI/badge.svg?branch=master) 33 | RTSP Server | ![C/C++ CI](https://github.com/cmiguelcabral/mjsxj05cm-rtsp-server/workflows/C/C++%20CI/badge.svg?tag=latest-rc)| ![C/C++ CI](https://github.com/cmiguelcabral/mjsxj05cm-rtsp-server/workflows/C/C++%20CI/badge.svg?branch=master) 34 | Runit | ![C/C++ CI](https://github.com/telmomarques/runit/workflows/C/C++%20CI/badge.svg?tag=latest-rc) | ![C/C++ CI](https://github.com/telmomarques/runit/workflows/C/C++%20CI/badge.svg?branch=master) 35 | SFTP Server | ![C/C++ CI](https://github.com/telmomarques/openssh-portable/workflows/C/C++%20CI/badge.svg?tag=latest-rc) | ![C/C++ CI](https://github.com/telmomarques/openssh-portable/workflows/C/C++%20CI/badge.svg?branch=master) 36 | SSH Server |![C/C++ CI](https://github.com/telmomarques/dropbear/workflows/C/C++%20CI/badge.svg?tag=latest-rc)|![C/C++ CI](https://github.com/telmomarques/dropbear/workflows/C/C++%20CI/badge.svg?branch=master) 37 | Web Configuration Client | ![Node.js CI](https://github.com/cmiguelcabral/mjsxj05cm-web-client/workflows/Node.js%20CI/badge.svg?tag=latest-rc) | ![Node.js CI](https://github.com/cmiguelcabral/mjsxj05cm-web-client/workflows/Node.js%20CI/badge.svg?branch=master) 38 | Web Configuration Server | ![Go](https://github.com/cmiguelcabral/mjsxj05cm-web-server/workflows/Go/badge.svg?tag=latest-rc)| ![Go](https://github.com/cmiguelcabral/mjsxj05cm-web-server/workflows/Go/badge.svg?branch=master) 39 | Websocker Stream Server | ![Go](https://github.com/cmiguelcabral/mjsxj05cm-websocket-stream-server/workflows/Go/badge.svg?tag=latest-rc)| ![Go](https://github.com/cmiguelcabral/mjsxj05cm-websocket-stream-server/workflows/Go/badge.svg?branch=master) 40 | 41 | ## Install Instructions 42 | The hacks exploits a flaw in firmware version 3.4.2_0062, **please read the instructions very carefully!!** 43 | 44 | - First [Check your camera firmware version](#view-camera-firmware-version) 45 | 46 | - If you have firmware version 3.4.2_0062, go to [Install the hacks](#install-the-hacks) 47 | 48 | - If you have another firmware version, go to [Downgrade the Firmware](#downgrade-the-firmware) 49 | 50 | ### View camera firmware version 51 | 1. Configure the camera using the Mi Home app 52 | 2. Open the camera in the app and touch the 3 dots in the upper right corner 53 | 3. Select the option "General Settings", and then "Check for firmware upgrades" 54 | 4. The current firmware version is presented on the screen 55 | 56 | ### Downgrade the Firmware 57 | **You will lose the camera configuration!** 58 | 59 | ⚠️ Please be careful! 60 | 61 | ⚠️ Do not power down the camera while flashing! 62 | 63 | ⚠️ Make sure you understand all the steps before continuing! 64 | 65 | 1. Grab tf_recovery.bin file from [here](https://github.com/telmomarques/xiaomi-360-1080p-hacks/raw/master/firmware/3.4.2_0062/tf_recovery.img). 66 | 2. Put the file in the root of your SD Card (don't change the name!) 67 | 3. Power down the camera and insert the SD Card 68 | 4. Power on the camera and wait, the led will be a solid yellow while the firmware is flashing (this will take several minutes!) 69 | 6. When the camera starts rotating and asking for the QR code, it's done. 70 | 7. Go to ["Install the hacks"](#install-the-hacks) below. 71 | 72 | ### Install the hacks 73 | 1. Configure the camera using the Mi Home app 74 | 2. Download the latest release from [releases](https://github.com/telmomarques/xiaomi-360-1080p-hacks/releases) 75 | 3. Copy the **contents** of "sdcard" folder to the root of your SD Card 76 | 4. Power off the camera and insert the SD Card 77 | 5. Power on the camera 78 | 6. Find the IP address of your camera 79 | 7. Open the web config interface o the camrea on your browser: [http://&1 | grep -c 'HTTP/1.1 200 OK') 10 | if [ $is_200_ok != "1" ]; then 11 | echo "Failed to get ${assetName}" 12 | exit 1 13 | fi 14 | } 15 | 16 | download_from_url() { 17 | local assetName=$1 18 | is_200_ok=$(wget -q --show-progress --server-response ${1} 2>&1 | grep -c 'HTTP/1.1 200 OK') 19 | if [ $is_200_ok != "1" ]; then 20 | echo "Failed to get ${assetName}" 21 | exit 1 22 | fi 23 | } 24 | 25 | process_external_download() { 26 | local url=$1 27 | local filename=$2 28 | 29 | echo Downloading \"${url}\" 30 | 31 | download_from_url ${url} 32 | } 33 | 34 | process_github_release_asset_download() { 35 | local owner=$1 36 | local repository=$2 37 | local assetName=$3 38 | 39 | if [ $releaseType == "dev" ]; then 40 | tagName="latest-rc" 41 | fi 42 | 43 | if [ $releaseType == "final" ]; then 44 | tagName="latest" 45 | fi 46 | 47 | echo Downloading \"${owner}/${repository}@${tagName}/${assetName}\" 48 | 49 | github_download_release_asset ${owner} ${repository} ${tagName} ${assetName} 50 | } 51 | 52 | extract() { 53 | local fileName=${1} 54 | case "$fileName" in 55 | *.zip) 56 | echo Extracting ${fileName} 57 | extract_zip ${fileName} 58 | rm -f ${assetFilename} 59 | ;; 60 | *.tar) 61 | echo Extracting ${fileName} 62 | extract_tar ${fileName} 63 | rm -f ${assetFilename} 64 | ;; 65 | esac 66 | } 67 | 68 | extract_zip() { 69 | unzip -qq ${1} 70 | } 71 | 72 | extract_tar() { 73 | tar -xf ${1} 74 | } 75 | 76 | process_build_file() { 77 | local buildType=$1 78 | local buildFilePath=.build 79 | local source=$(cat ${buildFilePath} | jq -r ".source") 80 | local assetFilename="" 81 | 82 | if [ "${source}" == "external" ]; then 83 | local url=$(cat ${buildFilePath} | jq -r ".url") 84 | assetFilename=$(cat ${buildFilePath} | jq -r ".filename") 85 | process_external_download ${url} ${assetFilename} 86 | 87 | elif [ "${source}" == "github-release-asset" ]; then 88 | local owner=$(cat ${buildFilePath} | jq -r ".owner") 89 | local repository=$(cat ${buildFilePath} | jq -r ".repository") 90 | assetFilename=$(cat ${buildFilePath} | jq -r ".assetName") 91 | process_github_release_asset_download ${owner} ${repository} ${assetFilename} 92 | fi 93 | 94 | rm $buildFilePath 95 | 96 | if [[ ! -z ${assetFilename} ]]; then 97 | extract ${assetFilename} 98 | fi 99 | 100 | if [ -d "uclibc" ]; then 101 | cp uclibc/* . 102 | rm -rf libc uclibc 103 | fi 104 | } 105 | 106 | clean() { 107 | echo "Cleaning..." 108 | rm -rf dist 109 | } 110 | 111 | build() { 112 | echo "Building..." 113 | test -d dist || mkdir dist 114 | cp -r sdcard/* dist/ 115 | shopt -s globstar 116 | for buildFile in dist/**/.build; do 117 | pushd $(dirname ${buildFile}) 118 | process_build_file ${1} 119 | popd 120 | done 121 | } 122 | 123 | package() { 124 | pushd dist 125 | zip -r sdcard.zip * -x hacks/**/libc -x hacks/**/uclibc 126 | popd 127 | } 128 | 129 | main() { 130 | local target=$1 131 | 132 | case ${target} in 133 | clean) 134 | clean 135 | ;; 136 | 137 | dev | rc | final) 138 | releaseType=$1 139 | 140 | clean 141 | build 142 | package 143 | ;; 144 | 145 | *) 146 | echo "Invalid target '${1}'" 147 | ;; 148 | esac 149 | } 150 | 151 | main $1 152 | -------------------------------------------------------------------------------- /firmware/3.4.2_0062/tf_recovery.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmiguelcabral/mjsxj05cm-hacks/5276b315332f3ff400202ea2b383915264f39a48/firmware/3.4.2_0062/tf_recovery.img -------------------------------------------------------------------------------- /images/MJSXJ02CM.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmiguelcabral/mjsxj05cm-hacks/5276b315332f3ff400202ea2b383915264f39a48/images/MJSXJ02CM.jpg -------------------------------------------------------------------------------- /images/itshappening.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmiguelcabral/mjsxj05cm-hacks/5276b315332f3ff400202ea2b383915264f39a48/images/itshappening.gif -------------------------------------------------------------------------------- /sdcard/hacks/framegrabber/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "telmomarques", 4 | "repository": "mija-framegrabber", 5 | "assetName": "framegrabber.zip", 6 | "clean": 7 | [ 8 | "ipc009" 9 | ] 10 | } -------------------------------------------------------------------------------- /sdcard/hacks/framegrabber/bin/framegrabber: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | CAMERA_MODEL=`factory get model | cut -d '.' -f3` 3 | 4 | if [ -z "$CAMERA_MODEL" ]; then 5 | echo "Can't get camera model, exiting." 6 | exit 1 7 | fi 8 | 9 | BINARY_PATH=${CAMERA_MODEL}/framegrabber 10 | 11 | if [ ! -f "$BINARY_PATH" ]; then 12 | echo "Camera model '${CAMERA_MODEL}' not supported, exiting." 13 | exit 1 14 | fi 15 | 16 | cp -f ${BINARY_PATH} /mnt/data/bin 17 | exec /mnt/data/bin/framegrabber "$@" -------------------------------------------------------------------------------- /sdcard/hacks/motor-control/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "cmiguelcabral", 4 | "repository": "mjsxj05cm-motor-control", 5 | "assetName": "motord" 6 | } -------------------------------------------------------------------------------- /sdcard/hacks/motor-control/meta/service/.enable: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmiguelcabral/mjsxj05cm-hacks/5276b315332f3ff400202ea2b383915264f39a48/sdcard/hacks/motor-control/meta/service/.enable -------------------------------------------------------------------------------- /sdcard/hacks/motor-control/meta/service/motor-control: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cd /mnt/sdcard/hacks/motor-control/bin 3 | exec ./motord -------------------------------------------------------------------------------- /sdcard/hacks/onvif-server/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "cmiguelcabral", 4 | "repository": "mjsxj05cm-onvif_srvd", 5 | "assetName": "onvif_srvd" 6 | } -------------------------------------------------------------------------------- /sdcard/hacks/onvif-server/meta/service/.enable: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmiguelcabral/mjsxj05cm-hacks/5276b315332f3ff400202ea2b383915264f39a48/sdcard/hacks/onvif-server/meta/service/.enable -------------------------------------------------------------------------------- /sdcard/hacks/onvif-server/meta/service/onvif-server: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cd /mnt/sdcard/hacks/onvif-server/bin 3 | 4 | source /mnt/data/etc/os-release 5 | 6 | STEPS=5 7 | MOTOR_CONTROL="/mnt/sdcard/hacks/motor-control/bin" 8 | EVENT_FILE="$MOTOR_CONTROL/event" 9 | 10 | LEFT="echo pan forward $STEPS > $EVENT_FILE" 11 | RIGHT="echo pan reverse $STEPS > $EVENT_FILE" 12 | UP="echo tilt forward $STEPS > $EVENT_FILE" 13 | DOWN="echo tilt reverse $STEPS > $EVENT_FILE" 14 | 15 | 16 | IP_ADDR=$(ip -4 addr show wlan0 | grep inet | awk '{print $2}' | cut -d'/' -f1) 17 | while [[ -z $IP_ADDR ]]; do 18 | IP_ADDR=$(ip -4 addr show wlan0 | grep inet | awk '{print $2}' | cut -d'/' -f1) 19 | done 20 | echo $IP_ADDR 21 | 22 | ONVIF_PROFILE_0="--name HD --width 1920 --height 1080 --url rtsp://$IP_ADDR:8554/mainstream --type H264" 23 | ONVID_PROFILE_1="--name SD --width 640 --height 360 --url rtsp://$IP_ADDR:8554/substream --type H264" 24 | echo $ONVIF_PROFILE_0 25 | echo $ONVIF_PROFILE_1 26 | 27 | exec ./onvif_srvd --no_fork --pid_file /var/run/onvif_srvd.pid --model "MJSXJ05CM" --manufacturer "Xiaomi" --ifs wlan0 --port 5000 --scope onvif://www.onvif.org/Profile/S $ONVIF_PROFILE_0 $ONVIF_PROFILE_1 \ 28 | --ptz \ 29 | --move_left "eval $LEFT" \ 30 | --move_right "eval $RIGHT" \ 31 | --move_up "eval $UP" \ 32 | --move_down "eval $DOWN" -------------------------------------------------------------------------------- /sdcard/hacks/rtsp-server/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "cmiguelcabral", 4 | "repository": "mjsxj05cm-rtsp-server", 5 | "assetName": "rtspserver" 6 | } -------------------------------------------------------------------------------- /sdcard/hacks/rtsp-server/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "encodingType": "h265" 3 | } 4 | -------------------------------------------------------------------------------- /sdcard/hacks/rtsp-server/meta/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "enable": false, 3 | "encodingType": "h265" 4 | } -------------------------------------------------------------------------------- /sdcard/hacks/rtsp-server/meta/config/config.json.template: -------------------------------------------------------------------------------- 1 | { 2 | "encodingType": "{{.EncodingType}}" 3 | } 4 | -------------------------------------------------------------------------------- /sdcard/hacks/rtsp-server/meta/service/framegrabber-mainstream: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ETCDIR=/mnt/data/etc/framegrabber/ 4 | RTSP_MAINSTREAM_PIPE="${ETCDIR}rtsp_mainstream" 5 | 6 | mkdir -p $ETCDIR 7 | mkfifo $RTSP_MAINSTREAM_PIPE 8 | 9 | cd /mnt/sdcard/hacks/framegrabber/bin 10 | exec ./framegrabber -f $RTSP_MAINSTREAM_PIPE -c 0 -------------------------------------------------------------------------------- /sdcard/hacks/rtsp-server/meta/service/framegrabber-substream: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ETCDIR=/mnt/data/etc/framegrabber/ 4 | RTSP_SUBSTREAM_PIPE="${ETCDIR}rtsp_substream" 5 | 6 | mkdir -p $ETCDIR 7 | mkfifo $RTSP_SUBSTREAM_PIPE 8 | 9 | cd /mnt/sdcard/hacks/framegrabber/bin 10 | exec ./framegrabber -f $RTSP_SUBSTREAM_PIPE -c 1 -------------------------------------------------------------------------------- /sdcard/hacks/rtsp-server/meta/service/rtsp-server: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cd /mnt/sdcard/hacks/rtsp-server/bin 3 | cp -f rtspserver /mnt/data/bin 4 | exec /mnt/data/bin/rtspserver -c ../config/config.json -m /mnt/data/etc/framegrabber/rtsp_mainstream -s /mnt/data/etc/framegrabber/rtsp_substream 5 | -------------------------------------------------------------------------------- /sdcard/hacks/runit/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "cmiguelcabral", 4 | "repository": "mjsxj05cm-runit", 5 | "assetName": "runit.tar", 6 | "clean": 7 | [ 8 | "*" 9 | ] 10 | } -------------------------------------------------------------------------------- /sdcard/hacks/sftp-server/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "telmomarques", 4 | "repository": "openssh-portable", 5 | "assetName": "sftp-server.tar" 6 | } -------------------------------------------------------------------------------- /sdcard/hacks/ssh-server/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "telmomarques", 4 | "repository": "dropbear", 5 | "assetName": "dropbear.tar" 6 | } -------------------------------------------------------------------------------- /sdcard/hacks/ssh-server/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "users": 3 | [ 4 | ] 5 | } -------------------------------------------------------------------------------- /sdcard/hacks/ssh-server/meta/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "enable": false, 3 | "users": [] 4 | } -------------------------------------------------------------------------------- /sdcard/hacks/ssh-server/meta/config/config.json.template: -------------------------------------------------------------------------------- 1 | { 2 | "users": 3 | [ 4 | {{range $i, $u := .Users}} 5 | {{if $i}}, {{end}} 6 | {"systemUsername": "{{.SystemUsername}}", "username": "{{.Username}}", "password": "{{.Password}}"} 7 | {{end}} 8 | ] 9 | } -------------------------------------------------------------------------------- /sdcard/hacks/ssh-server/meta/service/ssh-server: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | mkdir -p /mnt/data/etc/dropbear 3 | cd /mnt/sdcard/hacks/ssh-server/bin 4 | exec ./dropbear -FERB -------------------------------------------------------------------------------- /sdcard/hacks/web-config/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "cmiguelcabral", 4 | "repository": "mjsxj05cm-web-server", 5 | "assetName": "web-config-server" 6 | } -------------------------------------------------------------------------------- /sdcard/hacks/web-config/meta/service/.enable: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmiguelcabral/mjsxj05cm-hacks/5276b315332f3ff400202ea2b383915264f39a48/sdcard/hacks/web-config/meta/service/.enable -------------------------------------------------------------------------------- /sdcard/hacks/web-config/meta/service/web-config: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cd /mnt/sdcard/hacks/web-config/bin 3 | exec ./web-config-server 4 | -------------------------------------------------------------------------------- /sdcard/hacks/web-config/www/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "cmiguelcabral", 4 | "repository": "mjsxj05cm-web-client", 5 | "assetName": "web-config-client.zip", 6 | "clean": 7 | [ 8 | "*" 9 | ] 10 | } -------------------------------------------------------------------------------- /sdcard/hacks/websocket-stream-server/bin/.build: -------------------------------------------------------------------------------- 1 | { 2 | "source": "github-release-asset", 3 | "owner": "telmomarques", 4 | "repository": "x360h1080p-websocket-stream-server", 5 | "assetName": "websocket-stream-server" 6 | } -------------------------------------------------------------------------------- /sdcard/hacks/websocket-stream-server/meta/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "enable": false 3 | } -------------------------------------------------------------------------------- /sdcard/hacks/websocket-stream-server/meta/service/framegrabber-mainstream: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ETCDIR=/mnt/data/etc/framegrabber/ 4 | WEBSOCKET_MAINSTREAM_PIPE="${ETCDIR}websocket_mainstream" 5 | 6 | mkdir -p $ETCDIR 7 | mkfifo $WEBSOCKET_MAINSTREAM_PIPE 8 | 9 | cd /mnt/sdcard/hacks/framegrabber/bin 10 | exec ./framegrabber -f $WEBSOCKET_MAINSTREAM_PIPE -c 0 -------------------------------------------------------------------------------- /sdcard/hacks/websocket-stream-server/meta/service/framegrabber-substream: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ETCDIR=/mnt/data/etc/framegrabber/ 4 | WEBSOCKET_SUBSTREAM_PIPE="${ETCDIR}websocket_substream" 5 | 6 | mkdir -p $ETCDIR 7 | mkfifo $WEBSOCKET_SUBSTREAM_PIPE 8 | 9 | cd /mnt/sdcard/hacks/framegrabber/bin 10 | exec ./framegrabber -f $WEBSOCKET_SUBSTREAM_PIPE -c 1 -------------------------------------------------------------------------------- /sdcard/hacks/websocket-stream-server/meta/service/websocket-stream-server: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cd /mnt/sdcard/hacks/websocket-stream-server/bin/ 3 | exec ./websocket-stream-server -m=/mnt/data/etc/framegrabber/websocket_mainstream -s=/mnt/data/etc/framegrabber/websocket_substream 4 | -------------------------------------------------------------------------------- /sdcard/manu_test/configure_services.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | HACKS_DIR=/mnt/sdcard/hacks 4 | SERVICES_DIR=/mnt/data/etc/runit 5 | 6 | install_service() { 7 | hackName=$1 8 | serviceDir=${HACKS_DIR}/${hackName}/meta/service 9 | 10 | if [ -d ${serviceDir} ] && [ -f ${serviceDir}/.enable ]; then 11 | cd ${serviceDir} 12 | 13 | for service in ${serviceDir}/* ; do 14 | serviceName=`basename ${service}` 15 | hackServiceDir=${SERVICES_DIR}/${hackName}-${serviceName} 16 | mkdir -p ${hackServiceDir} 17 | cp ${service} ${hackServiceDir}/run 18 | done 19 | fi 20 | } 21 | 22 | install_services() { 23 | rm -rf ${SERVICES_DIR} 24 | 25 | for hack in ${HACKS_DIR}/* ; do 26 | if [ -d ${hack} ]; then 27 | hackName=`basename $hack` 28 | install_service ${hackName} 29 | fi 30 | done; 31 | 32 | export PATH=$PATH:${HACKS_DIR}/runit/bin 33 | runsvdir ${SERVICES_DIR} & 34 | } 35 | 36 | if [ -z $1 ]; then 37 | install_services 38 | else 39 | install_service $1 40 | fi -------------------------------------------------------------------------------- /sdcard/manu_test/disable_factory_mode.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | if [ -f "/tmp/factory_mode" ]; then 3 | rm -f /tmp/factory_mode 4 | else 5 | echo '#!/bin/sh 6 | rm -- "$0"' > /mnt/data/bin/touch 7 | chmod +x /mnt/data/bin/touch 8 | fi -------------------------------------------------------------------------------- /sdcard/manu_test/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "Xiaomi Hacks enabled" 3 | 4 | /mnt/sdcard/manu_test/disable_factory_mode.sh 5 | /mnt/sdcard/manu_test/configure_services.sh & 6 | -------------------------------------------------------------------------------- /sdcard/manu_test/manu.bin: -------------------------------------------------------------------------------- 1 | manu_test/manu.sh0000770000175000017500000000005513727450707014313 0ustar osboxesosboxes#!/bin/sh 2 | /mnt/sdcard/manu_test/entrypoint.sh -------------------------------------------------------------------------------- /sdcard/manu_test/manu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | /mnt/sdcard/manu_test/entrypoint.sh -------------------------------------------------------------------------------- /sdcard/manu_test/md5sum.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmiguelcabral/mjsxj05cm-hacks/5276b315332f3ff400202ea2b383915264f39a48/sdcard/manu_test/md5sum.dat --------------------------------------------------------------------------------