-
Notifications
You must be signed in to change notification settings - Fork 45
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
Fix updater [WIP] #1241
Fix updater [WIP] #1241
Conversation
@@ -86,60 +88,64 @@ const ( | |||
// NOTE: Update may call os.Exit. | |||
func (u *Updater) Update(updateConfig UpdateConfig) (updated bool, err error) { | |||
if !atomic.CompareAndSwapInt32(&u.updating, 0, 1) { | |||
return false, ErrAlreadyStarted | |||
return false, errors.New("updating already started") |
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 are we replacing this with an inline error?
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 had taken out most of the code in that file and several others, until the point it wouldnt work, so i copied the one function i modified and then git reset.
most of the errors already declared will be taken out, based on my proposal.
i will change it to non-inline errors before all is said and done.
// No update is available. | ||
if version == "" { | ||
return false, nil | ||
u.status.Set("failed checking permissions") |
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.
Is this status we set logged later down the line by the calling function?
u.status.Set(fmt.Sprintf("Installing Skywire %q", version)) | ||
if err := u.aptInstall(); err != nil { | ||
return false, err | ||
if si.OS.Vendor == "arch" { |
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 are not going to implicitly support arch here in the binaries. Please take this out.
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 i will need to implement for testing. None of the code i added for updating .deb was tested yet because i am writing it on arch.
I can remove it before this gets merged or we can discuss more of an appropriate context for this, but if i am able to implement this, it would let me much more easily test the updater on the system it is being developed on.
all of the .deb packages, everything i have done, was first done on arch and tested there and then re-implemented for debian.
it may not be able to be implemented, because of how permissions need to be handled for invoking yay
on archlinux, but i need to try.
u.status.Set("Checking for available package") | ||
available, err := script.Exec(`apt-cache search skywire-bin`).String() | ||
if err != nil { | ||
return false, err |
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 would maybe use fmt.Errorf
here so we can add some additional context to the error. Same goes for below errors that stem from executing apt
commands.
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.
sure
} | ||
u.log.Info("installed skywire-bin") | ||
u.log.Info("updating config and restarting visor") | ||
if _, err := script.Exec(`DMSGPTYTERM=true skywire-autoconfig`).String(); err != nil { |
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.
Will this run if we run apt-update before successfully?
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 should
An additional comment from my side. Instead of checking for the architecture, I would like to just check for the presence of the Skybian build tag. If it is set, we update. Otherwise we do not. Anything that is not a Skybian system can and should be handled differently, namely through the user running |
there is no architecture check that i know of. I am checking the linux distro, which should be at least additionally checked along with the build tag. In the second place, the same binaries are in the same packages used by the images in the same repo used by anyone who installs skywire-bin. The arm binaries could have the skybian build tag, but this wont differentiate a skybian installation from the same package installed outside the skybian image. its possible to switch on the skybian env instead of the build tag. in the second place, if the updater is right, it should be available as part of every package equally (no reason not to) or otherwise there needs to be a carve-out that it will work on amd64 for testing. if its not equally implemented and available for updating all the architecture .deb packages which are available, then we need to take out the updater completely and move it to skybian. it should be separate anyways, i think, but its about to work correctly with a few more changes. no objections to removing all the version checks or otherwise the outline of the update procedure? |
Did you run
make format && make check
?yes
The initial work adds a much abbreviated update process in place of the existing one, without changing much.
Needed / Proposed Changes:
apt
Version Checks
apt update && apt install skywire-bin
will update skywire to the latest version or install it if it is not installed. Packages are not re-installed, by default, withapt install
(correct me if I am wrong).The version checking is entirely unnecessary, all of it. Yet they occupy a substantial part of the code that I was not able to remove it without breaking things.
Prompt for repository configuration
If the repository used for updating the .deb packages is not already configured in the software sources, it is highly abnormal to preform this configuration without the explicit consent of the user.
Secondly, the way this configuration was previously done was no longer congruent with the skybian images (on my fork / in my open PR), and actually conflicting with that (wouldn't detect the existing config and then would redundantly set it in a different file).
This would be the open question - the repository configuration in my skybian fork is provided by the skybian package, which is architecture-specific to arm architectures. This repository configuration could be made a seprate .deb package (and could include the repository signing key) and would then be able to work on amd64. There is no real reason not to do this, from my perspective, and the advantages for testing should be obvious.
So there needs to be a prompt to preform this configuration ; a .deb package would be downloaded from the archive of the apt repo server, and then upon it's installation, skywire-bin would be available to install via
apt
otherwise update without prompting
Clicking the update button should either not prompt the user for confirmation if the repository is set, or it should only give a generic "are you sure you want to install / update?" confirmation dialog.
The visor should restart at the end of the update
Testing
requires:
So in theory, when this can take place, the update button will also function as the installer or a wrapper for the process which installs it, and that should be the easiest thing to test
Still needed
In order for the above outlines process to be robust in terms of using the key that the visor was already running with, when it is being installed by the updater button the key should be passed via environmental variable to skkywire-autoconfig, which will further pass it to the config gen command.
Additionally, the autoconfig script assumes skywire was already running as a systemd service, so there should be some thought given to the transition between the visor running from the source code to the visor running from the installation.