Skip to content

Commit 6b7edf8

Browse files
dcodeIOlukechildsmayankchhabra
authored
Implement external storage
Adds an external storage watcher to files API that listens for DBus events and auto-mounts and -unmounts partitions on external storage devices at the virtual path `/External/label`. Adds routes to query external storage devices and to safely eject a disk. Co-authored-by: Luke Childs <[email protected]> Co-authored-by: Mayank Chhabra <[email protected]>
1 parent 2e9b289 commit 6b7edf8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1458
-31
lines changed

packages/os/umbrelos.Dockerfile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,16 @@ RUN apt-get install --yes sudo nano vim less man iproute2 iputils-ping curl wget
120120
# Install umbreld dependencies
121121
# (many of these can be remove after the apps refactor)
122122
RUN apt-get install --yes python3 fswatch jq rsync git gettext-base gnupg procps dmidecode samba wsdd2 p7zip-full imagemagick ffmpeg
123+
124+
# Support for alternate filesystems
125+
RUN apt-get install --yes ntfs-3g
126+
127+
# TODO: udisks2 recommends eject (2.38.1-5+deb12u3) which is currently missing
128+
RUN apt-get install --yes --no-install-recommends udisks2
129+
123130
# Disable automatically starting smbd at boot so umbreld can initialize it first
124131
RUN systemctl disable smbd.service
132+
125133
# Install Node.js
126134
RUN apt-get install --yes python3 fswatch jq rsync git gettext-base gnupg procps dmidecode
127135
RUN NODE_ARCH=$([ "${TARGETARCH}" = "arm64" ] && echo "arm64" || echo "x64") && \

packages/ui/public/locales/de.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
"files-action.download": "Herunterladen",
200200
"files-action.download-items": "Lade {{count}} Elemente herunter",
201201
"files-action.drop-to-upload": "Ablegen zum Hochladen",
202+
"files-action.eject-disk": "Datenträger auswerfen",
202203
"files-action.empty-trash": "Papierkorb leeren",
203204
"files-action.go-to-path": "Gehe zu...",
204205
"files-action.new-folder": "Neuer Ordner",
@@ -230,6 +231,7 @@
230231
"files-error.copy": "Fehler beim Kopieren: {{message}}",
231232
"files-error.create-folder": "Fehler beim Erstellen des Ordners: {{message}}",
232233
"files-error.delete": "Fehler beim Löschen: {{message}}",
234+
"files-error.eject-disk": "Fehler beim Auswerfen des Datenträgers: {{message}}",
233235
"files-error.empty-trash": "Fehler beim Leeren des Papierkorbs: {{message}}",
234236
"files-error.extract": "Fehler beim Extrahieren: {{message}}",
235237
"files-error.move": "Fehler beim Verschieben: {{message}}",
@@ -243,6 +245,8 @@
243245
"files-extension-change.description-remove": "Bist du sicher, dass du die Dateiendung von „{{fileName}}“ entfernen möchtest?",
244246
"files-extension-change.title-add": "Dateiendung in „{{extension}}“ ändern?",
245247
"files-extension-change.title-remove": "Dateiendung entfernen?",
248+
"files-external-storage.unsupported.description": "Dein angeschlossenes externes Laufwerk kann mit diesem Gerät nicht verwendet werden. Die Funktion für externen Speicher ist ausschließlich auf dem Umbrel Home verfügbar.",
249+
"files-external-storage.unsupported.title": "Externer Speicher wird nicht unterstützt",
246250
"files-folder": "Ordner",
247251
"files-listing.empty": "Keine Elemente",
248252
"files-listing.error": "Es ist ein Fehler aufgetreten",
@@ -301,6 +305,7 @@
301305
"files-share.regular-title": "Ordner im Netzwerk freigeben",
302306
"files-share.toggle": "„{{name}}“ in deinem Netzwerk freigeben",
303307
"files-sidebar.apps": "Apps",
308+
"files-sidebar.external-storage": "Externer Speicher",
304309
"files-sidebar.favorites": "Favoriten",
305310
"files-sidebar.home": "Startseite",
306311
"files-sidebar.navigation": "Dateinavigation",
@@ -336,6 +341,7 @@
336341
"files-type.excel": "Excel-Tabelle",
337342
"files-type.exe": "Windows-Ausführbare Datei",
338343
"files-type.executable": "Ausführbare Datei",
344+
"files-type.external-drive": "Laufwerk",
339345
"files-type.flac": "FLAC-Audio",
340346
"files-type.flv": "FLV-Video",
341347
"files-type.gif": "GIF-Bild",

packages/ui/public/locales/en.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
"files-action.download": "Download",
200200
"files-action.download-items": "Download {{count}} items",
201201
"files-action.drop-to-upload": "Drop to upload",
202+
"files-action.eject-disk": "Eject disk",
202203
"files-action.empty-trash": "Empty Trash",
203204
"files-action.go-to-path": "Go to...",
204205
"files-action.new-folder": "New Folder",
@@ -230,6 +231,7 @@
230231
"files-error.copy": "Error copying: {{message}}",
231232
"files-error.create-folder": "Error creating folder: {{message}}",
232233
"files-error.delete": "Error deleting: {{message}}",
234+
"files-error.eject-disk": "Error ejecting disk: {{message}}",
233235
"files-error.empty-trash": "Error emptying trash: {{message}}",
234236
"files-error.extract": "Error extracting: {{message}}",
235237
"files-error.move": "Error moving: {{message}}",
@@ -243,6 +245,8 @@
243245
"files-extension-change.description-remove": "Are you sure you want to remove the extension of '{{fileName}}'?",
244246
"files-extension-change.title-add": "Change extension to '{{extension}}'?",
245247
"files-extension-change.title-remove": "Remove extension?",
248+
"files-external-storage.unsupported.description": "Your connected external drive cannot be used with this device. External storage functionality is exclusively available on the Umbrel Home.",
249+
"files-external-storage.unsupported.title": "External Storage Not Supported",
246250
"files-folder": "Folder",
247251
"files-listing.empty": "No items",
248252
"files-listing.error": "An error occurred",
@@ -301,6 +305,7 @@
301305
"files-share.regular-title": "Share folder over network",
302306
"files-share.toggle": "Share \"{{name}}\" over your network",
303307
"files-sidebar.apps": "Apps",
308+
"files-sidebar.external-storage": "External storage",
304309
"files-sidebar.favorites": "Favorites",
305310
"files-sidebar.home": "Home",
306311
"files-sidebar.navigation": "File navigation",
@@ -336,6 +341,7 @@
336341
"files-type.excel": "Excel Spreadsheet",
337342
"files-type.exe": "Windows Executable",
338343
"files-type.executable": "Executable",
344+
"files-type.external-drive": "Drive",
339345
"files-type.flac": "FLAC Audio",
340346
"files-type.flv": "FLV Video",
341347
"files-type.gif": "GIF Image",

packages/ui/public/locales/es.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
"files-action.download": "Descargar",
200200
"files-action.download-items": "Descargar {{count}} elementos",
201201
"files-action.drop-to-upload": "Suelta para subir",
202+
"files-action.eject-disk": "Expulsar disco",
202203
"files-action.empty-trash": "Vaciar papelera",
203204
"files-action.go-to-path": "Ir a...",
204205
"files-action.new-folder": "Nueva carpeta",
@@ -230,6 +231,7 @@
230231
"files-error.copy": "Error al copiar: {{message}}",
231232
"files-error.create-folder": "Error al crear carpeta: {{message}}",
232233
"files-error.delete": "Error al eliminar: {{message}}",
234+
"files-error.eject-disk": "Error al expulsar el disco: {{message}}",
233235
"files-error.empty-trash": "Error al vaciar la papelera: {{message}}",
234236
"files-error.extract": "Error al extraer: {{message}}",
235237
"files-error.move": "Error al mover: {{message}}",
@@ -243,6 +245,8 @@
243245
"files-extension-change.description-remove": "¿Estás seguro de que quieres quitar la extensión de '{{fileName}}'?",
244246
"files-extension-change.title-add": "¿Cambiar la extensión a '{{extension}}'?",
245247
"files-extension-change.title-remove": "¿Quitar la extensión?",
248+
"files-external-storage.unsupported.description": "La unidad de almacenamiento externo que conectaste no se puede usar con este dispositivo. La funcionalidad de almacenamiento externo está disponible exclusivamente en Umbrel Home.",
249+
"files-external-storage.unsupported.title": "Almacenamiento externo no compatible",
246250
"files-folder": "Carpeta",
247251
"files-listing.empty": "No hay elementos",
248252
"files-listing.error": "Ocurrió un error",
@@ -301,6 +305,7 @@
301305
"files-share.regular-title": "Compartir carpeta en la red",
302306
"files-share.toggle": "Compartir \"{{name}}\" en tu red",
303307
"files-sidebar.apps": "Aplicaciones",
308+
"files-sidebar.external-storage": "Almacenamiento externo",
304309
"files-sidebar.favorites": "Favoritos",
305310
"files-sidebar.home": "Inicio",
306311
"files-sidebar.navigation": "Navegación de archivos",
@@ -336,6 +341,7 @@
336341
"files-type.excel": "Hoja de cálculo de Excel",
337342
"files-type.exe": "Ejecutable de Windows",
338343
"files-type.executable": "Ejecutable",
344+
"files-type.external-drive": "Unidad",
339345
"files-type.flac": "Audio FLAC",
340346
"files-type.flv": "Vídeo FLV",
341347
"files-type.gif": "Imagen GIF",

packages/ui/public/locales/fr.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
"files-action.download": "Télécharger",
200200
"files-action.download-items": "Télécharger {{count}} éléments",
201201
"files-action.drop-to-upload": "Déposez pour importer",
202+
"files-action.eject-disk": "Éjecter le disque",
202203
"files-action.empty-trash": "Vider la corbeille",
203204
"files-action.go-to-path": "Aller à...",
204205
"files-action.new-folder": "Nouveau dossier",
@@ -230,6 +231,7 @@
230231
"files-error.copy": "Erreur lors de la copie : {{message}}",
231232
"files-error.create-folder": "Erreur lors de la création du dossier : {{message}}",
232233
"files-error.delete": "Erreur lors de la suppression : {{message}}",
234+
"files-error.eject-disk": "Erreur lors de l'éjection du disque : {{message}}",
233235
"files-error.empty-trash": "Erreur lors du vidage de la corbeille : {{message}}",
234236
"files-error.extract": "Erreur lors de l’extraction : {{message}}",
235237
"files-error.move": "Erreur lors du déplacement : {{message}}",
@@ -243,6 +245,8 @@
243245
"files-extension-change.description-remove": "Êtes-vous sûr de vouloir supprimer l’extension de « {{fileName}} » ?",
244246
"files-extension-change.title-add": "Changer l’extension en « {{extension}} » ?",
245247
"files-extension-change.title-remove": "Supprimer l’extension ?",
248+
"files-external-storage.unsupported.description": "Votre disque externe connecté ne peut pas être utilisé avec cet appareil. La fonctionnalité de stockage externe est exclusivement disponible sur Umbrel Home.",
249+
"files-external-storage.unsupported.title": "Stockage externe non pris en charge",
246250
"files-folder": "Dossier",
247251
"files-listing.empty": "Aucun élément",
248252
"files-listing.error": "Une erreur s'est produite",
@@ -301,6 +305,7 @@
301305
"files-share.regular-title": "Partager ce dossier sur le réseau",
302306
"files-share.toggle": "Partager « {{name}} » sur votre réseau",
303307
"files-sidebar.apps": "Applications",
308+
"files-sidebar.external-storage": "Stockage externe",
304309
"files-sidebar.favorites": "Favoris",
305310
"files-sidebar.home": "Accueil",
306311
"files-sidebar.navigation": "Navigation des fichiers",
@@ -336,6 +341,7 @@
336341
"files-type.excel": "Feuille de calcul Excel",
337342
"files-type.exe": "Exécutable Windows",
338343
"files-type.executable": "Exécutable",
344+
"files-type.external-drive": "Disque",
339345
"files-type.flac": "Audio FLAC",
340346
"files-type.flv": "Vidéo FLV",
341347
"files-type.gif": "Image GIF",

packages/ui/public/locales/hu.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
"files-action.download": "Letöltés",
200200
"files-action.download-items": "{{count}} elem letöltése",
201201
"files-action.drop-to-upload": "Húzd ide a feltöltéshez",
202+
"files-action.eject-disk": "Lemez kiadása",
202203
"files-action.empty-trash": "Kuka ürítése",
203204
"files-action.go-to-path": "Ugrás ide...",
204205
"files-action.new-folder": "Új mappa",
@@ -230,6 +231,7 @@
230231
"files-error.copy": "Hiba a másolás során: {{message}}",
231232
"files-error.create-folder": "Hiba a mappa létrehozása során: {{message}}",
232233
"files-error.delete": "Hiba a törlés során: {{message}}",
234+
"files-error.eject-disk": "Hiba a lemez kiadásakor: {{message}}",
233235
"files-error.empty-trash": "Hiba a kuka ürítése során: {{message}}",
234236
"files-error.extract": "Hiba a kicsomagolás során: {{message}}",
235237
"files-error.move": "Hiba az áthelyezés során: {{message}}",
@@ -243,6 +245,8 @@
243245
"files-extension-change.description-remove": "Biztosan szeretnéd eltávolítani a(z) „{{fileName}}” fájlkiterjesztését?",
244246
"files-extension-change.title-add": "Kiterjesztés módosítása „{{extension}}”-re?",
245247
"files-extension-change.title-remove": "Kiterjesztés eltávolítása?",
248+
"files-external-storage.unsupported.description": "A csatlakoztatott külső meghajtó nem használható ezen az eszközön. A külső tárhely funkció kizárólag az Umbrel Home-on érhető el.",
249+
"files-external-storage.unsupported.title": "Külső tárhely nem támogatott",
246250
"files-folder": "Mappa",
247251
"files-listing.empty": "Nincsenek elemek",
248252
"files-listing.error": "Hiba történt",
@@ -301,6 +305,7 @@
301305
"files-share.regular-title": "Mappa megosztása a hálózaton",
302306
"files-share.toggle": "„{{name}}” megosztása a hálózatodon",
303307
"files-sidebar.apps": "Alkalmazások",
308+
"files-sidebar.external-storage": "Külső tárhely",
304309
"files-sidebar.favorites": "Kedvencek",
305310
"files-sidebar.home": "Saját mappa",
306311
"files-sidebar.navigation": "Fájlböngészés",
@@ -336,6 +341,7 @@
336341
"files-type.excel": "Excel táblázat",
337342
"files-type.exe": "Windows futtatható fájl",
338343
"files-type.executable": "Futtatható fájl",
344+
"files-type.external-drive": "Meghajtó",
339345
"files-type.flac": "FLAC hang",
340346
"files-type.flv": "FLV videó",
341347
"files-type.gif": "GIF kép",

packages/ui/public/locales/it.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
"files-action.download": "Scarica",
200200
"files-action.download-items": "Scarica {{count}} elementi",
201201
"files-action.drop-to-upload": "Rilascia per caricare",
202+
"files-action.eject-disk": "Espelli disco",
202203
"files-action.empty-trash": "Svuota il Cestino",
203204
"files-action.go-to-path": "Vai a...",
204205
"files-action.new-folder": "Nuova cartella",
@@ -230,6 +231,7 @@
230231
"files-error.copy": "Errore durante la copia: {{message}}",
231232
"files-error.create-folder": "Errore durante la creazione della cartella: {{message}}",
232233
"files-error.delete": "Errore durante l'eliminazione: {{message}}",
234+
"files-error.eject-disk": "Errore durante l'espulsione del disco: {{message}}",
233235
"files-error.empty-trash": "Errore durante lo svuotamento del Cestino: {{message}}",
234236
"files-error.extract": "Errore durante l'estrazione: {{message}}",
235237
"files-error.move": "Errore durante lo spostamento: {{message}}",
@@ -243,6 +245,8 @@
243245
"files-extension-change.description-remove": "Sei sicuro di voler rimuovere l'estensione di '{{fileName}}'?",
244246
"files-extension-change.title-add": "Cambiare l'estensione in '{{extension}}'?",
245247
"files-extension-change.title-remove": "Rimuovere l'estensione?",
248+
"files-external-storage.unsupported.description": "Il tuo disco esterno collegato non può essere usato con questo dispositivo. La funzionalità di archiviazione esterna è disponibile esclusivamente su Umbrel Home.",
249+
"files-external-storage.unsupported.title": "Archiviazione esterna non supportata",
246250
"files-folder": "Cartella",
247251
"files-listing.empty": "Nessun elemento",
248252
"files-listing.error": "Si è verificato un errore",
@@ -301,6 +305,7 @@
301305
"files-share.regular-title": "Condividi cartella sulla rete",
302306
"files-share.toggle": "Condividi \"{{name}}\" sulla tua rete",
303307
"files-sidebar.apps": "App",
308+
"files-sidebar.external-storage": "Archiviazione esterna",
304309
"files-sidebar.favorites": "Preferiti",
305310
"files-sidebar.home": "Home",
306311
"files-sidebar.navigation": "Navigazione file",
@@ -336,6 +341,7 @@
336341
"files-type.excel": "Foglio di calcolo Excel",
337342
"files-type.exe": "Eseguibile Windows",
338343
"files-type.executable": "Eseguibile",
344+
"files-type.external-drive": "Disco",
339345
"files-type.flac": "Audio FLAC",
340346
"files-type.flv": "Video FLV",
341347
"files-type.gif": "Immagine GIF",

packages/ui/public/locales/ja.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
"files-action.download": "ダウンロード",
200200
"files-action.download-items": "アイテム{{count}}件をダウンロード",
201201
"files-action.drop-to-upload": "ここにドロップしてアップロード",
202+
"files-action.eject-disk": "ディスクを取り出す",
202203
"files-action.empty-trash": "ゴミ箱を空にする",
203204
"files-action.go-to-path": "移動...",
204205
"files-action.new-folder": "新規フォルダ",
@@ -230,6 +231,7 @@
230231
"files-error.copy": "コピーできませんでした: {{message}}",
231232
"files-error.create-folder": "フォルダを作成できませんでした: {{message}}",
232233
"files-error.delete": "削除できませんでした: {{message}}",
234+
"files-error.eject-disk": "ディスクを取り出せませんでした: {{message}}",
233235
"files-error.empty-trash": "ゴミ箱を空にできませんでした: {{message}}",
234236
"files-error.extract": "解凍できませんでした: {{message}}",
235237
"files-error.move": "移動できませんでした: {{message}}",
@@ -243,6 +245,8 @@
243245
"files-extension-change.description-remove": "「{{fileName}}」の拡張子を削除してもよろしいですか?",
244246
"files-extension-change.title-add": "拡張子を「{{extension}}」に変更しますか?",
245247
"files-extension-change.title-remove": "拡張子を削除しますか?",
248+
"files-external-storage.unsupported.description": "接続された外付けドライブはこのデバイスでは使えません。外部ストレージ機能はUmbrel Homeのみで利用できます。",
249+
"files-external-storage.unsupported.title": "外部ストレージには対応していません",
246250
"files-folder": "フォルダ",
247251
"files-listing.empty": "アイテムがありません",
248252
"files-listing.error": "エラーが発生しました",
@@ -301,6 +305,7 @@
301305
"files-share.regular-title": "ネットワーク経由でフォルダを共有",
302306
"files-share.toggle": "「{{name}}」をネットワーク共有する",
303307
"files-sidebar.apps": "アプリ",
308+
"files-sidebar.external-storage": "外部ストレージ",
304309
"files-sidebar.favorites": "お気に入り",
305310
"files-sidebar.home": "ホーム",
306311
"files-sidebar.navigation": "ファイルナビゲーション",
@@ -336,6 +341,7 @@
336341
"files-type.excel": "Excelスプレッドシート",
337342
"files-type.exe": "Windows実行ファイル",
338343
"files-type.executable": "実行ファイル",
344+
"files-type.external-drive": "ドライブ",
339345
"files-type.flac": "FLACオーディオ",
340346
"files-type.flv": "FLVビデオ",
341347
"files-type.gif": "GIF画像",

packages/ui/public/locales/ko.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
"files-action.download": "다운로드",
200200
"files-action.download-items": "항목 {{count}}개 다운로드",
201201
"files-action.drop-to-upload": "업로드하려면 여기로 끌어다 놓으세요",
202+
"files-action.eject-disk": "디스크 꺼내기",
202203
"files-action.empty-trash": "휴지통 비우기",
203204
"files-action.go-to-path": "이동...",
204205
"files-action.new-folder": "새 폴더",
@@ -230,6 +231,7 @@
230231
"files-error.copy": "복사 중 오류 발생: {{message}}",
231232
"files-error.create-folder": "폴더 생성 중 오류 발생: {{message}}",
232233
"files-error.delete": "삭제 중 오류 발생: {{message}}",
234+
"files-error.eject-disk": "디스크를 꺼내는 중 오류가 발생했어요: {{message}}",
233235
"files-error.empty-trash": "휴지통 비우기 중 오류 발생: {{message}}",
234236
"files-error.extract": "추출 중 오류 발생: {{message}}",
235237
"files-error.move": "이동 중 오류 발생: {{message}}",
@@ -243,6 +245,8 @@
243245
"files-extension-change.description-remove": "정말 '{{fileName}}'의 확장자를 제거하시겠어요?",
244246
"files-extension-change.title-add": "확장자를 '{{extension}}'(으)로 바꾸기?",
245247
"files-extension-change.title-remove": "확장자 제거하기?",
248+
"files-external-storage.unsupported.description": "연결된 외장 드라이브는 이 기기에서 사용할 수 없어요. 외장 스토리지 기능은 Umbrel Home에서만 이용할 수 있어요",
249+
"files-external-storage.unsupported.title": "외장 스토리지를 지원하지 않아요",
246250
"files-folder": "폴더",
247251
"files-listing.empty": "항목이 없습니다",
248252
"files-listing.error": "오류가 발생했어요",
@@ -301,6 +305,7 @@
301305
"files-share.regular-title": "폴더를 네트워크로 공유하기",
302306
"files-share.toggle": "네트워크에서 \"{{name}}\"(을)를 공유하기",
303307
"files-sidebar.apps": "",
308+
"files-sidebar.external-storage": "외장 스토리지",
304309
"files-sidebar.favorites": "즐겨찾기",
305310
"files-sidebar.home": "",
306311
"files-sidebar.navigation": "파일 탐색",
@@ -336,6 +341,7 @@
336341
"files-type.excel": "Excel 스프레드시트",
337342
"files-type.exe": "Windows 실행 파일",
338343
"files-type.executable": "실행 파일",
344+
"files-type.external-drive": "드라이브",
339345
"files-type.flac": "FLAC 오디오",
340346
"files-type.flv": "FLV 비디오",
341347
"files-type.gif": "GIF 이미지",

0 commit comments

Comments
 (0)