dev 62eda1322188 cached
41 files
15.6 MB
6.8k tokens
1 requests
Download .txt
Repository: cmiguelcabral/mjsxj05cm-hacks
Branch: dev
Commit: 62eda1322188
Files: 41
Total size: 15.6 MB

Directory structure:
gitextract_jczd0x7e/

├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .gitmodules
├── README.md
├── build
├── firmware/
│   └── 3.4.2_0062/
│       └── tf_recovery.img
└── 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.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
    branches:
      - '*'

env:
  sourceBranch: ${{ github.ref }}
  isNightly: ${{ contains(github.ref, 'dev') }}
  isFinalRelease: ${{ contains(github.ref, 'master') }}

jobs:
  build:
    runs-on: ubuntu-18.04
    steps:
    - name: Check out source code
      uses: actions/checkout@v2

    # - name: Build
    #   uses: dawidd6/action-ansible-playbook@v2
    #   with:
    #     playbook: build.yml
    #     directory: ./
    #     options: |
    #       --extra-vars branch=${{ github.ref }}

    - name: Build latest
      if: ${{ env.isNightly == 'true' }}
      env:
        THAT_HASH: ${{ secrets.THAT_HASH }}
      run: chmod +x build && ./build dev

    - name: Build stable
      if: ${{ env.isFinalRelease == 'true' }}
      env:
        THAT_HASH: ${{ secrets.THAT_HASH }}
      run: chmod +x build && ./build final

    - name: Release latest
      uses: marvinpinto/action-automatic-releases@latest
      if: env.isNightly == 'true'
      with:
        automatic_release_tag: latest-rc
        files: dist/sdcard.zip
        prerelease: true
        repo_token: "${{ secrets.GITHUB_TOKEN }}"
        title: latest-rc

    - name: Release stable
      uses: marvinpinto/action-automatic-releases@latest
      if: env.isFinalRelease == 'true'
      with:
        automatic_release_tag: stable
        files: dist/sdcard.zip
        prerelease: false
        repo_token: "${{ secrets.GITHUB_TOKEN }}"
        title: stable


================================================
FILE: .gitignore
================================================
*.ini
*.xcf
dist

================================================
FILE: .gitmodules
================================================
[submodule "submodules/x360h1080p-rtsp-server"]
	path = submodules/x360h1080p-rtsp-server
	url = https://github.com/telmomarques/x360h1080p-rtsp-server.git
[submodule "submodules/mija-framegrabber"]
	path = submodules/mija-framegrabber
	url = https://github.com/crckmc/mija-framegrabber.git
[submodule "submodules/x360h1080p-websocket-stream-server"]
	path = submodules/x360h1080p-websocket-stream-server
	url = https://github.com/telmomarques/x360h1080p-websocket-stream-server.git
[submodule "submodules/x360h1080p-web-config-client"]
	path = submodules/x360h1080p-web-config-client
	url = https://github.com/telmomarques/x360h1080p-web-config-client
[submodule "submodules/x360h1080p-web-config-server"]
	path = submodules/x360h1080p-web-config-server
	url = https://github.com/telmomarques/x360h1080p-web-config-server


================================================
FILE: README.md
================================================
[![discord](https://img.shields.io/discord/713125176971231233?label=discord)](http://discord.gg/qggupzu)

Stable: ![CI](https://github.com/cmiguelcabral/mjsxj05cm-hacks/workflows/CI/badge.svg?branch=master)

Latest: ![CI](https://github.com/cmiguelcabral/mjsxj05cm-hacks/workflows/CI/badge.svg?tag=latest-rc)

# Mi Camera Hacks (MJSXJ05CM)

- [Supported Cameras](#supported-cameras)
- [Features](#features)
- [Install Instructions](#install-instructions)
- [FAQ](#faq)
- [These Guys are Awesome](#these-guys-are-awesome)


Keep calm and follow the procedure!

Seriously now: it's still in beta, please read everything before continuing.

## Supported Cameras
For now this is it, I'm working on supporting more cameras.

Model Name(s) | Picture
--- | ---
MJSXJ05CM|![MJSXJ05CM](images/MJSXJ02CM.jpg)


## Features
Feature | Latest | Stable
--- | --- | ---
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)
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)
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)
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)
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)
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)
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)
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)
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)

## Install Instructions
The hacks exploits a flaw in firmware version 3.4.2_0062, **please read the instructions very carefully!!**

- First [Check your camera firmware version](#view-camera-firmware-version)

- If you have firmware version 3.4.2_0062, go to [Install the hacks](#install-the-hacks)

- If you have another firmware version, nothing can be done unfortunately.

### View camera firmware version
1. Configure the camera using the Mi Home app
2. Open the camera in the app and touch the 3 dots in the upper right corner
3. Select the option "General Settings", and then "Check for firmware upgrades"
4. The current firmware version is presented on the screen

### Downgrade the Firmware


⚠️ It is not possible to downgrade the frimware to 3.4.2_0062 on the MJSXJ05CM

If you have try to use an firmware and you camera is stuck on amber light try [this firmware](https://drive.google.com/file/d/1ve6XlBEiZebJV6ukJ0Oiu7DePw2JCsWj/view)

### Install the hacks
1. Configure the camera using the Mi Home app
2. Download the latest release from [releases](https://github.com/telmomarques/xiaomi-360-1080p-hacks/releases)
3. Copy the **contents** of "sdcard" folder to the root of your SD Card
4. Power off the camera and insert the SD Card
5. Power on the camera
6. Find the IP address of your camera
7. Open the web config interface o the camrea on your browser: [http://<your-camera-ip/](http://<your-camera-ip/)

## FAQ

### I can't downgrade the firmware, I follow the instructions but nothing happens.
Thy another SD Card. This actually happens a lot, trying a different SD Card usually solves it.

### The RTSP stream is corrupted / stops working after a while.
The RTSP server is still in alpha stage.

You may see some corrupted frames here and there, and the server may stop working after a few hours (restarting the camera solves it). We're working on it, but if a 100% stable video stream is **critical** for you, then it's still not ready.

### I'm worried about security, can I create/modify the [hack] password?

Security is in the roadmap, but still not the primary focus. Right now you'll have to secure the camera by making sure it's only accessible on your private network, and that your network is secure.

## These Guys are Awesome
Huge thanks to everyone who contributed!

[@aslafy-z](https://github.com/aslafy-z)
[@crckmc](https://github.com/crckmc)
[@thewh1teagle](https://github.com/thewh1teagle)
[@telmomarques](https://github.com/telmomarques)


================================================
FILE: build
================================================
#!/bin/bash

github_download_release_asset() {
  local owner=$1
  local repository=$2
  local tagName=$3
  local assetName=$4

  is_200_ok=$(wget -q --show-progress --server-response https://github.com/${owner}/${repository}/releases/download/${tagName}/${assetName} 2>&1 | grep -c 'HTTP/1.1 200 OK')
  if [ $is_200_ok != "1" ]; then
    echo "Failed to get ${assetName}"
    exit 1
  fi
}

download_from_url() {
  local assetName=$1
  is_200_ok=$(wget -q --show-progress --server-response ${1} 2>&1 | grep -c 'HTTP/1.1 200 OK')
  if [ $is_200_ok != "1" ]; then
    echo "Failed to get ${assetName}"
    exit 1
  fi
}

process_external_download() {
  local url=$1
  local filename=$2

  echo Downloading \"${url}\"

  download_from_url ${url}
}

process_github_release_asset_download() {
  local owner=$1
  local repository=$2
  local assetName=$3

  if [ $releaseType == "dev" ]; then
    tagName="latest-rc"
  fi

  if [ $releaseType == "final" ]; then
    tagName="latest"
  fi

  echo Downloading \"${owner}/${repository}@${tagName}/${assetName}\"

  github_download_release_asset ${owner} ${repository} ${tagName} ${assetName}
}

extract() {
  local fileName=${1}
  case "$fileName" in
  *.zip)
    echo Extracting ${fileName}
    extract_zip ${fileName}
    rm -f ${assetFilename}
    ;;
  *.tar)
    echo Extracting ${fileName}
    extract_tar ${fileName}
    rm -f ${assetFilename}
    ;;
  esac
}

extract_zip() {
  unzip -qq ${1}
}

extract_tar() {
  tar -xf ${1}
}

process_build_file() {
  local buildType=$1
  local buildFilePath=.build
  local source=$(cat ${buildFilePath} | jq -r ".source")
  local assetFilename=""

  if [ "${source}" == "external" ]; then
    local url=$(cat ${buildFilePath} | jq -r ".url")
    assetFilename=$(cat ${buildFilePath} | jq -r ".filename")
    process_external_download ${url} ${assetFilename}

  elif [ "${source}" == "github-release-asset" ]; then
    local owner=$(cat ${buildFilePath} | jq -r ".owner")
    local repository=$(cat ${buildFilePath} | jq -r ".repository")
    assetFilename=$(cat ${buildFilePath} | jq -r ".assetName")
    process_github_release_asset_download ${owner} ${repository} ${assetFilename}
  fi

  rm $buildFilePath

  if [[ ! -z ${assetFilename} ]]; then
    extract ${assetFilename}
  fi

  if [ -d "uclibc" ]; then
    cp uclibc/* .
    rm -rf libc uclibc
  fi
}

clean() {
  echo "Cleaning..."
  rm -rf dist
}

build() {
  echo "Building..."
  test -d dist || mkdir dist
  cp -r sdcard/* dist/
  shopt -s globstar
  for buildFile in dist/**/.build; do
    pushd $(dirname ${buildFile})
    process_build_file ${1}
    popd
  done
}

package() {
  pushd dist
  zip -r sdcard.zip * -x hacks/**/libc -x hacks/**/uclibc
  popd
}

main() {
  local target=$1

  case ${target} in
  clean)
    clean
    ;;

  dev | rc | final)
    releaseType=$1

    clean
    build
    package
    ;;

  *)
    echo "Invalid target '${1}'"
    ;;
  esac
}

main $1


================================================
FILE: firmware/3.4.2_0062/tf_recovery.img
================================================
[File too large to display: 15.6 MB]

================================================
FILE: sdcard/hacks/framegrabber/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "telmomarques",
  "repository": "mija-framegrabber",
  "assetName": "framegrabber.zip",
  "clean":
  [
    "ipc009"
  ]
}

================================================
FILE: sdcard/hacks/framegrabber/bin/framegrabber
================================================
#!/bin/sh
CAMERA_MODEL=`factory get model | cut -d '.' -f3`

if [ -z "$CAMERA_MODEL" ]; then
  echo "Can't get camera model, exiting."
  exit 1
fi

BINARY_PATH=${CAMERA_MODEL}/framegrabber

if [ ! -f "$BINARY_PATH" ]; then
  echo "Camera model '${CAMERA_MODEL}' not supported, exiting."
  exit 1
fi

cp -f ${BINARY_PATH} /mnt/data/bin
exec /mnt/data/bin/framegrabber "$@"

================================================
FILE: sdcard/hacks/motor-control/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "cmiguelcabral",
  "repository": "mjsxj05cm-motor-control",
  "assetName": "motord"
}

================================================
FILE: sdcard/hacks/motor-control/meta/service/.enable
================================================


================================================
FILE: sdcard/hacks/motor-control/meta/service/motor-control
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/motor-control/bin
exec ./motord

================================================
FILE: sdcard/hacks/onvif-server/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "cmiguelcabral",
  "repository": "mjsxj05cm-onvif_srvd",
  "assetName": "onvif_srvd"
}

================================================
FILE: sdcard/hacks/onvif-server/meta/service/.enable
================================================


================================================
FILE: sdcard/hacks/onvif-server/meta/service/onvif-server
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/onvif-server/bin

source /mnt/data/etc/os-release

STEPS=5
MOTOR_CONTROL="/mnt/sdcard/hacks/motor-control/bin"
EVENT_FILE="$MOTOR_CONTROL/event"

LEFT="echo pan forward $STEPS > $EVENT_FILE"
RIGHT="echo pan reverse $STEPS > $EVENT_FILE"
UP="echo tilt forward $STEPS > $EVENT_FILE"
DOWN="echo tilt reverse $STEPS > $EVENT_FILE"


IP_ADDR=$(ip -4 addr show wlan0 | grep inet | awk '{print $2}' | cut -d'/' -f1)
while [[ -z $IP_ADDR ]]; do
    IP_ADDR=$(ip -4 addr show wlan0 | grep inet | awk '{print $2}' | cut -d'/' -f1)
done
echo $IP_ADDR

ONVIF_PROFILE_0="--name HD --width 1920 --height 1080 --url rtsp://$IP_ADDR:8554/mainstream --type H264"
ONVID_PROFILE_1="--name SD --width 640 --height 360 --url rtsp://$IP_ADDR:8554/substream --type H264"
echo $ONVIF_PROFILE_0
echo $ONVIF_PROFILE_1

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 \
        --ptz \
        --move_left "eval $LEFT" \
        --move_right "eval $RIGHT" \
        --move_up "eval $UP" \
        --move_down "eval $DOWN"

================================================
FILE: sdcard/hacks/rtsp-server/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "cmiguelcabral",
  "repository": "mjsxj05cm-rtsp-server",
  "assetName": "rtspserver"
}

================================================
FILE: sdcard/hacks/rtsp-server/config/config.json
================================================
{
  "encodingType": "h265"
}


================================================
FILE: sdcard/hacks/rtsp-server/meta/config/config.json
================================================
{
  "enable": false,
  "encodingType": "h265"
}

================================================
FILE: sdcard/hacks/rtsp-server/meta/config/config.json.template
================================================
{
  "encodingType": "{{.EncodingType}}"
}


================================================
FILE: sdcard/hacks/rtsp-server/meta/service/framegrabber-mainstream
================================================
#!/bin/sh

ETCDIR=/mnt/data/etc/framegrabber/
RTSP_MAINSTREAM_PIPE="${ETCDIR}rtsp_mainstream"

mkdir -p $ETCDIR
mkfifo $RTSP_MAINSTREAM_PIPE

cd /mnt/sdcard/hacks/framegrabber/bin
exec ./framegrabber -f $RTSP_MAINSTREAM_PIPE -c 0

================================================
FILE: sdcard/hacks/rtsp-server/meta/service/framegrabber-substream
================================================
#!/bin/sh

ETCDIR=/mnt/data/etc/framegrabber/
RTSP_SUBSTREAM_PIPE="${ETCDIR}rtsp_substream"

mkdir -p $ETCDIR
mkfifo $RTSP_SUBSTREAM_PIPE

cd /mnt/sdcard/hacks/framegrabber/bin
exec ./framegrabber -f $RTSP_SUBSTREAM_PIPE -c 1

================================================
FILE: sdcard/hacks/rtsp-server/meta/service/rtsp-server
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/rtsp-server/bin
cp -f rtspserver /mnt/data/bin
exec /mnt/data/bin/rtspserver -c ../config/config.json -m /mnt/data/etc/framegrabber/rtsp_mainstream -s /mnt/data/etc/framegrabber/rtsp_substream


================================================
FILE: sdcard/hacks/runit/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "cmiguelcabral",
  "repository": "mjsxj05cm-runit",
  "assetName": "runit.tar",
  "clean":
  [
    "*"
  ]
}

================================================
FILE: sdcard/hacks/sftp-server/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "telmomarques",
  "repository": "openssh-portable",
  "assetName": "sftp-server.tar"
}

================================================
FILE: sdcard/hacks/ssh-server/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "telmomarques",
  "repository": "dropbear",
  "assetName": "dropbear.tar"
}

================================================
FILE: sdcard/hacks/ssh-server/config/config.json
================================================
{
    "users":
    [
    ]
}

================================================
FILE: sdcard/hacks/ssh-server/meta/config/config.json
================================================
{
  "enable": false,
  "users": []
}

================================================
FILE: sdcard/hacks/ssh-server/meta/config/config.json.template
================================================
{
  "users":
  [
  {{range $i, $u := .Users}}
    {{if $i}}, {{end}}
    {"systemUsername": "{{.SystemUsername}}", "username": "{{.Username}}", "password": "{{.Password}}"}
  {{end}}
  ]
}

================================================
FILE: sdcard/hacks/ssh-server/meta/service/ssh-server
================================================
#!/bin/sh
mkdir -p /mnt/data/etc/dropbear
cd /mnt/sdcard/hacks/ssh-server/bin
exec ./dropbear -FERB

================================================
FILE: sdcard/hacks/web-config/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "cmiguelcabral",
  "repository": "mjsxj05cm-web-server",
  "assetName": "web-config-server"
}

================================================
FILE: sdcard/hacks/web-config/meta/service/.enable
================================================


================================================
FILE: sdcard/hacks/web-config/meta/service/web-config
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/web-config/bin
exec ./web-config-server


================================================
FILE: sdcard/hacks/web-config/www/.build
================================================
{
  "source": "github-release-asset",
  "owner": "cmiguelcabral",
  "repository": "mjsxj05cm-web-client",
  "assetName": "web-config-client.zip",
  "clean":
  [
    "*"
  ]
}

================================================
FILE: sdcard/hacks/websocket-stream-server/bin/.build
================================================
{
  "source": "github-release-asset",
  "owner": "telmomarques",
  "repository": "x360h1080p-websocket-stream-server",
  "assetName": "websocket-stream-server"
}

================================================
FILE: sdcard/hacks/websocket-stream-server/meta/config/config.json
================================================
{
  "enable": false
}

================================================
FILE: sdcard/hacks/websocket-stream-server/meta/service/framegrabber-mainstream
================================================
#!/bin/sh

ETCDIR=/mnt/data/etc/framegrabber/
WEBSOCKET_MAINSTREAM_PIPE="${ETCDIR}websocket_mainstream"

mkdir -p $ETCDIR
mkfifo $WEBSOCKET_MAINSTREAM_PIPE

cd /mnt/sdcard/hacks/framegrabber/bin
exec ./framegrabber -f $WEBSOCKET_MAINSTREAM_PIPE -c 0

================================================
FILE: sdcard/hacks/websocket-stream-server/meta/service/framegrabber-substream
================================================
#!/bin/sh

ETCDIR=/mnt/data/etc/framegrabber/
WEBSOCKET_SUBSTREAM_PIPE="${ETCDIR}websocket_substream"

mkdir -p $ETCDIR
mkfifo $WEBSOCKET_SUBSTREAM_PIPE

cd /mnt/sdcard/hacks/framegrabber/bin
exec ./framegrabber -f $WEBSOCKET_SUBSTREAM_PIPE -c 1

================================================
FILE: sdcard/hacks/websocket-stream-server/meta/service/websocket-stream-server
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/websocket-stream-server/bin/
exec ./websocket-stream-server -m=/mnt/data/etc/framegrabber/websocket_mainstream -s=/mnt/data/etc/framegrabber/websocket_substream


================================================
FILE: sdcard/manu_test/configure_services.sh
================================================
#!/bin/sh

HACKS_DIR=/mnt/sdcard/hacks
SERVICES_DIR=/mnt/data/etc/runit

install_service() {
	hackName=$1
	serviceDir=${HACKS_DIR}/${hackName}/meta/service

	if [ -d ${serviceDir} ] && [ -f ${serviceDir}/.enable ]; then
		cd ${serviceDir}
		
		for service in ${serviceDir}/* ; do
			serviceName=`basename ${service}`
			hackServiceDir=${SERVICES_DIR}/${hackName}-${serviceName}
			mkdir -p ${hackServiceDir}
			cp ${service} ${hackServiceDir}/run
		done
	fi
}

install_services() {
	rm -rf ${SERVICES_DIR}

	for hack in ${HACKS_DIR}/* ; do
		if [ -d ${hack} ]; then
			hackName=`basename $hack`
			install_service ${hackName}
		fi
	done;

	export PATH=$PATH:${HACKS_DIR}/runit/bin
	runsvdir ${SERVICES_DIR} &
}

if [ -z $1 ]; then
	install_services
else
	install_service $1
fi

================================================
FILE: sdcard/manu_test/disable_factory_mode.sh
================================================
#!/bin/sh
if [ -f "/tmp/factory_mode" ]; then
  rm -f /tmp/factory_mode
else
  echo '#!/bin/sh
  rm -- "$0"' > /mnt/data/bin/touch
  chmod +x /mnt/data/bin/touch
fi

================================================
FILE: sdcard/manu_test/entrypoint.sh
================================================
#!/bin/sh
echo "Xiaomi Hacks enabled"

/mnt/sdcard/manu_test/disable_factory_mode.sh
/mnt/sdcard/manu_test/configure_services.sh &


================================================
FILE: sdcard/manu_test/manu.sh
================================================
#!/bin/sh
/mnt/sdcard/manu_test/entrypoint.sh
Download .txt
gitextract_jczd0x7e/

├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .gitmodules
├── README.md
├── build
├── firmware/
│   └── 3.4.2_0062/
│       └── tf_recovery.img
└── 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.sh
Condensed preview — 41 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (21K chars).
[
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1459,
    "preview": "name: CI\n\non:\n  push:\n    branches:\n      - '*'\n\nenv:\n  sourceBranch: ${{ github.ref }}\n  isNightly: ${{ contains(github"
  },
  {
    "path": ".gitignore",
    "chars": 16,
    "preview": "*.ini\n*.xcf\ndist"
  },
  {
    "path": ".gitmodules",
    "chars": 823,
    "preview": "[submodule \"submodules/x360h1080p-rtsp-server\"]\n\tpath = submodules/x360h1080p-rtsp-server\n\turl = https://github.com/telm"
  },
  {
    "path": "README.md",
    "chars": 5439,
    "preview": "[![discord](https://img.shields.io/discord/713125176971231233?label=discord)](http://discord.gg/qggupzu)\n\nStable: ![CI]("
  },
  {
    "path": "build",
    "chars": 2926,
    "preview": "#!/bin/bash\n\ngithub_download_release_asset() {\n  local owner=$1\n  local repository=$2\n  local tagName=$3\n  local assetNa"
  },
  {
    "path": "sdcard/hacks/framegrabber/bin/.build",
    "chars": 170,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"telmomarques\",\n  \"repository\": \"mija-framegrabber\",\n  \"assetName\": \"fr"
  },
  {
    "path": "sdcard/hacks/framegrabber/bin/framegrabber",
    "chars": 371,
    "preview": "#!/bin/sh\nCAMERA_MODEL=`factory get model | cut -d '.' -f3`\n\nif [ -z \"$CAMERA_MODEL\" ]; then\n  echo \"Can't get camera mo"
  },
  {
    "path": "sdcard/hacks/motor-control/bin/.build",
    "chars": 134,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"cmiguelcabral\",\n  \"repository\": \"mjsxj05cm-motor-control\",\n  \"assetNam"
  },
  {
    "path": "sdcard/hacks/motor-control/meta/service/.enable",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "sdcard/hacks/motor-control/meta/service/motor-control",
    "chars": 62,
    "preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/motor-control/bin\nexec ./motord"
  },
  {
    "path": "sdcard/hacks/onvif-server/bin/.build",
    "chars": 135,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"cmiguelcabral\",\n  \"repository\": \"mjsxj05cm-onvif_srvd\",\n  \"assetName\":"
  },
  {
    "path": "sdcard/hacks/onvif-server/meta/service/.enable",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "sdcard/hacks/onvif-server/meta/service/onvif-server",
    "chars": 1182,
    "preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/onvif-server/bin\n\nsource /mnt/data/etc/os-release\n\nSTEPS=5\nMOTOR_CONTROL=\"/mnt/sdcard/hac"
  },
  {
    "path": "sdcard/hacks/rtsp-server/bin/.build",
    "chars": 136,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"cmiguelcabral\",\n  \"repository\": \"mjsxj05cm-rtsp-server\",\n  \"assetName\""
  },
  {
    "path": "sdcard/hacks/rtsp-server/config/config.json",
    "chars": 29,
    "preview": "{\n  \"encodingType\": \"h265\"\n}\n"
  },
  {
    "path": "sdcard/hacks/rtsp-server/meta/config/config.json",
    "chars": 47,
    "preview": "{\n  \"enable\": false,\n  \"encodingType\": \"h265\"\n}"
  },
  {
    "path": "sdcard/hacks/rtsp-server/meta/config/config.json.template",
    "chars": 42,
    "preview": "{\n  \"encodingType\": \"{{.EncodingType}}\"\n}\n"
  },
  {
    "path": "sdcard/hacks/rtsp-server/meta/service/framegrabber-mainstream",
    "chars": 229,
    "preview": "#!/bin/sh\n\nETCDIR=/mnt/data/etc/framegrabber/\nRTSP_MAINSTREAM_PIPE=\"${ETCDIR}rtsp_mainstream\"\n\nmkdir -p $ETCDIR\nmkfifo $"
  },
  {
    "path": "sdcard/hacks/rtsp-server/meta/service/framegrabber-substream",
    "chars": 225,
    "preview": "#!/bin/sh\n\nETCDIR=/mnt/data/etc/framegrabber/\nRTSP_SUBSTREAM_PIPE=\"${ETCDIR}rtsp_substream\"\n\nmkdir -p $ETCDIR\nmkfifo $RT"
  },
  {
    "path": "sdcard/hacks/rtsp-server/meta/service/rtsp-server",
    "chars": 224,
    "preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/rtsp-server/bin\ncp -f rtspserver /mnt/data/bin\nexec /mnt/data/bin/rtspserver -c ../config"
  },
  {
    "path": "sdcard/hacks/runit/bin/.build",
    "chars": 157,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"cmiguelcabral\",\n  \"repository\": \"mjsxj05cm-runit\",\n  \"assetName\": \"run"
  },
  {
    "path": "sdcard/hacks/sftp-server/bin/.build",
    "chars": 135,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"telmomarques\",\n  \"repository\": \"openssh-portable\",\n  \"assetName\": \"sft"
  },
  {
    "path": "sdcard/hacks/ssh-server/bin/.build",
    "chars": 124,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"telmomarques\",\n  \"repository\": \"dropbear\",\n  \"assetName\": \"dropbear.ta"
  },
  {
    "path": "sdcard/hacks/ssh-server/config/config.json",
    "chars": 28,
    "preview": "{\n    \"users\":\n    [\n    ]\n}"
  },
  {
    "path": "sdcard/hacks/ssh-server/meta/config/config.json",
    "chars": 36,
    "preview": "{\n  \"enable\": false,\n  \"users\": []\n}"
  },
  {
    "path": "sdcard/hacks/ssh-server/meta/config/config.json.template",
    "chars": 188,
    "preview": "{\n  \"users\":\n  [\n  {{range $i, $u := .Users}}\n    {{if $i}}, {{end}}\n    {\"systemUsername\": \"{{.SystemUsername}}\", \"user"
  },
  {
    "path": "sdcard/hacks/ssh-server/meta/service/ssh-server",
    "chars": 99,
    "preview": "#!/bin/sh\nmkdir -p /mnt/data/etc/dropbear\ncd /mnt/sdcard/hacks/ssh-server/bin\nexec ./dropbear -FERB"
  },
  {
    "path": "sdcard/hacks/web-config/bin/.build",
    "chars": 142,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"cmiguelcabral\",\n  \"repository\": \"mjsxj05cm-web-server\",\n  \"assetName\":"
  },
  {
    "path": "sdcard/hacks/web-config/meta/service/.enable",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "sdcard/hacks/web-config/meta/service/web-config",
    "chars": 71,
    "preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/web-config/bin\nexec ./web-config-server\n"
  },
  {
    "path": "sdcard/hacks/web-config/www/.build",
    "chars": 174,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"cmiguelcabral\",\n  \"repository\": \"mjsxj05cm-web-client\",\n  \"assetName\":"
  },
  {
    "path": "sdcard/hacks/websocket-stream-server/bin/.build",
    "chars": 161,
    "preview": "{\n  \"source\": \"github-release-asset\",\n  \"owner\": \"telmomarques\",\n  \"repository\": \"x360h1080p-websocket-stream-server\",\n "
  },
  {
    "path": "sdcard/hacks/websocket-stream-server/meta/config/config.json",
    "chars": 21,
    "preview": "{\n  \"enable\": false\n}"
  },
  {
    "path": "sdcard/hacks/websocket-stream-server/meta/service/framegrabber-mainstream",
    "chars": 249,
    "preview": "#!/bin/sh\n\nETCDIR=/mnt/data/etc/framegrabber/\nWEBSOCKET_MAINSTREAM_PIPE=\"${ETCDIR}websocket_mainstream\"\n\nmkdir -p $ETCDI"
  },
  {
    "path": "sdcard/hacks/websocket-stream-server/meta/service/framegrabber-substream",
    "chars": 245,
    "preview": "#!/bin/sh\n\nETCDIR=/mnt/data/etc/framegrabber/\nWEBSOCKET_SUBSTREAM_PIPE=\"${ETCDIR}websocket_substream\"\n\nmkdir -p $ETCDIR\n"
  },
  {
    "path": "sdcard/hacks/websocket-stream-server/meta/service/websocket-stream-server",
    "chars": 192,
    "preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/websocket-stream-server/bin/\nexec ./websocket-stream-server -m=/mnt/data/etc/framegrabber"
  },
  {
    "path": "sdcard/manu_test/configure_services.sh",
    "chars": 776,
    "preview": "#!/bin/sh\n\nHACKS_DIR=/mnt/sdcard/hacks\nSERVICES_DIR=/mnt/data/etc/runit\n\ninstall_service() {\n\thackName=$1\n\tserviceDir=${"
  },
  {
    "path": "sdcard/manu_test/disable_factory_mode.sh",
    "chars": 164,
    "preview": "#!/bin/sh\nif [ -f \"/tmp/factory_mode\" ]; then\n  rm -f /tmp/factory_mode\nelse\n  echo '#!/bin/sh\n  rm -- \"$0\"' > /mnt/data"
  },
  {
    "path": "sdcard/manu_test/entrypoint.sh",
    "chars": 131,
    "preview": "#!/bin/sh\necho \"Xiaomi Hacks enabled\"\n\n/mnt/sdcard/manu_test/disable_factory_mode.sh\n/mnt/sdcard/manu_test/configure_ser"
  },
  {
    "path": "sdcard/manu_test/manu.sh",
    "chars": 45,
    "preview": "#!/bin/sh\n/mnt/sdcard/manu_test/entrypoint.sh"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the cmiguelcabral/mjsxj05cm-hacks GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 41 files (15.6 MB), approximately 6.8k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!