module caddy import freeflowuniverse.herolib.osal import freeflowuniverse.herolib.core.pathlib import freeflowuniverse.herolib.core.texttools import freeflowuniverse.herolib.ui.console import freeflowuniverse.herolib.sysadmin.startupmanager import freeflowuniverse.herolib.installers.lang.golang import os pub fn install_caddy_from_release() ! { version := '2.8.4' mut url := '' if core.is_linux_arm()! { url = 'https://github.com/caddyserver/caddy/releases/download/v${version}/caddy_${version}_linux_arm64.tar.gz' } else if core.is_linux_intel()! { url = 'https://github.com/caddyserver/caddy/releases/download/v${version}/caddy_${version}_linux_amd64.tar.gz' } else if core.is_osx_arm()! { url = 'https://github.com/caddyserver/caddy/releases/download/v${version}/caddy_${version}_darwin_arm64.tar.gz' } else if core.is_osx_intel()! { url = 'https://github.com/caddyserver/caddy/releases/download/v${version}/caddy_${version}_darwin_amd64.tar.gz' } else { return error('unsported platform') } mut dest := osal.download( url: url minsize_kb: 10000 expand_dir: '/tmp/caddyserver' )! mut binpath := dest.file_get('caddy')! osal.cmd_add( cmdname: 'caddy' source: binpath.path )! } pub fn plugin_is_installed(plugin_ string) !bool { plugin := plugin_.trim_space() result := osal.exec(cmd: 'caddy list-modules --packages')! mut lines := result.output.split('\n') mut standardard_packages := []string{} mut nonstandardard_packages := []string{} mut standard := true for mut line in lines { line = line.trim_space() if line == '' { continue } if line.starts_with('Standard modules') { standard = false continue } package := line.all_after(' ') if standard { standardard_packages << package } else { nonstandardard_packages << package } } return plugin in standardard_packages || plugin in nonstandardard_packages } pub fn install_caddy_with_xcaddy(plugins []string) ! { xcaddy_version := '0.4.2' caddy_version := '2.8.4' console.print_header('Installing xcaddy') mut url := '' if core.is_linux_arm()! { url = 'https://github.com/caddyserver/xcaddy/releases/download/v${xcaddy_version}/xcaddy_${xcaddy_version}_linux_arm64.tar.gz' } else if core.is_linux_intel()! { url = 'https://github.com/caddyserver/xcaddy/releases/download/v${xcaddy_version}/xcaddy_${xcaddy_version}_linux_amd64.tar.gz' } else if core.is_osx_arm()! { url = 'https://github.com/caddyserver/xcaddy/releases/download/v${xcaddy_version}/xcaddy_${xcaddy_version}_mac_arm64.tar.gz' } else if core.is_osx_intel()! { url = 'https://github.com/caddyserver/xcaddy/releases/download/v${xcaddy_version}/xcaddy_${xcaddy_version}_mac_amd64.tar.gz' } else { return error('unsported platform') } mut dest := osal.download( url: url minsize_kb: 1000 expand_dir: '/tmp/xcaddy_dir' )! mut binpath := dest.file_get('xcaddy')! osal.cmd_add( cmdname: 'xcaddy' source: binpath.path )! console.print_header('Installing Caddy with xcaddy') plugins_str := plugins.map('--with ${it}').join(' ') // Define the xcaddy command to build Caddy with plugins path := '/tmp/caddyserver/caddy' cmd := 'source ${osal.profile_path()!} && xcaddy build v${caddy_version} ${plugins_str} --output ${path}' osal.exec(cmd: cmd)! osal.cmd_add( cmdname: 'caddy' source: path reset: true )! } @[params] pub struct WebConfig { pub mut: path string = '/var/www' domain string } // configure caddy as default webserver & start // node, path, domain // path e.g. /var/www // domain e.g. www.myserver.com pub fn configure_examples(config WebConfig) ! { mut config_file := $tmpl('templates/caddyfile_default') if config.domain.len > 0 { config_file = $tmpl('templates/caddyfile_domain') } install()! os.mkdir_all(config.path)! default_html := '