Compare commits
3 Commits
v0.1.0
...
d4933fe5e4
Author | SHA1 | Date | |
---|---|---|---|
d4933fe5e4
|
|||
5b4822e4f8
|
|||
629ea6eaee
|
@ -1,2 +0,0 @@
|
|||||||
ARG VARIANT="3.4.2"
|
|
||||||
FROM ghcr.io/rails/devcontainer/images/ruby:${VARIANT}
|
|
@ -1,4 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
bundle update --bundler
|
|
||||||
bundler install
|
|
@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
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
|
|
@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"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,16 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: Gitea Actions Demo
|
name: Gitea Actions Demo
|
||||||
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
||||||
|
on: [push]
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 10 * * *"
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- "**"
|
|
||||||
tags:
|
|
||||||
- "v*.*.*"
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
@ -25,7 +16,7 @@ jobs:
|
|||||||
- name: Ruby Setup
|
- name: Ruby Setup
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: '3.4'
|
ruby-version: '3.3'
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
|
||||||
- run: bundle install
|
- run: bundle install
|
||||||
@ -49,8 +40,9 @@ jobs:
|
|||||||
|
|
||||||
- run: bundle exec rake
|
- run: bundle exec rake
|
||||||
|
|
||||||
docker:
|
release-image:
|
||||||
needs: test
|
needs: test
|
||||||
|
if: github.ref == 'refs/heads/main'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: catthehacker/ubuntu:act-latest
|
image: catthehacker/ubuntu:act-latest
|
||||||
@ -63,21 +55,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0 # all history for all branches and tags
|
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
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
@ -91,6 +68,5 @@ jobs:
|
|||||||
- name: Docker build and push
|
- name: Docker build and push
|
||||||
uses: docker/build-push-action@v5
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: git.kill0.net/ryanc/kubernaut:latest
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,3 +1,5 @@
|
|||||||
.bundle
|
.bundle
|
||||||
|
.cache
|
||||||
|
.local
|
||||||
.ruby-lsp
|
.ruby-lsp
|
||||||
/vendor
|
.ash_history
|
||||||
|
9
.vscode/settings.json
vendored
9
.vscode/settings.json
vendored
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"[ruby]": {
|
|
||||||
"editor.defaultFormatter": "Shopify.ruby-lsp"
|
|
||||||
},
|
|
||||||
"rubyLsp.formatter": "standard",
|
|
||||||
"rubyLsp.linters": [
|
|
||||||
"standard"
|
|
||||||
],
|
|
||||||
}
|
|
15
Dockerfile
15
Dockerfile
@ -9,6 +9,8 @@ RUN <<EOT
|
|||||||
apk upgrade --no-cache
|
apk upgrade --no-cache
|
||||||
EOT
|
EOT
|
||||||
|
|
||||||
|
RUN mkdir -p /run/app
|
||||||
|
|
||||||
|
|
||||||
FROM base AS build
|
FROM base AS build
|
||||||
|
|
||||||
@ -23,12 +25,25 @@ RUN <<EOT
|
|||||||
bundle install
|
bundle install
|
||||||
EOT
|
EOT
|
||||||
|
|
||||||
|
FROM build AS dev
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN <<EOT
|
||||||
|
bundle install
|
||||||
|
EOT
|
||||||
|
|
||||||
|
CMD [ "sleep", "infinity" ]
|
||||||
|
|
||||||
FROM base
|
FROM base
|
||||||
|
|
||||||
# RUN useradd ruby --home /app --shell /bin/sh
|
# RUN useradd ruby --home /app --shell /bin/sh
|
||||||
RUN adduser ruby -h /app -D
|
RUN adduser ruby -h /app -D
|
||||||
|
|
||||||
|
RUN mkdir -p /run/app
|
||||||
|
|
||||||
|
RUN chown ruby:ruby /run/app
|
||||||
|
|
||||||
USER ruby:ruby
|
USER ruby:ruby
|
||||||
|
|
||||||
COPY --from=build /usr/local/bundle /usr/local/bundle
|
COPY --from=build /usr/local/bundle /usr/local/bundle
|
||||||
|
2
Gemfile
2
Gemfile
@ -16,6 +16,8 @@ gem "httparty"
|
|||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "ruby-lsp"
|
gem "ruby-lsp"
|
||||||
|
gem "rubocop"
|
||||||
|
gem "rbs"
|
||||||
gem "rack-test"
|
gem "rack-test"
|
||||||
gem "rspec"
|
gem "rspec"
|
||||||
gem "standard"
|
gem "standard"
|
||||||
|
36
Gemfile.lock
36
Gemfile.lock
@ -2,7 +2,7 @@ GEM
|
|||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
anyflake (0.0.1)
|
anyflake (0.0.1)
|
||||||
ast (2.4.3)
|
ast (2.4.2)
|
||||||
base64 (0.2.0)
|
base64 (0.2.0)
|
||||||
bigdecimal (3.1.8)
|
bigdecimal (3.1.8)
|
||||||
csv (3.3.0)
|
csv (3.3.0)
|
||||||
@ -11,7 +11,7 @@ GEM
|
|||||||
csv
|
csv
|
||||||
mini_mime (>= 1.0.0)
|
mini_mime (>= 1.0.0)
|
||||||
multi_xml (>= 0.5.2)
|
multi_xml (>= 0.5.2)
|
||||||
json (2.10.2)
|
json (2.10.1)
|
||||||
jwt (2.10.1)
|
jwt (2.10.1)
|
||||||
base64
|
base64
|
||||||
ksuid (1.0.0)
|
ksuid (1.0.0)
|
||||||
@ -28,7 +28,7 @@ GEM
|
|||||||
nanoid (2.0.0)
|
nanoid (2.0.0)
|
||||||
nio4r (2.7.4)
|
nio4r (2.7.4)
|
||||||
parallel (1.26.3)
|
parallel (1.26.3)
|
||||||
parser (3.3.7.2)
|
parser (3.3.7.1)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
racc
|
racc
|
||||||
prism (1.3.0)
|
prism (1.3.0)
|
||||||
@ -65,10 +65,9 @@ GEM
|
|||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.13.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-support (3.13.2)
|
rspec-support (3.13.2)
|
||||||
rubocop (1.73.2)
|
rubocop (1.71.2)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
language_server-protocol (~> 3.17.0.2)
|
language_server-protocol (>= 3.17.0)
|
||||||
lint_roller (~> 1.1.0)
|
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.3.0.2)
|
parser (>= 3.3.0.2)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
@ -76,12 +75,11 @@ GEM
|
|||||||
rubocop-ast (>= 1.38.0, < 2.0)
|
rubocop-ast (>= 1.38.0, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 2.4.0, < 4.0)
|
unicode-display_width (>= 2.4.0, < 4.0)
|
||||||
rubocop-ast (1.41.0)
|
rubocop-ast (1.38.1)
|
||||||
parser (>= 3.3.7.2)
|
parser (>= 3.3.1.0)
|
||||||
rubocop-performance (1.24.0)
|
rubocop-performance (1.23.1)
|
||||||
lint_roller (~> 1.1)
|
rubocop (>= 1.48.1, < 2.0)
|
||||||
rubocop (>= 1.72.1, < 2.0)
|
rubocop-ast (>= 1.31.1, < 2.0)
|
||||||
rubocop-ast (>= 1.38.0, < 2.0)
|
|
||||||
ruby-lsp (0.23.11)
|
ruby-lsp (0.23.11)
|
||||||
language_server-protocol (~> 3.17.0)
|
language_server-protocol (~> 3.17.0)
|
||||||
prism (>= 1.2, < 2.0)
|
prism (>= 1.2, < 2.0)
|
||||||
@ -103,18 +101,18 @@ GEM
|
|||||||
sinatra (= 4.1.1)
|
sinatra (= 4.1.1)
|
||||||
tilt (~> 2.0)
|
tilt (~> 2.0)
|
||||||
sorbet-runtime (0.5.11911)
|
sorbet-runtime (0.5.11911)
|
||||||
standard (1.47.0)
|
standard (1.45.0)
|
||||||
language_server-protocol (~> 3.17.0.2)
|
language_server-protocol (~> 3.17.0.2)
|
||||||
lint_roller (~> 1.0)
|
lint_roller (~> 1.0)
|
||||||
rubocop (~> 1.73.0)
|
rubocop (~> 1.71.0)
|
||||||
standard-custom (~> 1.0.0)
|
standard-custom (~> 1.0.0)
|
||||||
standard-performance (~> 1.7)
|
standard-performance (~> 1.6)
|
||||||
standard-custom (1.0.2)
|
standard-custom (1.0.2)
|
||||||
lint_roller (~> 1.0)
|
lint_roller (~> 1.0)
|
||||||
rubocop (~> 1.50)
|
rubocop (~> 1.50)
|
||||||
standard-performance (1.7.0)
|
standard-performance (1.6.0)
|
||||||
lint_roller (~> 1.1)
|
lint_roller (~> 1.1)
|
||||||
rubocop-performance (~> 1.24.0)
|
rubocop-performance (~> 1.23.0)
|
||||||
tilt (2.6.0)
|
tilt (2.6.0)
|
||||||
ulid (1.4.0)
|
ulid (1.4.0)
|
||||||
unicode-display_width (3.1.4)
|
unicode-display_width (3.1.4)
|
||||||
@ -139,7 +137,9 @@ DEPENDENCIES
|
|||||||
rack-test
|
rack-test
|
||||||
rackup
|
rackup
|
||||||
rake
|
rake
|
||||||
|
rbs
|
||||||
rspec
|
rspec
|
||||||
|
rubocop
|
||||||
ruby-lsp
|
ruby-lsp
|
||||||
sinatra
|
sinatra
|
||||||
sinatra-contrib
|
sinatra-contrib
|
||||||
@ -148,4 +148,4 @@ DEPENDENCIES
|
|||||||
uuid7
|
uuid7
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.6.6
|
2.5.13
|
||||||
|
11
Rakefile
11
Rakefile
@ -1,11 +0,0 @@
|
|||||||
begin
|
|
||||||
require "rspec/core/rake_task"
|
|
||||||
RSpec::Core::RakeTask.new(:spec)
|
|
||||||
rescue LoadError
|
|
||||||
end
|
|
||||||
|
|
||||||
require "minitest/test_task"
|
|
||||||
|
|
||||||
Minitest::TestTask.create
|
|
||||||
|
|
||||||
task default: [:test, :spec]
|
|
92
app.rb
92
app.rb
@ -23,12 +23,11 @@ require "config"
|
|||||||
CHUNK_SIZE = 1024**2
|
CHUNK_SIZE = 1024**2
|
||||||
SESSION_SECRET_HEX_LENGTH = 64
|
SESSION_SECRET_HEX_LENGTH = 64
|
||||||
JWT_SECRET_HEX_LENGTH = 64
|
JWT_SECRET_HEX_LENGTH = 64
|
||||||
DEFAULT_FLAKEY = 50
|
|
||||||
|
|
||||||
NAME = "kubernaut".freeze
|
ENV_PREFIX = "KUBERNAUT"
|
||||||
ENV_PREFIX = NAME.upcase
|
|
||||||
|
|
||||||
CLK_TCK = 100
|
CLK_TCK = 100
|
||||||
|
PID_FILE_PATH = "/run/app/pid".freeze
|
||||||
PROC_UPTIME_PATH = "/proc/uptime".freeze
|
PROC_UPTIME_PATH = "/proc/uptime".freeze
|
||||||
|
|
||||||
SECONDS_PER_YEAR = 31_556_952
|
SECONDS_PER_YEAR = 31_556_952
|
||||||
@ -51,7 +50,6 @@ DURATION_PARTS = [
|
|||||||
config = Config.new
|
config = Config.new
|
||||||
|
|
||||||
set :session_secret, config.session_secret.unwrap
|
set :session_secret, config.session_secret.unwrap
|
||||||
set :public_folder, __dir__ + "/static"
|
|
||||||
|
|
||||||
module Sinatra
|
module Sinatra
|
||||||
module RequestHeadersHelper
|
module RequestHeadersHelper
|
||||||
@ -109,7 +107,7 @@ end
|
|||||||
|
|
||||||
class TickTock
|
class TickTock
|
||||||
def initialize
|
def initialize
|
||||||
@pid = ppid
|
@pid = master_pid
|
||||||
@procfs_f = format "/proc/%s/stat", @pid
|
@procfs_f = format "/proc/%s/stat", @pid
|
||||||
puts @pid
|
puts @pid
|
||||||
end
|
end
|
||||||
@ -135,7 +133,7 @@ class Health
|
|||||||
include UpDown
|
include UpDown
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@file = "/dev/shm/healthy"
|
@file = "./healthy"
|
||||||
end
|
end
|
||||||
|
|
||||||
def healthy?
|
def healthy?
|
||||||
@ -149,7 +147,7 @@ class Ready
|
|||||||
include UpDown
|
include UpDown
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@file = "/dev/shm/ready"
|
@file = "./ready"
|
||||||
end
|
end
|
||||||
|
|
||||||
def ready?
|
def ready?
|
||||||
@ -162,7 +160,7 @@ class Sleep
|
|||||||
include State
|
include State
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@file = "/dev/shm/sleep"
|
@file = "./sleep"
|
||||||
end
|
end
|
||||||
|
|
||||||
def asleep?
|
def asleep?
|
||||||
@ -178,22 +176,9 @@ class Sleep
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def ppid
|
def master_pid
|
||||||
pid = Process.pid
|
pid_s = File.read PID_FILE_PATH
|
||||||
# self
|
Integer pid_s.strip
|
||||||
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
|
end
|
||||||
|
|
||||||
def system_uptime
|
def system_uptime
|
||||||
@ -221,13 +206,6 @@ Health.instance.up
|
|||||||
Ready.instance.up
|
Ready.instance.up
|
||||||
Sleep.instance.wake
|
Sleep.instance.wake
|
||||||
|
|
||||||
def flaky(pct = DEFAULT_FLAKEY)
|
|
||||||
r = Random.rand(0..100)
|
|
||||||
unless r < (100 - pct)
|
|
||||||
halt 500, "so unreliable"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
enable :sessions
|
enable :sessions
|
||||||
|
|
||||||
configure do
|
configure do
|
||||||
@ -239,17 +217,6 @@ before do
|
|||||||
sleep(1) while Sleep.instance.asleep? && request.path_info != "/livez/sleep"
|
sleep(1) while Sleep.instance.asleep? && request.path_info != "/livez/sleep"
|
||||||
content_type :text if request.path_info.start_with? "/_cat"
|
content_type :text if request.path_info.start_with? "/_cat"
|
||||||
request.session_options[:skip] = !request.path_info.start_with?("/session")
|
request.session_options[:skip] = !request.path_info.start_with?("/session")
|
||||||
|
|
||||||
if params.has_key? :flaky
|
|
||||||
begin
|
|
||||||
pct = Integer(params[:flaky])
|
|
||||||
pct = pct.clamp(0, 100)
|
|
||||||
rescue => e
|
|
||||||
logger.warn "#{e.message}: falling back to default flaky percentage of #{DEFAULT_FLAKEY}"
|
|
||||||
pct = DEFAULT_FLAKEY
|
|
||||||
end
|
|
||||||
flaky(pct)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
helpers do
|
helpers do
|
||||||
@ -280,10 +247,6 @@ helpers do
|
|||||||
@auth.credentials and
|
@auth.credentials and
|
||||||
@auth.credentials == ["qwer", "asdf"]
|
@auth.credentials == ["qwer", "asdf"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def hostname
|
|
||||||
ENV["HOSTNAME"]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
get "/" do
|
get "/" do
|
||||||
@ -367,19 +330,19 @@ get "/snowflake" do
|
|||||||
end
|
end
|
||||||
|
|
||||||
post "/quit" do
|
post "/quit" do
|
||||||
Process.kill("TERM", ppid)
|
Process.kill("TERM", master_pid)
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
post "/halt" do
|
post "/halt" do
|
||||||
Process.kill("QUIT", ppid)
|
Process.kill("QUIT", master_pid)
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
get "/pid" do
|
get "/pid" do
|
||||||
pretty = params.key? :pretty
|
pretty = params.key? :pretty
|
||||||
|
|
||||||
jsonify({ppid: ppid, pid: Process.pid}, pretty:)
|
jsonify({puma: master_pid, pid: Process.pid}, pretty:)
|
||||||
end
|
end
|
||||||
|
|
||||||
get "/token" do
|
get "/token" do
|
||||||
@ -422,20 +385,6 @@ get "/config", provides: "json" do
|
|||||||
jsonify config.as_json, pretty:
|
jsonify config.as_json, pretty:
|
||||||
end
|
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
|
get "/_cat/headers" do
|
||||||
stream do |out|
|
stream do |out|
|
||||||
req_headers.each do |k, v|
|
req_headers.each do |k, v|
|
||||||
@ -475,14 +424,6 @@ get "/_cat/config" do
|
|||||||
end
|
end
|
||||||
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
|
route :delete, :get, :patch, :post, :put, "/status/:code" do
|
||||||
# hello
|
# hello
|
||||||
code = Integer(params[:code])
|
code = Integer(params[:code])
|
||||||
@ -558,16 +499,13 @@ get "/bytes/:size" do
|
|||||||
generate_bytes(Integer(n))
|
generate_bytes(Integer(n))
|
||||||
end
|
end
|
||||||
|
|
||||||
get "/api/caas" do
|
get "/kitty" do
|
||||||
send_file Dir[__dir__ + "/static/cat*.jpg"].sample
|
|
||||||
end
|
|
||||||
|
|
||||||
get "/meow" do
|
|
||||||
caas_host = ENV.fetch "CAAS_SERVICE_HOST", nil
|
caas_host = ENV.fetch "CAAS_SERVICE_HOST", nil
|
||||||
caas_port = ENV.fetch "CAAS_SERVICE_PORT", nil
|
caas_port = ENV.fetch "CAAS_SERVICE_PORT", nil
|
||||||
url = "http://#{caas_host}:#{caas_port}/"
|
url = "http://#{caas_host}:#{caas_port}/"
|
||||||
unless caas_host && caas_port
|
unless caas_host && caas_port
|
||||||
url = url("/api/caas")
|
# fail-safe url
|
||||||
|
url = "https://i.imgur.com/epzPw7L.jpeg"
|
||||||
end
|
end
|
||||||
tmp_file = Tempfile.open binmode: true do |f|
|
tmp_file = Tempfile.open binmode: true do |f|
|
||||||
# f.chmod 0o644
|
# f.chmod 0o644
|
||||||
|
3
config/puma.rb
Normal file
3
config/puma.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# workers 3
|
||||||
|
pidfile "/run/app/pid"
|
||||||
|
preload_app!
|
15
docker-compose.yml
Normal file
15
docker-compose.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
target: dev
|
||||||
|
ports:
|
||||||
|
- "4567:4567"
|
||||||
|
volumes:
|
||||||
|
- .:/app
|
||||||
|
environment:
|
||||||
|
{}
|
||||||
|
# WEB_CONCURRENCY: 3
|
||||||
|
command:
|
||||||
|
- sleep
|
||||||
|
- infinity
|
@ -10,7 +10,7 @@ class Sensitive
|
|||||||
end
|
end
|
||||||
|
|
||||||
def mask(v)
|
def mask(v)
|
||||||
+"".concat(v[0, @head], @ch * (v.length - (@head + @tail)), v[-@tail, @tail])
|
String.new.concat(v[0, @head], @ch * (v.length - (@head + @tail)), v[-@tail, @tail])
|
||||||
end
|
end
|
||||||
|
|
||||||
def unwrap
|
def unwrap
|
||||||
|
63
sig/app.rbs
Normal file
63
sig/app.rbs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
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
|
BIN
static/cat-1.jpg
BIN
static/cat-1.jpg
Binary file not shown.
Before Width: | Height: | Size: 47 KiB |
BIN
static/cat-2.jpg
BIN
static/cat-2.jpg
Binary file not shown.
Before Width: | Height: | Size: 626 KiB |
BIN
static/cat-3.jpg
BIN
static/cat-3.jpg
Binary file not shown.
Before Width: | Height: | Size: 156 KiB |
Reference in New Issue
Block a user