esphome: fix permissions on src file before modifying them
We store esphome in the nix store, which results in its file permissions being 0444. Esphome, when compiling a firmware image, will copy these files from the nix store to a working directory. When updating between versions it will notice these files changed and try to copy the new version over, which would break, because the user had no write permissions on the files. ❯ esphome compile 01e4ac.yml INFO Reading configuration 01e4ac.yml... INFO Detected timezone 'CET' with UTC offset 1 and daylight saving time from 27 March 02:00:00 to 30 October 03:00:00 INFO Generating C++ source... ERROR Error copying file /nix/store/lmzrgl1arqfd98jcss4rsmmy6dbffddn-esphome-1.19.2/lib/python3.8/site-packages/esphome/components/api/api_connection.cpp to 01e4ac/src/esphome/components/api/api_connection.cpp: [Errno 13] Permission denied: '01e4ac/src/esphome/components/api/api_connection.cpp' To fix this we modify chmod to 0644 just before esphome tries a copy operation, which will fix permissions on existing working directories just in time.
This commit is contained in:
parent
0ff9967dac
commit
06d92ba195
@ -21,6 +21,11 @@ python3.pkgs.buildPythonApplication rec {
|
||||
sha256 = "0bz6gkrvn7mwmjsqrazgpy9r64m5jj462v0izgvdymkx8bjd8mpi";
|
||||
};
|
||||
|
||||
patches = [
|
||||
# fix missing write permissions on src files before modifing them
|
||||
./fix-src-permissions.patch
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
# remove all version pinning (E.g tornado==5.1.1 -> tornado)
|
||||
sed -i -e "s/==[0-9.]*//" requirements.txt
|
||||
|
46
pkgs/tools/misc/esphome/fix-src-permissions.patch
Normal file
46
pkgs/tools/misc/esphome/fix-src-permissions.patch
Normal file
@ -0,0 +1,46 @@
|
||||
From f72c5035944065941daaa236b60664657c777726 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Weinelt <hexa@darmstadt.ccc.de>
|
||||
Date: Wed, 23 Jun 2021 04:50:35 +0200
|
||||
Subject: [PATCH] Set u+w for copied src files before trying to overwrite them
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
We store esphome in the nix store, which results in its file permissions
|
||||
being 0444. Esphome, when compiling a firmware image, will copy these
|
||||
files from the nix store to a working directory. When updating between
|
||||
versions it will notice these files changed and try to copy the new
|
||||
version over, which would break, because the user had no write
|
||||
permissions on the files.
|
||||
|
||||
❯ esphome compile 01e4ac.yml
|
||||
INFO Reading configuration 01e4ac.yml...
|
||||
INFO Detected timezone 'CET' with UTC offset 1 and daylight saving time from 27 March 02:00:00 to 30 October 03:00:00
|
||||
INFO Generating C++ source...
|
||||
ERROR Error copying file /nix/store/lmzrgl1arqfd98jcss4rsmmy6dbffddn-esphome-1.19.2/lib/python3.8/site-packages/esphome/components/api/api_connection.cpp to 01e4ac/src/esphome/components/api/api_connection.cpp: [Errno 13] Permission denied: '01e4ac/src/esphome/components/api/api_connection.cpp'
|
||||
|
||||
To fix this we modify chmod to 0644 just before esphome tries a copy
|
||||
operation, which will fix permissions on existing working directories
|
||||
just in time.
|
||||
---
|
||||
esphome/helpers.py | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/esphome/helpers.py b/esphome/helpers.py
|
||||
index ad7b8272..c456f4ff 100644
|
||||
--- a/esphome/helpers.py
|
||||
+++ b/esphome/helpers.py
|
||||
@@ -228,6 +228,10 @@ def copy_file_if_changed(src: os.PathLike, dst: os.PathLike) -> None:
|
||||
if file_compare(src, dst):
|
||||
return
|
||||
mkdir_p(os.path.dirname(dst))
|
||||
+ try:
|
||||
+ os.chmod(dst, 0o644)
|
||||
+ except OSError:
|
||||
+ pass
|
||||
try:
|
||||
shutil.copy(src, dst)
|
||||
except OSError as err:
|
||||
--
|
||||
2.31.1
|
||||
|
Loading…
Reference in New Issue
Block a user