OSDN Git Service

Update to suport squeeze machine.
[osdn-codes/image-creator.git] / create-image
index 04fe0ee..2af4aaa 100755 (executable)
@@ -100,7 +100,9 @@ class ImageCreator
         begin
           system("mount", dev, mount_point) or raise "Failed to mount file system #{dev} on #{mount_point}"
           puts "Copying #{src_host}:#{di.srcpath} to #{dev}..."
-          system("rsync", "-azHSAX", "--numeric-ids", "--info=progress2", "#{src_host}:#{di.srcpath}/", "#{mount_point}/", *((["--exclude"] * di.exclude.size).zip(di.exclude).flatten)) or raise "rsync fails"
+          unless system("rsync", "-azHSAX", "--numeric-ids", "--info=progress2", "#{src_host}:#{di.srcpath}/", "#{mount_point}/", *((["--exclude"] * di.exclude.size).zip(di.exclude).flatten))
+            warn "rsync exit with error, file transfer may not be completed."
+          end
         ensure
           system("umount", mount_point)
           File.directory?(mount_point) and
@@ -128,7 +130,7 @@ class ImageCreator
             system("mount", di.device, "#{dir}#{di.path}") or raise "Failed to mount #{di.device} to #{dir}#{path}"
           end
 
-          system "rm", "-f", "#{dir}/etc/systemd/system/udev.service", "#{dir}/etc/systemd/system/systemd-udevd.service"
+          system "rm", "-f", "#{dir}/etc/systemd/system/udev.service", "#{dir}/etc/systemd/system/systemd-udevd.service", "#{dir}/etc/udev/rules.d/70-persistent-net.rules"
 
           puts "Rewrite fstab..."
           File.open "#{dir}/etc/fstab", "w" do |f|
@@ -138,13 +140,23 @@ class ImageCreator
             end
           end
 
-          unless File.exists? "#{dir}/vmlinuz"
-            system("chroot", dir, "apt-get", "-qy", "update")
-            system("chroot", dir, "apt-get", "-y", "install", "linux-image-amd64")
+          system("chroot", dir, "apt-get", "-qy", "update")
+          if File.read("#{dir}/etc/debian_version").to_f >= 9.0
+            # Note: 2019-10-08 時点で Debian9 のカーネルバージョンに対応していないので、エラー回避のために既存のカーネルを全て削除し、強制的に jessie のカーネルをイントールする
+            system("rm", "-f", "#{dir}/var/lib/dpkg/info/linux-image-#{`uname -r`.chomp}.prerm")
+            system({'DEBIAN_FRONTEND' => 'noninteractive'}, "chroot", dir, "apt", "remove", "--purge", "-y", "linux-image-*")
+            system("wget", "-O", "#{dir}/tmp/linux.deb", "http://security-cdn.debian.org/debian-security/pool/updates/main/l/linux/linux-image-3.16.0-10-amd64_3.16.81-1_amd64.deb") or raise "Failed to get jessie kernel"
+            system("chroot", dir, "dpkg", "-i", "/tmp/linux.deb")
+            system({'DEBIAN_FRONTEND' => 'noninteractive'}, "chroot", dir, "apt", "install", "-f", "-y") or raise "Failed to install jessie kernel"
+          else
+            system({'DEBIAN_FRONTEND' => 'noninteractive'}, "chroot", dir, "apt-get", "-y", "--allow-unauthenticated", "install", "linux-image-amd64")
           end
 
           puts "Update grub..."
-          unless File.exists? "#{dir}/usr/sbin/grub-mkconfig"
+          if File.exists? "#{dir}/var/lib/dpkg/info/grub-efi-amd64.list"
+            system({'DEBIAN_FRONTEND' => 'noninteractive'}, "chroot", dir, "apt", "remove", "--purge", "-y", "grub-efi-amd64") or raise "Failed to purge grub-efi"
+          end
+          unless File.exists?("#{dir}/var/lib/dpkg/info/grub-pc.list") && File.exists?("#{dir}/usr/sbin/grub-bios-setup")
             system("chroot", dir, "apt-get", "-qy", "update") or raise "Failed to install grub-pc"
             system({'DEBIAN_FRONTEND' => 'noninteractive'}, "chroot", dir, "apt-get", "-y", "install", "grub-pc")
           end
@@ -153,6 +165,9 @@ class ImageCreator
           end
           system("chroot", dir, "grub-mkconfig", "-o", "/boot/grub/grub.cfg") or raise "grub-mkconfig fails."
           system(*%W(grub-install --no-floppy --grub-mkdevicemap=#{dir}/boot/grub/device.map --root-directory=#{dir} #{root_dev})) or raise "grub-install failed."
+          cfg = File.read "#{dir}/boot/grub/grub.cfg"
+          cfg.gsub! %r{mapper/loop0p}, "sda"
+          File.write "#{dir}/boot/grub/grub.cfg", cfg
         ensure
           system("umount", "#{dir}/dev")
           system("umount", "#{dir}/proc")
@@ -172,8 +187,8 @@ class ImageCreator
         "Description" => dir.path == '/' ? 'root' : dir.path[1..-1].tr('/', '-'),
         "Format" => "raw",
         "UserBucket" => {
-          "S3Bucket" => "Change-to-your-buket-name",
-          "S3Key" => "/src-disks/#{img_path_base}_#{idx}.img"
+          "S3Bucket" => ENV.fetch("S3_BUCKET", "osdn-base-images"),
+          "S3Key" => "#{ENV.fetch("S3_KEY_PREFIX", "src-disks/")}#{img_path_base}_#{idx}.img"
         }
       })
     end
@@ -192,6 +207,13 @@ class ImageCreator
 end
 
 if $0 == __FILE__
+  require 'optparse'
+
+  opts = ARGV.getopts('l:', 'limit:', 'skip:')
+  limit_pat = opts['limit'] || opts['l']
+  limit_pat and
+    limit_pat = Regexp.new(limit_pat)
+
   list = YAML.load_file(ARGV[0] || 'image-list.yml')
   list.each do |imgdef|
     name = nil
@@ -205,6 +227,9 @@ if $0 == __FILE__
     else
       name = imgdef
     end
+    if limit_pat
+      limit_pat.match?(name) or next
+    end
     dirs.empty? and dirs << SyncDirDef.new
     ImageCreator.new(name, dirs).run
   end