GSOC: Atomic IoT Host Upgrade Daemon Proposal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

I'm a final year undergraduate Computer Science student hoping to
participate in Google's Summer of Code. I'm interested in systems
programming and C, despite having little exposure throughout my degree,
having read K&R and Advanced UNIX Programming in the UNIX Environment
(Richard Stevens) in the past year or so. I'd love to get some
real-world, concrete experience with systems programming and open
source development.

I'm interested in tackling the idea for an automatic host upgrade daemon and
I've outlined my potential approach with some high-level technical detail below.
Does it look like I'm on the right track in my thinking?

Best regards,
Brian.

===========================================================

I propose writing the host upgrade daemon in C.

> - Set up daemon
  This can be done by having init fork and exec our host upgrade
  daemon. Then, we perform necessary set-up calling setsid to
  become the session leader, setting umask to a known value,
  close all open descriptors inherited and open 0,1,2 to log or
  to /dev/null.
  Alternatively, instead of having init fork and exec the daemon
  we could have the daemon be an executable that forks and exits,
  before carrying out the rest of the set-up.

> - Monitor the status of available downloads.
  We can use libcurl (https://curl.haxx.se/libcurl/) to download the
  update and monitor status or, if needed, do some socket programming.

> - Apply the Atomic update delta
  This is an area I'm unsure of how to tackle - how do you programmatically
  update the changed parts of files? Is there pre-existing functionality
  already present?

> - set a "boot once' flag to boot the new version via grub
  We could modify /boot/grub/grub.conf to boot once-only, allowing us to
  boot the new version while also being able to revert if the new version
  fails. Or, we could augment the file to specify the old version as a
  fallback

> - set a hardware watchdog
  A hardware watchdog can be set by writing to the block device
  /dev/watchdog periodically (if the timeout elapses and watchdog is not
  written to, a reboot occurs).

> - initiate a reboot of the system
  use reboot(2)

> - if boot to normal userspace fails the watchdog triggers and it resets
>   to the old version
  This should be covered by the above.

> - if boot succeeds to the point the daemon starts up it then proceeds
    to phase two of the upgrade process.
  This could be handled by checking a flag at the beginning of execution
  of the program. However, since we're rebooting it can be a flag in
  memory, so we could write to a file (maybe the version) and then
  check if the current version is the same as the written one. If it is
  then the reboot failed, else it succeeded and we carry out phase two.

> - unsets watchdog so the OS won't reset
  stop watchdog by writing 'v' to /dev/watchdog and closing the file.

> - checks it can see all required network interfaces
  We can get a linked list of all local network interfaces using
  getifaddrs(3) and check for presence of required interfaces.

> - checks it can resolve addresses and contact the update server
  We can use getaddrinfo() here to verify DNS look-ups are still okay.

> - Check it's connected to all other critical services
  We can use getaddrinfo() and connect(), checking if they were
  successful in order to determine this.

> - Checks it can see all sensors and services are running correctly
  Checking sensors is something I wouldn't be too familiar about.
  We can check processes and services to be present with kill() and
  sig==0.

Some manner of specifying what defines critical services for a
particular device needs to be supplied. The most obvious proposal
would be some file where critical components can be specified.
_______________________________________________
summer-coding mailing list -- summer-coding@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to summer-coding-leave@xxxxxxxxxxxxxxxxxxxxxxx



[Index of Archives]     [Older Fedora Users]     [Fedora Announce]     [Fedora Package Announce]     [EPEL Announce]     [Fedora Magazine]     [Fedora News]     [Fedora Laptop]     [Fedora Cloud]     [Fedora Advisory Board]     [Fedora Education]     [Fedora Security]     [Fedora Scitech]     [Fedora Robotics]     [Fedora Maintainers]     [Fedora Infrastructure]     [Fedora Websites]     [Anaconda Devel]     [Fedora Devel Java]     [Fedora Desktop]     [Fedora Fonts]     [ATA RAID]     [Fedora Marketing]     [Fedora Management Tools]     [Fedora Mentors]     [Fedora Package Review]     [Fedora R Devel]     [Fedora PHP Devel]     [Kickstart]     [Fedora Music]     [Fedora Packaging]     [Centos]     [Fedora SELinux]     [Fedora Legal]     [Fedora Kernel]     [Fedora QA]     [Fedora Triage]     [Fedora OCaml]     [Coolkey]     [Virtualization Tools]     [ET Management Tools]     [Yum Users]     [Yosemite News]     [Maemo Users]     [Gnome Users]     [KDE Users]     [Fedora Tools]     [Fedora Art]     [Fedora Docs]     [Maemo Users]     [Asterisk PBX]     [Fedora Sparc]     [Fedora Universal Network Connector]     [Libvirt Users]     [Fedora ARM]

  Powered by Linux