forked from vieter-v/vieter
Currently broken start of docker wrapper [CI SKIP]
parent
022f8c4fbe
commit
6f86033cd9
2
Makefile
2
Makefile
|
@ -35,7 +35,7 @@ c:
|
||||||
# Run the server in the default 'data' directory
|
# Run the server in the default 'data' directory
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: vieter
|
run: vieter
|
||||||
API_KEY=test DOWNLOAD_DIR=data/downloads REPO_DIR=data/repo PKG_DIR=data/pkgs LOG_LEVEL=DEBUG ./vieter
|
API_KEY=test DOWNLOAD_DIR=data/downloads REPO_DIR=data/repo PKG_DIR=data/pkgs LOG_LEVEL=DEBUG ./vieter server
|
||||||
|
|
||||||
.PHONY: run-prod
|
.PHONY: run-prod
|
||||||
run-prod: prod
|
run-prod: prod
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
module main
|
||||||
|
|
||||||
|
import docker
|
||||||
|
|
||||||
|
fn build() {
|
||||||
|
println(docker.containers() or { panic("yeet") })
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
module docker
|
||||||
|
|
||||||
|
import json
|
||||||
|
import net.urllib
|
||||||
|
|
||||||
|
struct Container {
|
||||||
|
id string
|
||||||
|
names []string
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn containers() ?[]Container {
|
||||||
|
res := docker.get(urllib.parse('/containers/json') ?) ?
|
||||||
|
|
||||||
|
return json.decode([]Container, res.text)
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
module docker
|
||||||
|
|
||||||
|
import net.unix
|
||||||
|
import net.urllib
|
||||||
|
import net.http
|
||||||
|
|
||||||
|
const socket = '/var/run/docker.sock'
|
||||||
|
const buf_len = 1024
|
||||||
|
|
||||||
|
fn request(method string, url urllib.URL) ?http.Response {
|
||||||
|
req := "$method $url.request_uri() HTTP/1.1\nHost: localhost\n\n"
|
||||||
|
|
||||||
|
// Open a connection to the socket
|
||||||
|
mut s := unix.connect_stream(socket) ?
|
||||||
|
|
||||||
|
defer {
|
||||||
|
s.close() ?
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the request to the socket
|
||||||
|
s.write_string(req) ?
|
||||||
|
|
||||||
|
// Wait for the server to respond
|
||||||
|
s.wait_for_write() ?
|
||||||
|
|
||||||
|
mut buf := []byte{len: buf_len}
|
||||||
|
mut res := []byte{}
|
||||||
|
|
||||||
|
mut c := 0
|
||||||
|
|
||||||
|
for {
|
||||||
|
c = s.read(mut buf) or {
|
||||||
|
return error('Failed to read data from socket.')
|
||||||
|
}
|
||||||
|
res << buf[..c]
|
||||||
|
|
||||||
|
if c < buf_len {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode chunked response
|
||||||
|
return http.parse_response(res.bytestr())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(url urllib.URL) ?http.Response {
|
||||||
|
return request('GET', url)
|
||||||
|
}
|
54
src/main.v
54
src/main.v
|
@ -2,7 +2,6 @@ module main
|
||||||
|
|
||||||
import web
|
import web
|
||||||
import os
|
import os
|
||||||
import log
|
|
||||||
import io
|
import io
|
||||||
import repo
|
import repo
|
||||||
|
|
||||||
|
@ -54,50 +53,13 @@ fn reader_to_file(mut reader io.BufferedReader, length int, path string) ? {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// Configure logger
|
if os.args.len == 1 {
|
||||||
log_level_str := os.getenv_opt('LOG_LEVEL') or { 'WARN' }
|
exit_with_message(1, 'No action provided.')
|
||||||
log_level := log.level_from_tag(log_level_str) or {
|
}
|
||||||
exit_with_message(1, 'Invalid log level. The allowed values are FATAL, ERROR, WARN, INFO & DEBUG.')
|
|
||||||
}
|
|
||||||
log_file := os.getenv_opt('LOG_FILE') or { 'vieter.log' }
|
|
||||||
|
|
||||||
mut logger := log.Log{
|
match os.args[1] {
|
||||||
level: log_level
|
'server' { server() }
|
||||||
}
|
'build' { build() }
|
||||||
|
else { exit_with_message(1, 'Unknown action: ${os.args[1]}') }
|
||||||
logger.set_full_logpath(log_file)
|
}
|
||||||
logger.log_to_console_too()
|
|
||||||
|
|
||||||
defer {
|
|
||||||
logger.info('Flushing log file')
|
|
||||||
logger.flush()
|
|
||||||
logger.close()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure web server
|
|
||||||
key := os.getenv_opt('API_KEY') or { exit_with_message(1, 'No API key was provided.') }
|
|
||||||
repo_dir := os.getenv_opt('REPO_DIR') or {
|
|
||||||
exit_with_message(1, 'No repo directory was configured.')
|
|
||||||
}
|
|
||||||
pkg_dir := os.getenv_opt('PKG_DIR') or {
|
|
||||||
exit_with_message(1, 'No package directory was configured.')
|
|
||||||
}
|
|
||||||
dl_dir := os.getenv_opt('DOWNLOAD_DIR') or {
|
|
||||||
exit_with_message(1, 'No download directory was configured.')
|
|
||||||
}
|
|
||||||
|
|
||||||
// This also creates the directories if needed
|
|
||||||
repo := repo.new(repo_dir, pkg_dir) or {
|
|
||||||
logger.error(err.msg)
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
os.mkdir_all(dl_dir) or { exit_with_message(1, 'Failed to create download directory.') }
|
|
||||||
|
|
||||||
web.run(&App{
|
|
||||||
logger: logger
|
|
||||||
api_key: key
|
|
||||||
dl_dir: dl_dir
|
|
||||||
repo: repo
|
|
||||||
}, port)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
module main
|
||||||
|
|
||||||
|
import web
|
||||||
|
import os
|
||||||
|
import log
|
||||||
|
import repo
|
||||||
|
|
||||||
|
fn server() {
|
||||||
|
// Configure logger
|
||||||
|
log_level_str := os.getenv_opt('LOG_LEVEL') or { 'WARN' }
|
||||||
|
log_level := log.level_from_tag(log_level_str) or {
|
||||||
|
exit_with_message(1, 'Invalid log level. The allowed values are FATAL, ERROR, WARN, INFO & DEBUG.')
|
||||||
|
}
|
||||||
|
log_file := os.getenv_opt('LOG_FILE') or { 'vieter.log' }
|
||||||
|
|
||||||
|
mut logger := log.Log{
|
||||||
|
level: log_level
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.set_full_logpath(log_file)
|
||||||
|
logger.log_to_console_too()
|
||||||
|
|
||||||
|
defer {
|
||||||
|
logger.info('Flushing log file')
|
||||||
|
logger.flush()
|
||||||
|
logger.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure web server
|
||||||
|
key := os.getenv_opt('API_KEY') or { exit_with_message(1, 'No API key was provided.') }
|
||||||
|
repo_dir := os.getenv_opt('REPO_DIR') or {
|
||||||
|
exit_with_message(1, 'No repo directory was configured.')
|
||||||
|
}
|
||||||
|
pkg_dir := os.getenv_opt('PKG_DIR') or {
|
||||||
|
exit_with_message(1, 'No package directory was configured.')
|
||||||
|
}
|
||||||
|
dl_dir := os.getenv_opt('DOWNLOAD_DIR') or {
|
||||||
|
exit_with_message(1, 'No download directory was configured.')
|
||||||
|
}
|
||||||
|
|
||||||
|
// This also creates the directories if needed
|
||||||
|
repo := repo.new(repo_dir, pkg_dir) or {
|
||||||
|
logger.error(err.msg)
|
||||||
|
exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
os.mkdir_all(dl_dir) or { exit_with_message(1, 'Failed to create download directory.') }
|
||||||
|
|
||||||
|
web.run(&App{
|
||||||
|
logger: logger
|
||||||
|
api_key: key
|
||||||
|
dl_dir: dl_dir
|
||||||
|
repo: repo
|
||||||
|
}, port)
|
||||||
|
}
|
Loading…
Reference in New Issue