unix-remotecontrol v0.4.0
Unix Remote Control (IOT)
Runs Scripts on Mac/Linux remotely.
Why :
I was setting up homebridge (iOS HomeKit Accesory Protocol) on my rasberryPi and after hooking up my IR Blaster, RF Transmitter and other wake-on-lan devices. I wanted my always-on OSX Laptop to also be remotely controlled by my iOS Device. So i ended up writing up a small plugin for Homebridge plugin.
I use this to play itunes, search google and bookmark search results, restart my system, get room temperature using MBP in-build Temp Sensor and adjust airconditioning accordingly, monitor my ec-2 instance stats, sync Spotify Playlist etc.
Homebridge Plugin => homebridge-unixcontrol
How it Works :
This library is directly injected into homebridge with a plugin wrapper => homebridge-unixcontrol
The plugin queries the system using HTTP API and run shell scripts. The shell requires sudo access to shutdown/reboot the system. More commands can be easily be injected. Feel free to PR.
You can ask Siri to execute commands :
Hey Siri, Shutdown my laptop
Hey Siri, play iTunes Playlist
Hey Siri, Good Morning ! // Plays Music, Backups OSX, Search for Google Alerts, Turns Off Air Conditioner
Hey Siri, Capture Laptop Webcam
Hey Siri, Who's using my laptop
Todo :
- Add Linux Support
- Add Windows Support
- Refactor With Promises
- Replace HTTP API with socket connection.
- Implement a working Example
- Security Concerns
Installation :
$ npm install -g unix-remotecontrolStarting Server :
$ unixremoteRunning Forever
$ npm install -g forever
$ git clone https://github.com/sahilchaddha/unix-remoteControl.git && cd unix-remoteControl
$ forever start src/server.jsConfiguration :
Configuration containing sudo password, port number, logLevel & sessionToken are stored in environment.js in root/src.
To Open Configuration for global module :
$ unixremote --configSample Configuration :
//environment.js
var env = {
port: '3000',
pass: 'lol', //sudo password TODO: Secure
logLevel: 'info',
sessionToken: 'f64f2940-fae4-11e7-8c5f-ef356f279131'
}
module.exports = envConfig Parameters
| Fields | Description |
|---|---|
| port | Port Number to run HTTP Server. |
| pass | System Sudo Password |
| logLevel | Log Level (debug, info, error) |
| sessionToken | Random Session Token for API Authentication. |
NOTE: sessionToken needs to be set as Request Header token
Usage :
After Running the server, You can request
localhost:portNumber/commandType/command
e.g.
POST localhost:3000/power/shutdown
{
"time": 10
}curl --header "token: f64f2940-fae4-11e7-8c5f-ef356f27913" -X POST localhost:3000/power/logout
curl --header "token: f64f2940-fae4-11e7-8c5f-ef356f27913" "Content-Type: application/json" -X POST -d '{"time":10}' localhost:3000/power/restart
curl --header "token: f64f2940-fae4-11e7-8c5f-ef356f27913" "Content-Type: application/json" -X POST -d '{"destination":"AppleMusic"}' localhost:3000/music/syncSpotifySample Scripts/Commands :
Power Command Type
Usage:-
localhost:3000/power/displaySleep
POST localhost:3000/power/restart
{
"time": 10
}| Command | Method | Description | Params | Sudo |
|---|---|---|---|---|
| /ping | GET | Pings to get server state (on/off) | None | false |
| /halt | POST | Shutdowns immediately & forcibly (Can cause data loss) | None | true |
| /shutdown | POST | Shut downs the system | time (minutes) : Delays Shutdown in minutes | true |
| /restart | POST | Restarts the system | time (minutes) : Delays Shutdown in minutes | true |
| /logout | POST | Logs Out the user (OSX Only) | None | false |
| /sleep | POST | Turns the System to Sleep | None | false |
| /displaySleep | POST | Turns the Display to Sleep | None | false |
| /cancelShutdown | POST | Cancels Scheduled Shutdown/Restart Task | None | true |
System Stats Command Type
Usage:-
localhost:3000/systemStats/temperature
localhost:3000/systemStats/ram
| Command | Method | Description | Params | Sudo |
|---|---|---|---|---|
| /temperature | GET | Returns current Temperature of CPU | None | false |
| /cpuLoad | GET | Returns current CPU Load | None | false |
| /ram | GET | Returns current Ram Status | None | false |
| /storage | GET | Returns current Storage Stats | None | false |
| /battery | GET | Returns current Battery Information | None | false |
Browser Command Type
Usage:-
localhost:3000/browser/googleChromeReset
| Command | Method | Description | Params | Sudo |
|---|---|---|---|---|
| /googleChromeReset | POST | Clear all data of google chrome and reset | None | false |
| /safariClearHistory | POST | Clear histroy of safari | None | false |
NOTE: For safariClearHistory you will have to add terminal or whatever command line tool you are using should be added in System Preferences -> Security & Privacy -> Privacy -> Accessibility. When you run this command for the first time there will a prompt to add command line tool in Accessibility.
Wi-fi Command Type
Usage:-
localhost:3000/wifi/on
| Command | Method | Description | Params | Sudo |
|---|---|---|---|---|
| /status | GET | Returns Wifi Enabled/Disabled Status (OS X Only) | None | false |
| /on | POST | Turn on wifi (OS X Only) | None | false |
| /off | POST | Turn off wifi (OS X Only) | None | false |
| /connect | POST | Connect to wifi (OS X Only) | name: wifi name, password: wifi password | false |
Bluetooth Command Type
Usage:-
localhost:3000/bluetooth/status
| Command | Method | Description | Params | Sudo |
|---|---|---|---|---|
| /status | GET | Returns Bluetooth Enabled/Disabled Status (OS X Only) | None | false |
| /on | POST | Turn on Bluetooth (OS X Only) | None | false |
| /off | POST | Turn off Bluetooth (OS X Only) | None | false |
| /showPairingAlert | POST | Show pairing alert or pair with any BLE enabled device (OS X Only) | deviceName: Bluetooth name of device with percentage encoding | false |
| /toggle | POST | Toggle device bluetooth connection (OS X Only) | deviceName: Bluetooth name of device with percentage encoding | false |
NOTE: blueutil is added as a depedancy for Bluetooth Connections. It will be automatically installed during npm install. Its added as postInstall Script in package.json. If for some reason installation of blueutil fails, you can manually install blueutil brew install blueutil
System Spy Command Type
Usage:-
localhost:3000/systemSpy/screenshot
localhost:3000/systemSpy/camRecord
localhost:3000/systemSpy/alert
{
"message": "Heeeyyy !!! Hooooo !!!"
}localhost:3000/systemSpy/notify
{
"title": "heyyy",
"message": "hooo"
}| Command | Method | Description | Params | Sudo |
|---|---|---|---|---|
| /screenshot | POST | Screenshots Current Screen, Saves & returns image (OSX Only) | None | false |
| /webcamCapture | POST | Clicks Camera Still, Saves & returns image (OSX Only) | None | false |
| /screenRecord | POST | Starts Screen Recording (OSX Only) | time (In Minutes): Start recording for specific time. Here time is optional if you want to run this command forever than do not pass any arguments | false |
| /camRecord | POST | Starts Camera Recording (OSX Only) | time (In Minutes): Start recording for specific time. Here time is optional if you want to run this command forever than do not pass any arguments | false |
| /alert | POST | Shows Alert to User | message: Message to Show Alert | false |
| /notify | POST | Shows Notification to User | title: Title For Notification, message: Message | false |
| /isRecording | GET | Returns Recording Status (OSX Only) | type : screen or cam type of recording | false |
Music Command Type
Usage:-
localhost:3000/music/itunesPlaylist
localhost:3000/music/setVolume
{
"volume": 10
}| Command | Method | Description | Params | Sudo |
|---|---|---|---|---|
| /youtubePlaylist | POST | Opens Youtube & Starts Playing Playlist defined in environment.js (OSX Only) | None | false |
| /itunesPlaylist | POST | Opens iTunes & Starts Playing Playlist defined in environment.js (OSX Only) | None | false |
| /setVolume | POST | Sets New Volume (OSX Only) | volume: volume to be set. Should be between 0 to 10 | false |
| /getVolume | GET | Returns Current Volume (OSX Only) | None | false |
| /mute | POST | Mutes the System (OSX Only) | None | false |
| /unmute | POST | UnMutes the System (OSX Only) | None | false |
| /isMuted | GET | Returns Mute Status (OSX Only) | None | false |
Todo Scripts :
- Remote System Backup
- Remote System Format (Need extra OSX Device to test. :P )
Writing Custom Scripts :
Cloning the Repo :
$ git clone https://github.com/sahilchaddha/unix-remoteControl.git && cd unix-remoteControl
$ node src/server.js
or
$ npm startCreating Your Router :
You can create your custom router inside Routes folder.
//DummyRouter.js
var router = require('express').Router() // Create New Router
var commandService = require('../Services/CommandService.js')
router.get('/hello', function (req, res) {
res.send('Hello')
// Run Your npm commands
// or call Shell Scripts using Command Service
commandService.execute('dummy', 'sayHello', options, function(){})
})
module.exports = routerAdding your Router to Valid Routes :
Add your custom router inside routes.js
var powerRouter = require('./Routes/PowerRouter.js')
var dummyRouter = require('./Routes/DummyRouter.js')
var routes = [
{
url: '/power',
routerClass: powerRouter
},
{
url: '/dummy',
routerClass: dummyRouter
}
]
module.exports = routesAdding Your Shell Scripts :
You can use Command Service to execute commands :
To add Commands, you can inject your commands inside Commands/commands.js
var dummyCommands = {
sayHello: {
command: ['say', 'hello'],
sudo: false // Set as true if command need sudo access
}
}
module.exports = {
// power: powerCommands,
dummy: dummyCommands
}Apple Scripts
Apple scripts in format .scpt are to be injected inside AppleScripts folder.
You can add command inside commands.js
var dummyCommands = {
sayHello: {
command: ['say', 'hello'],
sudo: false // Set as true if command need sudo access
},
runAppleScript: {
command: ['osascript', 'src/Commands/AppleScripts/dummyAS.scpt'],
sudo: false
}
}
module.exports = {
// power: powerCommands,
dummy: dummyCommands
}Homebridge on Raspberry Pi :
Homebridge Configuration :
WIP
On Pi :
$ ssh pi@192.168.1.2 // Your Pi Local Address
$ npm install -g homebridge
$ npm install -g homebridge-unixcontrol
// Configure Homebridge config.jsonOn Unix System (For Remote Access) :
$ npm install -g unix-remotecontrol
$ unixremote --config //Setup Your Configuration
$ unixremoteCredits :
Sahil Chaddha (mail@sahilchaddha.com)
Sumit Chudasama (imsrc21@gmail.com)
