From d6a16358ff59045f42344b37e18d5492fbc007ee Mon Sep 17 00:00:00 2001 From: ai-dev Date: Fri, 10 Oct 2025 16:11:46 +0200 Subject: [PATCH] add samba with old data --- samba/CHANGELOG.md | 146 ++++++++++++++++++ samba/DOCS.md | 126 +++++++++++++++ samba/Dockerfile | 21 +++ samba/README.md | 16 ++ samba/build.yaml | 10 ++ samba/config.yaml | 69 +++++++++ samba/icon.png | Bin 0 -> 13776 bytes samba/logo.png | Bin 0 -> 18379 bytes .../s6-rc.d/init-smbd/dependencies.d/base | 0 .../etc/s6-overlay/s6-rc.d/init-smbd/run | 53 +++++++ .../etc/s6-overlay/s6-rc.d/init-smbd/type | 1 + .../etc/s6-overlay/s6-rc.d/init-smbd/up | 1 + .../s6-rc.d/nmbd/dependencies.d/smbd | 0 .../rootfs/etc/s6-overlay/s6-rc.d/nmbd/finish | 27 ++++ samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/run | 10 ++ samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/type | 1 + .../s6-rc.d/smbd/dependencies.d/init-smbd | 0 .../rootfs/etc/s6-overlay/s6-rc.d/smbd/finish | 27 ++++ samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/run | 10 ++ samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/type | 1 + .../s6-rc.d/user/contents.d/init-smbd | 0 .../s6-overlay/s6-rc.d/user/contents.d/nmbd | 0 .../s6-overlay/s6-rc.d/user/contents.d/smbd | 0 samba/rootfs/usr/share/tempio/smb.gtpl | 136 ++++++++++++++++ samba/translations/en.yaml | 41 +++++ 25 files changed, 696 insertions(+) create mode 100644 samba/CHANGELOG.md create mode 100644 samba/DOCS.md create mode 100644 samba/Dockerfile create mode 100644 samba/README.md create mode 100644 samba/build.yaml create mode 100644 samba/config.yaml create mode 100644 samba/icon.png create mode 100644 samba/logo.png create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/dependencies.d/base create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/run create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/type create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/up create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/dependencies.d/smbd create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/finish create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/run create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/type create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/dependencies.d/init-smbd create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/finish create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/run create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/type create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-smbd create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/nmbd create mode 100644 samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/smbd create mode 100644 samba/rootfs/usr/share/tempio/smb.gtpl create mode 100644 samba/translations/en.yaml diff --git a/samba/CHANGELOG.md b/samba/CHANGELOG.md new file mode 100644 index 0000000..7b6360e --- /dev/null +++ b/samba/CHANGELOG.md @@ -0,0 +1,146 @@ +# Changelog + +## 12.5.2 + +- Avoid binding to disabled network interfaces + +## 12.5.1 + +- Add configurations option to disable Apple devices interoperability. Disabling this setting might be required for file systems that do not support extended attributes such as exFAT. + +## 12.5.0 + +- Add the ability to enable and disable trying to become a local master browser on a subnet + +## 12.4.0 + +- Add the ability to enable and disable specific shares, improving user control over folder access + +## 12.3.3 + +- Enable Samba configurations to improve interoperability with Apple devices + +## 12.3.2 + +- Suppress benign idmap logged error + +## 12.3.1 + +- Handle passwords with backslash correctly + +## 12.3.0 + +- Upgrade Alpine Linux to 3.19 + +## 12.2.0 + +- Decrease Samba log level + +## 12.1.0 + +- Use the new Home Assistant folder for the `config` share +- Add support for accessing public add-on configurations + +## 12.0.0 + +- Temporary remove access to add-on config shares, until Supervisor 2023.11.2 has been rolled out stable +- Revert `config` share name change to avoid user facing change +- Adjust location of Home Assistant config to match latest dev/beta Supervisor +- Migrate add-on layout to S6 Overlay + +## 11.0.0 + +- The `config` share has been renamed to `homeassistant` to match upstream changes. +- Add support for accessing public add-on configurations +- Update to Alpine 3.18 +- Adds HEALTCHECK support + +## 10.0.2 + +- Enable IPv6 ULA and IPv4 link-local addresses by default + +## 10.0.1 + +- Update to Alpine 3.17 + +## 10.0.0 + +BREAKING CHANGE: Don't mangle filenames + +By default, Samba mangles filenames with special characters to ensure +compatibility with really old versions of Windows which have a very limited +charset for filenames. The add-on no longer does this as modern operating +systems do not have these restrictions. + +- Don't mangle filenames (fixes #2541) +- Upgrade Alpine Linux to 3.16 + +## 9.7.0 + +- Upgrade Alpine Linux to 3.15 +- Sign add-on with Codenotary Community Attestation Service (CAS) + +## 9.6.1 + +- Remove lo from interface list +- Exit with error if there are no supported interfaces to run Samba on + +## 9.6.0 + +- Run on all supported interfaces + +## 9.5.1 + +- Add `hassio_api` to add-on configuration + +## 9.5.0 + +- Remove interface options in favor of network + +## 9.4.0 + +- Upgrade Alpine Linux to 3.13 +- Rewrite configuration generation code + +## 9.3.1 + +- Update options schema for passwords + +## 9.3.0 + +- Support new media folder +- Update Samba to 4.12.6 +- Upgrade Alpine Linux to 3.12 + +## 9.2.0 + +- Pin base image version +- Rewrite add-on onto S6 Overlay +- Use default configuration location +- Add support for running in compatibility mode (SMB1/NT1) +- Add dummy files to reduce number of errors/warnings in log output + +## 9.1.0 + +- Allow IPv6 link-local hosts by default, consistent with IPv4 + +## 9.0.0 + +- New option `veto_files` to limit writing of specified files to the share + +## 8.3.0 + +- Fixes a bug in warning log message, causing start failure +- Minor code cleanups + +## 8.2.0 + +- Update from bash to bashio + +## 8.1.0 + +- Update Samba to version 4.8.8 + +## 8.0.0 + +- Fix access to /backup diff --git a/samba/DOCS.md b/samba/DOCS.md new file mode 100644 index 0000000..b8c7c25 --- /dev/null +++ b/samba/DOCS.md @@ -0,0 +1,126 @@ +# Home Assistant Add-on: Samba share + +## Installation + +Follow these steps to get the add-on installed on your system: + +1. Navigate in your Home Assistant frontend to **Settings** -> **Add-ons** -> **Add-on store**. +2. Find the "Samba share" add-on and click it. +3. Click on the "INSTALL" button. + +## How to use + +1. In the configuration section, set a username and password. + You can specify any username and password; these are not related in any way to the login credentials you use to log in to Home Assistant or to log in to the computer with which you will use Samba share. +2. Review the enabled shares. Disable any you do not plan to use. Shares can be re-enabled later if needed. + +## Connection + +If you are on Windows you use `\\\`, if you are on MacOS you use `smb://` to connect to the shares. + +This addon exposes the following directories over smb (samba): + +Directory | Description +-- | -- +`addons` | This is for your local add-ons. +`addon_configs` | This is for the configuration files of your add-ons. +`backup` | This is for your backups. +`config` | This is for your Home Assistant configuration. +`media` | This is for local media files. +`share` | This is for your data that is shared between add-ons and Home Assistant. +`ssl` | This is for your SSL certificates. + +## Configuration + +Add-on configuration: + +```yaml +workgroup: WORKGROUP +local_master: true +username: homeassistant +password: YOUR_PASSWORD +enabled_shares: + - addons + - addon_configs + - backup + - config + - media + - share + - ssl +allow_hosts: + - 10.0.0.0/8 + - 172.16.0.0/12 + - 192.168.0.0/16 + - 169.254.0.0/16 + - fe80::/10 + - fc00::/7 +veto_files: + - "._*" + - ".DS_Store" + - Thumbs.db +compatibility_mode: false +``` + +### Option: `workgroup` (required) + +Change WORKGROUP to reflect your network needs. + +### Option: `local_master` (required) + +Enable to try and become a local master browser on a subnet. + +### Option: `username` (required) + +The username you would like to use to authenticate with the Samba server. + +### Option: `password` (required) + +The password that goes with the username configured for authentication. + +### Option: `enabled_shares` (required) + +List of Samba shares that will be accessible. Any shares removed or commented out of the list will not be accessible. + +### Option: `allow_hosts` (required) + +List of hosts/networks allowed to access the shared folders. + +### Option: `veto_files` (optional) + +List of files that are neither visible nor accessible. Useful to stop clients +from littering the share with temporary hidden files +(e.g., macOS `.DS_Store` or Windows `Thumbs.db` files) + +### Option: `compatibility_mode` + +Setting this option to `true` will enable old legacy Samba protocols +on the Samba add-on. This might solve issues with some clients that cannot +handle the newer protocols, however, it lowers security. Only use this +when you absolutely need it and understand the possible consequences. + +Defaults to `false`. + +### Option: `apple_compatibility_mode` + +Enable Samba configurations to improve interoperability with Apple devices. +This can cause issues with file systems that do not support xattr such as exFAT. + +Defaults to `true`. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Home Assistant Discord Chat Server][discord]. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +In case you've found a bug, please [open an issue on our GitHub][issue]. + +[discord]: https://discord.gg/c5DvZ4e +[forum]: https://community.home-assistant.io +[issue]: https://github.com/home-assistant/addons/issues +[reddit]: https://reddit.com/r/homeassistant +[repository]: https://github.com/hassio-addons/repository diff --git a/samba/Dockerfile b/samba/Dockerfile new file mode 100644 index 0000000..2c2d1fe --- /dev/null +++ b/samba/Dockerfile @@ -0,0 +1,21 @@ +ARG BUILD_FROM +FROM $BUILD_FROM + +# Add env +ENV LANG C.UTF-8 + +# Setup base +RUN \ + apk add --no-cache samba \ + && mkdir -p /var/lib/samba \ + && touch \ + /etc/samba/lmhosts \ + /var/lib/samba/account_policy.tdb \ + /var/lib/samba/registry.tdb \ + /var/lib/samba/winbindd_idmap.tdb + +# Copy data +COPY rootfs / + +HEALTHCHECK \ + CMD smbclient -L '\\localhost' -U '%' -m SMB3 diff --git a/samba/README.md b/samba/README.md new file mode 100644 index 0000000..d9b07ba --- /dev/null +++ b/samba/README.md @@ -0,0 +1,16 @@ +# Home Assistant Add-on: Samba share + +Share your configuration over the network using Windows file sharing. + +![Supports aarch64 Architecture][aarch64-shield] ![Supports amd64 Architecture][amd64-shield] ![Supports armhf Architecture][armhf-shield] ![Supports armv7 Architecture][armv7-shield] ![Supports i386 Architecture][i386-shield] + +## About + +This Add-on allows you to enable file sharing across different operating systems over a network. +It lets you access your config files with Windows and macOS devices. + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg +[i386-shield]: https://img.shields.io/badge/i386-yes-green.svg diff --git a/samba/build.yaml b/samba/build.yaml new file mode 100644 index 0000000..039821f --- /dev/null +++ b/samba/build.yaml @@ -0,0 +1,10 @@ +--- +build_from: + aarch64: ghcr.io/home-assistant/aarch64-base:3.19 + amd64: ghcr.io/home-assistant/amd64-base:3.19 + armhf: ghcr.io/home-assistant/armhf-base:3.19 + armv7: ghcr.io/home-assistant/armv7-base:3.19 + i386: ghcr.io/home-assistant/i386-base:3.19 +codenotary: + signer: notary@home-assistant.io + base_image: notary@home-assistant.io diff --git a/samba/config.yaml b/samba/config.yaml new file mode 100644 index 0000000..cdb4b4c --- /dev/null +++ b/samba/config.yaml @@ -0,0 +1,69 @@ +--- +version: 12.5.2 +slug: samba +name: Samba share +description: Expose Home Assistant folders with SMB/CIFS +url: https://github.com/home-assistant/addons/tree/master/samba +codenotary: notary@home-assistant.io +arch: + - armhf + - armv7 + - aarch64 + - amd64 + - i386 +hassio_api: true +host_network: true +image: homeassistant/{arch}-addon-samba +init: false +map: + - addons:rw + - all_addon_configs:rw + - backup:rw + - homeassistant_config:rw + - media:rw + - share:rw + - ssl:rw + - old_data +options: + username: homeassistant + password: null + workgroup: WORKGROUP + local_master: true + enabled_shares: + - addons + - addon_configs + - backup + - config + - media + - share + - ssl + - old_data + compatibility_mode: false + apple_compatibility_mode: true + veto_files: + - ._* + - .DS_Store + - Thumbs.db + - icon? + - .Trashes + allow_hosts: + - 10.0.0.0/8 + - 172.16.0.0/12 + - 192.168.0.0/16 + - 169.254.0.0/16 + - fe80::/10 + - fc00::/7 +schema: + username: str + password: password + workgroup: str + local_master: bool + enabled_shares: + - "match(^(?i:(addons|addon_configs|backup|config|media|share|ssl))$)" + compatibility_mode: bool + apple_compatibility_mode: bool + veto_files: + - str + allow_hosts: + - str +startup: services diff --git a/samba/icon.png b/samba/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..852981bcc43cafc5c71907d25d60af670d7cd4c5 GIT binary patch literal 13776 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 literal 0 HcmV?d00001 diff --git a/samba/logo.png b/samba/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1c82ba8426ab5395332b6b9a2f6ba758b8094ef2 GIT binary patch literal 18379 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 Z@ISGM`O{+oPCWns002ovPDHLkV1gA%@=5>z literal 0 HcmV?d00001 diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/dependencies.d/base b/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/dependencies.d/base new file mode 100644 index 0000000..e69de29 diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/run b/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/run new file mode 100644 index 0000000..bd94a67 --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/run @@ -0,0 +1,53 @@ +#!/command/with-contenv bashio +# vim: ft=bash +# shellcheck shell=bash +# ============================================================================== +# Prepare the Samba service for running +# ============================================================================== +declare password +declare username +declare -a interfaces=() +export HOSTNAME + +# Check Login data +if ! bashio::config.has_value 'username' || ! bashio::config.has_value 'password'; then + bashio::exit.nok "Setting a username and password is required!" +fi + +bashio::config.require "enabled_shares" "Samba is a tool for sharing folders. Starting it without sharing any folders defeats the purpose." + +# Read hostname from API or setting default "hassio" +HOSTNAME=$(bashio::info.hostname) +if bashio::var.is_empty "${HOSTNAME}"; then + bashio::log.warning "Can't read hostname, using default." + HOSTNAME="hassio" +fi +bashio::log.info "Hostname: ${HOSTNAME}" + +# Get supported interfaces +for interface in $(bashio::network.interfaces); do + interface_enabled=$(bashio::network.enabled "${interface}") + if bashio::var.true "${interface_enabled}"; then + interfaces+=("${interface}") + fi +done +if [ ${#interfaces[@]} -eq 0 ]; then + bashio::exit.nok 'No supported interfaces found to bind on.' +fi +bashio::log.info "Interfaces: $(printf '%s ' "${interfaces[@]}")" + +# Generate Samba configuration. +jq ".interfaces = $(jq -c -n '$ARGS.positional' --args -- "${interfaces[@]}") | + .enabled_shares.[] |= ascii_downcase" /data/options.json \ + | tempio \ + -template /usr/share/tempio/smb.gtpl \ + -out /etc/samba/smb.conf + +# Init user +username=$(bashio::config 'username') +password=$(bashio::config 'password') +addgroup "${username}" +adduser -D -H -G "${username}" -s /bin/false "${username}" + +(echo "$password"; echo "$password") \ + | smbpasswd -a -s -c "/etc/samba/smb.conf" "${username}" diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/type b/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/type @@ -0,0 +1 @@ +oneshot diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/up b/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/up new file mode 100644 index 0000000..1abccc0 --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/init-smbd/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-smbd/run diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/dependencies.d/smbd b/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/dependencies.d/smbd new file mode 100644 index 0000000..e69de29 diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/finish b/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/finish new file mode 100644 index 0000000..25b9f61 --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/finish @@ -0,0 +1,27 @@ +#!/command/with-contenv bashio +# vim: ft=bash +# shellcheck shell=bash +# ============================================================================== +# Take down the S6 supervision tree when nmbd fails +# ============================================================================== +# shellcheck disable=SC2155 +readonly exit_code_container=$( /run/s6-linux-init-container-results/exitcode + fi + [[ "${exit_code_signal}" -eq 15 ]] && exec /run/s6/basedir/bin/halt +elif [[ "${exit_code_service}" -ne 0 ]]; then + if [[ "${exit_code_container}" -eq 0 ]]; then + echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode + fi + exec /run/s6/basedir/bin/halt +fi diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/run b/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/run new file mode 100644 index 0000000..74bb858 --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/run @@ -0,0 +1,10 @@ +#!/command/with-contenv bashio +# vim: ft=bash +# shellcheck shell=bash +# ============================================================================== +# Start nmbd service +# ============================================================================== +exec nmbd \ + --foreground \ + --debug-stdout \ + --no-process-group diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/type b/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/nmbd/type @@ -0,0 +1 @@ +longrun diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/dependencies.d/init-smbd b/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/dependencies.d/init-smbd new file mode 100644 index 0000000..e69de29 diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/finish b/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/finish new file mode 100644 index 0000000..e60184b --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/finish @@ -0,0 +1,27 @@ +#!/command/with-contenv bashio +# vim: ft=bash +# shellcheck shell=bash +# ============================================================================== +# Take down the S6 supervision tree when smbd fails +# ============================================================================== +# shellcheck disable=SC2155 +readonly exit_code_container=$( /run/s6-linux-init-container-results/exitcode + fi + [[ "${exit_code_signal}" -eq 15 ]] && exec /run/s6/basedir/bin/halt +elif [[ "${exit_code_service}" -ne 0 ]]; then + if [[ "${exit_code_container}" -eq 0 ]]; then + echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode + fi + exec /run/s6/basedir/bin/halt +fi diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/run b/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/run new file mode 100644 index 0000000..219d3d4 --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/run @@ -0,0 +1,10 @@ +#!/command/with-contenv bashio +# vim: ft=bash +# shellcheck shell=bash +# ============================================================================== +# Start smbd service +# ============================================================================== +exec smbd \ + --foreground \ + --debug-stdout \ + --no-process-group diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/type b/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/samba/rootfs/etc/s6-overlay/s6-rc.d/smbd/type @@ -0,0 +1 @@ +longrun diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-smbd b/samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-smbd new file mode 100644 index 0000000..e69de29 diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/nmbd b/samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/nmbd new file mode 100644 index 0000000..e69de29 diff --git a/samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/smbd b/samba/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/smbd new file mode 100644 index 0000000..e69de29 diff --git a/samba/rootfs/usr/share/tempio/smb.gtpl b/samba/rootfs/usr/share/tempio/smb.gtpl new file mode 100644 index 0000000..8dbd26d --- /dev/null +++ b/samba/rootfs/usr/share/tempio/smb.gtpl @@ -0,0 +1,136 @@ +[global] + netbios name = {{ env "HOSTNAME" }} + workgroup = {{ .workgroup }} + server string = Samba Home Assistant + local master = {{ .local_master | ternary "yes" "no" }} + + security = user + ntlm auth = yes + idmap config * : backend = tdb + idmap config * : range = 1000000-2000000 + + load printers = no + disable spoolss = yes + + log level = 1 + + bind interfaces only = yes + interfaces = lo {{ .interfaces | join " " }} + hosts allow = 127.0.0.1 {{ .allow_hosts | join " " }} + + {{ if .compatibility_mode }} + client min protocol = NT1 + server min protocol = NT1 + {{ end }} + + mangled names = no + dos charset = CP850 + unix charset = UTF-8 + + {{ if .apple_compatibility_mode }} + vfs objects = catia fruit streams_xattr + {{ end }} + +{{ if (has "config" .enabled_shares) }} +[config] + browseable = yes + writeable = yes + path = /homeassistant + + valid users = {{ .username }} + force user = root + force group = root + veto files = /{{ .veto_files | join "/" }}/ + delete veto files = {{ eq (len .veto_files) 0 | ternary "no" "yes" }} +{{ end }} + +{{ if (has "addons" .enabled_shares) }} +[addons] + browseable = yes + writeable = yes + path = /addons + + valid users = {{ .username }} + force user = root + force group = root + veto files = /{{ .veto_files | join "/" }}/ + delete veto files = {{ eq (len .veto_files) 0 | ternary "no" "yes" }} +{{ end }} + +{{ if (has "addon_configs" .enabled_shares) }} +[addon_configs] + browseable = yes + writeable = yes + path = /addon_configs + + valid users = {{ .username }} + force user = root + force group = root + veto files = /{{ .veto_files | join "/" }}/ + delete veto files = {{ eq (len .veto_files) 0 | ternary "no" "yes" }} +{{ end }} + +{{ if (has "ssl" .enabled_shares) }} +[ssl] + browseable = yes + writeable = yes + path = /ssl + + valid users = {{ .username }} + force user = root + force group = root + veto files = /{{ .veto_files | join "/" }}/ + delete veto files = {{ eq (len .veto_files) 0 | ternary "no" "yes" }} +{{ end }} + +{{ if (has "share" .enabled_shares) }} +[share] + browseable = yes + writeable = yes + path = /share + + valid users = {{ .username }} + force user = root + force group = root + veto files = /{{ .veto_files | join "/" }}/ + delete veto files = {{ eq (len .veto_files) 0 | ternary "no" "yes" }} +{{ end }} + +{{ if (has "backup" .enabled_shares) }} +[backup] + browseable = yes + writeable = yes + path = /backup + + valid users = {{ .username }} + force user = root + force group = root + veto files = /{{ .veto_files | join "/" }}/ + delete veto files = {{ eq (len .veto_files) 0 | ternary "no" "yes" }} +{{ end }} + +{{ if (has "media" .enabled_shares) }} +[media] + browseable = yes + writeable = yes + path = /media + + valid users = {{ .username }} + force user = root + force group = root + veto files = /{{ .veto_files | join "/" }}/ + delete veto files = {{ eq (len .veto_files) 0 | ternary "no" "yes" }} +{{ end }} + +{{ if (has "old_data" .enabled_shares) }} +[old_data] + browseable = yes + writeable = yes + path = /old_data + + valid users = {{ .username }} + force user = root + force group = root + veto files = /{{ .veto_files | join "/" }}/ + delete veto files = {{ eq (len .veto_files) 0 | ternary "no" "yes" }} +{{ end }} diff --git a/samba/translations/en.yaml b/samba/translations/en.yaml new file mode 100644 index 0000000..81d426a --- /dev/null +++ b/samba/translations/en.yaml @@ -0,0 +1,41 @@ +--- +configuration: + username: + name: Username + description: >- + The username you would like to use to authenticate with the Samba server. + password: + name: Password + description: >- + The password that goes with the username configured for authentication. + workgroup: + name: Workgroup + description: Change WORKGROUP to reflect your network needs. + local_master: + name: Local master + description: Enable to try and become a local master browser on a subnet. + enabled_shares: + name: >- + Enabled Shares - allowed values are: + addons, addon_configs, backup, config, media, share, /mnt/old_data or ssl. + description: >- + List of file shares to make available. + Adding a share requires typing its name to add it. + The listed values are the only allowed values. + The configuration cannot be saved if any non-allowed value is in the list. + compatibility_mode: + name: Enable Compatibility Mode + description: >- + Enable this to use old legacy Samba protocols on the Samba add-on. + apple_compatibility_mode: + name: Enable Compatibility Settings for Apple Devices + description: >- + Enable Samba configurations to improve interoperability with Apple + devices. May cause issues with file systems that do not support xattr + such as exFAT. + veto_files: + name: Veto Files + description: List of files that are neither visible nor accessible. + allow_hosts: + name: Allowed Hosts + description: List of hosts/networks allowed to access the shared folders.