sshmgr 3.2.3
A powerful ssh manager
Requires Python: >=3.6.0

# sshmgr - A powerful Linux server manager

It leverages docker to automatically do

- create a new ubuntu container for user, the current supported ubuntu base images are
    - ubuntu 16.04
- setup a default password located in user's `$HOME/.defpsd`
- setup a ssh login welcome message

It supports `docker` for normal docker creation and `nvidia-docker` for gpu docker creation.
The dockerfile for nvidia based gpu could be found here
@[https://gitlab.com/nvidia/cuda].

You can specify a customized `dockerfile` with first line beginning with `FROM ubuntu:<supported ubuntu version>`.

# Dependencies

- Server Side
    - The Linux server should have docker installed
- Client Side
    - The client should have `~/.ssh/config` configured
    - The client should have `paramiko` package installed

# Installation

Download the source, uncompress it and enter the source directory. Run the following command to install

    pip3 install sshmgr

# Quick start

## Main interface

    ➜  sshmgr (master) ✗ sshmgr -h
    usage: sshmgr [-h] [-v] [--hosts [hosts]] [--sshkey path_of_the_new_ssh_key]
                  {docker} ...

    A powerful linux server manager

    positional arguments:
      {docker}

    optional arguments:
      -h, --help            show this help message and exit
      -v, --version         Show the version of sshmgr
      --hosts [hosts]       The host(s) to be operated on
      --sshkey path_of_the_new_ssh_key
                            Update ssh key for administrator

More about `--hosts`.  You can process multiple hosts in one command, if the
host name

- case that beginning with `@`

    It indicates a file that contains multiple host ID, one ID holds one line.
    For example, `@$HOME/Downloads/hostids`.

    Empty lines will be ignored and lines begin with `#` will be regarded as
    comments.

- case that beginning with `/`

    The hosts are seperated by comma, for example `/tom, nancy, louis`.

- case that a normal host

    A single host name you want to connect to.

## The docker interface

    sshmgr --hosts <hosts> docker [-h]
                         (--new username | --delete username | --query username | --list)
                         [--fdocker dockerfile] [--nvidia]
                         [--apt {ubuntu.16.04.offical,ubuntu.16.04.tsinghua}]
                         [--himsg hello_message]

    optional arguments:
      -h, --help            show this help message and exit
      --new username        The user to add
      --delete username     The user to delete
      --query username      Query the information of username
      --list                List all users in the host.
      --fdocker dockerfile  The file path to dockerfile, the first line of the
                            file must be `FROM ubuntu:16.04`
      --nvidia              Enable gpu based nvidia docker
      --apt {ubuntu.16.04.offical,ubuntu.16.04.tsinghua}
                            Select apt source.list, the default is
                            ubuntu.16.04.offical
      --himsg hello_message
                            Messages showed after your guest logined into the
                            server

sshmgr will connect to your specified host and create a docker container for
your guest, create a `$HOME/share` folder shared between the user on host and the
user on the container.

## The info interface

Retrieve server information:

    sshmger --hosts <hosts> info [-h]
        [--net Network]
        [--factory Manufacturer]
        [--cpu CPU]
        [--mem Memory]
        [--disk Disk]

An example is showed as below:

    "102": {
        "info": {
            "net": {
                "verbose": [
                    "2: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000\n",
                    "    inet 192.168.100.102/24 brd 192.168.100.255 scope global enp2s0f0\n"
                ]
            },
            "factory": {
                "verbose": [
                    "\tManufacturer: xxx\n",
                    "\tProduct Name: xxx V3\n",
                    "\tSerial Number: xxx\n"
                ],
                "Manufacturer": "xxx",
                "Product Name": "xxx V3",
                "Serial Number": "xxx"
            },
            "cpu": {
                "verbose": [
                    "\tSocket Designation: CPU01\n",
                    "\tVersion: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz\n",
                    "\tCore Count: 8\n",
                    "\tThread Count: 16\n",
                    "\tSocket Designation: CPU02\n",
                    "\tVersion: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz\n",
                    "\tCore Count: 8\n",
                    "\tThread Count: 16\n"
                ],
                "logic_core_count": 32
            },
            "mem": {
                "verbose": [
                    "              total        used        free      shared  buff/cache   available\n",
                    "Mem:      131626576      577188   130605988        9304      443400   130449412\n",
                    "Swap:     133803004           0   133803004\n",
                    "\tMaximum Capacity: 2 TB\n"
                ],
                "total": 131626576
            },
            "disk": {
                "verbose": [
                    "Disk /dev/sda: 1198GB\n"
                ],
                "size": 1286342705152
            }
        },
        "errmsg": null,
        "status": false
    }

Both memory and disk size are in bytes.

If you want to process further, for example, you want to have an overview of the
servers in `cpu`, `memory`, `disk`, you can use the following code snippets:

    #! /usr/bin/env python3
    #! -*- coding:utf-8 -*-

    import json

    with open('sysinfo.json', 'r') as _:
        sysinfo = json.load(_)

    cpucnt, memsz, disksz = 0, 0, 0
    for host in sysinfo.keys():
        if not sysinfo[host]['islive']: continue
        cpucnt += sysinfo[host]['info']['cpu']['logic_core_count']
        memsz += sysinfo[host]['info']['mem']['total']
        disksz += sysinfo[host]['info']['disk']['size']

    print(f'[+] CPU Count: {cpucnt} Memory Size: {memsz/(1024 ** 3)} GB Disk Size: {disksz/(1024 ** 4)} TB')

# Development

Open a terminal at the project root, debug with `python3 -m src <options>`.