67 Commits
Author SHA1 Message Date
3wc ff4e63339f Merge branch 'master' into yolocolo
continuous-integration/drone/push Build is passing
2021-08-04 12:19:57 +02:00
3wordchant 7b16606b16 Merge pull request 'shell_scripts: Fix reporting of VM IP addresses' (#9) from mirsal/capsul-flask:ipv6 into master
continuous-integration/drone/push Build is passing
Reviewed-on: #9
2021-08-04 12:13:44 +02:00
mirsal d9f3e68278 shell_scripts: Fix reporting of VM IP addresses
continuous-integration/drone/pr Build is failing
The shell script which gets informations from libvirt incorrectly
matches virsh output lines which contain VMs' public IPv4 addresses.
It doesn't work when there are multiple address families which breaks
reporting of IPv4 address when a VM also has an IPv6 address and virsh
happen to output that one first.

This commit changes it to explicitely match the first ipv4 address instead.
2021-08-04 00:56:55 +00:00
3wc bcd1190f50 Fix API 🙈
continuous-integration/drone/push Build is passing
2021-07-29 11:36:58 +02:00
3wc 6963e22933 Merge branch 'publicapi' into yolocolo 2021-07-29 11:16:54 +02:00
3wc 816be36a52 Revert unthemed template changes, tweak theme 2021-07-29 11:11:51 +02:00
3wc d6f2f6d0bf Merge branch 'master' into yolocolo 2021-07-29 09:47:31 +02:00
3wc cfb323bf60 Merge branch 'yc-templates' into yolocolo
continuous-integration/drone/push Build is passing
2021-07-22 01:03:02 +02:00
3wc 8c7197f118 Merge branch 'docker' into yolocolo 2021-07-22 01:02:34 +02:00
3wc fb83f52162 Merge branch 'master' into yolocolo 2021-07-22 00:57:01 +02:00
3wc 982556a2c5 Tag with current branch, instead of latest
continuous-integration/drone/pr Build was killed
continuous-integration/drone/push Build is passing
2021-07-22 00:28:33 +02:00
3wc 13646e64da Make docker-compose file less demanding
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2021-07-21 23:50:47 +02:00
3wc 67149f437a Changes from @decentral1se code review 2021-07-21 23:50:47 +02:00
3wc 308ac05fe6 Add openssh-cient to Dockerfile for ssh-keyscan 2021-07-21 23:50:47 +02:00
3wc c378c2b287 STRIPE_SECRET_KEY not STRIPE_PUBLISHABLE_KEY 2021-07-21 23:50:47 +02:00
3wc 5367822747 Load secrets from files if _FILE vars are set 2021-07-21 23:50:47 +02:00
3wc e295b4420c Docker updates for libvirtd 2021-07-21 23:50:47 +02:00
3wc e4180b8306 Use Flask server in development 2021-07-21 23:50:47 +02:00
3wc 5cd5126039 Multi-stage build oh my! 2021-07-21 23:50:47 +02:00
3wc f8e9ab2482 Initial attempt at Docker 2021-07-21 23:50:47 +02:00
3wc 487a1ac0a3 Revert accidental change to main images 2021-07-21 23:30:14 +02:00
3wc 71344fbf4d Merge branch 'yc-templates' into yolocolo 2021-07-21 22:49:17 +02:00
3wc 6f3ecf991d Custom theme fixes 2021-07-21 22:48:54 +02:00
3wc 40aa3bccd3 Load YOLOCOLO templates from a "theme" folder..
..configurable using the THEME env var.

Defaults to normal Capsul theme.
2021-07-21 22:24:25 +02:00
3wc bcc3f20b27 Tweak table style 2021-07-21 22:12:13 +02:00
3wc 8bd3971545 Improve form styling 2021-07-21 22:12:13 +02:00
3wc c639899cd0 Remove cash payment option 2021-07-21 22:12:13 +02:00
3wc a47c430855 Further colour tweak 2021-07-21 22:12:13 +02:00
3wc d5362897df Fix typo, tweak colours 2021-07-21 22:12:13 +02:00
3wc a52d183f2e More cheeky template changes 2021-07-21 22:12:13 +02:00
3wc 73042d1705 Disco updates for YOLOCOLO site 2021-07-21 22:12:13 +02:00
3wc d3078fc5ce Merge branch 'yc-templates' into yolocolo 2021-07-21 21:07:59 +02:00
3wc d60238f6f0 Improve form styling 2021-07-21 21:07:51 +02:00
3wc ab55146d41 Remove cash payment option 2021-07-21 21:07:49 +02:00
3wc 7191213646 Further colour tweak 2021-07-21 21:07:27 +02:00
3wc 8c802a977a Fix typo, tweak colours 2021-07-21 21:07:27 +02:00
3wc 929aa29663 More cheeky template changes 2021-07-21 21:07:26 +02:00
3wc 61beee8d3b Disco updates for YOLOCOLO site 2021-07-21 21:07:03 +02:00
3wc 8586b85095 Merge branch 'master' into yolocolo
continuous-integration/drone/push Build is failing
2021-07-21 20:38:36 +02:00
3wc b2b78e0015 Merge branch 'yc-templates' into yolocolo
continuous-integration/drone/push Build is passing
2021-07-21 11:43:17 +02:00
3wc d6f4be8197 Improve form styling 2021-07-21 11:43:04 +02:00
3wc 5d3d0a1c5e Merge branch 'docker' into yolocolo 2021-07-21 11:38:58 +02:00
3wc fc7e264178 Make docker-compose file less demanding
continuous-integration/drone/pr Build was killed
continuous-integration/drone/push Build is passing
2021-07-21 11:38:01 +02:00
3wc 157e81e6e5 Merge branch 'yc-templates' into yolocolo
continuous-integration/drone/push Build is passing
2021-07-21 02:02:58 +02:00
3wc 97f9486ea3 Remove cash payment option 2021-07-21 02:02:21 +02:00
3wc 4b90a6c7ae Merge branch 'yc-templates' into yolocolo
continuous-integration/drone/push Build is passing
2021-07-21 01:56:45 +02:00
3wc adc3342a8c Further colour tweak 2021-07-21 01:56:36 +02:00
3wc f8bbdcc3c5 Merge branch 'yc-templates' into yolocolo
continuous-integration/drone/push Build was killed
2021-07-21 01:54:35 +02:00
3wc 1133caa8a4 Fix typo, tweak colours 2021-07-21 01:54:21 +02:00
3wc 1f384f34b5 Merge branch 'yc-templates' into yolocolo
continuous-integration/drone/push Build was killed
2021-07-21 01:44:52 +02:00
3wc c25d85bbdd More cheeky template changes 2021-07-21 01:44:45 +02:00
3wc 0f4ac8e444 Merge branch 'yc-templates' into yolocolo
continuous-integration/drone/push Build is passing
2021-07-21 01:15:51 +02:00
3wc 3cf501a393 Disco updates for YOLOCOLO site 2021-07-21 01:13:52 +02:00
3wc 180efa01af Merge branch 'optional-btcpay' into yolocolo
continuous-integration/drone/push Build is passing
2021-07-21 00:30:34 +02:00
3wc f5c079ffc2 Un-hard-code SSH key name
continuous-integration/drone/push Build is passing
2021-07-20 23:55:03 +02:00
3wc 0e5dfe6bde Last re-hard-coding for "working" joy 2021-07-20 23:55:03 +02:00
3wc 2adbb8d94c Further filthy fix for local libvirt 2021-07-20 23:55:03 +02:00
3wc 8446d11720 Revert hardcoded local path to tank dir 2021-07-20 23:55:03 +02:00
3wc a580b04659 Bag of hacks to get local libvirt working 2021-07-20 23:55:03 +02:00
3wc 2e6894ad14 Changes from @decentral1se code review
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2021-07-20 23:48:23 +02:00
3wc 2e6c6517f3 Add openssh-cient to Dockerfile for ssh-keyscan
continuous-integration/drone/pr Build encountered an error
continuous-integration/drone/push Build is passing
2021-07-20 01:52:17 +02:00
3wc be6c1b38b7 STRIPE_SECRET_KEY not STRIPE_PUBLISHABLE_KEY
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2021-07-19 01:17:18 +02:00
3wc aa8e129913 Load secrets from files if _FILE vars are set 2021-07-19 00:24:22 +02:00
3wc 71e09807a7 Docker updates for libvirtd 2021-07-15 00:13:11 +02:00
3wc 4816170c03 Use Flask server in development 2021-07-15 00:13:11 +02:00
3wc 6af241e8be Multi-stage build oh my! 2021-07-15 00:13:11 +02:00
3wc c8ec53f207 Initial attempt at Docker 2021-07-15 00:13:11 +02:00
10 changed files with 48 additions and 44 deletions
+4 -3
View File
@@ -189,7 +189,7 @@ def detail(id):
duration=duration
)
def _create(vm_sizes, operating_systems, public_keys_for_account, affordable_vm_sizes, server_data):
def _create(email, vm_sizes, operating_systems, public_keys_for_account, affordable_vm_sizes, server_data):
errors = list()
size = server_data.get("size")
@@ -241,14 +241,14 @@ def _create(vm_sizes, operating_systems, public_keys_for_account, affordable_vm_
if len(errors) == 0:
id = make_capsul_id()
current_app.config["HUB_MODEL"].create(
email = session["account"],
email = email,
id=id,
os=os,
size=size,
template_image_file_name=operating_systems[os]['template_image_file_name'],
vcpus=vm_sizes[size]['vcpus'],
memory_mb=vm_sizes[size]['memory_mb'],
ssh_authorized_keys=posted_keys
ssh_authorized_keys=list(map(lambda x: dict(name=x['name'], content=x['content']), posted_keys))
)
return id, errors
@@ -276,6 +276,7 @@ def create():
if "csrf-token" not in request.form or request.form['csrf-token'] != session['csrf-token']:
return abort(418, f"u want tea")
id, errors = _create(
session['account'],
vm_sizes,
operating_systems,
public_keys_for_account,
+1 -1
View File
@@ -178,4 +178,4 @@ def on_create_claimed(payload, host_id):
network_name=payload['network_name'],
public_ipv4=payload['public_ipv4'],
ssh_authorized_keys=list(map(lambda x: x["name"], payload['ssh_authorized_keys'])),
)
)
+7 -2
View File
@@ -198,6 +198,10 @@ class CapsulFlaskHub(VirtualizationInterface):
validate_capsul_id(id)
online_hosts = get_model().get_online_hosts()
#current_app.logger.debug(f"hub_model.create(): ${len(online_hosts)} hosts")
current_app.logger.error(f'{email}, {id} {os} {size} {template_image_file_name} {vcpus} {memory_mb}')
current_app.logger.error(f'{ssh_authorized_keys}')
payload = json.dumps(dict(
type="create",
email=email,
@@ -228,12 +232,13 @@ class CapsulFlaskHub(VirtualizationInterface):
except:
# no need to do anything here since if it cant be parsed then generic_operation will handle it.
pass
if error_message != "":
raise ValueError(f"create capsul operation {operation_id} on {assigned_hosts} failed with {error_message}")
if number_of_assigned != 1:
assigned_hosts_string = ", ".join(assigned_hosts)
raise ValueError(f"expected create capsul operation {operation_id} to be assigned to one host, it was assigned to {number_of_assigned} ({assigned_hosts_string})")
if error_message != "":
raise ValueError(f"create capsul operation {operation_id} on {assigned_hosts_string} failed with {error_message}")
def destroy(self, email: str, id: str):
+2 -1
View File
@@ -15,7 +15,7 @@ bp = Blueprint("publicapi", __name__, url_prefix="/api")
@bp.route("/capsul/create", methods=["POST"])
@account_required
def capsul_create():
email = session["account"]
email = session["account"][0]
from .console import _create, get_account_balance, get_payments, get_vms
@@ -36,6 +36,7 @@ def capsul_create():
request.json['ssh_authorized_key_count'] = 1
id, errors = _create(
email,
vm_sizes,
operating_systems,
public_keys_for_account,
@@ -3,7 +3,7 @@
# check available RAM and IPv4s
ram_bytes_to_allocate="$1"
ram_bytes_available=$(grep -E "^(size|memory_available_bytes)" /proc/spl/kstat/zfs/arcstats | awk '{sum+=$3} END {printf "%.0f", sum}')
ram_bytes_available="$(($(grep Available /proc/meminfo | grep -o '[0-9]*') * 1024))"
ram_bytes_remainder="$((ram_bytes_available - ram_bytes_to_allocate))"
if echo "$ram_bytes_to_allocate" | grep -vqE "^[0-9]+$"; then
@@ -11,8 +11,8 @@ if echo "$ram_bytes_to_allocate" | grep -vqE "^[0-9]+$"; then
exit 1
fi
# 20GB
if [ "$ram_bytes_remainder" -le $((20 * 1024 * 1024 * 1024)) ]; then
# 0.25GB
if [ "$ram_bytes_remainder" -le $((1 * 1024 * 1024 * 1024 / 4)) ]; then
echo "VM is requesting more RAM than $(hostname -f) has available."
echo "Bytes requested: $ram_bytes_to_allocate"
echo "Bytes available: $ram_bytes_available"
+13 -12
View File
@@ -6,6 +6,7 @@
vmname="$1"
template_file="/tank/img/$2"
qemu_tank_dir="/tank"
vcpus="$3"
memory="$4"
pubkeys="$5"
@@ -50,40 +51,40 @@ if echo "$public_ipv4" | grep -vqE "^[0-9.]+$"; then
exit 1
fi
disk="/tank/vm/$vmname.qcow2"
cdrom="/tank/vm/$vmname.iso"
xml="/tank/vm/$vmname.xml"
disk="$vmname.qcow2"
cdrom="$vmname.iso"
xml="$vmname.xml"
if [ -f /tank/vm/$vmname.qcow2 ]; then
echo "Randomly generated name matched an existing VM! Odds are like one in a billion. Buy a lotto ticket."
exit 1
fi
cp "$template_file" "$disk"
cp "$template_file" "/tank/vm/$disk"
cp /tank/config/cyberia-cloudinit.yml /tmp/cloudinit.yml
echo "$pubkeys" | while IFS= read -r line; do
echo " - $line" >> /tmp/cloudinit.yml
done
cloud-localds "$cdrom" /tmp/cloudinit.yml
cloud-localds "/tank/vm/$cdrom" /tmp/cloudinit.yml
qemu-img resize "$disk" "$root_volume_size"
qemu-img resize "/tank/vm/$disk" "$root_volume_size"
virt-install \
--memory "$memory" \
--vcpus "$vcpus" \
--name "$vmname" \
--disk "$disk",bus=virtio \
--disk "$cdrom",device=cdrom \
--disk "$qemu_tank_dir/vm/$disk",bus=virtio \
--disk "$qemu_tank_dir/vm/$cdrom",device=cdrom \
--os-type Linux \
--os-variant generic \
--virt-type kvm \
--graphics vnc,listen=127.0.0.1 \
--network network=$network_name,filterref=clean-traffic,model=virtio \
--network network=$network_name,model=virtio \
--import \
--print-xml > "$xml"
--print-xml > "/tank/vm/$xml"
chmod 0600 "$xml" "$disk" "$cdrom"
virsh define "$xml"
chmod 0600 "/tank/vm/$xml" "/tank/vm/$disk" "/tank/vm/$cdrom"
virsh define "/tank/vm/$xml"
virsh start "$vmname"
echo "success"
+1 -1
View File
@@ -30,6 +30,6 @@ if virsh domuuid "$vmname" | grep -vqE '^[\t\s\n]*$'; then
fi
# this gets the ipv4
ipv4="$(virsh domifaddr "$vmname" | awk '/vnet/ {print $4}' | cut -d'/' -f1)"
ipv4="$(virsh domifaddr "$vmname" | awk '/ipv4/ {print $4}' | cut -d'/' -f1)"
echo "$exists $state $ipv4"
+8 -8
View File
@@ -1,8 +1,8 @@
html {
color: #bdc7b8;
color: #241e1e;
font: calc(0.40rem + 1vmin) monospace;
overflow-y: scroll;
background-color: #241e1e;
background-color: #bdc7b8;
}
body {
@@ -19,8 +19,8 @@ body {
}
a {
color:#6CF;
text-shadow: 1px 1px 0px #000c;
color:#00517a;
text-shadow: 1px 1px 0px #eee;
}
a.no-shadow {
@@ -28,7 +28,7 @@ a.no-shadow {
}
a:hover, a:active, a:visited {
color: #b5bd68;
color: #323417;
}
.nav-links a {
@@ -59,11 +59,11 @@ h1, h2, h3, h4, h5 {
margin: initial;
padding: initial;
text-transform: uppercase;
text-shadow: 2px 2px 0px #0007;
text-shadow: 2px 2px 0px #eee;
}
main {
border: 1px dashed #bdc7b8;
border: 1px dashed #241e1e;
padding: 1rem;
margin-bottom: 2em;
@@ -143,7 +143,7 @@ input, textarea, select, label {
input, select, textarea {
outline: 0;
padding: 0.25em 0.5em;
color: #bdc7b8;
color: #241e1e;
background-color: #bdc7b805;
}
+4 -6
View File
@@ -2,7 +2,7 @@
<head>
<!-- Namecoin Address: N2aVL6pHtBp7EtNGb3jpsL2L2NyjBNbiB1 -->
<link href="{{ url_for('static', filename='favicon.yolocolo.ico') }}" rel="icon">
<title>{% block title %}{% endblock %}{% if self.title() %} - {% endif %}Capsul</title>
<title>{% block title %}{% endblock %}{% if self.title() %} - {% endif %}Serverscoop</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="Description" content="Cyberia Capsul">
@@ -14,7 +14,7 @@
<nav>
<div class="row justify-space-between half-margin">
<div>
🦉 <a href="/"><b>YOLOCOLO</b></a>
🍞 <a href="/"><b>serverscoop</b></a>
</div>
<div>
&nbsp;
@@ -31,7 +31,7 @@
{% if session["account"] %}
<a href="/console">Capsuls</a>
<a href="/console/ssh">SSH Public Keys</a>
<a href="/console/keys">SSH &amp; API Keys</a>
<a href="/console/account-balance">Account Balance</a>
{% endif %}
@@ -49,9 +49,7 @@
<footer>
This server runs <a
href="https://giit.cyberia.club/~forest/capsul-flask">capsul-flask</a> by
Cyberia Computer Club, available under the <a
href="https://creativecommons.org/licenses/by-sa/4.0/">Attribution-ShareAlike
4.0 International</a> licence.<br/><br/>
Cyberia Computer Club, available under the GNU AFFERO GENERAL PUBLIC LICENSE.<br/><br/>
<a href="https://git.autonomic.zone/3wordchant/capsul-flask/src/branch/yolocolo/capsulflask{% block pagesource %}{% endblock %}">View page source</a>
</footer>
</body>
+5 -7
View File
@@ -3,13 +3,11 @@
{% block content %}
<h1>
<pre>
_ _
_ _ ___ | | ___ ___ ___ | | ___
| | | |/ _ \| |/ _ \ / __/ _ \| |/ _ \
| |_| | (_) | | (_) | (_| (_) | | (_) |
\__, |\___/|_|\___/ \___\___/|_|\___/
|___/
___ ___ _ ____ _____ _ __ ___ ___ ___ ___ _ __
/ __|/ _ \ '__\ \ / / _ \ '__/ __|/ __/ _ \ / _ \| '_ \
\__ \ __/ | \ V / __/ | \__ \ (_| (_) | (_) | |_) |
|___/\___|_| \_/ \___|_| |___/\___\___/ \___/| .__/
|_|
</pre>
<span>Co-operative hosting using <a href="https://cyberia.club">Cyberia</a>'s Capsul</span>
{% endblock %}