#!/usr/bin/env python # -*- coding: utf-8 -*- #Instruction: This is a demo installer which performs basic live cd to external hard disk installation. #It requies an external storage device with atleast one partition to test this. #This script will prompt for username, password for new user to be added and also we can specify ROOT partition import re,os,sys,dbus,time symlink_path = os.readlink("/usr").replace("/usr","") symlink_dirs = ["bin","sbin","lib","boot","usr","opt","dev","tmp"] actual_dirs = ["etc","var","root"] empty_dirs = ["mnt","sys","proc","media","home"] def run(cmd): print cmd ret = os.system(cmd) def message(msg): print msg def part_list(): devs = re.compile("sd[a-z][0-9]") tmp_data = open('/proc/partitions').read().strip() return devs.findall(tmp_data) def start_dbus(): global bus bus = None if os.fork() == 0: os.chroot("/mnt/install_root") run("rm /var/run/dbus/pid") run("/sbin/start-stop-daemon -b --start --pidfile /var/run/dbus/pid --exec /usr/bin/dbus-daemon -- --system") sys.exit(0) for i in range(20): try: print("trying to start dbus..") bus = dbus.bus.BusConnection(address_or_type="unix:path=%s/var/run/dbus/system_bus_socket" % "/mnt/install_root/") break except dbus.DBusException: time.sleep(1) print("wait dbus for 1 second...") if bus: return True return False #Hard coded grub-install function which always install to an external drive with /dev/sdb,sdb1 #Little hack required to make it generic (Yali4 has better code to generate grub conf and handle device minor and major parts) def grub_install(): if os.fork() == 0: run("mount --bind /dev/ /mnt/install_root/dev") os.chroot("/mnt/install_root") handle = file("/tmp/grub_install","w") handle.writelines(["root (hd1,0)\n","setup (hd1)\n","quit\n"]) handle.close() run("/sbin/grub < /tmp/grub_install") #Done run("umount -l /mnt/install_root") sys.exit(0) #Installer calls starts here message("Pardus Live installer\n") message("Partitions %s\n" %part_list()) root_part = raw_input("Enter Root partition: ") run("umount /dev/%s" %root_part) run("mkfs.ext4 /dev/%s -L PARDUS_FS" %root_part) run("mkdir /mnt/install_root") run("mount /dev/%s /mnt/install_root" %root_part) for dir in symlink_dirs: run("cp -Rp /%s/%s %s" %(symlink_path,dir,"/mnt/install_root")) for dir in actual_dirs: run("cp -Rp /%s %s" %(dir,"/mnt/install_root")) for dir in empty_dirs: run("mkdir %s/%s" %("/mnt/install_root",dir)) #change run("sed -i 's/AutoLoginEnable=true/AutoLoginEnable=false/' %s" %"/mnt/install_root/etc/X11/kdm/kdmrc") username=raw_input("Enter default username: ") password=raw_input("Enter default Password: ") #use getpass module start_dbus() obj = bus.get_object("tr.org.pardus.comar", "/package/baselayout") obj.addUser(1700, username, username, os.path.join('/home',username), "/bin/bash", password, ["wheel", "users", "pnp", "pnpadmin", "removable", "disk", "audio", "video", "power", "dialout"], [], [], dbus_interface="tr.org.pardus.comar.User.Manager") #Set root password obj.setUser(0, "", "", "", password, "", dbus_interface="tr.org.pardus.comar.User.Manager") run("cp -p /mnt/cdrom/boot/kernel /mnt/cdrom/boot/initrd /mnt/install_root/boot/") #Hardcoded grub conf grub_conf = file("/mnt/install_root/boot/grub/grub.conf","w") grub_conf.writelines(["default 0\n","timeout 10\n","title pardus-test-install\n","root(hd0,0)\n","kernel /boot/kernel root=LABEL=PARDUS_FS\n","initrd /boot/initrd\n"]) grub_conf.close() grub_install() #Reboot and boot from external drive to boot the installed version