diff options
author | Sven-Hendrik Haase <svenstaro@gmail.com> | 2023-07-05 17:19:12 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-05 17:19:12 +0000 |
commit | 91d5bd1bd530b8e8889baa0dd77b48872ef513ff (patch) | |
tree | 15aa105eb1abb297c04b43d8a9ec695b72cc4477 /src | |
parent | Bump deps (diff) | |
parent | Add CHANGELOG entry for #1160 (diff) | |
download | miniserve-91d5bd1bd530b8e8889baa0dd77b48872ef513ff.tar.gz miniserve-91d5bd1bd530b8e8889baa0dd77b48872ef513ff.zip |
Merge pull request #1160 from svenstaro/env-config
Allow parameters to be provided via env vars
Diffstat (limited to '')
-rw-r--r-- | src/args.rs | 110 |
1 files changed, 78 insertions, 32 deletions
diff --git a/src/args.rs b/src/args.rs index 243eecf..f7b42f1 100644 --- a/src/args.rs +++ b/src/args.rs @@ -19,18 +19,18 @@ pub enum MediaType { #[command(name = "miniserve", author, about, version)] pub struct CliArgs { /// Be verbose, includes emitting access logs - #[arg(short = 'v', long = "verbose")] + #[arg(short = 'v', long = "verbose", env = "MINISERVE_VERBOSE")] pub verbose: bool, /// Which path to serve - #[arg(value_hint = ValueHint::AnyPath)] + #[arg(value_hint = ValueHint::AnyPath, env = "MINISERVE_PATH")] pub path: Option<PathBuf>, /// The name of a directory index file to serve, like "index.html" /// /// Normally, when miniserve serves a directory, it creates a listing for that directory. /// However, if a directory contains this file, miniserve will serve that file instead. - #[arg(long, value_hint = ValueHint::FilePath)] + #[arg(long, value_hint = ValueHint::FilePath, env = "MINISERVE_INDEX")] pub index: Option<PathBuf>, /// Activate SPA (Single Page Application) mode @@ -38,11 +38,16 @@ pub struct CliArgs { /// This will cause the file given by --index to be served for all non-existing file paths. In /// effect, this will serve the index file whenever a 404 would otherwise occur in order to /// allow the SPA router to handle the request instead. - #[arg(long, requires = "index")] + #[arg(long, requires = "index", env = "MINISERVE_SPA")] pub spa: bool, /// Port to use - #[arg(short = 'p', long = "port", default_value = "8080")] + #[arg( + short = 'p', + long = "port", + default_value = "8080", + env = "MINISERVE_PORT" + )] pub port: u16, /// Interface to listen on @@ -50,30 +55,41 @@ pub struct CliArgs { short = 'i', long = "interfaces", value_parser(parse_interface), - num_args(1) + num_args(1), + env = "MINISERVE_INTERFACE" )] pub interfaces: Vec<IpAddr>, /// Set authentication. Currently supported formats: /// username:password, username:sha256:hash, username:sha512:hash /// (e.g. joe:123, joe:sha256:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3) - #[arg(short = 'a', long = "auth", value_parser(parse_auth), num_args(1))] + #[arg( + short = 'a', + long = "auth", + value_parser(parse_auth), + num_args(1), + env = "MINISERVE_AUTH" + )] pub auth: Vec<auth::RequiredAuth>, /// Use a specific route prefix - #[arg(long = "route-prefix")] + #[arg(long = "route-prefix", env = "MINISERVE_ROUTE_PREFIX")] pub route_prefix: Option<String>, /// Generate a random 6-hexdigit route - #[arg(long = "random-route", conflicts_with("route_prefix"))] + #[arg( + long = "random-route", + conflicts_with("route_prefix"), + env = "MINISERVE_RANDOM_ROUTE" + )] pub random_route: bool, /// Hide symlinks in listing and prevent them from being followed - #[arg(short = 'P', long = "no-symlinks")] + #[arg(short = 'P', long = "no-symlinks", env = "MINISERVE_NO_SYMLINKS")] pub no_symlinks: bool, /// Show hidden files - #[arg(short = 'H', long = "hidden")] + #[arg(short = 'H', long = "hidden", env = "MINISERVE_HIDDEN")] pub hidden: bool, /// Default color scheme @@ -81,7 +97,8 @@ pub struct CliArgs { short = 'c', long = "color-scheme", default_value = "squirrel", - ignore_case = true + ignore_case = true, + env = "MINISERVE_COLOR_SCHEME" )] pub color_scheme: ThemeSlug, @@ -90,24 +107,35 @@ pub struct CliArgs { short = 'd', long = "color-scheme-dark", default_value = "archlinux", - ignore_case = true + ignore_case = true, + env = "MINISERVE_COLOR_SCHEME_DARK" )] pub color_scheme_dark: ThemeSlug, /// Enable QR code display - #[arg(short = 'q', long = "qrcode")] + #[arg(short = 'q', long = "qrcode", env = "MINISERVE_QRCODE")] pub qrcode: bool, /// Enable file uploading (and optionally specify for which directory) - #[arg(short = 'u', long = "upload-files", value_hint = ValueHint::FilePath, num_args(0..=1), value_delimiter(','))] + #[arg(short = 'u', long = "upload-files", value_hint = ValueHint::FilePath, num_args(0..=1), value_delimiter(','), env = "MINISERVE_ALLOWED_UPLOAD_DIR")] pub allowed_upload_dir: Option<Vec<PathBuf>>, /// Enable creating directories - #[arg(short = 'U', long = "mkdir", requires = "allowed_upload_dir")] + #[arg( + short = 'U', + long = "mkdir", + requires = "allowed_upload_dir", + env = "MINISERVE_MKDIR_ENABLED" + )] pub mkdir_enabled: bool, /// Specify uploadable media types - #[arg(short = 'm', long = "media-type", requires = "allowed_upload_dir")] + #[arg( + short = 'm', + long = "media-type", + requires = "allowed_upload_dir", + env = "MINISERVE_MEDIA_TYPE" + )] pub media_type: Option<Vec<MediaType>>, /// Directly specify the uploadable media type expression @@ -115,55 +143,73 @@ pub struct CliArgs { short = 'M', long = "raw-media-type", requires = "allowed_upload_dir", - conflicts_with = "media_type" + conflicts_with = "media_type", + env = "MINISERVE_RAW_MEDIA_TYPE" )] pub media_type_raw: Option<String>, /// Enable overriding existing files during file upload - #[arg(short = 'o', long = "overwrite-files")] + #[arg(short = 'o', long = "overwrite-files", env = "OVERWRITE_FILES")] pub overwrite_files: bool, /// Enable uncompressed tar archive generation - #[arg(short = 'r', long = "enable-tar")] + #[arg(short = 'r', long = "enable-tar", env = "MINISERVE_ENABLE_TAR")] pub enable_tar: bool, /// Enable gz-compressed tar archive generation - #[arg(short = 'g', long = "enable-tar-gz")] + #[arg(short = 'g', long = "enable-tar-gz", env = "MINISERVE_ENABLE_TAR_GZ")] pub enable_tar_gz: bool, /// Enable zip archive generation /// /// WARNING: Zipping large directories can result in out-of-memory exception /// because zip generation is done in memory and cannot be sent on the fly - #[arg(short = 'z', long = "enable-zip")] + #[arg(short = 'z', long = "enable-zip", env = "MINISERVE_ENABLE_ZIP")] pub enable_zip: bool, /// List directories first - #[arg(short = 'D', long = "dirs-first")] + #[arg(short = 'D', long = "dirs-first", env = "MINISERVE_DIRS_FIRST")] pub dirs_first: bool, /// Shown instead of host in page title and heading - #[arg(short = 't', long = "title")] + #[arg(short = 't', long = "title", env = "MINISERVE_TITLE")] pub title: Option<String>, /// Set custom header for responses - #[arg(long = "header", value_parser(parse_header), num_args(1))] + #[arg( + long = "header", + value_parser(parse_header), + num_args(1), + env = "MINISERVE_HEADER" + )] pub header: Vec<HeaderMap>, /// Visualize symlinks in directory listing - #[arg(short = 'l', long = "show-symlink-info")] + #[arg( + short = 'l', + long = "show-symlink-info", + env = "MINISERVE_SHOW_SYMLINK_INFO" + )] pub show_symlink_info: bool, /// Hide version footer - #[arg(short = 'F', long = "hide-version-footer")] + #[arg( + short = 'F', + long = "hide-version-footer", + env = "MINISERVE_HIDE_VERSION_FOOTER" + )] pub hide_version_footer: bool, /// Hide theme selector - #[arg(long = "hide-theme-selector")] + #[arg(long = "hide-theme-selector", env = "MINISERVE_HIDE_THEME_SELECTOR")] pub hide_theme_selector: bool, /// If enabled, display a wget command to recursively download the current directory - #[arg(short = 'W', long = "show-wget-footer")] + #[arg( + short = 'W', + long = "show-wget-footer", + env = "MINISERVE_SHOW_WGET_FOOTER" + )] pub show_wget_footer: bool, /// Generate completion file for a shell @@ -176,16 +222,16 @@ pub struct CliArgs { /// TLS certificate to use #[cfg(feature = "tls")] - #[arg(long = "tls-cert", requires = "tls_key", value_hint = ValueHint::FilePath)] + #[arg(long = "tls-cert", requires = "tls_key", value_hint = ValueHint::FilePath, env = "MINISERVE_TLS_CERT")] pub tls_cert: Option<PathBuf>, /// TLS private key to use #[cfg(feature = "tls")] - #[arg(long = "tls-key", requires = "tls_cert", value_hint = ValueHint::FilePath)] + #[arg(long = "tls-key", requires = "tls_cert", value_hint = ValueHint::FilePath, env = "MINISERVE_TLS_KEY")] pub tls_key: Option<PathBuf>, /// Enable README.md rendering in directories - #[arg(long)] + #[arg(long, env = "MINISERVE_README")] pub readme: bool, } |