Compare commits

...

4 commits

8 changed files with 655 additions and 6 deletions

View file

@ -1,6 +1,11 @@
PREFIX=/usr
all: build all: build
prepare:
shards install
build: build:
shards build --error-trace shards build --error-trace
@ -8,4 +13,11 @@ spec: test
test: test:
crystal spec --error-trace crystal spec --error-trace
.PHONY: spec test build all install:
install \
-m 755 \
-o root \
bin/code-preloader \
$(PREFIX)/bin
.PHONY: spec test build all prepare install

View file

@ -19,15 +19,43 @@ ChatGPT.
repositories, performance may not be optimal due to processing constraints and repositories, performance may not be optimal due to processing constraints and
the nature of interactions with ChatGPT. the nature of interactions with ChatGPT.
## Installation ## Prerequisites
To get started with Code-Preloader, ensure that you have Crystal language installed on your system. Follow these steps to install: Before installing and using Code-Preloader, make sure your system meets the
following requirements:
1. **Crystal Language**: Code-Preloader is written in Crystal. Ensure you have
the Crystal programming language installed on your system. For installation
instructions, refer to the [official Crystal language
website](https://crystal-lang.org/install/).
2. **Required Libraries**: The following libraries are necessary for the proper
functioning of Code-Preloader:
* `libevent`: Used for asynchronous event notification.
* `libyaml`: Required for YAML parsing.
* `libmagic`: Utilized for file type detection.
* `make`: Used to define compilation rules
On a Debian-based system, you can install these libraries using the following
command:
```bash ```bash
git clone https://code.apps.glenux.net/glenux/chatgpt-preloader sudo apt-get install libevent-dev libyaml-dev libmagic-dev make
```
## Installation
To get started with Code-Preloader, ensure that you have the prerequisites
installed on your system (see above).
Then follow these steps to install:
```bash
git clone https://code.apps.glenux.net/glenux/code-preloader
cd code-preloader cd code-preloader
shards install make prepare
shards build make build
make install
``` ```
## Usage ## Usage

34
Vagrantfile vendored Normal file
View file

@ -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: 'misc/vagrant-provision/base.sh'
end

114
misc/SCRIPT.md Normal file
View file

@ -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*!

373
misc/record-output.sh Normal file
View file

@ -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

View file

@ -0,0 +1,32 @@
#!/bin/sh
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 mfm requirements"
# apt-get install -y \
# fzf \
# sshfs \
# httpdirfs \
# libyaml-0-2 \
# libyaml-dev \
# libpcre3-dev \
# libevent-dev

View file

@ -0,0 +1,34 @@
#!/bin/sh
# install crystal
set -e
set -u
USER="$(test -d /vagrant && echo "vagrant" || echo "debian")"
HOSTNAME="$(hostname)"
export DEBIAN_FRONTEND=noninteractive
echo "Installing mfm requirements"
apt-get install -y \
fzf \
sshfs \
httpdirfs \
libyaml-0-2 \
libyaml-dev \
libpcre3-dev \
libevent-dev
# 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"

View file

@ -0,0 +1,22 @@
#!/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
echo "Installing recording requirements"
apt-get install -y \
tmux \
mdp \
bat \
asciinema \
termtosvg