Improve rsync process and logging

This commit is contained in:
Jan Schneider 2017-06-29 08:48:58 +02:00
parent c25b3c13a9
commit 6e1cb938c2
1 changed files with 91 additions and 36 deletions

View File

@ -27,6 +27,7 @@ namespace eval rmupdate {
variable install_log "/usr/local/addons/rmupdate/var/install.log" variable install_log "/usr/local/addons/rmupdate/var/install.log"
variable install_lock "/usr/local/addons/rmupdate/var/install.lock" variable install_lock "/usr/local/addons/rmupdate/var/install.lock"
variable log_file "" variable log_file ""
variable debug 0
} }
proc ::rmupdate::get_rpi_version {} { proc ::rmupdate::get_rpi_version {} {
@ -120,10 +121,10 @@ proc ::rmupdate::get_partion_start_and_size {device partition} {
proc ::rmupdate::is_system_upgradeable {} { proc ::rmupdate::is_system_upgradeable {} {
variable sys_dev variable sys_dev
if { [rmupdate::get_filesystem_label "${sys_dev}p2"] != "rootfs1" } { #if { [libfirmware::get_filesystem_label "${sys_dev}p2"] != "rootfs1" } {
return 0 # return 0
} #}
if { [rmupdate::get_filesystem_label "${sys_dev}p3"] != "rootfs2" } { if { [libfirmware::get_filesystem_label "${sys_dev}p3"] != "rootfs2" } {
return 0 return 0
} }
return 1 return 1
@ -166,7 +167,7 @@ proc ::rmupdate::update_cmdline {cmdline root} {
} }
proc ::rmupdate::get_current_root_partition {} { proc ::rmupdate::get_current_root_partition {} {
set cmdline "/boot/cmdline.txt" set cmdline "/proc/cmdline"
set fd [open $cmdline r] set fd [open $cmdline r]
set data [read $fd] set data [read $fd]
close $fd close $fd
@ -244,19 +245,28 @@ proc ::rmupdate::mount_system_partition {partition mountpoint} {
} else { } else {
write_log "Mounting device ${partition} (rw)." write_log "Mounting device ${partition} (rw)."
} }
file mkdir $mountpoint
catch {exec /bin/umount "${mountpoint}"} if {![file exists $mountpoint]} {
file mkdir $mountpoint
}
if {$remount} { if {$remount} {
exec /bin/mount -o bind $partition "${mountpoint}" if {$partition != $mountpoint} {
exec /bin/mount -o bind $partition "${mountpoint}"
}
exec /bin/mount -o remount,rw "${mountpoint}" exec /bin/mount -o remount,rw "${mountpoint}"
} else { } else {
catch {exec /bin/umount "${mountpoint}"}
exec /bin/mount -o rw $partition "${mountpoint}" exec /bin/mount -o rw $partition "${mountpoint}"
} }
} }
proc ::rmupdate::umount {device_or_mountpoint} { proc ::rmupdate::umount {device_or_mountpoint} {
exec /bin/umount "${device_or_mountpoint}" if {$device_or_mountpoint == "/boot"} {
exec /bin/mount -o remount,ro "${device_or_mountpoint}"
} else {
exec /bin/umount "${device_or_mountpoint}"
}
} }
proc ::rmupdate::get_filesystem_size_and_usage {device_or_mountpoint} { proc ::rmupdate::get_filesystem_size_and_usage {device_or_mountpoint} {
@ -306,14 +316,10 @@ proc ::rmupdate::update_filesystems {image {dryrun 0}} {
variable mnt_img variable mnt_img
variable mnt_sys variable mnt_sys
variable sys_dev variable sys_dev
variable debug
set root_partition [get_current_root_partition] set root_partition [get_current_root_partition]
set extra_args ""
if {$dryrun != 0} {
set extra_args "--dry-run"
}
write_log "Updating filesystems." write_log "Updating filesystems."
file mkdir $mnt_img file mkdir $mnt_img
@ -321,50 +327,71 @@ proc ::rmupdate::update_filesystems {image {dryrun 0}} {
foreach img_partition [list 2 1] { foreach img_partition [list 2 1] {
set sys_partition $img_partition set sys_partition $img_partition
set mnt_s $mnt_sys
if {$img_partition == 2 && $root_partition == 2} { if {$img_partition == 2 && $root_partition == 2} {
set sys_partition 3 set sys_partition 3
} }
if {$sys_partition == 1} {
set mnt_s "/boot"
}
write_log "Updating system partition ${sys_partition}." write_log "Updating system partition ${sys_partition}."
mount_image_partition $image $img_partition $mnt_img mount_image_partition $image $img_partition $mnt_img
mount_system_partition $sys_partition $mnt_sys mount_system_partition $sys_partition $mnt_s
if {$debug} {
write_log "ls -la ${mnt_img}"
write_log [exec ls -la ${mnt_img}]
write_log "ls -la ${mnt_s}"
write_log [exec ls -la ${mnt_s}]
}
write_log "Rsyncing filesystem of partition ${sys_partition}." write_log "Rsyncing filesystem of partition ${sys_partition}."
if [catch {exec rsync ${extra_args} --progress --archive --delete "${mnt_img}/" "${mnt_sys}"} err] { if [catch {
write_log $err set out ""
if {$dryrun} {
if {$debug} {
write_log "rsync --dry-run --progress --archive --delete ${mnt_img}/ ${mnt_s}"
}
set out [exec rsync --dry-run --progress --archive --delete ${mnt_img} ${mnt_s}]
} else {
if {$debug} {
write_log "rsync --progress --archive --delete ${mnt_img}/ ${mnt_s}"
}
set out [exec rsync --progress --archive --delete ${mnt_img}/ ${mnt_s}]
}
if {$debug} {
write_log $out
}
} err] {
if {$debug} {
write_log $err
}
} }
write_log "Rsync finished." write_log "Rsync finished."
if {$debug} {
write_log "ls -la ${mnt_img}"
write_log [exec ls -la ${mnt_img}]
write_log "ls -la ${mnt_s}"
write_log [exec ls -la ${mnt_s}]
}
if {$img_partition == 1} { if {$img_partition == 1} {
write_log "Update cmdline." write_log "Update cmdline."
if {$dryrun == 0} { if {!$dryrun} {
set new_root_partition 2 set new_root_partition 2
if {$root_partition == 2} { if {$root_partition == 2} {
set new_root_partition 3 set new_root_partition 3
} }
set part_uuid [rmupdate::get_part_uuid "${sys_dev}p${new_root_partition}"] set part_uuid [libfirmware::get_part_uuid "${sys_dev}p${new_root_partition}"]
update_cmdline "${mnt_sys}/cmdline.txt" "PARTUUID=${part_uuid}" update_cmdline "${mnt_s}/cmdline.txt" "PARTUUID=${part_uuid}"
} }
} }
umount $mnt_img umount $mnt_img
umount $mnt_sys umount $mnt_s
} }
} }
#proc ::rmupdate::is_firmware_up_to_date {} {
# set latest_version [get_latest_firmware_version]
# write_log "Latest firmware version: ${latest_version}"
#
# set current_version [get_current_firmware_version]
# write_log "Current firmware version: ${current_version}"
#
# if {[compare_versions $current_version $latest_version] >= 0} {
# return 1
# }
# return 0
#}
proc ::rmupdate::get_current_firmware_version {} { proc ::rmupdate::get_current_firmware_version {} {
set fp [open "/boot/VERSION" r] set fp [open "/boot/VERSION" r]
set data [read $fp] set data [read $fp]
@ -535,10 +562,10 @@ proc ::rmupdate::delete_firmware_image {version} {
} }
proc ::rmupdate::install_firmware_version {version {reboot 1} {dryrun 0}} { proc ::rmupdate::install_firmware_version {version {reboot 1} {dryrun 0}} {
if {[rmupdate::install_process_running]} { if {[install_process_running]} {
error "Another install process is running." error "Another install process is running."
} }
if {! [rmupdate::is_system_upgradeable]} { if {! [is_system_upgradeable]} {
error "System not upgradeable." error "System not upgradeable."
} }
@ -546,6 +573,16 @@ proc ::rmupdate::install_firmware_version {version {reboot 1} {dryrun 0}} {
variable log_file variable log_file
variable install_log variable install_log
foreach var {install_lock log_file install_log} {
set var [set $var]
if {$var != ""} {
set basedir [file dirname $var]
if {![file exists $basedir]} {
file mkdir $basedir
}
}
}
set fd [open $install_lock "w"] set fd [open $install_lock "w"]
puts $fd [pid] puts $fd [pid]
close $fd close $fd
@ -583,6 +620,24 @@ proc ::rmupdate::install_firmware_version {version {reboot 1} {dryrun 0}} {
} }
} }
proc ::rmupdate::install_latest_version {{reboot 1} {dryrun 0}} {
set latest_version [get_latest_firmware_version]
return install_firmware_version $latest_version $reboot $dryrun
}
proc ::rmupdate::is_firmware_up_to_date {} {
set latest_version [get_latest_firmware_version]
write_log "Latest firmware version: ${latest_version}"
set current_version [get_current_firmware_version]
write_log "Current firmware version: ${current_version}"
if {[compare_versions $current_version $latest_version] >= 0} {
return 1
}
return 0
}
#puts [rmupdate::get_latest_firmware_version] #puts [rmupdate::get_latest_firmware_version]
#puts [rmupdate::get_firmware_info] #puts [rmupdate::get_firmware_info]
#puts [rmupdate::get_available_firmware_images] #puts [rmupdate::get_available_firmware_images]