-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add configuration management #17
Conversation
|
||
try_partition() { | ||
# Create file system node from partition | ||
#mknod /dev/$1 b $2 $3 2>/dev/null |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hamishcoleman Works without this. Do we need?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
strange - I'm confused as to what is creating the device nodes in that case - this is running on a system with an empty /dev and before udev has hotplugged anything
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was running the script manually so it wasn't tested at the correct state of OS startup
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ah, Doh!
} | ||
|
||
# Mount proc if not already mounted | ||
#mount -t proc proc /proc |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hamishcoleman Works without this. Do we need?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
strange, I dont know what would be mounting proc in this case - this is running before systemd has mounted any filesystems
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same reason. I am running this after all the systemd stuff
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You know, we could add a blockdevice to the qemu test environment and allow that to be used to simply test persistance
# Find conf.d in root of partition and save current configurations in /etc | ||
if [ -d "/mnt/$CONFDIR" ]; then | ||
echo Saving configurations to /dev/$1: "/mnt/$CONFDIR/50-node-config-save.tar.gz" | ||
# TODO Handle symlinks properly (i.e. excluding them from the tar) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right now it tars up everything in /etc and when extracting the tar you end up with a bunch of symlink errors like this:
tar: ./network/if-post-down.d/hostapd: Cannot create symlink to '../../hostapd/ifupdown.sh': Operation not permitted
I guess we should exclude symlinks in the tar?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hamishcoleman this is the biggest problem though
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cannot exclude symlinks - they are vital to be stored as part of the config.
Dont know why you get untar errors - tar quite happily handles creating symlinks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure, but I was also runnings the script not in the expected place
# Check each partition matching sd*[0-9] (e.g. sda1) or mmcblk*p* (e.g. mmcblk0p1) | ||
case $name in | ||
sd*[0-9]|mmcblk*p*) | ||
echo Checking for configuration directory on $name |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right now we only write to partitions with a conf.d
directory. We should include an empty conf.d
in the fat16 we create alongside boot
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is the appropriate place to do this? Is there an obvious common Makefile?
@@ -0,0 +1,36 @@ | |||
# Save current configurations to partition containing conf.d |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hamishcoleman Where shall I place this file?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There isnt really a well named place for non-debian customisations in the repo (I had some ideas, but it didnt come up enough to fix yet) - I think you found the debian/packages.d/systemd.customise.add/usr/local/sbin/ dir which should work for now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It wouldn't automatically run this right? And bin or sbin in this case? System never runs it, it's the administrator of the nodes that may use it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sbin is for tools that the administrator runs - so it is definitely sbin
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Local is a bit of a toss up for me. By definition it sorta applies sorta does not.
The /usr/local hierarchy is for use by the system administrator when installing software locally. It needs to be safe from being overwritten when the system software is updated. It may be used for programs and data that are shareable among a group of hosts, but not found in /usr.
Since were not "upgrading" we don't really need local?
# Mount proc if not already mounted | ||
#mount -t proc proc /proc | ||
|
||
cat /proc/partitions | while read major minor size name; do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This reads conf.d
from all partitions. I guess it's okay for now? It'll be a little weird if multiple partitions have configurations because tar archive order rule doesn't apply here cross partitions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we could exit on first found - which has issues if the files are hard to overwrite. we could also collate all the tar files from all the partitions - but that has an unwanted increase in complexity.
by checking all partitions, we try to avoid painting ourselves into an unexpected corner
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Neither first found or collect sort seem better than current. They are just different but just as non-ideal. I suggest keeping it as is and discourage people from having two partitions with conf.d at root, and state current behaviour.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suggested the collect-and-sort method as that is how a lot of things (like systemd) handle multiple sources of config overrides - its an annoying amount of additional work, but could be done if this ever becomes an issue
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On WINDOWS machines, only the FIRST partition is ever recognized OS on usb devices.
Unless you have some reason to put config on partition >2 you could just stick with partition 1 to make it most compatible.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The issue still exists when there are multiple physical disks connected to the board
# Mount proc if not already mounted | ||
#mount -t proc proc /proc | ||
|
||
cat /proc/partitions | while read major minor size name; do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This writes to multiple partitions if they all have conf.d
. We don't expect that to happen and it's probably not a big deal.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I dunno - I'd be wanting it to only save to one of them - perhaps exit after the first found. Perhaps allowing the device name to be given as an optional parameter
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added breaking after first found
if [ -d "/mnt/$CONFDIR" ]; then | ||
confs=$(find /mnt/$CONFDIR -name *.tar.gz) | ||
for conf in $confs; do | ||
echo Applying configurations from /dev/$1: $conf |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not just use "for conf in /mnt/$CONFDIR/*.tar.gz" ?
Using find will traverse subdirs and is not known to be sorted
confs=$(find /mnt/$CONFDIR -name *.tar.gz) | ||
for conf in $confs; do | ||
echo Applying configurations from /dev/$1: $conf | ||
tar --extract --gzip -f $conf -C /etc |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tar will automatically detect the compression type - you can leave off "--gzip"
|
||
try_partition() { | ||
# Create file system node from partition | ||
#mknod /dev/$1 b $2 $3 2>/dev/null |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
as this is run from a booted system, it should not make nodes - udev will do that for us
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed
# Find conf.d in root of partition and save current configurations in /etc | ||
if [ -d "/mnt/$CONFDIR" ]; then | ||
echo Saving configurations to /dev/$1: "/mnt/$CONFDIR/50-node-config-save.tar.gz" | ||
tar --create --gzip -f 50-node-config-save.tar.gz -C /etc . |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the future, we probably want both the tar filename and the source files to be optional parameters - but dont complicate things right now
} | ||
|
||
# Mount proc if not already mounted | ||
#mount -t proc proc /proc |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
as this is running in a booted system, we should not be mounting proc
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed
try_partition $name $major $minor | ||
S=$? | ||
|
||
# Save only to the first partition found with conf.d |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hamishcoleman Break like this after first successful save?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
seems reasonable
@hamishcoleman I haven't tested this yet, and the following two issues remain:
|
Okay so the extract part works. I have:
After first boot:
Then I tested
So then I tried to manually extract the tar to make sure there isn't symlink errors:
No errors. So, everything seems to work at least for the case when I have only a single FAT partition connected to the system. |
To identify the config partition possibly look for the boot directory that identifies the partition created by the mesh-orange instead of conf.d. That way the conf.d files are always internal vs some other random partition that is plugged in (ie usb drive). It would also allow for pulling the sd card out and plugging it into a computer to edit the config files externally (since its the first vfat partition) On the other hand mesh-orange image will overwrite the image and as such the config. |
During the boot sequence the tar tries to extract the files with a timestamps causing allot of warnings about future files (since there is no RTC on the board) Possibly adding
Example of issue (seen on serial console)
|
I also thought about checking for So then I thought about making an additional identifier like |
Are we building a production node here or prototype node. The act of plugging a USB with config files into a device sounds like something you DONT want to do in a production model due to being a easy way to "hack" in. Just a thought. |
If you have physical possession of the device, it is no different to plug a key USB or swap an SD card. I don't see being able to pick up configurations from more than one storage device being a security risk. |
Does this look right for the FAT partition of a Raspberry Pi 2 image? I stuck a
|
boards/common-uboot.mk
Outdated
# $1 is the mtools config file | ||
# $2 is the mtools drive letter | ||
define uboot_confdir | ||
MTOOLSRC=$1 mmd $2conf.d |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you just add this line to the uboot_bootdir macro above, then you dont have to edit every single board config to make it happen. That macro is already described as the place that all needed boot partition actions are done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wanted to make conf.d
creation as an explicit step because it is not required as part of boot. I know the alternative works, but this was done intentionally to not mix two things, even though they all end up in the same boot partition.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In that case, create a super macro ("uboot_doitall"?) that calls both uboot_bootdir and uboot_confdir - they both take the same params and reducing the amount of lines in each board file makes it easier for others to see and port the important parts.
@hamishcoleman Thoughts re: timestamp warnings? #17 (comment) |
See: #6 and https://gist.github.com/hamishcoleman/75de3d6c5040efccf392f984306ea2c2