Compare commits
14 Commits
7883107bdf
...
v0.1.0
Author | SHA1 | Date | |
---|---|---|---|
9bd8d0c131
|
|||
c2c1672802
|
|||
af87ba5ed1
|
|||
af9f89a7f5
|
|||
6f84053124
|
|||
9c55277924
|
|||
2b7b338742
|
|||
312e570a02
|
|||
d6b1ed1046
|
|||
768a58849d
|
|||
54bc100d2a
|
|||
c2b00f2c3e
|
|||
a580e78d81
|
|||
8acc46c08d
|
2
.devcontainer/Dockerfile
Normal file
2
.devcontainer/Dockerfile
Normal file
@ -0,0 +1,2 @@
|
||||
ARG VARIANT="3.4.2"
|
||||
FROM ghcr.io/rails/devcontainer/images/ruby:${VARIANT}
|
4
.devcontainer/boot.sh
Executable file
4
.devcontainer/boot.sh
Executable file
@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
bundle update --bundler
|
||||
bundler install
|
12
.devcontainer/compose.yml
Normal file
12
.devcontainer/compose.yml
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
services:
|
||||
kubernaut:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
volumes:
|
||||
- ..:/workspace:cached
|
||||
- /var/run/docker.sock:/var/run/docker-host.sock
|
||||
command: sleep infinity
|
||||
memcached:
|
||||
image: memcached:latest
|
20
.devcontainer/devcontainer.json
Normal file
20
.devcontainer/devcontainer.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"dockerComposeFile": "compose.yml",
|
||||
"service": "kubernaut",
|
||||
"workspaceFolder": "/workspace",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"Shopify.ruby-lsp",
|
||||
"ms-azuretools.vscode-docker"
|
||||
]
|
||||
}
|
||||
},
|
||||
"postCreateCommand": ".devcontainer/boot.sh",
|
||||
"forwardPorts": [
|
||||
4567
|
||||
],
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}
|
||||
}
|
||||
}
|
@ -1,7 +1,16 @@
|
||||
---
|
||||
name: Gitea Actions Demo
|
||||
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
||||
on: [push]
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 10 * * *"
|
||||
push:
|
||||
branches:
|
||||
- "**"
|
||||
tags:
|
||||
- "v*.*.*"
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
@ -16,7 +25,7 @@ jobs:
|
||||
- name: Ruby Setup
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: '3.3'
|
||||
ruby-version: '3.4'
|
||||
bundler-cache: true
|
||||
|
||||
- run: bundle install
|
||||
@ -40,9 +49,8 @@ jobs:
|
||||
|
||||
- run: bundle exec rake
|
||||
|
||||
release-image:
|
||||
docker:
|
||||
needs: test
|
||||
if: github.ref == 'refs/heads/main'
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: catthehacker/ubuntu:act-latest
|
||||
@ -55,6 +63,21 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0 # all history for all branches and tags
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
git.kill0.net/ryanc/kubernaut
|
||||
tags: |
|
||||
type=schedule
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
type=sha
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
@ -68,5 +91,6 @@ jobs:
|
||||
- name: Docker build and push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
push: true
|
||||
tags: git.kill0.net/ryanc/kubernaut:latest
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,5 +1,3 @@
|
||||
.bundle
|
||||
.cache
|
||||
.local
|
||||
.ruby-lsp
|
||||
.ash_history
|
||||
/vendor
|
||||
|
9
.vscode/settings.json
vendored
Normal file
9
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"[ruby]": {
|
||||
"editor.defaultFormatter": "Shopify.ruby-lsp"
|
||||
},
|
||||
"rubyLsp.formatter": "standard",
|
||||
"rubyLsp.linters": [
|
||||
"standard"
|
||||
],
|
||||
}
|
15
Dockerfile
15
Dockerfile
@ -9,8 +9,6 @@ RUN <<EOT
|
||||
apk upgrade --no-cache
|
||||
EOT
|
||||
|
||||
RUN mkdir -p /run/app
|
||||
|
||||
|
||||
FROM base AS build
|
||||
|
||||
@ -25,25 +23,12 @@ RUN <<EOT
|
||||
bundle install
|
||||
EOT
|
||||
|
||||
FROM build AS dev
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN <<EOT
|
||||
bundle install
|
||||
EOT
|
||||
|
||||
CMD [ "sleep", "infinity" ]
|
||||
|
||||
FROM base
|
||||
|
||||
# RUN useradd ruby --home /app --shell /bin/sh
|
||||
RUN adduser ruby -h /app -D
|
||||
|
||||
RUN mkdir -p /run/app
|
||||
|
||||
RUN chown ruby:ruby /run/app
|
||||
|
||||
USER ruby:ruby
|
||||
|
||||
COPY --from=build /usr/local/bundle /usr/local/bundle
|
||||
|
2
Gemfile
2
Gemfile
@ -16,8 +16,6 @@ gem "httparty"
|
||||
|
||||
group :development do
|
||||
gem "ruby-lsp"
|
||||
gem "rubocop"
|
||||
gem "rbs"
|
||||
gem "rack-test"
|
||||
gem "rspec"
|
||||
gem "standard"
|
||||
|
36
Gemfile.lock
36
Gemfile.lock
@ -2,7 +2,7 @@ GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
anyflake (0.0.1)
|
||||
ast (2.4.2)
|
||||
ast (2.4.3)
|
||||
base64 (0.2.0)
|
||||
bigdecimal (3.1.8)
|
||||
csv (3.3.0)
|
||||
@ -11,7 +11,7 @@ GEM
|
||||
csv
|
||||
mini_mime (>= 1.0.0)
|
||||
multi_xml (>= 0.5.2)
|
||||
json (2.10.1)
|
||||
json (2.10.2)
|
||||
jwt (2.10.1)
|
||||
base64
|
||||
ksuid (1.0.0)
|
||||
@ -28,7 +28,7 @@ GEM
|
||||
nanoid (2.0.0)
|
||||
nio4r (2.7.4)
|
||||
parallel (1.26.3)
|
||||
parser (3.3.7.1)
|
||||
parser (3.3.7.2)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
prism (1.3.0)
|
||||
@ -65,9 +65,10 @@ GEM
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.13.0)
|
||||
rspec-support (3.13.2)
|
||||
rubocop (1.71.2)
|
||||
rubocop (1.73.2)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (>= 3.17.0)
|
||||
language_server-protocol (~> 3.17.0.2)
|
||||
lint_roller (~> 1.1.0)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.3.0.2)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
@ -75,11 +76,12 @@ GEM
|
||||
rubocop-ast (>= 1.38.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 4.0)
|
||||
rubocop-ast (1.38.1)
|
||||
parser (>= 3.3.1.0)
|
||||
rubocop-performance (1.23.1)
|
||||
rubocop (>= 1.48.1, < 2.0)
|
||||
rubocop-ast (>= 1.31.1, < 2.0)
|
||||
rubocop-ast (1.41.0)
|
||||
parser (>= 3.3.7.2)
|
||||
rubocop-performance (1.24.0)
|
||||
lint_roller (~> 1.1)
|
||||
rubocop (>= 1.72.1, < 2.0)
|
||||
rubocop-ast (>= 1.38.0, < 2.0)
|
||||
ruby-lsp (0.23.11)
|
||||
language_server-protocol (~> 3.17.0)
|
||||
prism (>= 1.2, < 2.0)
|
||||
@ -101,18 +103,18 @@ GEM
|
||||
sinatra (= 4.1.1)
|
||||
tilt (~> 2.0)
|
||||
sorbet-runtime (0.5.11911)
|
||||
standard (1.45.0)
|
||||
standard (1.47.0)
|
||||
language_server-protocol (~> 3.17.0.2)
|
||||
lint_roller (~> 1.0)
|
||||
rubocop (~> 1.71.0)
|
||||
rubocop (~> 1.73.0)
|
||||
standard-custom (~> 1.0.0)
|
||||
standard-performance (~> 1.6)
|
||||
standard-performance (~> 1.7)
|
||||
standard-custom (1.0.2)
|
||||
lint_roller (~> 1.0)
|
||||
rubocop (~> 1.50)
|
||||
standard-performance (1.6.0)
|
||||
standard-performance (1.7.0)
|
||||
lint_roller (~> 1.1)
|
||||
rubocop-performance (~> 1.23.0)
|
||||
rubocop-performance (~> 1.24.0)
|
||||
tilt (2.6.0)
|
||||
ulid (1.4.0)
|
||||
unicode-display_width (3.1.4)
|
||||
@ -137,9 +139,7 @@ DEPENDENCIES
|
||||
rack-test
|
||||
rackup
|
||||
rake
|
||||
rbs
|
||||
rspec
|
||||
rubocop
|
||||
ruby-lsp
|
||||
sinatra
|
||||
sinatra-contrib
|
||||
@ -148,4 +148,4 @@ DEPENDENCIES
|
||||
uuid7
|
||||
|
||||
BUNDLED WITH
|
||||
2.5.13
|
||||
2.6.6
|
||||
|
57
app.rb
57
app.rb
@ -25,10 +25,10 @@ SESSION_SECRET_HEX_LENGTH = 64
|
||||
JWT_SECRET_HEX_LENGTH = 64
|
||||
DEFAULT_FLAKEY = 50
|
||||
|
||||
ENV_PREFIX = "KUBERNAUT"
|
||||
NAME = "kubernaut".freeze
|
||||
ENV_PREFIX = NAME.upcase
|
||||
|
||||
CLK_TCK = 100
|
||||
PID_FILE_PATH = "/run/app/pid".freeze
|
||||
PROC_UPTIME_PATH = "/proc/uptime".freeze
|
||||
|
||||
SECONDS_PER_YEAR = 31_556_952
|
||||
@ -109,7 +109,7 @@ end
|
||||
|
||||
class TickTock
|
||||
def initialize
|
||||
@pid = master_pid
|
||||
@pid = ppid
|
||||
@procfs_f = format "/proc/%s/stat", @pid
|
||||
puts @pid
|
||||
end
|
||||
@ -178,9 +178,22 @@ class Sleep
|
||||
end
|
||||
end
|
||||
|
||||
def master_pid
|
||||
pid_s = File.read PID_FILE_PATH
|
||||
Integer pid_s.strip
|
||||
def ppid
|
||||
pid = Process.pid
|
||||
# self
|
||||
ps = File.open "/proc/#{pid}/stat", &:readline
|
||||
ps = ps.split(" ")
|
||||
ppid = Integer(ps[3])
|
||||
|
||||
# ppid
|
||||
ps = File.open "/proc/#{ppid}/stat", &:readline
|
||||
ps = ps.split(" ")
|
||||
|
||||
if ps[1].include? "ruby"
|
||||
ppid
|
||||
else
|
||||
pid
|
||||
end
|
||||
end
|
||||
|
||||
def system_uptime
|
||||
@ -267,6 +280,10 @@ helpers do
|
||||
@auth.credentials and
|
||||
@auth.credentials == ["qwer", "asdf"]
|
||||
end
|
||||
|
||||
def hostname
|
||||
ENV["HOSTNAME"]
|
||||
end
|
||||
end
|
||||
|
||||
get "/" do
|
||||
@ -350,19 +367,19 @@ get "/snowflake" do
|
||||
end
|
||||
|
||||
post "/quit" do
|
||||
Process.kill("TERM", master_pid)
|
||||
Process.kill("TERM", ppid)
|
||||
nil
|
||||
end
|
||||
|
||||
post "/halt" do
|
||||
Process.kill("QUIT", master_pid)
|
||||
Process.kill("QUIT", ppid)
|
||||
nil
|
||||
end
|
||||
|
||||
get "/pid" do
|
||||
pretty = params.key? :pretty
|
||||
|
||||
jsonify({puma: master_pid, pid: Process.pid}, pretty:)
|
||||
jsonify({ppid: ppid, pid: Process.pid}, pretty:)
|
||||
end
|
||||
|
||||
get "/token" do
|
||||
@ -405,6 +422,20 @@ get "/config", provides: "json" do
|
||||
jsonify config.as_json, pretty:
|
||||
end
|
||||
|
||||
get "/_cat" do
|
||||
stream do |out|
|
||||
out << "=^.^=\n"
|
||||
x = Sinatra::Application.routes.map do |method, route|
|
||||
route.map do |route|
|
||||
route.first.to_s
|
||||
end
|
||||
end
|
||||
x.flatten.sort.uniq.each do |route|
|
||||
out << "#{route}\n" if route.start_with? "/_cat"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
get "/_cat/headers" do
|
||||
stream do |out|
|
||||
req_headers.each do |k, v|
|
||||
@ -444,6 +475,14 @@ get "/_cat/config" do
|
||||
end
|
||||
end
|
||||
|
||||
get "/_cat/pid" do
|
||||
stream do |out|
|
||||
{ppid: ppid, pid: Process.pid}.sort.each do |k, v|
|
||||
out << "#{k}=#{v}\n"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
route :delete, :get, :patch, :post, :put, "/status/:code" do
|
||||
# hello
|
||||
code = Integer(params[:code])
|
||||
|
@ -1,3 +0,0 @@
|
||||
# workers 3
|
||||
pidfile "/run/app/pid"
|
||||
preload_app!
|
@ -1,15 +0,0 @@
|
||||
services:
|
||||
web:
|
||||
build:
|
||||
context: .
|
||||
target: dev
|
||||
ports:
|
||||
- "4567:4567"
|
||||
volumes:
|
||||
- .:/app
|
||||
environment:
|
||||
{}
|
||||
# WEB_CONCURRENCY: 3
|
||||
command:
|
||||
- sleep
|
||||
- infinity
|
63
sig/app.rbs
63
sig/app.rbs
@ -1,63 +0,0 @@
|
||||
module State
|
||||
def enable: () -> untyped
|
||||
|
||||
def disable: () -> (untyped | nil)
|
||||
|
||||
def enabled?: () -> bool
|
||||
|
||||
def toggle: () -> untyped
|
||||
end
|
||||
|
||||
module UpDown
|
||||
def up: () -> untyped
|
||||
|
||||
def down: () -> untyped
|
||||
|
||||
def to_s: () -> ("up" | "down")
|
||||
|
||||
def to_json: (*untyped _args) -> (nil | untyped)
|
||||
end
|
||||
|
||||
class Health
|
||||
@file: untyped
|
||||
|
||||
include Singleton
|
||||
|
||||
include State
|
||||
|
||||
include UpDown
|
||||
|
||||
def initialize: () -> void
|
||||
|
||||
def healthy?: () -> bool
|
||||
end
|
||||
|
||||
class Ready
|
||||
@file: untyped
|
||||
|
||||
include Singleton
|
||||
|
||||
include State
|
||||
|
||||
include UpDown
|
||||
|
||||
def initialize: () -> void
|
||||
|
||||
def ready?: () -> bool
|
||||
end
|
||||
|
||||
class Sleep
|
||||
@file: untyped
|
||||
|
||||
include Singleton
|
||||
|
||||
include State
|
||||
|
||||
def initialize: () -> void
|
||||
|
||||
def asleep?: () -> bool
|
||||
|
||||
def wake: () -> untyped
|
||||
|
||||
def sleep: () -> untyped
|
||||
end
|
Reference in New Issue
Block a user