diff --git a/__pycache__/pyf.cpython-35.pyc b/__pycache__/pyf.cpython-35.pyc index 3e79dd9..a9833e7 100644 Binary files a/__pycache__/pyf.cpython-35.pyc and b/__pycache__/pyf.cpython-35.pyc differ diff --git a/database.txt b/database.txt index 3f8be62..7f9c288 100644 --- a/database.txt +++ b/database.txt @@ -1,11 +1,10 @@ { "raspbian": { + "interval":"0", + "file_name": "raspbian.zip", "file_url":"https://downloads.raspberrypi.org/raspbian_latest", + "test_name":"raspbian_release-notes.txt", "test_url":"http://downloads.raspberrypi.org/raspbian/release_notes.txt", - "interval":"5", - "file_name": "", - "test_name":"", - "test_sha256":"", "last_check":"" } } diff --git a/dist/raspbian.zip b/dist/raspbian.zip new file mode 100644 index 0000000..fbaa509 Binary files /dev/null and b/dist/raspbian.zip differ diff --git a/dist/raspbian_release-notes.txt b/dist/raspbian_release-notes.txt new file mode 100644 index 0000000..6c4bc01 --- /dev/null +++ b/dist/raspbian_release-notes.txt @@ -0,0 +1,346 @@ +2018-11-13: + * Two versions of image created - "base" image has no optional software packages included; "full" image has all optional packages + - Removed from "base" image - LibreOffice, Thonny, Scratch, Scratch 2, Sonic Pi, Minecraft, Python Games, SmartSim, SenseHAT Emulator + - Added to "full" image - Mathematica, BlueJ, Greenfoot, Node-RED, Claws Mail, VNC Viewer + * Python Games and SmartSim added to Recommended Software + * VLC media player with VideoCore hardware acceleration included in image + * Version 3.0.5 of Thonny included + * Modifications to LXDE components to enable local configuration to override global configuration correctly + * Modifications to Appearance Settings to support above configuration changes + * Modifications to various initial config defaults and relevant package to support above configuration changes + * Selecting default option in Appearance Settings now deletes relevant local configuration files + * PiX theme modified so that all changes made in Appearance Settings are in override files rather than in theme files + * Design of scrollbar buttons changed + * Image Viewer moved into Graphics category on main menu + * Recommended Software now installs LibreOffice language support files if needed, and suggests reboot if needed + * Latest version of Pepper Flash plugin included + * Chromium h264ify plugin permissions set correctly by default + * Corrections to various MIME types so that files open in sensible default applications + * Set default timezone to 'Europe/London' + * Linux kernel 4.14.79 + * Raspberry Pi firmware 12e0bf86e08d6067372bc0a45d7e8a10d3113210 +2018-10-09: + * Raspberry Pi 3A+ support + * In startup wizard, assign keyboard to country as per Debian installer recommendations + * In startup wizard, add option to use US keyboard in preference to country-specific option + * In startup wizard, show IP address on first page + * In startup wizard, check for existing wifi network connection and show it if there is one + * In startup wizard, install language support packages for LibreOffice and other applications + * In startup wizard, improve operation with keyboard only and no mouse + * Password change in Raspberry Pi Configuration and startup wizard now works properly if passwords contain shell characters + * Battery indicator plugin modified to cope with Pi-top hardware monitor crashing + * Networking plugin hides wifi password characters by default + * In Scratch 2 GPIO plugin, set pin from dropdown list rather than free text + * In Scratch 2 SenseHAT plugin, swap x and y axis values for LED array + * Include latest Adobe Flash player (31.0.0.108) + * Include latest RealVNC Server (6.3.1) + * Include libav-tools + * Include ssh-import-id + * Removed Mathematica + * Merge in latest third-party code for Bluetooth ALSA interface + * Add ability to prevent software update changing configuration files, by creating ~/.config/.lock file + * Various other small bug fixes, tweaks and changes to text + * Make dhcpcd work with 3G devices + * Add hw acceleration to ffmpeg + * Improved WiFi-BT coexistence parameters + * Run fake-hwclock before systemd-fsck-root + * Raspberry Pi PoE HAT support + * Linux kernel 4.14.71 + * Raspberry Pi firmware 5b49caa17e91d0e64024380119ad739bb201c674 +2018-06-27: + * New first-boot configuration wizard added + * Recommended Software installer added + * Bluej, Greenfoot, NodeRED, Claws Mail, VNC Viewer removed from image - can now be installed from Recommended Applications + * Qpdfview PDF viewer installed instead of Xpdf + * Version 65.0 of Chromium browser included, with latest Flash player + * Volume up / down keys now change by 5% increments and affect currently-selected output device rather than internal device only + * Network plugin now remembers previously-entered WiFi network passwords when prompting for reconnection + * Serial port and serial console can now be switched separately in Raspberry Pi Configuration + * Lxkeymap keyboard language setting application removed - replaced with dialog within Raspberry Pi Configuration + * Wifi country and keyboard language setting dialogs in Raspberry Pi Configuration now callable from other applications + * New version of Piboto font included to render with correct weight under some rogue applications + * Reconnection to Bluetooth audio devices on reboot improved + * Disable click-to-rename behaviour in file manager if single-click selection enabled + * Appearance Settings dialog makes config changes to some Qt files to match selected theme + * MIME file type associations improved + * Multiple desktop management options removed from mouse middle-click menu + * Menu shortcuts to Raspberry Pi website amended + * Python 2 IDLE menu link removed + * Sample Magpi PDF installed in /home/pi/MagPi + * Various minor tweaks, bug fixes and appearance changes + * Bluetooth updates + - Firmware with Bluetooth 4.2 features + - SCO profile suppot added via bthelper.service + * Linux kernel 4.14.50+ + * Raspberry Pi firmware 748fb17992426bb29d99224b93cb962fefbdc833 +2018-04-18: + * Fixed race between wifi-country.service and raspberrypi-net-mods.service + * Linux kernel 4.14.34+ + * Raspberry Pi firmware 5db8e4e1c63178e200d6fbea23ed4a9bf4656658 +2018-03-13: + * Raspberry Pi 3 B+ support + * WiFi is disabled until wireless regulatory domain is set (Pi 3 B+ only) + - The domain can be done through 'Raspberry Pi Configuration' (rc_gui), + 'raspi-config' or by setting 'country=' to an appropriate ISO 3166 + alpha2 country code in /etc/wpa_supplicant/wpa_supplicant.conf. + * Default wireless regulatory domain is now unset + * Added support to desktop for different screen sizes and resolutions, + including multiple preset options in Appearance Settings and pixel doubling + option in Raspberry Pi Configuration + * Version 2.1.16 of Thonny included + * Version 29.0.0.113 of Adobe PepperFlash player included + * Version 1.2.post1 of Pygame Zero included + * Bluetooth plugin now supports connection to Bluetooth LE HID devices + * Network plugin now indicates 5G-compatible APs + * Latest changes to Bluez ALSA service merged + - service now started on CLI boot as well as GUI boot + * Latest changes to dhcpcd networking plugin merged + * Improved support for running on pi-top devices + * Small design changes to PiX theme and icons + * Bug fix - hide spurious window resize handles + * Bug fix - Scratch 2 remote GPIO state block now works correctly + * Updated WiFi Firmware + - brcmfmac43455-sdio 7.45.154 + - brcmfmac43430-sdio 7.45.98.38 + * New packages: + - policykit-1 + - obconf + - python-buttonshim python3-buttonshim + - python-unicornhathd python3-unicornhathd + - python-pantilthat python3-pantilthat + * Linux kernel 4.9.80+ + * Raspberry Pi firmware 3347884c7df574bbabeff6dca63caf686e629699 +2017-11-29: + * Added battery monitor plugin for taskbar - works on x86 images or first-generation Pi-Top + * Added cutdown mode to PCManFM file manager to reduce complexity + * Added ability to rename files in PCManFM by clicking name when selected + * Bug fix in Bluetooth ALSA module to reduce truncation of audio at end of playback + * Various small tweaks, bug fixes and theme modifications + * New kernel and firmware +2017-09-07: + * Disable predictable network interface names for Ethernet devices + * Bug fix for keyboard settings dialog in Raspberry Pi Configuration + * Bug fix for crash on some videos and animations in Chromium + * Bug fix for taskbar crash when running RealVNC server + * Bug fix for reloading projects with extensions in Scratch 2 + * Bug fix for MAC address problem in Bluetooth + * Simple mode and new icons in Thonny + * New Japanese translations in Raspberry Pi Configuration + * Install fonts-droid-fallback for international fonts +2017-08-16: + * Based on Raspbian Stretch (Debian version 9) + * Version 60 of Chromium browser included + * Version 3.0.1 of Sonic Pi included + * Version 6.1.1 of RealVNC included + * Version 0.17.4 of NodeRED included + * Bluetooth audio routed via ALSA rather than Pulseaudio + * SenseHAT extension added to Scratch 2 + * Various desktop applications modified to prompt for sudo password if needed + * lxinput control options for mouse speed simplified + * lxpanel plugins moved into separate packages + * Wireless firmware for Pi 3 and Pi 0W modified to address Broadpwn exploit + * Latest kernel and firmware + * Various small tweaks, bug fixes and theme modifications +2017-07-05: + * New kernel and firmware + * Filesystem created without the metadata_csum feature +2017-06-21: + * Scratch 2 application included + * Thonny Python IDE included + * New icons with thinner outlines + * Volume control more linear in behaviour + * Updated Flash player + * Updated RealVNC server and viewer + * Various tweaks and bugfixes + * New kernel and firmware +2017-04-10: + * Wolfram Mathematica updated to version 11.0.1 + * Adobe Flash Player updated to version 25.0.0.127 + * Use PARTUUID to support USB boot +2017-03-02: + * Updated kernel and firmware (final Pi Zero W support) + * Wolfram Mathematica updated to version 11 + * NOOBS installs now checks for presence of 'ssh' file on the NOOBS partition. +2017-02-16: + * Chromium browser updated to version 56 + * Adobe Flash Player updated to version 24.0.0.221 + * RealVNC Server and Viewer updated to version 6.0.2 (RealVNC Connect) + * Sonic Pi updated to version 2.11 + * Node-RED updated to version 0.15.3 + * Scratch updated to version 120117 + * Detection of SSH enabled with default password moved into PAM + * Updated desktop GL driver to support use of fake KMS option + * Raspberry Pi Configuration and raspi-config allow setting of fixed HDMI resolution + * raspi-config allows enabling of serial hardware independent of serial terminal + * Updates to kernel and firmware + * Various minor bug fixes and usability and appearance tweaks +2017-01-11: + * Re-release of the 2016-11-25 image with a FAT32-formatted boot partition +2016-11-25: + * SSH disabled by default; can be enabled by creating a file with name "ssh" in boot partition + * Prompt for password change at boot when SSH enabled with default password unchanged + * Adobe Flash Player included + * Updates to hardware video acceleration in Chromium browser + * Greeter now uses background image from last set in Appearance Settings rather than pi user + * Updated version of Scratch + * Rastrack option removed from raspi-config and Raspberry Pi Configuration + * Ability to disable graphical boot splash screen added to raspi-config and Raspberry Pi Configuration + * Appearance Settings dialog made tabbed to work better on small screens + * Raspberry Pi Configuration now requires current password to change password + * Various small bug fixes + * Updated firmware and kernel +2016-09-23: + * New PIXEL desktop environment - new icon set, window design, desktop images, splash screen and greeter + * Chromium web browser included + * Infinality font rendering patches included + * RealVNC server and viewer included + * SenseHAT emulator included + * Rfkill entries added to Wifi and Bluetooth panel plugins + * Updates to various standard applications, including Scratch and NodeRED + * Various bug fixes, tweaks and translation updates + * Updated firmware and kernel (https://github.com/raspberrypi/firmware/commit/ad8608c08b122b2c228dba0ff5070d6e9519faf5) +2016-05-27: + * Fixed crash of lxpanel when D-bus not accessible + * Fixed permissions for D-bus Bluetooth access + * Removed sudo from shutdown options + * Appearance of tooltips updated in theme + * Fixed ejecter plugin grabbing focus + * raspi-config command line and GUI apps tidied; unnecessary reboots removed + * More error detection in piclone; copying of volume names and IDs added + * Updated translation files +2016-05-10: + * New version of Scratch, which no longer requires sudo + * New version of BlueJ + * New version of NodeRED + * New version of pypy + * pigpio included + * geany editor included + * SD Card Copier added (can be used to duplicate or back up the Pi) + * Bluetooth plugin added to taskbar + * Volume control on taskbar now compatible with Bluetooth devices + * New shutdown helper application + * Mouse double-click speed setting added to mouse and keyboard preference application + * Option to enable / disable 1-wire interface and remote access to pigpio added to Raspberry Pi config application + * File system automatically expanded on first boot + * Empty Wastebasket option added to right-click menu + * Ctrl-Alt-T can be used to open a terminal window + * Various small bug fixes and appearance tweaks + * Updated firmware and kernel (https://github.com/raspberrypi/firmware/commit/cc6d7bf8b4c03a2a660ff9fdf4083fc165620866) +2016-03-18: + * updated firmware and kernel (https://github.com/raspberrypi/firmware/commit/951799bbcd795ddf27769d14acf4813fdcbe53dc) + * use serial0 in cmdline.txt + * wpa_supplicant.conf country default to GB (allows use of channels 12 and 13) +2016-02-26: + * Support added for Pi 3, including Wifi and Bluetooth + * Option to set wifi country code added to raspi-config +2016-02-09: + * dtb that uses mmc sdcard driver (fixes problems experienced with certain SD cards) +2016-02-03: + * new version of Sonic Pi (2.9) + * new version of Scratch (15/1/16) + * new version of Node-Red (2.5) + * new version of Wolfram (10.3) + * optional experimental GL desktop driver (can be enabled using advanced options in command-line raspi-config) + * new version of Java (1.8.0_65) + * new version of WiringPi + * raspi-gpio included + * ping no longer requires sudo (except NOOBS installs) + * support for more USB audio devices in lxpanel + * bug fix for creation of new menus in Alacarte + * various changes to raspi-config and GUI to tidy up board support and fix bugs, and updated translations + * small tweaks to theme to support GL driver +2015-11-21: + * Included IBM Node-RED IoT application + * Included graphical package manager + * Included accelerated pixman library + * Updated Epiphany browser to improve video compatibility + * Updated Scratch with performance improvements and bug fixes + * Updated Raspberry Pi configuration to allow boot to pause while + network is established + * Various minor bug fixes +2015-09-25: + * Based on Debian Jessie + * Upgraded applications - Epiphany browser, Scratch and Sonic Pi + * Included applications - LibreOffice, Claws Mail, Greenfoot, BlueJ + * Included utilities - Alacarte menu editor, Lxkeymap, scrot, tree, pip + * New GUI-based Raspberry Pi Configuration application + * GPIO control now possible without need for sudo + * Web link to Magpi magazine included + * New taskbar plugin to eject mounted USB drives + * Default boot is now to GUI not desktop + * Look and feel now based on GTK+3 default theme + * Print screen key launches scrot to produce screenshot + * Common keyboards autodetected by GUI and drivers loaded accordingly + * Numerous small tweaks and bugfixes +2015-05-05: + * Updated UI changes + * Updated firmware + * Install raspberrypi-net-mods + * Install avahi-daemon + * Add user pi to new i2c and spi groups + * Modified udev rules for i2c and spi devices +2015-02-16: + * Newer firmware with various fixes + * New Sonic Pi release + * Pi2 compatible RPi.GPIO + * Updated Wolfram Mathematica +2015-01-31: + * Support for Pi2 + * Newer firmware + * New Sonic Pi release + * Updated Scratch + * New Wolfram Mathematica release + * Updated Epiphany +2014-12-24: + * Fix regression with omission of python-pygame +2014-12-22: + * New firmware with variosu fixes and improvements + * New UI configuration for lxde + * Various package updates + * python3-pygame preinstalled + * 'nuscratch', scratch running on the Cog StackVM + * Misc other changes +2014-09-09: + * New firmware with various fixes and improvements + * Minecraft Pi pre-installed + * Sonic Pi upgraded to 2.0 + * Include Epiphany browser work from Collabora + * Switch to Java 8 from Java 7 + * Updated Mathematica + * Misc minor configuration changes +2014-06-20: + * New firmware with various fixes, and kernel bugfix +2014-06-02: + * Many, many firmware updates with major USB improvements + * pyserial installed by default + * picamera installed by default +2014-01-07: + * Firmware updated + * Some space saved on the root filesystem +2013-12-20: + * Firmware updated, includes V4L2 fixes + * Update omxplayer +2013-12-18: + * Firmware updated and now using kernel 3.10. Many, many improvements + * fbturbo XOrg driver is now included and enabled by default. Thanks to + ssvb https://github.com/ssvb/xf86-video-fbturbo + * Update Scratch image with further bug fixes + * Include Wolfram Mathematica + * Update to PyPy 2.2 + * Update omxplayer + * Include v4l-utils for use with experimental V4L2 Raspberry Pi camera driver + * Update squeak-vm to fix issues with loading JPEGs +2013-09-25: + * Update Scratch image for further performance improvements + * Include Oracle JDK + * At least a 4GiB SD card is now required (see above) + * Include PyPy 2.1 + * Include base piface packages + * Update raspi-config to include bugfix for inheriting language settings + from NOOBS +2013-09-10: + * Updated to current top of tree firmware + * Update squeak-vm, including fastblit optimised for the Raspbery Pi + * Include Sonic Pi and a fixed jackd2 package + * Support boot to Scratch + * Inherit keyboard and language settings from NOOBS diff --git a/pyf.py b/pyf.py index 98ac5c3..9aa48ba 100644 --- a/pyf.py +++ b/pyf.py @@ -1,15 +1,8 @@ ''' pyf - a simple python framework ''' -import os -WORKDIR = os.getcwd() - - -TMP = '/tmp/quickos.log' -def log(message): - ''' write to logfile TMP - @param message: the message which shall be written to the log file - ''' +def log(message, log_file): + ''' write @message to @log_file ''' with open(TMP, 'a') as f: f.write('{} {}\n'.format(time.ctime(), message)) @@ -21,9 +14,7 @@ def prt(message): def download(url, file_name, progress=True): - ''' download a given url to a file - @return the absolute filename - ''' + ''' download @url to @file_name ''' from urllib.request import urlretrieve if progress: from tqdm import tqdm @@ -38,3 +29,16 @@ def download(url, file_name, progress=True): urlretrieve(url, filename=file_name, reporthook=t.update_to) else: urlretrieve(url, filename=file_name) + + +def sha256(file_name): + ''' return @string sha256sum of @file_name ''' + import hashlib + block = 65536 + hasher = hashlib.sha256() + with open(file_name, 'rb') as f: + buf = f.read(block) + while len(buf) > 0: + hasher.update(buf) + buf = f.read(block) + return hasher.hexdigest() diff --git a/quickos.py b/quickos.py index 0a264e4..aea97d2 100755 --- a/quickos.py +++ b/quickos.py @@ -7,7 +7,7 @@ import time import argparse import os import json -from pyf import download, prt +from pyf import download, prt, sha256 WORKDIR = os.getcwd() @@ -28,15 +28,6 @@ def init_parser(): return parser.parse_args() -# algo check if new version should be downloaded -# a: is image file there? -# -> no: download image file -# -> yes: goto b -# -# b: is the age of the file older than *today* - *interval* -# -> no: break -# -> yes: goto c -# # c: is there a *testfile_sha256* sum? # -> no: download image file # -> yes: goto d @@ -49,10 +40,18 @@ def check_update(database): ''' check if update is necessary ''' from urllib.parse import urlparse from os import path + from datetime import datetime for name, dist in database.items(): prt('checking operating system {} ...'.format(name)) + if dist['file_url'] == '': + prt('database.txt: `file_url` not specified, skipping ...') + continue + + #TODO check if donwload was successful, if not do stuff if dist['file_name'] == '': + prt('database.txt: `file_name` not specified') + #TODO get real file_name and save it to database.txt file_name = urlparse(dist['file_url']) file_name = file_name.path file_name = '{}/dist/{}'.format(WORKDIR, path.basename(file_name)) @@ -61,9 +60,55 @@ def check_update(database): file_name = '{}/dist/{}'.format(WORKDIR, dist['file_name']) if not path.isfile(file_name): + prt('database.txt: `file_name` {} does not exist on your filesystem'.format(file_name)) download(dist['file_url'], file_name) continue + if dist['interval'] == '': + prt('database.txt: `interval` not specified') + download(dist['file_url'], file_name) + continue + + file_mod = datetime.fromtimestamp(path.getmtime(file_name)) + file_age = (datetime.now() - file_mod).days + if file_age < int(dist['interval']): + prt('{} is younger than {} days, skipping ...'.format( + name, dist['interval'])) + continue + else: + prt('{} is older than {} days'.format(name, file_age)) + + if dist['test_url'] == '': + prt('database.txt: `test_url` not specified') + download(dist['file_url'], file_name) + continue + + if dist['test_name'] == '': + prt('database.txt: `test_name` not specified') + #TODO write test_name to database.txt + test_name = urlparse(dist['test_url']) + test_name = test_name.path + test_name = '{}/dist/{}'.format(WORKDIR, path.basename(test_name)) + else: + test_name = '{}/dist/{}'.format(WORKDIR, dist['test_name']) + + if not path.isfile(test_name): + prt('database.txt: `test_name` {} does not exist on your filesystem'.format(test_name)) + download(dist['test_url'], test_name) + download(dist['file_url'], file_name) + continue + + prt(test_name) + test_sha256_old = sha256(test_name) + download(dist['test_url'], test_name) + test_sha256_new = sha256(test_name) + + if not test_sha256_old == test_sha256_new: + prt('`test_file` {} has changed'.format(test_name)) + download(dist['file_url'], file_name) + continue + + prt('{} is still up to date, skipping ...'.format(name)) def read_os_database(): @@ -74,7 +119,6 @@ def read_os_database(): return json.load(f) - # https://stackoverflow.com/questions/4637420/efficient-python-daemon#8375012 def run_daemon(): ''' run the daemon ''' @@ -82,7 +126,6 @@ def run_daemon(): check_update() - if __name__ == '__main__': args = init_parser() database = read_os_database()