Skip to content

Instantly share code, notes, and snippets.

@zommiommy
Last active May 14, 2020 13:31
Show Gist options
  • Save zommiommy/e2ef69f2464ead75e51576712e377281 to your computer and use it in GitHub Desktop.
Save zommiommy/e2ef69f2464ead75e51576712e377281 to your computer and use it in GitHub Desktop.
Mongodb laboratory service
from mongo:latest
ENV DEBIAN_FRONTEND=noninteractive
# 32 bit
RUN dpkg --add-architecture i386
RUN apt-get update -qyy && apt-get install -qyy apt-utils build-essential software-properties-common
###########################################################
# Basic devel tools
###########################################################
RUN apt-get install -qyy \
zsh \
python \
python-pip \
python-all-dev \
virtualenvwrapper \
nano \
tmux \
neovim \
gdb \
gdbserver \
gdb-multiarch \
git \
make \
gcc \
g++ \
flex \
bison \
wget \
curl \
cmake \
unzip \
gzip \
netcat \
pkg-config \
libstdc++6:i386 \
libffi-dev \
binutils \
strace \
socat
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:mongo2020' | chpasswd
RUN echo "ListenAddress 0.0.0.0\n" >> /etc/ssh/sshd_config
RUN echo "ListenAddress ::\n" >> /etc/ssh/sshd_config
RUN echo "PasswordAuthentication yes\n" >> /etc/ssh/sshd_config
RUN echo "PermitRootLogin yes\n" >> /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
CMD /usr/sbin/sshd -D -p $PORT -o ListenAddress=0.0.0.0
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<script>
function bake_cookie(name, value) {
var cookie = [name, '=', JSON.stringify(value)].join('');
document.cookie = cookie;
}
function read_cookie(name) {
var result = document.cookie.match(new RegExp(name + '=([^;]+)'));
result && (result = JSON.parse(result[1]));
return result;
}
function delete_cookie(name) {
document.cookie = [name, '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.', window.location.host.toString()].join('');
}
</script>
</head>
<body class="bg-light vsc-initialized">
<div class="container">
<div class="py-5 text-center">
<h1>Mongodb Container Creation service</h1>
<p class="lead">
This service create a container for the mongodb Lab. Once it's created you can access it by ssh.<br>
On windows you can use Putty which can be downloaded <a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html">Here</a>.<br>
On Linux just run the command <code>ssh root@&lt;IP&gt; -p &lt;PORT&gt; </code>
</p>
</div>
<h4 class="mb-3">Ports already used for ssh</h4>
<p id="used_ports" class="lead"></p>
<script>
function used_ports(){
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", "/list", false ); // false for synchronous request
xmlHttp.send( null );
document.getElementById("used_ports").innerHTML = xmlHttp.responseText;
}
used_ports()
window.setInterval(used_ports, 1000);
</script>
<hr class="mb-4">
<div class="row">
<div class="col-md-6 mb-3">
<h4 class="mb-3">Create new container</h4>
<div class="row">
<div class="col-md-6 mb-3">
<label>Password: </label>
<input type="text" id="password" placeholder="password" class="form-control">
</div>
<div class="col-md-6 mb-3">
<label>Port: </label>
<input type="text" id="port" value=""placeholder="port E.g 1337" class="form-control">
</div>
</div>
<hr class="mb-4">
<button onclick="send()" class="btn btn-primary btn-lg btn-block">create container</button>
<div id="result"></div>
</div>
<div class="col-md-6 mb-3">
<h4 class="mb-3">My ports</h4>
<hr class="mb-4">
<ul id="command_list" class="list-group mb-3">
</ul>
</div>
</div>
<script>
var my_ports = read_cookie("my_ports");
if (my_ports == null){
my_ports = [];
}
var my_ports = my_ports.filter(function (el) {
return el != null;
});
my_ports.forEach(update_my_ports)
function update_my_ports(port){
if (port == "")
return;
var command = document.createElement("li");
command.classList = ["list-group-item d-flex justify-content-between lh-condensed"];
var text = document.createElement("h6");
text.classList = ["my-0"];
text.innerHTML = "<strong>"+port+"</strong>";
command.appendChild(text);
document.getElementById("command_list").appendChild(command)
}
function send(){
var xhr = new XMLHttpRequest();
var url = "/";
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
document.getElementById("result").innerHTML = xhr.responseText
used_ports()
update_my_ports(document.getElementById("port").value)
}
};
var data = JSON.stringify({
"pw": document.getElementById("password").value,
"port": document.getElementById("port").value
});
my_ports.push(document.getElementById("port").value);
document.cookie = bake_cookie("my_ports", my_ports);
console.log(data);
xhr.send(data);
}
</script>
</div>
</body>
</html>
import os
import json
import docker
from time import sleep
from flask import Flask, request
from pprint import pprint
app = Flask(__name__)
ROOT_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
DOCKER_CLIENT = docker.from_env()
PASSWORD = "mongo2020"
used_ports = set()
print("BUILING ENV")
os.makedirs(f"{ROOT_DIR}/data", exist_ok=True)
DOCKER_CLIENT.images.build(
tag="mongo-env",
path=ROOT_DIR,
custom_context=False
)
print("DONE")
@app.route('/', methods=["POST"])
def run():
content = request.json
port = int(content["port"])
pw = content["pw"]
if pw != PASSWORD:
return "Error, wrnong password"
if port in used_ports:
return "Error, Port in use"
used_ports.add(port)
home_dir = f"{ROOT_DIR}/data/{port}/home"
data_dir = f"{ROOT_DIR}/data/{port}/data"
os.makedirs(home_dir, exist_ok=True)
os.makedirs(data_dir, exist_ok=True)
DOCKER_CLIENT.containers.run("mongo-env",
detach=True,
volumes={
home_dir:{
"bind":"/home",
"mode":"rw"
},
data_dir:{
"bind":"/data",
"mode":"rw"
}
},
environment=[f"PORT={port}"],
network_mode="host"
)
return "Done!"
@app.route('/list', methods=["GET"])
def lista_porte_usate():
return json.dumps(list(used_ports))
@app.route('/', methods=["GET"])
def index():
with open("index.html") as f:
return f.read()
#!/bin/bash
sudo FLASK_APP=docker_service.py flask run --host=0.0.0.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment