UNPKG

remotemon

Version:

remote monitoring, since there is no ansible for raspberry pi.

286 lines (200 loc) 11.1 kB
![](https://raw.githubusercontent.com/sourcevault/remotemon/dev/logo.jpg) **Install** ```js sudo npm i -g remotemon sudo yarn global add remotemon # OR sudo pnpm add -g remotemon # OR ``` `remotemon` is a cli automation tool for building/copying/executing code on remote machines and monitoring the result. Its main use-case is for developing / running scripts on remote machines like the raspberry pi .. .. but can also be used for purposes that would normally be done using `make` / `nodemon` 😀. ```bash remotemon reboot # reboot remote machine 😏 remotemon ssh45 # to change default ssh port to 45 👮🏼‍♂️ ``` ```yaml # Example Config File reboot: remote: - sudo reboot shutdown: remote: - shutdown -h now ssh45: local: - scp sshd_config ${remotehost}:/tmp/sshd_config remote: - sudo mv /tmp/sshd_config /etc/ssh/sshd_config - sudo systemctl restart ssh.service ``` #### 🟡 How to Use A local configuration files (`.remotemon.yaml`) is used to organize different sub-commands to run in a project. `⛔️ In remotemon lingo a project is top level folder name in your service directory. ⛔️` First argument to `remotemon` is the name of the build routine to use, subsequent arguments can be used internally as variables using handlebar syntax (eg. `${0}`), or `.global` variables using `=` ( eg. `file=main.js` ). ```zsh ~/app:(dev*) remotemon shutdown ``` Running `remotemon` without any arguments makes `remotemon` execute default routine present in provided configuration file. ```zsh ~/app:(dev*) remotemon ``` `remotemon` has taken inspiration from [runit](http://smarden.org/runit/) in how to structure projects, just like in `runit`, you have to provide a **service directory** name ( can be any folder in your disk ), each folder within that directory is considered a project. `remotemon` also stores it's configuration data in your home folder's `.config` folder ( `~/.config/config.remotemon.yaml` ). #### 🟡 Creating Configuration `YAML` File - **Quick Example** ```yaml remotehost: pi@192.152.65.12 remotefold: ~/test local: make local remote: make remote ``` ```yaml remotehost: pi@192.152.65.12 remotefold: ~/test local: make local remote: make remote ``` ```yaml remotehost: pi@192.152.65.12 remotefold: ~/test local: make local remote: make remote rsync: # rsync options - recursive - exclude: - .gitignore - .ls - .git ``` ```yaml remotehost: pi@192.152.65.12 remotefold: ~/test local: make local remote: make remote rsync: - recursive - exclude: - .gitignore - .ls - .git test1: # custom routine remotefold: ~/test1 ``` - **Creating custom named builds** Named builds can be created at top-level as long as the name does not clash with **reserved keyword**, they **cannot** also contain `/` character in their name ( e.g `mybui/ld1` would be considered incorrect ): ```yaml mybuild1: remotehost: pi@192.152.65.12 remotefold: ~/test local: make pi1 remote: make mybuild1 mybuild2: remotehost: pi@192.168.43.51 remotefold: ~/build local: make pi2 remote: make mybuild2 ``` values not provided in a build are merged with default provided at top-level, in case defaults don't exist at top level then values are extracted from module's internal defaults. ```yaml rsync: - recursive - exclude: - .gitignore - .ls - .git mybuild1: remotehost: pi@192.152.65.12 remotefold: ~/test local: make pi1 remote: make mybuild1 mybuild2: remotehost: pi@192.152.65.12 remotefold: ~/build local: make pi2 remote: make mybuild2 ``` In the above config file for example, `mybuild1` and `mybuild2` get their rsync values from the common `rsync` field. Since rsync's default `src` and `des` are not provided by user in our config file, they are derived from `remotemon`'s internal defaults. #### 🟡 **all configuration options** - `remotehost` - `{username}@{ipaddress}` / ssh name of remote client. - `remotefold` - folder in remote client where we want to execute our script. - `watch` - local file(s) or folders(s) to watch for changes. - `ignore` - files to **not** watch. - `pre` - local commands to run before setting up watch, *runs only **once***. - `local` - local commands to run after a change in file is detected. - `remote` - command to execute in remote client. - `final` - command to execute after `remote` returns `exit 0`. - `ssh` - custom `ssh` config options - `startwith` - command(s) to run for each ssh session. - `option` - ssh options (default is `-tt -o LogLevel=QUIET`). - `verbose` - hardcode verbose level of printing for command. - `silent` - hardcode commandline `--silent` option ( use sparsely ). - `pwd` - specify if the command is run in the directory of the project, or in the working directory, by default(`false`) it runs in project directory. - `description` - provide a brief description of what the command does. - `defarg` - default values for empty commandline arguments, for enforcing minimum commandline arguments, a number can be provided. - `initialize` - boolean value to specify if a first run is performed or not when command is run, default is `true`. - `rsync` - rsync options ( currently supported ) : - `src` - source folder(s) to sync. - `des` - destination folder in remote client. - `recursive`▪️`verbose`▪️`quiet`▪️`no-motd`▪️`exclude:`▪️`checksum`▪️`archive`▪️`relative`▪️`no-OPTION`▪️`no-implied-dirs`▪️`backup`▪️`update`▪️`inplace`▪️`append`▪️`append-verify`▪️`dirs`▪️`links`▪️`copy-links`▪️`copy-unsafe-links`▪️`safe-links`▪️`copy-dirlinks`▪️`keep-dirlinks`▪️`hard-links`▪️`perms`▪️`executability`▪️`chmod:`▪️`acls`▪️`xattrs`▪️`owner`▪️`group`▪️`devices`▪️`specials`▪️`devices`▪️`specials`▪️`times`▪️`omit-dir-times`▪️`super`▪️`fake-super`▪️`sparse`▪️`dry-run`▪️`whole-file`▪️`one-file-system`▪️`existing`▪️`ignore-existing`▪️`remove-soucre-files`▪️`del`▪️`delete`▪️`delete-before`▪️`delete-during`▪️`delete-delay`▪️`delete-after`▪️`delete-excluded`▪️`ignore-errors`▪️`force`▪️`partial`▪️`delay-updates`▪️`prune-empty-dirs`▪️`numeric-ids`▪️`ignore-times`▪️`size-only`▪️`compress`▪️`cvs-exclude`▪️`F`▪️`from0`▪️`protect-args`▪️`blocking-io`▪️`stats`▪️`8-bit-output`▪️`human-readable`▪️`progress`▪️`P`▪️`itemize-changes`▪️`list-only` - `block-size:`▪️`rsh:`▪️`rsync-path:`▪️`max-delete:`▪️`max-size:`▪️`max-size:`▪️`partial-dir:`▪️`timeout:`▪️`contimeout:`▪️`modify-window:`▪️`temp-dir:`▪️`fuzzy:`▪️`compare-dest:`▪️`copy-dest:`▪️`link-dest:`▪️`compress-level:`▪️`skip-compress:`▪️`filter:`▪️`exclude:`▪️`exclude-from:`▪️`include:`▪️`include-from:`▪️`files-from:`▪️`address:`▪️`port:`▪️`sockopts:`▪️`out-format:`▪️`log-file:`▪️`log-file-format:`▪️`password-file:`▪️`bwlimit:`▪️`write-batch:`▪️`only-write-batch:`▪️`read-batch:`▪️`protocol:`▪️`iconv:`▪️`checksum-seed:` #### 🟡 `cli` variables - **Named** In `make` we can change internal variables (eg.`env`,`file`) from the command line in this way: ```bash make file=/dist/main.js make env=prod file=/dist/main.js make compile env=prod file=/dist/main.js ``` in remotemon the same thing can do done : ```bash remotemon file=/dist/main.js ``` it changes the internal value(s) of **associated key** in `global`: ```yaml val: file: /dist/main.js # <-- old value replaced with value taken from commandline remotehost: pi@192.152.65.12 remotefold: ~/test local: make local ${global.file} remote: make remote ``` this way we can edit the values of our makefile without opening either `.remotemon.yaml` or `makefile`. - **Unnamed** Sometimes it's more convenient to not have to name your variables. Instead of `remotemon file=/dist/main.js` we would like to do `remotemon /dist/main.js`. We can in situation like that use numbered templating `${0}`,`${1}` in our config file. `defarg` field can also be used to provide default values if the user does not specify them. If we know the most common file name is `/dist/main.js` we could use `defarg: [/dist/main.js]` to not have to always provide the filename as an argument. ***When not to use remotemon ?*** - when your build process gets complicated enough to warrant the use of gulpfiles, makefiles, etc. - `remotemon` is meant for situations where you are constantly having to configure linux system files, but also developing and running code on remote machines, that involves complicated `rsync` and `ssh` commands, but prefer to change those files from the comfort of your favorite local text editor - not everybody uses vim. - `--edit` It's possible to make **permanent edits** on `.remotemon.yaml` without opening them using the `-e`/`--edit` flag. For example if the IP address of the host has changed, you could do : `remotemon -e remotehost=user@192.168.43.52` and the remotehost field would have value of `user@192.168.43.52` It's also possible to change inner values of custom defined tasks ( using `/` to define nesting ) : `remotemon -e mybuild1/remotehost=user@192.168.43.52` ##### 🟡 all commandline options - `--watch-config-file` or `-w` restarts on config file change by default. - `--dry-run` or `-d` would disable all execution, used for checking and making sure all the commands are accurate. - `--verbose,-v` ( also `-vv`) would show all the command in their full form. - `-l,--list` to see all the different commands from the command line itself. - `-m --auto-make-directory` make remote directory if it doesn't exist. `-mm` ( with root permission ) - `-V --version` displays version number - `-n --no-watch` force disable any and all watches - `-s --silent` do not show `remotemon` message - `-e --edit` make permanent edits to `.remotemon.yaml` values. - `-p --project` folder name ( in service directory ) to look for `.remotemon.yaml` - `-c --cat` dump the output of the current config file being used. `-cc` same as -c but with comments `-ccc` show raw json for final process state ##### 🔴 Bugs - [same object ref doesn't work #6](https://github.com/arthurlacoste/tampa/issues/6) For now it's not possible for `remotemon` to do two levels of referencing in config file, as `remotemon` uses `tampax`, and the issue is with `tampax`, write your config files to work around the issue ( for now ). #### LICENCE - Code released under BSD-3-Clause. - Documentation and images released under CC BY-NC-ND 4.0. - details can be found [here](https://github.com/sourcevault/remotemon/blob/dev/COPYING.txt).