diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1bb17f0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.webm filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text +*.svg filter=lfs diff=lfs merge=lfs -text +*.rec filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 57b480f..ef729c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,8 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland +# Copyright © 2023 Glenn Y. Rolland + +.vagrant bin lib diff --git a/README.md b/README.md index 90ce7a8..537cfda 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,9 @@ Commands: edit Adjust the configuration ``` +### Demo + + ## Configuration diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..d5596e1 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure('2') do |config| + config.vm.box = 'debian/bookworm64' + config.vm.box_check_update = false + + config.vm.provider 'virtualbox' do |vb| + vb.gui = false + vb.memory = '4096' + end + + config.vm.provider "libvirt" do |lv| + # lv.cpus = "2" + lv.memory = "4096" + # enable nested virtualization + lv.nested = true + lv.cpu_mode = "host-model" + end + + # config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ["vers=3,tcp"] + # config.vm.synced_folder "../../exercises", "/exercises", type: "nfs", mount_options: ["vers=3,tcp"] + + config.vm.define 'demo' do |machine| + machine.vm.hostname = 'demo' + + machine.vm.network 'forwarded_port', guest: 8080, host: 8080, host_ip: '127.0.0.1' + machine.vm.network 'forwarded_port', guest: 80, host: 1080, host_ip: '127.0.0.1' + end + + config.vm.provision 'shell', path: 'scripts/vagrant.provision.sh' +end diff --git a/doc/SCRIPT.md b/doc/SCRIPT.md new file mode 100644 index 0000000..2e844cf --- /dev/null +++ b/doc/SCRIPT.md @@ -0,0 +1,114 @@ + +# Minimalist FUSE Manager + +--- + +## Configuration + +Let's start by configuring `~/mnt/mfm.yml`! + +--- + +--- + +## Configuration + +We can add as many filesystems we want in the `filesystems:` list. + +--- + +## Configuration + +Each filesystem has a `type:` and specific configuration parameters + +The current values supported by *mfm* are `gocryptfs`, `httpdirfs` and `sshfs`. + +--- + +## Preparation + +Before using *mfm*, lets have a look at the `~/mnt/` directory. + +--- + +--- + +## Preparation + +Yes, it is empty! + +Don't worry, the mountpoint will be created automatically. + +--- + +## Usage + +Ok. Now, simply run *mfm* and choose your favorite filesystem! + +In this demo, I will choose `Public - Debian Repository` which is a remote web +page hosting debian packages and registy catalog. + +--- + +--- + +## Usage + +Hmmm... + +What happened? + +--- + +## Usage + +A directory was created in `~/mnt`. + +It is filled with files and directories from a remote system, in which we can +navigate. + +--- + +## Usage + +Let's detach it now! + +Simply run *mfm* again, and choose the same filesystem. + +--- + +--- + +## Usage + +It is now detached, and the directory is empty again! + +--- + +## Conclusion + +The *mfm* command works in the same way regardless of the filesystem selected. + +It's simple, fast and efficient. + +--- + +## Conclusion + +The *mfm* project is still in its infancy. + +We're looking for contributors to test it, to improve it, to make it even more +useful and enjoyable to use. + +--- + +## Conclusion + +But if you're just a user, we're already happy. + +--- + +## Conclusion + +Now it's your turn to use *mfm*! + diff --git a/doc/demo.mfm.yml b/doc/demo.mfm.yml new file mode 100644 index 0000000..169fde8 --- /dev/null +++ b/doc/demo.mfm.yml @@ -0,0 +1,23 @@ +--- + +version: 1 + +global: + mountpoint: "~/mnt" + +filesystems: + - type: gocryptfs + name: "Personal - Encrypted Credentials" + encrypted_path: "/path/to/credentials/vault" + + - type: httpdirfs + name: "Public - Remote Debian Repository" + url: "http://ftp.debian.org/debian/" + + - type: sshfs + name: "Personal - Remote Media Server" + remote_user: user + remote_host: mediaserver.local + remote_port: 22 + remote_path: "/remote/path/to/media" +# diff --git a/doc/output.gif b/doc/output.gif new file mode 100644 index 0000000..042de6c --- /dev/null +++ b/doc/output.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a32b478fc2a64a52fcb7dd14513affbc0a9c1426b7852bf6dde38674ba854e8f +size 1736117 diff --git a/doc/output.rec b/doc/output.rec new file mode 100644 index 0000000..c80e915 --- /dev/null +++ b/doc/output.rec @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8d4cad3c0810ace50eece364c1edae213ceae2a79fe97aa46859210d501d9a1 +size 2069840 diff --git a/doc/output.svg b/doc/output.svg new file mode 100644 index 0000000..270db1a --- /dev/null +++ b/doc/output.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7679a53f34e32f6671e748b8e41b5d4c66ca09346fd690be2a79cc17d00db01e +size 1274721 diff --git a/doc/output.webm b/doc/output.webm new file mode 100644 index 0000000..f723226 --- /dev/null +++ b/doc/output.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbc867e3d23fbe3c033e41f7d75fbc4685b13247d3abd5ee57e5b28dba2d460d +size 919631 diff --git a/doc/record-output.sh b/doc/record-output.sh new file mode 100644 index 0000000..b239c9b --- /dev/null +++ b/doc/record-output.sh @@ -0,0 +1,373 @@ +#!/bin/bash +# shellcheck disable=SC2317 + +set -u + +# parameters +konsole=org.kde.konsole-2913641 +session=2 +SLEEP_LONG_READ="3" +SLEEP_SHORT_READ="2" +SLEEP_TRANSITION="0.4" +SLEEP_COMMAND_BEFORE="0.4" +SLEEP_COMMAND_AFTER="0.65" +SLEEP_MICROPAUSE="0.25" +SLEEP_TYPESPEED="0.10" + +qtype() { + qdbus "$konsole" "/Sessions/$session" sendText "$1" +} + +qrun() { + qdbus "$konsole" "/Sessions/$session" runCommand "$1" +} + +qctrlb() { + qdbus "$konsole" "/Sessions/$session" sendText $'\002' +} + +qctrlc() { + qdbus "$konsole" "/Sessions/$session" sendText $'\003' +} + + +qtype_slow() { + echo -n "$1" \ + | sed 's/\(.\)/\1\n/g' \ + | while IFS="" read -r X ; do qtype "$X" ; sleep "$SLEEP_TYPESPEED" ; done +} + +tmux_key() { + qctrlb + sleep 0.5 + qtype "$1" +} + +qtype_arrow_up() { + qtype $'\033' + qtype "[A" +} + +qtype_arrow_down() { + qtype $'\033' + qtype "[B" +} + +qtype_arrow_left() { + qtype $'\033' + qtype "[D" +} + +qtype_arrow_right() { + qtype $'\033' + qtype "[C" +} + +## cleanup + +qctrlc +tmux_key "d" +qctrlc + +qrun "clear" +sleep "$SLEEP_MICROPAUSE" +qrun "cd ~/src/mfm" +sleep "$SLEEP_MICROPAUSE" +qrun "cp doc/demo.mfm.yml ~/.config/mfm.yml" +sleep "$SLEEP_MICROPAUSE" +qrun "rm -f output.rec" +sleep "$SLEEP_MICROPAUSE" +qrun "tmux kill-session -t demo" +sleep "$SLEEP_MICROPAUSE" +qrun "mkdir -p /home/vagrant/mnt" +sleep "$SLEEP_MICROPAUSE" +qrun "fusermount -u \"/home/vagrant/mnt/Public - Remote Debian Repository\"" +sleep "$SLEEP_MICROPAUSE" +qrun "rm -fr \"/home/vagrant/mnt/Public - Remote Debian Repository\"" +sleep "$SLEEP_MICROPAUSE" +qrun "# cleanup done" +sleep "$SLEEP_LONG_READ" + +## reset demo environment +qrun "tmux new -s demo" +sleep "$SLEEP_MICROPAUSE" +tmux_key "c" +qrun "cd ~/src/mfm" +sleep "$SLEEP_MICROPAUSE" +qrun "mdp --noslidenum doc/SCRIPT.md" +sleep "$SLEEP_MICROPAUSE" + +tmux_key "c" +qrun "export PATH=\$PATH:~/src/mfm/bin" +sleep "$SLEEP_MICROPAUSE" +qrun "export FZF_DEFAULT_OPTS=\"--height 40% --layout=reverse --border\"" +sleep "$SLEEP_MICROPAUSE" +qrun "alias cat=\"batcat -p\"" +sleep "$SLEEP_MICROPAUSE" +qrun "cd ~/src/mfm" +sleep "$SLEEP_MICROPAUSE" +qrun "clear" +sleep "$SLEEP_MICROPAUSE" + +tmux_key "1" +tmux_key ":" +qrun "set -g status off" +sleep "$SLEEP_MICROPAUSE" + +tmux_key "d" + +## record +qrun "asciinema rec --cols 80 --rows 24 -c 'tmux attach' output.rec" + +# slide 1 (title) +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# slide 2 (config file) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# cmd 2 (show config file) +qtype " " +sleep "$SLEEP_TRANSITION" + +tmux_key "2" +qtype_slow "cat " +sleep "$SLEEP_MICROPAUSE" +qtype_slow "~/.config" +sleep "$SLEEP_MICROPAUSE" +qtype_slow "/mfm.yml" +sleep "$SLEEP_MICROPAUSE" +qrun "" +sleep "$SLEEP_LONG_READ" # double +sleep "$SLEEP_LONG_READ" +tmux_key "1" + +# slide 3 (config options 1) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# slide 4 (config options 2) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# slide 5 (preparation - mnt) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# demo 5 (show mnt) +qtype " " +sleep "$SLEEP_TRANSITION" + +tmux_key "2" +qtype_slow "cd " +sleep "$SLEEP_MICROPAUSE" +qtype_slow "~/mnt" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" + +qtype_slow "ls" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_LONG_READ" +tmux_key "1" + +# slide 6 (preparation - empty mnt!) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# slide 7 (usage - run) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# demo 7 (run mfm) +qtype " " +sleep "$SLEEP_TRANSITION" + +tmux_key "2" +qtype_slow "m" +sleep "$SLEEP_MICROPAUSE" +qtype_slow "f" +sleep "$SLEEP_MICROPAUSE" +qtype_slow "m" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_SHORT_READ" + +qtype_arrow_down +sleep "$SLEEP_MICROPAUSE" +qtype_arrow_down +sleep "$SLEEP_MICROPAUSE" +qtype_arrow_up +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_LONG_READ" + +tmux_key "1" + +# slide 8 (usage - what?) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# demo 8 (usage - what : show mnt) +tmux_key "2" + +qtype_slow "ls" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_SHORT_READ" + +qtype_slow "cd \"Pub" +sleep "$SLEEP_MICROPAUSE" +qtype "lic - Remote Debian Repository\"" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" + +qtype_slow "ls" +sleep "$SLEEP_MICROPAUSE" +qtype $'\015' +sleep "$SLEEP_SHORT_READ" + +qtype_slow "cd pool" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" + +qtype_slow "ls" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_SHORT_READ" + +qtype_slow "cd main" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" + +qtype_slow "ls" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_LONG_READ" + +tmux_key "1" + +# slide 9 (usage - explanation) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# slide 10 (usage - prepare for detach) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# demo 10 (run mfm for detach) +qtype " " +sleep "$SLEEP_TRANSITION" + +tmux_key "2" + +qtype_slow "cd ~/mnt/" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" + +qtype_slow "m" +sleep "$SLEEP_MICROPAUSE" +qtype_slow "f" +sleep "$SLEEP_MICROPAUSE" +qtype_slow "m" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_SHORT_READ" + +qtype_arrow_down +sleep "$SLEEP_MICROPAUSE" +qtype_arrow_down +sleep "$SLEEP_MICROPAUSE" +qtype_arrow_up +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_LONG_READ" + +qtype_slow "ls" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_SHORT_READ" + +qtype_slow "cd \"Pub" +sleep "$SLEEP_MICROPAUSE" +qtype "lic - Remote Debian Repository\"" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_SHORT_READ" + +qtype_slow "ls" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_SHORT_READ" + +qtype_slow "ls -la" +sleep "$SLEEP_COMMAND_BEFORE" +sleep "$SLEEP_COMMAND_BEFORE" +qtype $'\015' +sleep "$SLEEP_COMMAND_AFTER" +sleep "$SLEEP_LONG_READ" + +tmux_key "1" + +# slide 11 (usage - detached) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + + +# slide 12 (conclusion) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# slide 13 (conclusion) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# slide 14 (conclusion) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# slide 15 (conclusion) +qtype " " +sleep "$SLEEP_TRANSITION" +sleep "$SLEEP_LONG_READ" + +# detach and clean +tmux_key "d" + +qrun "tmux kill-session -t demo" +qrun "termtosvg render output.rec output.svg" + +qrun "# success!" + +exit 0 + diff --git a/_attic/gx-vault.bash b/scripts/gx-vault.bash similarity index 100% rename from _attic/gx-vault.bash rename to scripts/gx-vault.bash diff --git a/scripts/vagrant.provision.sh b/scripts/vagrant.provision.sh new file mode 100644 index 0000000..a074a0a --- /dev/null +++ b/scripts/vagrant.provision.sh @@ -0,0 +1,72 @@ +#!/bin/sh + +# install crystal +set -e +set -u + +USER="$(test -d /vagrant && echo "vagrant" || echo "debian")" +HOSTNAME="$(hostname)" + +export DEBIAN_FRONTEND=noninteractive + +echo "Installing required system packages" +apt-get update --allow-releaseinfo-change +apt-get install -y \ + apt-transport-https \ + ca-certificates \ + git \ + curl \ + wget \ + vim \ + gnupg2 \ + software-properties-common + +echo "Installing recording requirements" +apt-get install -y \ + tmux \ + mdp \ + bat \ + asciinema \ + termtosvg + +echo "Installing mfm requirements" +apt-get install -y \ + fzf \ + sshfs \ + httpdirfs \ + libyaml-0-2 \ + libyaml-dev \ + libpcre3-dev \ + libevent-dev + +#!/bin/sh + +set -e +set -u + +USER="$(test -d /vagrant && echo "vagrant" || echo "debian")" +CLUSTERS_DIR=/home/$USER/clusters + +# Installation de kompose +if [ ! -f /usr/local/bin/kompose ]; then + DL="$(mktemp)" + curl \ + -L https://github.com/kubernetes/kompose/releases/download/v1.22.0/kompose-linux-amd64 \ + -o "$DL" + chmod +x "$DL" + mv "$DL" /usr/local/bin/kompose +fi + +# Installing asdf +su - "$USER" -c "git config --global advice.detachedHead false" +su - "$USER" -c "rm -rf ~/.asdf" +su - "$USER" -c "git clone --quiet https://github.com/asdf-vm/asdf.git \ + ~/.asdf \ + --branch v0.8.0" +su - "$USER" -c "echo '. \$HOME/.asdf/asdf.sh' >> ~/.bashrc" + +su - "$USER" -c "source \$HOME/.asdf/asdf.sh \ + && asdf plugin add crystal 2>&1 \ + && asdf install crystal 1.7.3 >/dev/null 2>&1 \ + && asdf global crystal 1.7.3" +