# Greek translation for isodumper package. # Copyright (C) 2013 THE isodumper'S COPYRIGHT HOLDER # This file is distributed under the same license as the isodumper package. # # Translators: # Automatically generated, 2013. # Dimitrios Glentadakis , 2014, 2015. # dtsiamasiotis , 2013-2014. # FIRST AUTHOR , 2008. # JimSp472000 , 2014. msgid "" msgstr "" "Project-Id-Version: isodumper\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-05-09 20:37+0200\n" "PO-Revision-Date: 2015-01-29 20:13+0100\n" "Last-Translator: Dimitrios Glentadakis \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "el/)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.5\n" #: lib/isodumper.py:123 #, python-format msgid "%r not known to UDisks2" msgstr "Το %r είναι άγνωστο στο UDisks2" #: lib/isodumper.py:190 msgid "Mb" msgstr "Mb" #: lib/isodumper.py:210 msgid "Target Device: " msgstr "Συσκευή προορισμού: " #: lib/isodumper.py:232 msgid "Backup to: " msgstr "Δημιουργία αντιγράφων ασφαλείας σε:" #: lib/isodumper.py:236 msgid "Formatting confirmation" msgstr "" #: lib/isodumper.py:241 msgid "The device was formatted successfully." msgstr "Η συσκευή διαμορφώθηκε με επιτυχία." #: lib/isodumper.py:245 msgid "An error occurred while creating a partition." msgstr "Προέκυψε σφάλμα κατά την δημιουργία διαμερίσματος." #: lib/isodumper.py:249 msgid "Authentication error." msgstr "Σφάλμα πιστοποίησης." #: lib/isodumper.py:253 msgid "An error occurred." msgstr "Προέκυψε σφάλμα." #: lib/isodumper.py:290 msgid "Backup confirmation" msgstr "" #: lib/isodumper.py:290 msgid "Do you want to overwrite the file?" msgstr "Θέλετε να αντικαταστήσετε το αρχείο;" #: lib/isodumper.py:298 #, python-format msgid "" "The destination directory is too small to receive the backup (%s Mb needed)" msgstr "" "Ο κατάλογος προορισμού είναι πολύ μικρός για την αποθήκευση του εφεδρικού " "αντίγραφου (απαιτούνται %s Mb)" #: lib/isodumper.py:304 lib/isodumper.py:666 msgid "Backup to:" msgstr "Εφεδρικό αρχείο στο:" #: lib/isodumper.py:324 msgid "The device is too small to contain the ISO file." msgstr "Η συσκευή είναι πολύ μικρή για να χωρέσει το αρχείο ISO." #: lib/isodumper.py:328 msgid "Writing confirmation" msgstr "" #: lib/isodumper.py:331 msgid "The device is bigger than 32 Gbytes. Are you sure you want use it?" msgstr "" "Η συσκευή είναι μεγαλύτερη από 32 Gbytes. Είστε σίγουροι ότι θέλετε να την " "χρησιμοποιήσετε;" #: lib/isodumper.py:331 lib/isodumper.py:508 msgid "Warning" msgstr "" #: lib/isodumper.py:356 msgid "Unmounting all partitions of " msgstr "Αποπροσάρτηση όλων των διαμερισμάτων του " #: lib/isodumper.py:358 msgid "Trying to unmount " msgstr "Προσπάθεια για αποπροσάρτηση " #: lib/isodumper.py:362 #, python-format msgid "Partition %s is busy" msgstr "" #: lib/isodumper.py:366 msgid " was terminated by signal " msgstr " τερματίστηκε από το σήμα " #: lib/isodumper.py:366 lib/isodumper.py:372 msgid "Error, umount " msgstr "Σφάλμα, αποπροσάρτηση " #: lib/isodumper.py:370 msgid " successfully unmounted" msgstr " επιτυχής αποπροσάρτηση" #: lib/isodumper.py:372 msgid " returned " msgstr " επέστρεψε " #: lib/isodumper.py:376 msgid "Execution failed: " msgstr "Αποτυχία εκτέλεσης: " #: lib/isodumper.py:385 msgid "Could not read mtab !" msgstr "Αδυναμία ανάγνωσης του mtab !" #: lib/isodumper.py:395 lib/isodumper.py:422 msgid "Reading error." msgstr "Σφάλμα ανάγνωσης." #: lib/isodumper.py:403 msgid "You don't have permission to write to the device" msgstr "Δεν έχετε δικαιώματα εγγραφής στη συσκευή" #: lib/isodumper.py:408 lib/isodumper.py:409 msgid " to " msgstr " προς " #: lib/isodumper.py:408 msgid "Writing " msgstr "Εγγραφή " #: lib/isodumper.py:409 msgid "Executing copy from " msgstr "Εκτέλεση αντιγραφής από" #: lib/isodumper.py:429 lib/isodumper.py:443 lib/isodumper.py:453 msgid "Writing error." msgstr "Σφάλμα εγγραφής." #: lib/isodumper.py:436 msgid "Wrote: " msgstr "Γραφτηκε: " #: lib/isodumper.py:448 msgid " successfully written to " msgstr " γράφτηκε επιτυχώς στο " #: lib/isodumper.py:448 lib/isodumper.py:567 msgid "Image " msgstr "Εικόνα " #: lib/isodumper.py:449 msgid "Bytes written: " msgstr "Εγγεγραμμένα bytes:" #: lib/isodumper.py:461 msgid "Checking " msgstr "Έλεγχος " #: lib/isodumper.py:486 msgid "SHA1 sum: " msgstr "Άθροισμα SHA1: " #: lib/isodumper.py:487 msgid "MD5 sum: " msgstr "Άθροισμα MD5: " #: lib/isodumper.py:496 msgid "Success" msgstr "" #: lib/isodumper.py:496 msgid "" "The operation completed successfully.\n" " You are free to unplug it now, a logfile \n" "(/home/-user- or /root)/.isodumper/isodumper.log will be saved when\n" " you close the application." msgstr "" #: lib/isodumper.py:508 msgid "" "Writing is in progress. Exiting during writing \n" " will make the device or the backup unusable.\n" " Are you sure you want to quit during writing?" msgstr "" #: lib/isodumper.py:520 msgid "Error" msgstr "" #: lib/isodumper.py:571 lib/isodumper.py:625 msgid "IsoDumper" msgstr "IsoDumper" #: lib/isodumper.py:571 msgid "" "Mageia IsoDumper
----------------
This GUI program is primarily " "for safely writing a bootable ISO image to a USB flash drive, an operation " "devious & potentially hazardous when done by hand. As a bonus, it can also " "back up theentire previous
contents of the flash drive onto the hard " "disc, and restore the flash drive to its previous state subsequently.
It gives also a feature for formatting the USB device.

IsoDumper " "can be launched either from the menus, or a user or root console with the " "command 'isodumper'.
For normal users, the root password is solicited; " "this is necessary for the program's operation.
The flash drive can be " "inserted beforehand or once the program is started. In the latter case, a " "dialogue will say that there is no flash drive inserted, and allow a 'retry' " "to find it once it is.
(You may have to close any automatically opened " "File Manager window).

The fields of the main window are as " "follows:
- Device to work on: the device of the USB flash drive, a drop-" "down list to choose from.
- Write Image: to choose the source ISO image " "*.iso (or flash drive backup file *.img) to write out.
- Write to " "device: This button launches the operation - with a prior warning dialogue. " "
The operation is shown in the progress bar beneath.
- Backup to: " "define the name and placement of the backup image file. The current flash " "drive will be backed up to a disc file. Note that the entire flash drive is " "preserved, regardless of its actual contents; ensure that you have the " "necessary free disc space (the same size as the USB device). This backup " "file can be used later to restore the flash drive by selecting it as the " "source *.img file to write out.
- Backup the device: launch the backup " "operation.
- Format the device: create an unique partition on the " "entire volume in the specified format in FAT, NTFS or ext. You can specify a " "volume name and the format in a new dialog box.
" msgstr "" #: lib/isodumper.py:617 msgid "Choose an image" msgstr "" #: lib/isodumper.py:618 msgid "" "Warning\n" "This will destroy all data on the target device,\n" " are you sure you want to proceed?\n" " If you say ok here, please do not unplug the device " "during the following operation." msgstr "" #: lib/isodumper.py:653 msgid "Device to work on:" msgstr "Συσκευή προς επεξεργασία:" #: lib/isodumper.py:657 msgid "Write Image:" msgstr "Εγγραφή εικόνας:" #: lib/isodumper.py:663 msgid "&Write to device" msgstr "Γράψτε στη συσκευή" #: lib/isodumper.py:672 msgid "&Backup the device" msgstr "" #: lib/isodumper.py:676 msgid "Format the device in FAT, NTFS or ext:" msgstr "Μορφοποιήστε τη συσκευή σε FAT, NTFS ή ext:" #: lib/isodumper.py:678 msgid "&Format the device" msgstr "Μορφοποίηση συσκευής" #: lib/isodumper.py:682 msgid "Progression" msgstr "" #: lib/isodumper.py:686 msgid "Report" msgstr "" #: lib/isodumper.py:691 lib/isodumper.py:799 msgid "&Refresh" msgstr "" #: lib/isodumper.py:693 msgid "&About" msgstr "" #: lib/isodumper.py:695 msgid "&Help" msgstr "" #: lib/isodumper.py:697 msgid "&Quit" msgstr "" #: lib/isodumper.py:703 msgid "UDisks2 is not available on your system" msgstr "Το UDisks2 δεν είναι διαθέσιμο στο σύστημά σας" #: lib/isodumper.py:722 msgid "Label for the device:" msgstr "Ετικέτα για τη συσκευή:" #: lib/isodumper.py:726 msgid "FAT 32 (Windows)" msgstr "FAT 32 (Windows)" #: lib/isodumper.py:728 msgid "NTFS (Windows)" msgstr "NTFS (Windows)" #: lib/isodumper.py:730 msgid "ext4 (Linux)" msgstr "ext4 (Linux)" #: lib/isodumper.py:732 msgid "Execute" msgstr "" #: lib/isodumper.py:733 lib/isodumper.py:800 msgid "Cancel" msgstr "" #: lib/isodumper.py:790 msgid "A tool for writing ISO images to a device" msgstr "" #: lib/isodumper.py:798 msgid "" "Warning\n" "No target devices were found.\n" "You need to plug in a USB Key to which the image can be written." msgstr "" #: polkit/org.mageia.isodumper.policy.in.h:1 msgid "Run Isodumper" msgstr "Εκτελέστε το Isodumper" #: polkit/org.mageia.isodumper.policy.in.h:2 msgid "Authentication is required to run Isodumper" msgstr "Απαιτείται πιστοποίηση για την εκτέλεση του Isodumper" #: share/applications/isodumper.desktop.in.h:1 msgid "A GUI tool to write .img and .iso files to USB sticks" msgstr "" #~ msgid "" #~ "Success\n" #~ " The operation completed successfully.\n" #~ " \n" #~ " You are free to unplug it now, a logfile\n" #~ " (/home/-user- or /root)/.isodumper/isodumper.log will be saved when\n" #~ " you close the application." #~ msgstr "" #~ "Επιτυχία\n" #~ " Η λειτουργία εκτελέστηκε με επιτυχία.\n" #~ " \n" #~ " Είστε ελεύθερος να το αποσυνδέσετε τώρα, ένα αρχείο καταγραφών isodumper." #~ "log \n" #~ " της λειτουργίας θα αποθηκευτεί στον κατάλογο /.isodumper/ σας όταν\n" #~ " κλείσετε την εφαρμογή." #~ msgid "" #~ "Warning\n" #~ " No target devices were found. \n" #~ "\n" #~ " You need to plug in a USB Key\n" #~ " to which the image can be written." #~ msgstr "" #~ "Προσοχή\n" #~ " Δε βρέθηκαν συσκευές προορισμού. \n" #~ "\n" #~ " Πρέπει να συνδέσετε μία USB μνήμη\n" #~ " στην οποία μπορεί να εγγραφεί το εικονικό αρχείο." #~ msgid "Details" #~ msgstr "Λεπτομέρειες" #~ msgid "Choose the format. The device will be formatted in one partition" #~ msgstr "Επιλέξτε μορφή. Η συσκευή θα διαμορφωθεί σε ένα διαμέρισμα" #~ msgid "Backup the device" #~ msgstr "Δημιουργία αντιγράφων ασφαλείας για τη συσκευή" #~ msgid "Select a folder in which to write the backup image" #~ msgstr "Διαλέξτε ένα φάκελο για να γράψετε εκεί την εφεδρική εικόνα" #~ msgid "(None)" #~ msgstr "(κανένα)" #~ msgid "Create a backup of the device as image to restore it later" #~ msgstr "" #~ "Δημιουργήστε ένα εφεδρικό αντίγραφο της συσκευής σαν εικόνα για να το " #~ "αποκαταστήσετε αργότερα" #~ msgid "Select Image" #~ msgstr "Επιλογή εικόνας" #~ msgid "Select an image file to be written to the device" #~ msgstr "Επιλέξτε ένα αρχείο εικόνας που πρόκειται να εγγραφεί στην συσκευή" #~ msgid "Select target device to write the image to" #~ msgstr "Επιλέξτε την συσκευή προορισμού για να γράψετε την εικόνα" #~ msgid "" #~ "Mageia IsoDumper\n" #~ "----------------\n" #~ "This GUI program is primarily for safely writing a bootable ISO image to " #~ "a USB flash drive, an operation devious & potentially hazardous when done " #~ "by hand. As a bonus, it can also back up the entire previous contents of " #~ "the flash drive onto the hard disc, and restore the flash drive to its " #~ "previous state subsequently. It gives also a feature for formatting the " #~ "USB device.\n" #~ "\n" #~ "IsoDumper can be launched either from the menus, or a user or root " #~ "console with the command 'isodumper'. For normal users, the root password " #~ "is solicited; this is necessary for the program's operation. The flash " #~ "drive can be inserted beforehand or once the program is started. In the " #~ "latter case, a dialogue will say that there is no flash drive inserted, " #~ "and allow a 'retry' to find it once it is. (You may have to close any " #~ "automatically opened File Manager window).\n" #~ "\n" #~ "The fields of the main window are as follows:\n" #~ "- Device to work on: the device of the USB flash drive, a drop-down list " #~ "to choose from.\n" #~ "- Write Image: to choose the source ISO image *.iso (or flash drive " #~ "backup file *.img) to write out.\n" #~ "- Write to device: This button launches the operation - with a prior " #~ "warning dialogue. If a flash drive backup was requested, this is done " #~ "first. Then (or only) the image file write. Each operation is shown in " #~ "the progress bar beneath.\n" #~ "- Backup to: define the name and placement of the backup image file. The " #~ "current flash drive will be backed up to a disc file. Note that the " #~ "entire flash drive is preserved, regardless of its actual contents; " #~ "ensure that you have the necessary free disc space (the same size as the " #~ "USB device). This backup file can be used later to restore the flash " #~ "drive by selecting it as the source *.img file to write out.\n" #~ "- Backup the device: launch the backup operation.\n" #~ "- Format the device: create an unique partition on the entire volume in " #~ "the specified format in FAT, NTFS or ext. You can specify a volume name " #~ "and the format in a new dialog box.\n" #~ "- Details: this button shows detailed log information.\n" #~ "\n" #~ msgstr "" #~ "Mageia IsoDumper\n" #~ "----------------\n" #~ "Αυτό το πρόγραμμα γραφικού περιβάλλοντος έχει ως πρωταρχικό στόχο την " #~ "ασφαλή εγγραφή μιας εικόνας ISO σε έναν οδηγό φλας USB, μια διαδικασία " #~ "που κρύβει κινδύνους όταν γίνεται χειροκίνητα. Ως δώρο, μπορεί να " #~ "δημιουργήσει αντίγραφα ασφαλείας των περιεχομένων του οδηγού φλας στον " #~ "σκληρό δίσκο, και μετά το πέρας της διαδικασίας την ανάκτησή τους στον " #~ "οδηγό φλας. Παρέχει επίσης την δυνατότητα μορφοποίησης της συσκευής USB.\n" #~ "\n" #~ "Το IsoDumper μπορεί να εκτελεστεί είτε από το μενού, είτε από ένα " #~ "τερματικό με σύνδεση διαχειριστή με την εντολή «isodumper». Για τυπικούς " #~ "χρήστες, απαιτείται ο κωδικός πρόσβασης διαχειριστή· αυτό είναι " #~ "απαραίτητο για τη λειτουργία του προγράμματος. Ο οδηγός φλας μπορεί να " #~ "συνδεθεί πριν ή μετά την εκτέλεση του προγράμματος. Στην δεύτερη " #~ "περίπτωση, ένας διάλογος θα σας πληροφορήσει ότι δεν έχετε συνδέσει " #~ "κάποιον οδηγό φλας, και σας επιτρέπει μέσω της επιλογής «επανάληψη» να το " #~ "εντοπίσει αφού το συνδέσετε. (Μπορεί να χρειαστεί να κλείσετε όποιον " #~ "αυτόματα ανοιγμένο παράθυρο του διαχειριστή αρχείων).\n" #~ "\n" #~ "Τα πεδία του κύριου παραθύρου έχουν ως εξής:\n" #~ "- Συσκευή που θα εργαστείτε: η συσκευή του οδηγού φλας USB, επιλογή από " #~ "μια αναπτυσσόμενη λίστα.\n" #~ "- Εγγραφή εικόνας: για επιλογή της πηγαίας εικόνας ISO *.iso (ή αρχείο " #~ "αντιγράφου ασφαλείας οδηγού φλας *.img) προς εγγραφή.\n" #~ "- Εγγραφή σε συσκευή: Αυτό το κουμπί εκκινεί την διεργασία - με έναν " #~ "διάλογο προειδοποίησης. Αν έχει αιτηθεί η λήψη αντίγραφου ασφαλείας του " #~ "οδηγού φλας, αυτό θα γίνει πρωτίστως. Τότε (ή εξαρχής) θα γίνει η εγγραφή " #~ "του αρχείου εικόνας. Κάθε διεργασία εμφανίζεται στην γραμμή προόδου " #~ "κάτωθεν.\n" #~ "- Αντίγραφο ασφαλείας σε: προσδιορίζει το όνομα και την τοποθεσία του " #~ "εφεδρικού αρχείου εικόνας. Ο τρέχων οδηγός φλας θα αποθηκευθεί ως " #~ "αντίγραφο ασφαλείας στον σκληρό δίσκο. Σημειώστε ότι αποθηκεύεται " #~ "ολόκληρος ο οδηγός φλας, ασχέτως του περιεχομένου του· σιγουρευτείτε ότι " #~ "διαθέτετε τον απαιτούμενο ελεύθερο χώρο στον δίσκο (το ίδιο μέγεθος με τη " #~ "συσκευή USB). Αυτό το αντίγραφο ασφαλείας μπορεί να χρησιμοποιηθεί " #~ "μετέπειτα για την ανάκτηση του οδηγού φλας επιλέγοντάς το ως πηγαίο " #~ "αρχείο *.img προς εγγραφή.\n" #~ "- Αντίγραφο ασφαλείας της συσκευής: ξεκινά την διεργασία λήψης εφεδρικού " #~ "αρχείου.\n" #~ "- Μορφοποίηση της συσκευής: δημιουργεί μια μοναδική κατάτμηση σε ολόκληρο " #~ "τον οδηγό στην καθορισμένη μορφή FAT, NTFS ή ext. Μπορείτε να " #~ "προσδιορίσετε το όνομα της κατάτμησης και τη μορφή σε ένα νέο πλαίσιο " #~ "διαλόγου.\n" #~ "- Λεπτομέρειες: αυτό το κουμπί εμφανίζει τις πληροφορίες των καταγραφών.\n" #~ "\n" #~ msgid "Isodumper - Help" #~ msgstr "Isodumper - Βοήθεια" #~ msgid "Only for Linux systems" #~ msgstr "Μόνο για συστήματα Linux" #~ msgid "To handle files bigger than 4Gb" #~ msgstr "Για διαχείριση αρχείων μεγαλύτερων από 4GB" #~ msgid "The standard. The size of files are limited to 4Gb" #~ msgstr "Το πρότυπο. Το μέγεθος των αρχείων είναι περιορισμένο στα 4GB" #~ msgid "" #~ "Error\n" #~ " Something went wrong, please see the details\n" #~ " window for the exact error.\n" #~ "\n" #~ " The application will be closed with this window, and a logfile\n" #~ " (/home/-user- or /root)/.isodumper/isodumper.log will be saved." #~ msgstr "" #~ "Σφάλμα\n" #~ " Κάτι πήγε στραβά, παρακαλώ δείτε το παράθυρο\n" #~ " λεπτομερειών για το ακριβές σφάλμα.\n" #~ "\n" #~ " Η εφαρμογή θα κλείσει με αυτό το παράθυρο, και θα αποθηκευτεί\n" #~ " ένα αρχείο καταγραφής isodumper.log στον κατάλογο /.isodumper σας" #~ msgid "" #~ "Warning\n" #~ " This will destroy all data on the target\n" #~ " device, are you sure you want to proceed ?\n" #~ "\n" #~ " If you say ok here, please do not unplug\n" #~ " the device during the following operation." #~ msgstr "" #~ "Προσοχή\n" #~ " Αυτό θα καταστρέψει όλα τα δεδομένα στη συσκευή\n" #~ " προορισμού, είστε σίγουροι ότι θέλετε να συνεχίσετε;\n" #~ "\n" #~ " Αν συμφωνείτε εδώ, παρακαλώ μην αποσυνδέσετε\n" #~ " τη συσκευή κατά τη διάρκεια της διεργασίας που ακολουθεί." #~ msgid "Select" #~ msgstr "Επιλέξτε" #~ msgid "" #~ "A tool for writing ISO images on a USB stick. It's a fork of usb-" #~ "imagewriter." #~ msgstr "" #~ "Ένα εργαλείο εγγραφής εικόνων ISO σε ένα USB stick. Είναι ένα fork του " #~ "usb-imagewriter." #~ msgid "" #~ "Writing is in progress. Exiting during writing will occur that the device " #~ "or the backup will be unusable.\n" #~ "Are you sure you want to quit during writing?" #~ msgstr "" #~ "Η εγγραφή βρίσκεται σε εξέλιξη. Η έξοδος κατά την εγγραφή θα αχρηστεύσει " #~ "τη συσκευή ή το αντίγραφο ασφαλείας.\n" #~ "Θέλετε σίγουρα να εξέλθετε κατά την εγγραφή;" #~ msgid "A GUI tool to write .img and .iso files to USB Keys" #~ msgstr "" #~ "Ένα γραφικό εργαλείο για την εγγραφή αρχείων .img και .iso σε μνήμες USB" 3 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
package install2; # $Id$

use diagnostics;
use strict;
use vars qw($o $version);

#-######################################################################################
#- misc imports
#-######################################################################################
use steps;
use common;
use install_any qw(:all);
use install_steps;
use install_any;
use lang;
use keyboard;
use mouse;
use fsedit;
use devices;
use partition_table qw(:types);
use modules;
use detect_devices;
use run_program;
use any;
use log;
use fs;
#-$::corporate=1;


#-#######################################################################################
#-$O
#-the big struct which contain, well everything (globals + the interactive methods ...)
#-if you want to do a kickstart file, you just have to add all the required fields (see for example
#-the variable $default)
#-#######################################################################################
$o = $::o = {
#    bootloader => { linear => 0, message => 1, timeout => 5, restricted => 0 },
    mkbootdisk => 0, #- no mkbootdisk if 0 or undef, find a floppy with 1, or fd1
#-    packages   => [ qw() ],
    partitioning => { clearall => 0, eraseBadPartitions => 0, auto_allocate => 0 }, #-, readonly => 0 },
    authentication => { md5 => 1, shadow => 1 },
    locale         => { lang => 'en_US' },
#-    isUpgrade    => 0,
    toRemove     => [],
    toSave       => [],
#-    simple_themes => 1,

    timezone => {
#-                   timezone => "Europe/Paris",
#-                   UTC      => 1,
                },
#-    superuser => { password => 'a', shell => '/bin/bash', realname => 'God' },
#-    user => { name => 'foo', password => 'bar', home => '/home/foo', shell => '/bin/bash', realname => 'really, it is foo' },

#-    keyboard => 'de',
#-    display => "192.168.1.19:1",
    steps        => \%steps::installSteps,
    orderedSteps => \@steps::orderedInstallSteps,

#- for the list of fields available for user and superuser, see @etc_pass_fields in install_steps.pm
#-    intf => { eth0 => { DEVICE => "eth0", IPADDR => '1.2.3.4', NETMASK => '255.255.255.128' } },

#-step : the current one
#-prefix
#-mouse
#-keyboard
#-netc
#-methods
#-packages compss
#-printer haveone entry(cf printer.pm)

};


sub installStepsCall {
    my ($o, $auto, $fun, @args) = @_;
    $fun = "install_steps::$fun" if $auto;
    $o->$fun(@args);
}

#-######################################################################################
#- Steps Functions
#- each step function are called with two arguments : clicked(because if you are a
#- beginner you can force the the step) and the entered number
#-######################################################################################

#------------------------------------------------------------------------------
sub selectLanguage {
    my ($_clicked, $ent_number, $auto) = @_;

    installStepsCall($o, $auto, 'selectLanguage', $ent_number == 1);
}

sub acceptLicense {
    my ($_clicked, $_ent_number, $auto) = @_;
    installStepsCall($o, $auto, 'acceptLicense') if !$o->{useless_thing_accepted};
}

#------------------------------------------------------------------------------
sub selectMouse {
    my ($clicked, $ent_number, $auto) = @_;

    require pkgs;
    my ($first_time) = $ent_number == 1;

    installStepsCall($o, $auto, 'selectMouse', !$first_time || $clicked);

    addToBeDone { mouse::write($o, $o->{mouse}) if !$o->{isUpgrade} || $clicked } 'installPackages';
}

#------------------------------------------------------------------------------
sub setupSCSI {
    my ($clicked, $_ent_number, $auto) = @_;

    if (!$::live && !$::g_auto_install && !$o->{blank} && !$::testing && !$::uml_install) {
	-s modules::cz_file() or die N("Can't access kernel modules corresponding to your kernel (file %s is missing), this generally means your boot floppy in not in sync with the Installation medium (please create a newer boot floppy)", modules::cz_file());
    }

    installStepsCall($o, $auto, 'setupSCSI', $clicked);
}

#------------------------------------------------------------------------------
sub selectKeyboard {
    my ($clicked, $_ent_number, $auto) = @_;

    installStepsCall($o, $auto, 'selectKeyboard', $clicked);

    #- read keyboard ASAP (so that summary displays ok)
    addToBeDone {	
	$o->{keyboard}{unsafe} or return;
	if (my $keyboard = keyboard::read()) {
	    $o->{keyboard} = $keyboard;
	}
    } 'formatPartitions';
}

#------------------------------------------------------------------------------
sub selectInstallClass {
    my ($clicked, $_ent_number, $auto) = @_;

    installStepsCall($o, $auto, 'selectInstallClass', $clicked);

    if ($o->{isUpgrade}) {
	$o->{keepConfiguration} and @{$o->{orderedSteps}} = grep { !/selectMouse|selectKeyboard|miscellaneous|setRootPassword|addUser|configureNetwork|installUpdates|summary|configureServices|configureX/ } @{$o->{orderedSteps}};
	my $s; foreach (@{$o->{orderedSteps}}) {
	    $s->{next} = $_ if $s;
	    $s = $o->{steps}{$_};
	}
    }
}

#------------------------------------------------------------------------------
sub doPartitionDisks {
    my ($_clicked, $_ent_number, $auto) = @_;
    $o->{steps}{formatPartitions}{done} = 0;
    installStepsCall($o, $auto, 'doPartitionDisksBefore');
    installStepsCall($o, $auto, 'doPartitionDisks');
    installStepsCall($o, $auto, 'doPartitionDisksAfter');
}

sub formatPartitions {
    my ($_clicked, $_ent_number, $auto) = @_;

    $o->{steps}{choosePackages}{done} = 0;
    installStepsCall($o, $auto, 'choosePartitionsToFormat', $o->{fstab}) if !$o->{isUpgrade};
    my $want_root_formated = fsedit::get_root($o->{fstab})->{toFormat};
    if ($want_root_formated) {
	foreach ('/usr') {
	    my $part = fsedit::mntpoint2part($_, $o->{fstab}) or next;
	    $part->{toFormat} or die N("You must also format %s", $_);
	}
    }
    installStepsCall($o, $auto, 'formatMountPartitions', $o->{fstab}) if !$::testing;

    if ($want_root_formated) {
	#- we formatted /, ensure /var/lib/rpm is cleaned otherwise bad things can happen
	#- (especially when /var is *not* formatted)
	eval { rm_rf("$o->{prefix}/var/lib/rpm") };
    }

    mkdir "$o->{prefix}/$_", 0755 foreach 
      qw(dev etc etc/profile.d etc/rpm etc/sysconfig etc/sysconfig/console 
	etc/sysconfig/network-scripts etc/sysconfig/console/consolefonts 
	etc/sysconfig/console/consoletrans
	home mnt tmp var var/tmp var/lib var/lib/rpm var/lib/urpmi);
    mkdir "$o->{prefix}/$_", 0700 foreach qw(root root/tmp root/drakx);

    devices::make("$o->{prefix}/dev/null");
    chmod 0666, "$o->{prefix}/dev/null";

    common::screenshot_dir__and_move();

    any::rotate_logs($o->{prefix});

    require raid;
    raid::prepare_prefixed($o->{all_hds}{raids}, $o->{prefix});
}

#------------------------------------------------------------------------------
sub choosePackages {
    my ($_clicked, $ent_number, $auto) = @_;
    require pkgs;

    #- always setPackages as it may have to copy hdlist files and synthesis files.
    installStepsCall($o, $auto, 'setPackages', $o->{isUpgrade} && $ent_number == 1);
    installStepsCall($o, $auto, 'choosePackages', $o->{packages}, $o->{compssUsers}, $ent_number == 1);
    log::l("compssUsersChoice's: ", join(" ", grep { $o->{compssUsersChoice}{$_} } keys %{$o->{compssUsersChoice}}));

    #- check pre-condition where base backage has to be selected.
    pkgs::packageByName($o->{packages}, 'basesystem')->flag_available or die "basesystem package not selected";

    #- check if there are package that need installation.
    $o->{steps}{installPackages}{done} = 0 if $o->{steps}{installPackages}{done} && pkgs::packagesToInstall($o->{packages}) > 0;
}

#------------------------------------------------------------------------------
sub installPackages {
    my ($_clicked, $ent_number, $auto) = @_;

    installStepsCall($o, $auto, 'readBootloaderConfigBeforeInstall') if $ent_number == 1;

    installStepsCall($o, $auto, 'beforeInstallPackages');
    installStepsCall($o, $auto, 'installPackages');
    installStepsCall($o, $auto, 'afterInstallPackages');
}
#------------------------------------------------------------------------------
sub miscellaneous {
    my ($clicked, $_ent_number, $auto) = @_;

    installStepsCall($o, $auto, 'miscellaneousBefore', $clicked);
    installStepsCall($o, $auto, 'miscellaneous', $clicked);
    installStepsCall($o, $auto, 'miscellaneousAfter', $clicked);
}

#------------------------------------------------------------------------------
sub summary {
    my ($_clicked, $ent_number, $auto) = @_;
    installStepsCall($o, $auto, 'summaryBefore');
    installStepsCall($o, $auto, 'summary', $ent_number == 1);
}
#------------------------------------------------------------------------------
sub configureNetwork {
    my ($_clicked, $_ent_number, $auto) = @_;
    #- get current configuration of network device.
    require network;
    eval { network::read_all_conf($o->{prefix}, $o->{netc} ||= {}, $o->{intf} ||= {}) };
    installStepsCall($o, $auto, 'configureNetwork') if !$o->{isUpgrade};
}
#------------------------------------------------------------------------------
sub installUpdates {
    my ($_clicked, $_ent_number, $auto) = @_;
    installStepsCall($o, $auto, 'installUpdates');
}
#------------------------------------------------------------------------------
sub configureServices {
    my ($clicked, $_ent_number, $auto) = @_;
    installStepsCall($o, $auto, 'configureServices', $clicked);
}
#------------------------------------------------------------------------------
sub setRootPassword {
    my ($clicked, $_ent_number, $auto) = @_;
    return if $o->{isUpgrade};

    installStepsCall($o, $auto, 'setRootPassword', $clicked);
    addToBeDone { install_any::setAuthentication($o) } 'installPackages';
}
#------------------------------------------------------------------------------
sub addUser {
    my ($clicked, $_ent_number, $auto) = @_;

    installStepsCall($o, $auto, 'addUser', $clicked) if !$o->{isUpgrade};
}

#------------------------------------------------------------------------------
sub setupBootloader {
    my ($_clicked, $ent_number, $auto) = @_;
    return if $::g_auto_install || $::uml_install;

    modules::write_conf($o->{prefix});

    installStepsCall($o, $auto, 'setupBootloaderBefore') if $ent_number == 1;
    installStepsCall($o, $auto, 'setupBootloader');

    eval { install_any::set_security($o) };
}
#------------------------------------------------------------------------------
sub configureX {
    my ($_clicked, $_ent_number, $auto) = @_;

    #- done here and also at the end of install2.pm, just in case...
    install_any::write_fstab($o);
    modules::write_conf($o->{prefix});

    require pkgs;
    installStepsCall($o, $auto, 'configureX') if pkgs::packageByName($o->{packages}, 'XFree86')->flag_installed && !$o->{X}{disabled} || $::testing;
}
#------------------------------------------------------------------------------
sub exitInstall {
    my ($_clicked, $_xent_number, $auto) = @_;
    installStepsCall($o, $auto, 'exitInstall', getNextStep() eq 'exitInstall');
}


sub start_i810fb {

    my ($vga) = cat_('/proc/cmdline') =~ /vga=(\S+)/;
    return if !$vga || listlength(cat_('/proc/fb'));

    my %vga_to_xres = (0x311 => '640', 0x314 => '800', 0x317 => '1024');
    my $xres = $vga_to_xres{$vga} || '800';

    log::l("trying to load i810fb module with xres <$xres> (vga was <$vga>)");
    eval {
	any::ddcxinfos(); # keep the result otherwise ddcxinfos doesn't return good results afterwards
	modules::load([ 'i810fb',
			"xres=$xres", 'hsync1=32', 'hsync2=48', 'vsync1=50', 'vsync2=70',  #- this sucking i810fb does not accept floating point numbers in hsync!
			 'vram=2', 'bpp=16', 'accel=1', 'mtrr=1', 'hwcur=1', 'xcon=4' ]);
    };
}


#-######################################################################################
#- MAIN
#-######################################################################################
sub main {
    $SIG{__DIE__} = sub { chomp(my $err = $_[0]); log::l("warning: $err") if $err !~ /^find_index failed/ };
    $SIG{SEGV} = sub { 
	my $msg = "segmentation fault: seems like memory is missing as the install crashes"; print "$msg\n"; log::l($msg);
	$o->ask_warn('', $msg);
	setVirtual(1);
	require install_steps_auto_install;
	install_steps_auto_install_non_interactive::errorInStep();
    };
    $ENV{PERL_BADLANG} = 1;
    umask 022;

    $::isInstall = 1;
    $::isWizard = 1;
    $::no_ugtk_init = 1;
    $::expert = $::g_auto_install = 0;

#-    c::unlimit_core() unless $::testing;

    my ($cfg, $patch, @auto);
    my %cmdline; map { 
	my ($n, $v) = split '=';
	$cmdline{$n} = $v || 1;
    } split ' ', cat_("/proc/cmdline");

    my $opt; foreach (@_) {
	if (/^--?(.*)/) {
	    $cmdline{$opt} = 1 if $opt;
	    $opt = $1;
	} else {
	    $cmdline{$opt} = $_ if $opt;
	    $opt = '';
	}
    } $cmdline{$opt} = 1 if $opt;
    
    map_each {
	my ($n, $v) = @_;
	my $f = ${{
	    oem       => sub { $::oem = $v },
	    lang      => sub { $o->{locale}{lang} = $v },
	    flang     => sub { $o->{locale}{lang} = $v; push @auto, 'selectLanguage' },
	    method    => sub { $o->{method} = $v },
	    pcmcia    => sub { $o->{pcmcia} = $v },
	    vga16     => sub { $o->{vga16} = $v },
	    vga       => sub { $o->{vga} = $v },
	    step      => sub { $o->{steps}{first} = $v },
	    expert    => sub { $::expert = $v },
	    meta_class => sub { $o->{meta_class} = $v },
	    readonly  => sub { $o->{partitioning}{readonly} = $v ne "0" },
	    display   => sub { $o->{display} = $v },
	    askdisplay => sub { print "Please enter the X11 display to perform the install on ? "; $o->{display} = chomp_(scalar(<STDIN>)) },
	    security  => sub { $o->{security} = $v },
	    live      => sub { $::live = 1 },
	    noauto    => sub { $::noauto = 1 },
	    test      => sub { $::testing = 1 },
	    patch     => sub { $patch = 1 },
	    defcfg    => sub { $cfg = $v },
	    newt      => sub { $o->{interactive} = "newt" },
	    text      => sub { $o->{interactive} = "newt" },
	    stdio     => sub { $o->{interactive} = "stdio" },
	    corporate => sub { $::corporate = 1 },
	    kickstart => sub { $::auto_install = $v },
	    uml_install => sub { $::uml_install = 1 },
	    auto_install => sub { $::auto_install = $v },
	    simple_themes => sub { $o->{simple_themes} = 1 },
	    theme     => sub { $o->{theme} = $v },
	    doc       => sub { $o->{doc} = 1 },  #- will be used to know that we're running for the doc team,
	                                         #- e.g. we want screenshots with a good B&W contrast
	    useless_thing_accepted => sub { $o->{useless_thing_accepted} = 1 },
	    alawindows => sub { $o->{security} = 0; $o->{partitioning}{clearall} = 1; $o->{bootloader}{crushMbr} = 1 },
	    fdisk => sub { $o->{partitioning}{fdisk} = 1 },
	    g_auto_install => sub { $::testing = $::g_auto_install = 1; $o->{partitioning}{auto_allocate} = 1 },
	    nomouseprobe => sub { $o->{nomouseprobe} = $v },
	    blank         => sub { $o->{blank} = $::blank = 1 },
	    updatemodules => sub { $o->{updatemodules} = 1 },
	}}{lc $n}; &$f if $f;
    } %cmdline;

    if ($::testing) {
	$ENV{SHARE_PATH} ||= "/export/Mandrake/mdkinst/usr/share";
	$ENV{SHARE_PATH} = "/usr/share" if !-e $ENV{SHARE_PATH};
    } else {
	$ENV{SHARE_PATH} ||= "/usr/share";
    }

    undef $::auto_install if $cfg;
    if ($::g_auto_install) {
	(my $root = `/bin/pwd`) =~ s|(/[^/]*){5}$||;
	symlinkf $root, "/tmp/image" or die "unable to create link /tmp/image";
	$o->{method} ||= "cdrom";
	$o->{mkbootdisk} = 0;
    }
    if (!$::testing && !$::live) {
	symlink "rhimage", "/tmp/image"; #- for compatibility with old stage1
	unlink $_ foreach "/modules/modules.mar", "/sbin/stage1";
    }

    print STDERR "in second stage install\n";
    log::openLog(($::testing || $o->{localInstall}) && 'debug.log');
    log::l("second stage install running (", any::drakx_version(), ")");

    $o->{prefix} = $::prefix = $::testing ? "/tmp/test-perl-install" : $::live ? "" : "/mnt";
    $o->{isUpgrade} = 1 if $::live;
    mkdir $o->{prefix}, 0755;
    devices::make("/dev/zero"); #- needed by ddcxinfos

    #-  make sure we don't pick up any gunk from the outside world
    my $remote_path = "$o->{prefix}/sbin:$o->{prefix}/bin:$o->{prefix}/usr/sbin:$o->{prefix}/usr/bin:$o->{prefix}/usr/X11R6/bin";
    $ENV{PATH} = "/usr/bin:/bin:/sbin:/usr/sbin:/usr/X11R6/bin:$remote_path" unless $::g_auto_install;

    eval { spawnShell() };

    modules::load_dependencies(($::testing ? ".." : "") . "/modules/modules.dep");
    modules::read_stage1_conf($_) foreach "/tmp/conf.modules", "/etc/modules.conf";
    modules::read_already_loaded();

    #- done before auto_install is called to allow the -IP feature on auto_install file name
    if (-e '/tmp/network') {
	require network;
	#- get stage1 network configuration if any.
	log::l('found /tmp/network');
	$o->{netc} ||= {};
	add2hash($o->{netc}, network::read_conf('/tmp/network'));
	if (my ($file) = glob_('/tmp/ifcfg-*')) {
	    log::l("found network config file $file");
	    my $l = network::read_interface_conf($file);
	    $o->{intf} ||= { $l->{DEVICE} => $l };
	}
	if (-e '/etc/resolv.conf') {
	    my $file = '/etc/resolv.conf';
	    log::l("found network config file $file");
	    add2hash($o->{netc}, network::read_resolv_conf($file));
	}
    }

    #- done after module dependencies are loaded for "vfat depends on fat"
    if ($::auto_install) {
	if ($::auto_install =~ /-IP(\.pl)?$/) {
	    my $ip = join('', map { sprintf "%02X", $_ } split '\.', $o->{intf}{IPADDR});
	    $::auto_install =~ s/-IP(\.pl)?$/-$ip$1/;
	}
	require install_steps_auto_install;
	eval { $o = $::o = install_any::loadO($o, $::auto_install) };
	if ($@) {
	    if ($o->{useless_thing_accepted}) { #- Pixel's hack to be able to fail through
		log::l("error using auto_install, continuing");
		undef $::auto_install;
	    } else {
		print "Error using auto_install\n$@\n";
		install_steps_auto_install_non_interactive::errorInStep();
	    }
	} else {
	    log::l("auto install config file loaded successfully");
	}
    }
    $o->{interactive} ||= 'gtk' if !$::auto_install;
 
    if ($o->{interactive} eq "gtk" && availableMemory() < 22 * 1024) {
 	log::l("switching to newt install cuz not enough memory");
 	$o->{interactive} = "newt";
    }

    if (my ($s) = cat_("/proc/cmdline") =~ /brltty=(\S*)/) {
	my ($driver, $device, $table) = split(',', $s);
	$table = "text.$table.tbl" if $table !~ /\.tbl$/;
	log::l("brltty option $driver $device $table");
	$o->{brltty} = { driver => $driver, device => $device, table => $table };
	$o->{interactive} = 'newt';
    }

    # perl_checker: require install_steps_gtk
    # perl_checker: require install_steps_newt
    # perl_checker: require install_steps_stdio
    require "install_steps_$o->{interactive}.pm" if $o->{interactive};

    #- needed before accessing floppy (in case of usb floppy)
    modules::load_category('bus/usb'); 

    #- oem patch should be read before to still allow patch or defcfg.
    eval { $o = $::o = install_any::loadO($o, "Mandrake/base/patch-oem.pl"); log::l("successfully read oem patch") };
    #- patch should be read after defcfg in order to take precedance.
    eval { $o = $::o = install_any::loadO($o, $cfg); log::l("successfully read default configuration: $cfg") } if $cfg;
    eval { $o = $::o = install_any::loadO($o, "patch"); log::l("successfully read patch") } if $patch;

    eval { modules::load("af_packet") };

    require harddrake::sound;
    harddrake::sound::configure_sound_slots();

    #- need to be after oo-izing $o
    if ($o->{brltty}) {
	symlink "/tmp/stage2/$_", $_ foreach "/etc/brltty";
	if (common::usingRamdisk()) {
	    install_any::remove_unused(0);
	    mkdir '/tmp/stage2/etc/brltty';
	    mkdir '/lib/brltty';
	    foreach ($o->{brltty}{table}, "brltty-$o->{brltty}{driver}.hlp") {
		install_any::getAndSaveFile($_ , "/tmp/stage2/$_") if $_;
	    }
	    install_any::getAndSaveFile("/lib/brltty/libbrlttyb$o->{brltty}{driver}.so") or do {
		local $| = 1;
		print("Braille driver $o->{brltty}{driver} for BRLTTY was not found.\n",
		      "Press ENTER to continue.\n\a");
		<STDIN>;
	    };
	    install_any::getAndSaveFile("/usr/bin/brltty");
	    chmod 0755, "/usr/bin/brltty";
	}
	devices::make("vcsa");
	run_program::run("brltty");
    }

    #- needed very early for install_steps_gtk
    eval { $o->{mouse} = mouse::detect() } if !$o->{nomouseprobe} && !$o->{mouse} && !$::testing;

    $o->{locale}{lang} = lang::set($o->{locale}{lang}) if $o->{locale}{lang} ne 'en_US'; #- mainly for defcfg

    start_i810fb();

    $o->{allowFB} = listlength(cat_("/proc/fb"));

    my $VERSION = cat__(install_any::getFile("VERSION")) or do { print "VERSION file missing\n"; sleep 5 };
    $o->{meta_class} = 'desktop' if $VERSION =~ /desktop/i;
    $o->{meta_class} = 'firewall' if $VERSION =~ /firewall/i;
    $o->{meta_class} = 'server' if $VERSION =~ /server/i;
    if ($::oem) {
	$o->{partitioning}{use_existing_root} = 1;
	$o->{compssListLevel} = 4;
	push @auto, 'selectInstallClass', 'doPartitionDisks', 'choosePackages', 'configureTimezone', 'exitInstall';
    }

    foreach (@auto) {
	my $s = $o->{steps}{/::(.*)/ ? $1 : $_} or next;
	$s->{auto} = $s->{hidden} = 1;
    }

    my $o_;
    while (1) {
    	$o_ = $::auto_install ?
    	  install_steps_auto_install->new($o) :
    	    $o->{interactive} eq "stdio" ?
    	  install_steps_stdio->new($o) :
    	    $o->{interactive} eq "newt" ?
    	  install_steps_newt->new($o) :
    	    $o->{interactive} eq "gtk" ?
    	  install_steps_gtk->new($o) :
    	    die "unknown install type";
	$o_ and last;

	$o->{interactive} = "newt";
	require install_steps_newt;
    }
    $::o = $o = $o_;

    install_any::remove_unused() if common::usingRamdisk();

    #-the main cycle
    my $clicked = 0;
    MAIN: for ($o->{step} = $o->{steps}{first};; $o->{step} = getNextStep()) {
	$o->{steps}{$o->{step}}{entered}++;
	$o->enteringStep($o->{step});
	eval {
	    &{$install2::{$o->{step}}}($clicked || $o->{steps}{$o->{step}}{noauto},
				       $o->{steps}{$o->{step}}{entered},
				       $clicked ? 0 : $o->{steps}{$o->{step}}{auto});
	};
	my $err = $@;
	$o->kill_action;
	$clicked = 0;
	if ($err) {
	    local $_ = $err;
	    $o->kill_action;
	    if (!/^already displayed/) {
		eval { $o->errorInStep($_) };
		$o->{steps}{$o->{step}}{auto} = 0;
		$err = $@;
		$err and next;
	    }
	    $o->{step} = $o->{steps}{$o->{step}}{onError};
	    next MAIN unless $o->{steps}{$o->{step}}{reachable}; #- sanity check: avoid a step not reachable on error.
	    redo MAIN;
	}
	$o->{steps}{$o->{step}}{done} = 1;
	$o->leavingStep($o->{step});

	last if $o->{step} eq 'exitInstall';
    }
    install_any::clean_postinstall_rpms();
    install_any::log_sizes($o);
    install_any::remove_advertising($o);
    install_any::write_fstab($o);
    modules::write_conf($o->{prefix});
    detect_devices::install_addons($o->{prefix});

    #- mainly for auto_install's
    #- do not use run_program::xxx because it doesn't leave stdin/stdout unchanged
    system("bash", "-c", $o->{postInstallNonRooted}) if $o->{postInstallNonRooted};
    system("chroot", $o->{prefix}, "bash", "-c", $o->{postInstall}) if $o->{postInstall};

    install_any::ejectCdrom();

    #- to ensure linuxconf doesn't cry against those files being in the future
    foreach ('/etc/modules.conf', '/etc/crontab', '/etc/sysconfig/mouse', '/etc/sysconfig/network', '/etc/X11/fs/config') {
	my $now = time() - 24 * 60 * 60;
	utime $now, $now, "$o->{prefix}/$_";
    }
    $::live or install_any::killCardServices();

    #- make sure failed upgrade will not hurt too much.
    install_steps::cleanIfFailedUpgrade($o);

    -e "$o->{prefix}/usr/sbin/urpmi.update" or eval { rm_rf("$o->{prefix}/var/lib/urpmi") };

    #- copy latest log files
    eval { cp_af("/tmp/$_", "$o->{prefix}/root/drakx") foreach qw(ddebug.log stage1.log) };

    #- ala pixel? :-) [fpons]
    common::sync(); common::sync();

    log::l("installation complete, leaving");
    log::l("files still open by install2: ", readlink($_)) foreach glob_("/proc/self/fd/*");
    print "\n" x 80;
}

1;