summaryrefslogtreecommitdiffstats
path: root/perl-install/share/po/fi.po
diff options
context:
space:
mode:
authorThierry Vignaud <tvignaud@mandriva.org>2005-07-05 07:40:47 +0000
committerThierry Vignaud <tvignaud@mandriva.org>2005-07-05 07:40:47 +0000
commit4a8d78ad8370533c11788f9ee280b635bb34e8ba (patch)
tree5de1e10954ef594acad9f17c7b8221801f94b032 /perl-install/share/po/fi.po
parent2cea242328d456b4b35da360a09e773aa4781f0a (diff)
downloaddrakx-4a8d78ad8370533c11788f9ee280b635bb34e8ba.tar
drakx-4a8d78ad8370533c11788f9ee280b635bb34e8ba.tar.gz
drakx-4a8d78ad8370533c11788f9ee280b635bb34e8ba.tar.bz2
drakx-4a8d78ad8370533c11788f9ee280b635bb34e8ba.tar.xz
drakx-4a8d78ad8370533c11788f9ee280b635bb34e8ba.zip
update strings from CVS
Diffstat (limited to 'perl-install/share/po/fi.po')
-rw-r--r--perl-install/share/po/fi.po712
1 files changed, 463 insertions, 249 deletions
diff --git a/perl-install/share/po/fi.po b/perl-install/share/po/fi.po
index 730f3f96d..2de6de0fd 100644
--- a/perl-install/share/po/fi.po
+++ b/perl-install/share/po/fi.po
@@ -11,7 +11,7 @@
msgid ""
msgstr ""
"Project-Id-Version: DrakX-fi - LE2005 Release\n"
-"POT-Creation-Date: 2005-07-01 16:44+0200\n"
+"POT-Creation-Date: 2005-07-05 16:34+0200\n"
"PO-Revision-Date: 2005-04-03 20:59+0300\n"
"Last-Translator: Thomas Backlund <tmb@mandrake.org>\n"
"Language-Team: Finnish <fi@li.org>\n"
@@ -226,12 +226,13 @@ msgstr "Odota hetki, tunnistetaan ja asetetaan laitteistoa..."
#: standalone/drakbackup:4324 standalone/drakclock:124
#: standalone/drakconnect:672 standalone/drakconnect:676
#: standalone/drakconnect:681 standalone/drakconnect:696
-#: standalone/drakfloppy:297 standalone/drakfloppy:300
-#: standalone/drakfloppy:306 standalone/drakfont:210 standalone/drakfont:223
-#: standalone/drakfont:261 standalone/drakgw:50 standalone/drakgw:188
-#: standalone/drakgw:217 standalone/drakgw:258 standalone/drakgw:292
-#: standalone/drakgw:397 standalone/drakroam:41 standalone/draksplash:15
-#: standalone/drakxtv:107 standalone/finish-install:49 standalone/logdrake:168
+#: standalone/drakfont:210 standalone/drakfont:223 standalone/drakfont:261
+#: standalone/drakgw:50 standalone/drakgw:188 standalone/drakgw:217
+#: standalone/drakgw:258 standalone/drakgw:292 standalone/drakgw:397
+#: standalone/drakhosts:227 standalone/drakhosts:234 standalone/drakhosts:242
+#: standalone/draknfs:351 standalone/draknfs:358 standalone/draknfs:366
+#: standalone/drakroam:41 standalone/draksplash:15 standalone/drakxtv:107
+#: standalone/finish-install:49 standalone/logdrake:168
#: standalone/logdrake:437 standalone/logdrake:442 standalone/scannerdrake:59
#: standalone/scannerdrake:202 standalone/scannerdrake:261
#: standalone/scannerdrake:715 standalone/scannerdrake:726
@@ -317,8 +318,8 @@ msgid "No CDROM support"
msgstr "Ei CD-ROM-tukea"
#: ../move/tree/mdk_totem:76 diskdrake/hd_gtk.pm:92
-#: diskdrake/interactive.pm:1039 diskdrake/interactive.pm:1049
-#: diskdrake/interactive.pm:1102
+#: diskdrake/interactive.pm:1046 diskdrake/interactive.pm:1056
+#: diskdrake/interactive.pm:1109
#, c-format
msgid "Read carefully!"
msgstr "Lue tarkkaan!"
@@ -674,11 +675,11 @@ msgstr "Peruuta"
#: Xconfig/resolution_and_depth.pm:372 diskdrake/hd_gtk.pm:150
#: install_steps_gtk.pm:228 install_steps_gtk.pm:629 interactive.pm:527
#: interactive/gtk.pm:677 interactive/gtk.pm:679 standalone/drakTermServ:284
-#: standalone/drakbackup:3883 standalone/drakbug:104
+#: standalone/drakbackup:3883 standalone/drakbug:105
#: standalone/drakconnect:153 standalone/drakconnect:236
-#: standalone/drakfont:509 standalone/drakperm:133 standalone/draksec:336
-#: standalone/draksec:338 standalone/draksec:356 standalone/draksec:358
-#: ugtk2.pm:1040 ugtk2.pm:1041
+#: standalone/drakfont:509 standalone/draknfs:131 standalone/draknfs:133
+#: standalone/drakperm:133 standalone/draksec:336 standalone/draksec:338
+#: standalone/draksec:356 standalone/draksec:358 ugtk2.pm:1040 ugtk2.pm:1041
#, c-format
msgid "Help"
msgstr "Ohje"
@@ -826,7 +827,7 @@ msgstr "muu"
#: any.pm:142 harddrake/sound.pm:190 interactive.pm:470 pkgs.pm:458
#: standalone/drakconnect:160 standalone/drakconnect:635 standalone/draksec:68
#: standalone/drakups:101 standalone/drakxtv:92 standalone/harddrake2:245
-#: standalone/service_harddrake:207
+#: standalone/service_harddrake:206
#, c-format
msgid "Please wait"
msgstr "Odota hetki"
@@ -949,7 +950,7 @@ msgstr ""
msgid "The passwords do not match"
msgstr "Salasanat poikkeavat toisistaan"
-#: any.pm:276 any.pm:609 authentication.pm:181 diskdrake/interactive.pm:1299
+#: any.pm:276 any.pm:609 authentication.pm:181 diskdrake/interactive.pm:1306
#, c-format
msgid "Please try again"
msgstr "Yritä uudelleen"
@@ -1082,8 +1083,7 @@ msgstr "Verkkoprofiili"
msgid "Label"
msgstr "Nimike"
-#: any.pm:382 any.pm:392 harddrake/v4l.pm:358 standalone/drakfloppy:84
-#: standalone/drakfloppy:90 standalone/draksec:52
+#: any.pm:382 any.pm:392 harddrake/v4l.pm:358 standalone/draksec:52
#, c-format
msgid "Default"
msgstr "Oletus"
@@ -1438,7 +1438,7 @@ msgstr "Käynnistä Userdrake"
#: any.pm:1015 printer/printerdrake.pm:3900 printer/printerdrake.pm:3903
#: printer/printerdrake.pm:3904 printer/printerdrake.pm:3905
#: printer/printerdrake.pm:5162 standalone/drakTermServ:294
-#: standalone/drakbackup:4083 standalone/drakbug:127 standalone/drakfont:497
+#: standalone/drakbackup:4083 standalone/drakbug:126 standalone/drakfont:497
#: standalone/drakroam:242 standalone/net_monitor:118
#: standalone/printerdrake:547
#, c-format
@@ -2102,12 +2102,12 @@ msgid "Server: "
msgstr "Palvelin: "
#: diskdrake/dav.pm:110 diskdrake/interactive.pm:521
-#: diskdrake/interactive.pm:1181 diskdrake/interactive.pm:1259
+#: diskdrake/interactive.pm:1188 diskdrake/interactive.pm:1266
#, c-format
msgid "Mount point: "
msgstr "Liitospiste: "
-#: diskdrake/dav.pm:111 diskdrake/interactive.pm:1266
+#: diskdrake/dav.pm:111 diskdrake/interactive.pm:1273
#, c-format
msgid "Options: %s"
msgstr "Optiot: %s"
@@ -2194,7 +2194,7 @@ msgstr "HFS"
msgid "Windows"
msgstr "Windows "
-#: diskdrake/hd_gtk.pm:336 diskdrake/interactive.pm:1196
+#: diskdrake/hd_gtk.pm:336 diskdrake/interactive.pm:1203
#, c-format
msgid "Empty"
msgstr "Tyhjä"
@@ -2269,38 +2269,38 @@ msgstr "Vaihda asiantuntijatilaan"
msgid "Continue anyway?"
msgstr "Jatka joka tapauksessa?"
-#: diskdrake/interactive.pm:278
-#, c-format
-msgid ""
-"You should format partition %s.\n"
-"Otherwise no entry for mount point %s will be written in fstab.\n"
-"Quit anyway?"
-msgstr ""
-"Sinun pitäisi alustaa osio %s.\n"
-"Muuten tietuetta liitoskohdalle %s ei kirjoiteta fstab:iin.\n"
-"Lopeta kummiskin?"
-
-#: diskdrake/interactive.pm:285
+#: diskdrake/interactive.pm:280
#, c-format
msgid "Quit without saving"
msgstr "Lopeta tallentamatta"
-#: diskdrake/interactive.pm:285
+#: diskdrake/interactive.pm:280
#, c-format
msgid "Quit without writing the partition table?"
msgstr "Lopeta kirjoittamatta osiotaulua?"
-#: diskdrake/interactive.pm:290
+#: diskdrake/interactive.pm:285
#, c-format
msgid "Do you want to save /etc/fstab modifications"
msgstr "Haluatko tallentaa muutokset tiedostoon /etc/fstab"
-#: diskdrake/interactive.pm:297 install_steps_interactive.pm:329
+#: diskdrake/interactive.pm:292 install_steps_interactive.pm:329
#, c-format
msgid "You need to reboot for the partition table modifications to take place"
msgstr ""
"Sinun tulee käynnistää järjestelmä uudelleen jotta muutokset tulevat voimaan"
+#: diskdrake/interactive.pm:297
+#, c-format
+msgid ""
+"You should format partition %s.\n"
+"Otherwise no entry for mount point %s will be written in fstab.\n"
+"Quit anyway?"
+msgstr ""
+"Sinun pitäisi alustaa osio %s.\n"
+"Muuten tietuetta liitoskohdalle %s ei kirjoiteta fstab:iin.\n"
+"Lopeta kummiskin?"
+
#: diskdrake/interactive.pm:310 help.pm:530
#, c-format
msgid "Clear all"
@@ -2455,12 +2455,12 @@ msgstr "Luo uusi osio"
msgid "Start sector: "
msgstr "Aloitussektori: "
-#: diskdrake/interactive.pm:519 diskdrake/interactive.pm:919
+#: diskdrake/interactive.pm:519 diskdrake/interactive.pm:926
#, c-format
msgid "Size in MB: "
msgstr "Koko Mt: "
-#: diskdrake/interactive.pm:520 diskdrake/interactive.pm:920
+#: diskdrake/interactive.pm:520 diskdrake/interactive.pm:927
#, c-format
msgid "Filesystem type: "
msgstr "Tiedostojärjestelmä: "
@@ -2606,98 +2606,110 @@ msgstr "Valitse olemassa oleva LVM johon lisätään"
msgid "LVM name?"
msgstr "LVM:n nimi?"
-#: diskdrake/interactive.pm:904
+#: diskdrake/interactive.pm:891
+#, c-format
+msgid ""
+"Physical volume %s is still in use.\n"
+"Do you want to move used physical extents on this volume to other volumes?"
+msgstr ""
+
+#: diskdrake/interactive.pm:893
+#, c-format
+msgid "Moving physical extents"
+msgstr ""
+
+#: diskdrake/interactive.pm:911
#, c-format
msgid "This partition can not be used for loopback"
msgstr "Osiota ei voida käyttää loopback-osiona"
-#: diskdrake/interactive.pm:917
+#: diskdrake/interactive.pm:924
#, c-format
msgid "Loopback"
msgstr "Loopback"
-#: diskdrake/interactive.pm:918
+#: diskdrake/interactive.pm:925
#, c-format
msgid "Loopback file name: "
msgstr "Loopback tiedostonimi: "
-#: diskdrake/interactive.pm:923
+#: diskdrake/interactive.pm:930
#, c-format
msgid "Give a file name"
msgstr "Anna tiedostonimi"
-#: diskdrake/interactive.pm:926
+#: diskdrake/interactive.pm:933
#, c-format
msgid "File is already used by another loopback, choose another one"
msgstr "Tiedosto on jo toisen loopback:n käytössä, valitse toinen"
-#: diskdrake/interactive.pm:927
+#: diskdrake/interactive.pm:934
#, c-format
msgid "File already exists. Use it?"
msgstr "Tiedosto on jo olemassa. Käytetäänkö sitä?"
-#: diskdrake/interactive.pm:950
+#: diskdrake/interactive.pm:957
#, c-format
msgid "Mount options"
msgstr "Liitosoptiot"
-#: diskdrake/interactive.pm:957
+#: diskdrake/interactive.pm:964
#, c-format
msgid "Various"
msgstr "Useita"
-#: diskdrake/interactive.pm:1021
+#: diskdrake/interactive.pm:1028
#, c-format
msgid "device"
msgstr "laite"
-#: diskdrake/interactive.pm:1022
+#: diskdrake/interactive.pm:1029
#, c-format
msgid "level"
msgstr "taso"
-#: diskdrake/interactive.pm:1023
+#: diskdrake/interactive.pm:1030
#, c-format
msgid "chunk size in KiB"
msgstr "lohkon koko kilotavuina"
-#: diskdrake/interactive.pm:1040
+#: diskdrake/interactive.pm:1047
#, c-format
msgid "Be careful: this operation is dangerous."
msgstr "Varoitus: tämä on vaarallinen toiminto"
-#: diskdrake/interactive.pm:1055
+#: diskdrake/interactive.pm:1062
#, c-format
msgid "What type of partitioning?"
msgstr "Minkä tyyppinen osiointi?"
-#: diskdrake/interactive.pm:1093
+#: diskdrake/interactive.pm:1100
#, c-format
msgid "You'll need to reboot before the modification can take place"
msgstr "Sinun täytyy käynnistää kone uudelleen ennen kuin muutos tulee voimaan"
-#: diskdrake/interactive.pm:1102
+#: diskdrake/interactive.pm:1109
#, c-format
msgid "Partition table of drive %s is going to be written to disk!"
msgstr "Levyn %s osiotaulu kirjoitetaan levylle!"
# mat
-#: diskdrake/interactive.pm:1111
+#: diskdrake/interactive.pm:1118
#, c-format
msgid "After formatting partition %s, all data on this partition will be lost"
msgstr "Kaikki osiolla %s olevat tiedot häviävät osion alustuksen yhteydessä"
-#: diskdrake/interactive.pm:1127
+#: diskdrake/interactive.pm:1134
#, c-format
msgid "Move files to the new partition"
msgstr "Siirrä tiedostot uudelle osiolle"
-#: diskdrake/interactive.pm:1127
+#: diskdrake/interactive.pm:1134
#, c-format
msgid "Hide files"
msgstr "Piilota tiedostot"
-#: diskdrake/interactive.pm:1128
+#: diskdrake/interactive.pm:1135
#, c-format
msgid ""
"Directory %s already contains data\n"
@@ -2706,109 +2718,109 @@ msgstr ""
"Hakemisto %s sisältää jo jotakin tietoa\n"
"(%s)"
-#: diskdrake/interactive.pm:1139
+#: diskdrake/interactive.pm:1146
#, c-format
msgid "Moving files to the new partition"
msgstr "Siirretään tiedostoja uudelle osiolle"
-#: diskdrake/interactive.pm:1143
+#: diskdrake/interactive.pm:1150
#, c-format
msgid "Copying %s"
msgstr "Kopioidaan %s"
-#: diskdrake/interactive.pm:1147
+#: diskdrake/interactive.pm:1154
#, c-format
msgid "Removing %s"
msgstr "Poistetaan %s"
-#: diskdrake/interactive.pm:1161
+#: diskdrake/interactive.pm:1168
#, c-format
msgid "partition %s is now known as %s"
msgstr "osio %s tunnetaan nyt nimellä %s"
-#: diskdrake/interactive.pm:1162
+#: diskdrake/interactive.pm:1169
#, c-format
msgid "Partitions have been renumbered: "
msgstr "Osiot ovat uudellennumerotu: "
-#: diskdrake/interactive.pm:1182 diskdrake/interactive.pm:1244
+#: diskdrake/interactive.pm:1189 diskdrake/interactive.pm:1251
#, c-format
msgid "Device: "
msgstr "Laite: "
-#: diskdrake/interactive.pm:1183
+#: diskdrake/interactive.pm:1190
#, c-format
msgid "Devfs name: "
msgstr "Devfs laitenimi: "
-#: diskdrake/interactive.pm:1184
+#: diskdrake/interactive.pm:1191
#, c-format
msgid "Volume label: "
msgstr "Osion nimi: "
-#: diskdrake/interactive.pm:1185
+#: diskdrake/interactive.pm:1192
#, c-format
msgid "DOS drive letter: %s (just a guess)\n"
msgstr "DOS-asema: %s (vain arvaus)\n"
-#: diskdrake/interactive.pm:1189 diskdrake/interactive.pm:1198
-#: diskdrake/interactive.pm:1262
+#: diskdrake/interactive.pm:1196 diskdrake/interactive.pm:1205
+#: diskdrake/interactive.pm:1269
#, c-format
msgid "Type: "
msgstr "Tyyppi: "
-#: diskdrake/interactive.pm:1193 install_steps_gtk.pm:296
+#: diskdrake/interactive.pm:1200 install_steps_gtk.pm:296
#, c-format
msgid "Name: "
msgstr "Nimi: "
-#: diskdrake/interactive.pm:1200
+#: diskdrake/interactive.pm:1207
#, c-format
msgid "Start: sector %s\n"
msgstr "Alkaa: sektori %s\n"
# mat
-#: diskdrake/interactive.pm:1201
+#: diskdrake/interactive.pm:1208
#, c-format
msgid "Size: %s"
msgstr "Koko: %s"
-#: diskdrake/interactive.pm:1203
+#: diskdrake/interactive.pm:1210
#, c-format
msgid ", %s sectors"
msgstr ", %s sektoria"
-#: diskdrake/interactive.pm:1205
+#: diskdrake/interactive.pm:1212
#, c-format
msgid "Cylinder %d to %d\n"
msgstr "Sylinteristä %d sylinteriin %d\n"
-#: diskdrake/interactive.pm:1206
+#: diskdrake/interactive.pm:1213
#, c-format
msgid "Number of logical extents: %d\n"
msgstr ""
-#: diskdrake/interactive.pm:1207
+#: diskdrake/interactive.pm:1214
#, c-format
msgid "Formatted\n"
msgstr "Alustettu\n"
-#: diskdrake/interactive.pm:1208
+#: diskdrake/interactive.pm:1215
#, c-format
msgid "Not formatted\n"
msgstr "Ei alustettu\n"
-#: diskdrake/interactive.pm:1209
+#: diskdrake/interactive.pm:1216
#, c-format
msgid "Mounted\n"
msgstr "Liitetty\n"
-#: diskdrake/interactive.pm:1210
+#: diskdrake/interactive.pm:1217
#, c-format
msgid "RAID %s\n"
msgstr "RAID %s\n"
-#: diskdrake/interactive.pm:1215
+#: diskdrake/interactive.pm:1222
#, c-format
msgid ""
"Loopback file(s):\n"
@@ -2817,7 +2829,7 @@ msgstr ""
"Loopback tiedosto(t):\n"
" %s\n"
-#: diskdrake/interactive.pm:1216
+#: diskdrake/interactive.pm:1223
#, c-format
msgid ""
"Partition booted by default\n"
@@ -2826,27 +2838,27 @@ msgstr ""
"Osiolta käynnistetään oletuksena\n"
" (MS-DOS käynnistys, ei LILO)\n"
-#: diskdrake/interactive.pm:1218
+#: diskdrake/interactive.pm:1225
#, c-format
msgid "Level %s\n"
msgstr "Taso %s\n"
-#: diskdrake/interactive.pm:1219
+#: diskdrake/interactive.pm:1226
#, c-format
msgid "Chunk size %d KiB\n"
msgstr "Lohkon koko %d kt\n"
-#: diskdrake/interactive.pm:1220
+#: diskdrake/interactive.pm:1227
#, c-format
msgid "RAID-disks %s\n"
msgstr "RAID-levyt %s\n"
-#: diskdrake/interactive.pm:1222
+#: diskdrake/interactive.pm:1229
#, c-format
msgid "Loopback file name: %s"
msgstr "Loopback-tiedoston nimi: %s"
-#: diskdrake/interactive.pm:1225
+#: diskdrake/interactive.pm:1232
#, c-format
msgid ""
"\n"
@@ -2859,7 +2871,7 @@ msgstr ""
"ajuriosio. Sinun olisi kaiketi\n"
"parasta jättää se rauhaan.\n"
-#: diskdrake/interactive.pm:1228
+#: diskdrake/interactive.pm:1235
#, c-format
msgid ""
"\n"
@@ -2872,75 +2884,75 @@ msgstr ""
"on järjestelmäsi käynnistämiseksi\n"
"eri käyttöjärjestelmiin.\n"
-#: diskdrake/interactive.pm:1245
+#: diskdrake/interactive.pm:1252
#, c-format
msgid "Read-only"
msgstr "Vain luku"
-#: diskdrake/interactive.pm:1246
+#: diskdrake/interactive.pm:1253
#, c-format
msgid "Size: %s\n"
msgstr "Koko: %s\n"
-#: diskdrake/interactive.pm:1247
+#: diskdrake/interactive.pm:1254
#, c-format
msgid "Geometry: %s cylinders, %s heads, %s sectors\n"
msgstr "Levyn tiedot: %s sylinteriä, %s lukupäätä, %s sektoria\n"
-#: diskdrake/interactive.pm:1248
+#: diskdrake/interactive.pm:1255
#, c-format
msgid "Info: "
msgstr "Tietoja: "
-#: diskdrake/interactive.pm:1249
+#: diskdrake/interactive.pm:1256
#, c-format
msgid "LVM-disks %s\n"
msgstr "LVM-levyt %s\n"
# mat
-#: diskdrake/interactive.pm:1250
+#: diskdrake/interactive.pm:1257
#, c-format
msgid "Partition table type: %s\n"
msgstr "Osion tyyppi: %s\n"
-#: diskdrake/interactive.pm:1251
+#: diskdrake/interactive.pm:1258
#, c-format
msgid "on channel %d id %d\n"
msgstr "väylässä %d id %d\n"
-#: diskdrake/interactive.pm:1294
+#: diskdrake/interactive.pm:1301
#, c-format
msgid "Filesystem encryption key"
msgstr "Tiedostojärjestelmän salausavain"
-#: diskdrake/interactive.pm:1295
+#: diskdrake/interactive.pm:1302
#, c-format
msgid "Choose your filesystem encryption key"
msgstr "Valitse tiedostojärjestelmäsi salausavain"
-#: diskdrake/interactive.pm:1298
+#: diskdrake/interactive.pm:1305
#, c-format
msgid "This encryption key is too simple (must be at least %d characters long)"
msgstr ""
"Salausavain on liian yksinkertainen (sen pitää olla ainakin %d merkkiä pitkä)"
-#: diskdrake/interactive.pm:1299
+#: diskdrake/interactive.pm:1306
#, c-format
msgid "The encryption keys do not match"
msgstr "Salausavaimet eivät täsmää"
-#: diskdrake/interactive.pm:1302 network/netconnect.pm:1013
+#: diskdrake/interactive.pm:1309 network/netconnect.pm:1013
#: standalone/drakconnect:419
#, c-format
msgid "Encryption key"
msgstr "Salausavain"
-#: diskdrake/interactive.pm:1303
+#: diskdrake/interactive.pm:1310
#, c-format
msgid "Encryption key (again)"
msgstr "Salausavain (uudelleen)"
-#: diskdrake/interactive.pm:1304 standalone/drakvpn:1017
+#: diskdrake/interactive.pm:1311 standalone/drakvpn:1017
#: standalone/drakvpn:1102
#, c-format
msgid "Encryption algorithm"
@@ -3600,9 +3612,9 @@ msgstr "Vianetsintä"
#: standalone/drakTermServ:325 standalone/drakTermServ:1135
#: standalone/drakTermServ:1196 standalone/drakTermServ:1861
#: standalone/drakbackup:497 standalone/drakbackup:596 standalone/drakboot:125
-#: standalone/drakclock:224 standalone/drakconnect:969
-#: standalone/drakfloppy:291 standalone/drakups:27 standalone/harddrake2:478
-#: standalone/scannerdrake:51 standalone/scannerdrake:940
+#: standalone/drakclock:224 standalone/drakconnect:969 standalone/drakups:27
+#: standalone/harddrake2:478 standalone/scannerdrake:51
+#: standalone/scannerdrake:940
#, c-format
msgid "Warning"
msgstr "Varoitus"
@@ -7664,21 +7676,23 @@ msgid "Choose a file"
msgstr "Valitse tiedosto"
#: interactive.pm:317 interactive/gtk.pm:505 standalone/drakbackup:1514
-#: standalone/drakfont:656 standalone/drakroam:218 standalone/drakups:301
-#: standalone/drakups:361 standalone/drakups:381 standalone/drakvpn:319
-#: standalone/drakvpn:680
+#: standalone/drakfont:656 standalone/drakhosts:223 standalone/draknfs:347
+#: standalone/drakroam:218 standalone/drakups:301 standalone/drakups:361
+#: standalone/drakups:381 standalone/drakvpn:319 standalone/drakvpn:680
#, c-format
msgid "Add"
msgstr "Lisää"
-#: interactive.pm:317 interactive/gtk.pm:505
+#: interactive.pm:317 interactive/gtk.pm:505 standalone/drakhosts:230
+#: standalone/draknfs:354
#, c-format
msgid "Modify"
msgstr "Muokkaa"
-#: interactive.pm:317 interactive/gtk.pm:505 standalone/drakroam:202
-#: standalone/drakups:303 standalone/drakups:363 standalone/drakups:383
-#: standalone/drakvpn:319 standalone/drakvpn:680
+#: interactive.pm:317 interactive/gtk.pm:505 standalone/drakhosts:238
+#: standalone/draknfs:362 standalone/drakroam:202 standalone/drakups:303
+#: standalone/drakups:363 standalone/drakups:383 standalone/drakvpn:319
+#: standalone/drakvpn:680
#, c-format
msgid "Remove"
msgstr "Poista"
@@ -9735,17 +9749,22 @@ msgstr ", "
msgid "Welcome to %s"
msgstr "Tervetuloa %s:n"
-#: lvm.pm:130
+#: lvm.pm:83
+#, c-format
+msgid "Moving used physical extents to other physical volumes failed"
+msgstr ""
+
+#: lvm.pm:135
#, c-format
msgid "Physical volume %s is still in use"
msgstr ""
-#: lvm.pm:139
+#: lvm.pm:145
#, c-format
msgid "Remove the logical volumes first\n"
msgstr "Poista ensin loogiset osiot\n"
-#: lvm.pm:172
+#: lvm.pm:178
#, c-format
msgid "The bootloader can't handle /boot on multiple physicals volumes"
msgstr ""
@@ -10788,7 +10807,7 @@ msgstr "IP-parametrit"
#: network/netconnect.pm:582 network/netconnect.pm:890
#: printer/printerdrake.pm:460 standalone/drakconnect:109
#: standalone/drakconnect:316 standalone/drakconnect:878
-#: standalone/drakups:286
+#: standalone/drakhosts:192 standalone/drakups:286
#, c-format
msgid "IP address"
msgstr "IP-osoite"
@@ -11291,7 +11310,7 @@ msgstr ""
msgid "Host name (optional)"
msgstr "Konenimi (ei pakollinen)"
-#: network/netconnect.pm:1159
+#: network/netconnect.pm:1159 standalone/drakhosts:192
#, c-format
msgid "Host name"
msgstr "Konenimi"
@@ -18767,7 +18786,9 @@ msgstr "/etc/hosts.allow ja /etc/hosts.deny on jo asetettu - ei muutoksia"
msgid "Configuration changed - restart clusternfs/dhcpd?"
msgstr "Asetukset muutettu - käynnistetäänkö clusternfs/dhcpd uudestaan?"
-#: standalone/drakautoinst:38
+#: standalone/drakautoinst:38 standalone/drakhosts:116
+#: standalone/drakhosts:123 standalone/draknfs:38 standalone/draknfs:74
+#: standalone/draknfs:244
#, c-format
msgid "Error!"
msgstr "Virhe!"
@@ -19772,7 +19793,7 @@ msgstr "Missä"
msgid "When"
msgstr "Koska"
-#: standalone/drakbackup:2271
+#: standalone/drakbackup:2271 standalone/draknfs:230
#, c-format
msgid "More Options"
msgstr "Lisävalinnat"
@@ -20512,21 +20533,21 @@ msgstr ""
msgid "Drakbackup"
msgstr "Drakbackup"
-#: standalone/drakboot:76 standalone/drakfloppy:47 standalone/harddrake2:190
-#: standalone/harddrake2:191 standalone/harddrake2:192 standalone/logdrake:69
+#: standalone/drakboot:76 standalone/harddrake2:190 standalone/harddrake2:191
+#: standalone/harddrake2:192 standalone/logdrake:69
#: standalone/printerdrake:138 standalone/printerdrake:139
#: standalone/printerdrake:140
#, c-format
msgid "/_File"
msgstr "/_Tiedosto"
-#: standalone/drakboot:77 standalone/drakfloppy:48 standalone/logdrake:75
+#: standalone/drakboot:77 standalone/logdrake:75
#, c-format
msgid "/File/_Quit"
msgstr "/Tiedosto/_Lopeta"
-#: standalone/drakboot:77 standalone/drakfloppy:48 standalone/harddrake2:192
-#: standalone/logdrake:75 standalone/printerdrake:140
+#: standalone/drakboot:77 standalone/harddrake2:192 standalone/logdrake:75
+#: standalone/printerdrake:140
#, c-format
msgid "<control>Q"
msgstr "<control>L"
@@ -20647,7 +20668,7 @@ msgstr "Mandriva Linux Ohjauskeskus"
msgid "Synchronization tool"
msgstr "Synkronointityökalu"
-#: standalone/drakbug:49 standalone/drakbug:149
+#: standalone/drakbug:49 standalone/drakbug:152
#, c-format
msgid "Standalone Tools"
msgstr "Itsenäisiä työkaluja"
@@ -20731,7 +20752,7 @@ msgstr "Paketti: "
msgid "Kernel:"
msgstr "Ydin:"
-#: standalone/drakbug:100
+#: standalone/drakbug:101
#, c-format
msgid ""
"To submit a bug report, click on the report button. \n"
@@ -20746,19 +20767,19 @@ msgstr ""
"Hyödyllisiä tietoja jota kannattaa liittää mukaan virheraportissa on lspci "
"tuloste, ytimen versio ja /proc/cpuinfo."
-#: standalone/drakbug:106
+#: standalone/drakbug:107
#, c-format
msgid "Report"
msgstr "Raportti"
# Asennuksen sivuvalikko
-#: standalone/drakbug:159
+#: standalone/drakbug:162
#, c-format
msgid "Not installed"
msgstr "Ei asennettu"
# Asennuksen sivuvalikko
-#: standalone/drakbug:171
+#: standalone/drakbug:174
#, c-format
msgid "Package not installed"
msgstr "Pakettia ei asennettu"
@@ -20984,7 +21005,7 @@ msgstr "Poista käytöstä"
msgid "Media class"
msgstr "Media luokka"
-#: standalone/drakconnect:594 standalone/drakfloppy:136
+#: standalone/drakconnect:594
#, c-format
msgid "Module name"
msgstr "Moduulin nimi"
@@ -21219,122 +21240,6 @@ msgstr ""
"Kaikki käynnissä olevat ohjelmat suljetaan ja nykyinen istunto menetetään. "
"Oletko varma että haluat käynnistää palvelun dm uudelleen?"
-#: standalone/drakfloppy:41
-#, c-format
-msgid "drakfloppy"
-msgstr "drakfloppy"
-
-#: standalone/drakfloppy:78
-#, c-format
-msgid "Boot disk creation"
-msgstr "Käynnistyslevykkeen luominen"
-
-#: standalone/drakfloppy:79
-#, c-format
-msgid "General"
-msgstr "Yleinen"
-
-#: standalone/drakfloppy:82 standalone/harddrake2:147
-#, c-format
-msgid "Device"
-msgstr "Laite"
-
-#: standalone/drakfloppy:88
-#, c-format
-msgid "Kernel version"
-msgstr "Ytimen versio"
-
-#: standalone/drakfloppy:103
-#, c-format
-msgid "Preferences"
-msgstr "Ominaisuudet"
-
-#: standalone/drakfloppy:117
-#, c-format
-msgid "Advanced preferences"
-msgstr "Lisävalinnat"
-
-#: standalone/drakfloppy:136
-#, c-format
-msgid "Size"
-msgstr "Koko"
-
-#: standalone/drakfloppy:139
-#, c-format
-msgid "Mkinitrd optional arguments"
-msgstr "mkinitrd lisäparametrit"
-
-#: standalone/drakfloppy:141
-#, c-format
-msgid "force"
-msgstr "pakota"
-
-#: standalone/drakfloppy:142
-#, c-format
-msgid "omit raid modules"
-msgstr "jätä pois raid-moduulit"
-
-#: standalone/drakfloppy:143
-#, c-format
-msgid "if needed"
-msgstr "jos tarvitaan"
-
-#: standalone/drakfloppy:144
-#, c-format
-msgid "omit scsi modules"
-msgstr "jätä pois scsi-moduulit"
-
-#: standalone/drakfloppy:147
-#, c-format
-msgid "Add a module"
-msgstr "Lisää moduuli"
-
-#: standalone/drakfloppy:156
-#, c-format
-msgid "Remove a module"
-msgstr "Poista moduuli"
-
-#: standalone/drakfloppy:291
-#, c-format
-msgid "Be sure a media is present for the device %s"
-msgstr "Varmista, että media on laitteessa %s"
-
-#: standalone/drakfloppy:297
-#, c-format
-msgid ""
-"There is no medium or it is write-protected for device %s.\n"
-"Please insert one."
-msgstr ""
-"Mediaa ei ole olemassa tai se on kirjoitussuojattu laitteessa %s.\n"
-"Ole hyvä ja aseta media."
-
-#: standalone/drakfloppy:300
-#, c-format
-msgid "Unable to fork: %s"
-msgstr "Prosessia ei voitu haaroittaa: %s"
-
-#: standalone/drakfloppy:303
-#, c-format
-msgid "Floppy creation completed"
-msgstr "Levykkeen luominen valmis"
-
-#: standalone/drakfloppy:303
-#, c-format
-msgid "The creation of the boot floppy has been successfully completed \n"
-msgstr "Käynnistyslevykkeen luominen on valmis\n"
-
-#. -PO: Do not alter the <span ..> and </span> tags
-#: standalone/drakfloppy:308
-#, c-format
-msgid ""
-"Unable to properly close mkbootdisk:\n"
-"\n"
-"<span foreground=\"Red\"><tt>%s</tt></span>"
-msgstr ""
-"mkbootdisk ei voitu sulkea oikein: \n"
-"\n"
-"<span foreground=\"Red\"><tt>%s</tt></span>"
-
#: standalone/drakfont:183
#, c-format
msgid "Search installed fonts"
@@ -21996,6 +21901,240 @@ msgstr ""
"%s ei voida näyttää\n"
"Ohjetietuetta ei ole tälle tyypille\n"
+#: standalone/drakhosts:106
+#, c-format
+msgid "Please %s information"
+msgstr ""
+
+#: standalone/drakhosts:108
+#, c-format
+msgid "IP address:"
+msgstr ""
+
+#: standalone/drakhosts:109
+#, c-format
+msgid "Host name:"
+msgstr ""
+
+#: standalone/drakhosts:110
+#, c-format
+msgid "Host Aliases:"
+msgstr ""
+
+#: standalone/drakhosts:116
+#, c-format
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: standalone/drakhosts:123
+#, c-format
+msgid "Same IP is already in %s file."
+msgstr ""
+
+#: standalone/drakhosts:192
+#, c-format
+msgid "Host Aliases"
+msgstr ""
+
+#: standalone/drakhosts:227
+#, c-format
+msgid "Failed to add host."
+msgstr ""
+
+#: standalone/drakhosts:234
+#, c-format
+msgid "Failed to Modify host."
+msgstr ""
+
+#: standalone/drakhosts:242
+#, c-format
+msgid "Failed to remove host."
+msgstr ""
+
+#: standalone/draknfs:38
+#, c-format
+msgid "You are not root. Exiting..."
+msgstr ""
+
+#: standalone/draknfs:69
+#, c-format
+msgid "Directory Selection"
+msgstr ""
+
+#: standalone/draknfs:74
+#, c-format
+msgid "Should be a directory."
+msgstr ""
+
+#: standalone/draknfs:103
+#, c-format
+msgid ""
+"NFS clients may be specified in a number of ways:\n"
+"single host: You may specify a host either by an abbreviated name recognized "
+"be the resolver, the fully qualified domain name, or an IP address.\n"
+"\n"
+"netgroups: NIS netgroups may be given as @group.\n"
+"\n"
+"wildcards: machine names may contain the wildcard characters * and ?. For "
+"instance: *.cs.foo.edu matches all hosts in the domain cs.foo.edu.\n"
+"\n"
+"IP networks: you can also export directories to all hosts on an IP "
+"(sub-)network simultaneously. for example, either `/255.255.252.0' or "
+"`/22' appended to the network base address result.\n"
+msgstr ""
+
+#: standalone/draknfs:113
+#, c-format
+msgid ""
+"root_squash: map requests from uid/gid 0 to the anonymous uid/gid.\n"
+"\n"
+"no_root_squash: turn off root squashing. This option is mainly useful for "
+"diskless clients.\n"
+"\n"
+"all_squash: map all uids and gids to the anonymous user. Useful for NFS-"
+"exported public FTP directories, news spool directories, etc. The opposite "
+"option is no_all_squash, which is the default setting.\n"
+"\n"
+"anonuid and anongid: explicitly set the uid and gid of the anonymous "
+"account.\n"
+msgstr ""
+
+#: standalone/draknfs:122
+#, c-format
+msgid ""
+"secure: this option requires that requests originate on an internet port "
+"less than IPPORT_RESERVED (1024). This option is on by default. To turn it "
+"off, specify insecure.\n"
+"\n"
+"rw: allow both read and write requests on this NFS volume. The default is to "
+"disallow any request which changes the filesystem. This can also be made "
+"explicit by using the ro option.\n"
+"\n"
+"async: allows the NFS server to violate the NFS protocol and reply to "
+"requests before any changes made by that request have been committed to "
+"stable storage (e.g. disc drive).\n"
+msgstr ""
+
+#: standalone/draknfs:167
+#, c-format
+msgid "dir path"
+msgstr ""
+
+#: standalone/draknfs:206
+#, c-format
+msgid "NFS directory"
+msgstr ""
+
+#: standalone/draknfs:208
+#, c-format
+msgid "Directory:"
+msgstr ""
+
+#: standalone/draknfs:211
+#, c-format
+msgid "Host access"
+msgstr ""
+
+#: standalone/draknfs:213
+#, c-format
+msgid "Access:"
+msgstr ""
+
+#: standalone/draknfs:213 standalone/draknfs:218
+#, c-format
+msgid "Help User ID"
+msgstr ""
+
+#: standalone/draknfs:216
+#, c-format
+msgid "User ID Mapping"
+msgstr ""
+
+#: standalone/draknfs:218
+#, c-format
+msgid "User ID:"
+msgstr ""
+
+#: standalone/draknfs:219
+#, c-format
+msgid "anonuid:"
+msgstr ""
+
+#: standalone/draknfs:220
+#, c-format
+msgid "anongid:"
+msgstr ""
+
+#: standalone/draknfs:223 standalone/draknfs:313
+#, c-format
+msgid "General Options"
+msgstr ""
+
+#: standalone/draknfs:225
+#, c-format
+msgid "Force sync:"
+msgstr ""
+
+#: standalone/draknfs:225
+#, c-format
+msgid "Help General options"
+msgstr ""
+
+#: standalone/draknfs:226
+#, c-format
+msgid "port below 1024:"
+msgstr ""
+
+#: standalone/draknfs:227
+#, c-format
+msgid "Read/Write request:"
+msgstr ""
+
+#: standalone/draknfs:232
+#, c-format
+msgid "options:"
+msgstr ""
+
+#: standalone/draknfs:244
+#, c-format
+msgid "Please enter a directory to share."
+msgstr ""
+
+#: standalone/draknfs:313
+#, c-format
+msgid "Share Directory"
+msgstr ""
+
+#: standalone/draknfs:313
+#, c-format
+msgid "Hosts Wildcard"
+msgstr ""
+
+#: standalone/draknfs:313
+#, c-format
+msgid "More options"
+msgstr ""
+
+#: standalone/draknfs:351
+#, c-format
+msgid "Failed to add NFS share."
+msgstr ""
+
+#: standalone/draknfs:358
+#, c-format
+msgid "Failed to Modify NFS share."
+msgstr ""
+
+#: standalone/draknfs:366
+#, c-format
+msgid "Failed to remove an NFS share."
+msgstr ""
+
+#: standalone/draknfs:371
+#, c-format
+msgid "Reload NFS server"
+msgstr ""
+
#: standalone/drakperm:21
#, c-format
msgid "System settings"
@@ -25142,6 +25281,11 @@ msgstr "Virheet"
msgid "FPU"
msgstr "Liukulukuyksikkö"
+#: standalone/harddrake2:147
+#, c-format
+msgid "Device"
+msgstr "Laite"
+
#: standalone/harddrake2:148
#, c-format
msgid "Partitions"
@@ -26558,27 +26702,27 @@ msgstr ""
msgid "Your scanner(s) will not be available on the network."
msgstr "Kuvanlukijasi ei ole käytettävissä verkossa."
-#: standalone/service_harddrake:105
+#: standalone/service_harddrake:104
#, c-format
msgid "Some devices in the \"%s\" hardware class were removed:\n"
msgstr "Joitakin laitteita luokasta \"%s\" poistettiin:\n"
-#: standalone/service_harddrake:106
+#: standalone/service_harddrake:105
#, c-format
msgid "- %s was removed\n"
msgstr "- %s poistettiin\n"
-#: standalone/service_harddrake:109
+#: standalone/service_harddrake:108
#, c-format
msgid "Some devices were added: %s\n"
msgstr "Joitakin laitteita lisättiin: %s\n"
-#: standalone/service_harddrake:110
+#: standalone/service_harddrake:109
#, c-format
msgid "- %s was added\n"
msgstr "- %s lisättiin\n"
-#: standalone/service_harddrake:207
+#: standalone/service_harddrake:206
#, c-format
msgid "Hardware probing in progress"
msgstr "Laitteiston tunnistaminen käynnissä..."
@@ -26754,6 +26898,76 @@ msgstr ""
msgid "Installation failed"
msgstr "Asennus epäonnistui"
+#~ msgid "drakfloppy"
+#~ msgstr "drakfloppy"
+
+#~ msgid "Boot disk creation"
+#~ msgstr "Käynnistyslevykkeen luominen"
+
+#~ msgid "General"
+#~ msgstr "Yleinen"
+
+#~ msgid "Kernel version"
+#~ msgstr "Ytimen versio"
+
+#~ msgid "Preferences"
+#~ msgstr "Ominaisuudet"
+
+#~ msgid "Advanced preferences"
+#~ msgstr "Lisävalinnat"
+
+#~ msgid "Size"
+#~ msgstr "Koko"
+
+#~ msgid "Mkinitrd optional arguments"
+#~ msgstr "mkinitrd lisäparametrit"
+
+#~ msgid "force"
+#~ msgstr "pakota"
+
+#~ msgid "omit raid modules"
+#~ msgstr "jätä pois raid-moduulit"
+
+#~ msgid "if needed"
+#~ msgstr "jos tarvitaan"
+
+#~ msgid "omit scsi modules"
+#~ msgstr "jätä pois scsi-moduulit"
+
+#~ msgid "Add a module"
+#~ msgstr "Lisää moduuli"
+
+#~ msgid "Remove a module"
+#~ msgstr "Poista moduuli"
+
+#~ msgid "Be sure a media is present for the device %s"
+#~ msgstr "Varmista, että media on laitteessa %s"
+
+#~ msgid ""
+#~ "There is no medium or it is write-protected for device %s.\n"
+#~ "Please insert one."
+#~ msgstr ""
+#~ "Mediaa ei ole olemassa tai se on kirjoitussuojattu laitteessa %s.\n"
+#~ "Ole hyvä ja aseta media."
+
+#~ msgid "Unable to fork: %s"
+#~ msgstr "Prosessia ei voitu haaroittaa: %s"
+
+#~ msgid "Floppy creation completed"
+#~ msgstr "Levykkeen luominen valmis"
+
+#~ msgid "The creation of the boot floppy has been successfully completed \n"
+#~ msgstr "Käynnistyslevykkeen luominen on valmis\n"
+
+#~ msgid ""
+#~ "Unable to properly close mkbootdisk:\n"
+#~ "\n"
+#~ "<span foreground=\"Red\"><tt>%s</tt></span>"
+#~ msgstr ""
+#~ "mkbootdisk ei voitu sulkea oikein: \n"
+#~ "\n"
+#~ "<span foreground=\"Red\"><tt>%s</tt></span>"
+
#~ msgid "You can not use a LVM Logical Volume for mount point %s"
#~ msgstr "Et voi käyttää LVM loogista taltiota liitepisteelle %s"
->size; #- if a package is obsoleted with the same name it should #- have been selected, so a selected new package obsoletes #- all the old package. exists $skip{$_->name} and next; $skip{$_->name} = undef; $size -= $packages->{sizes}{$_->name}; } } #- but remove size of package being obsoleted or removed. foreach (keys %{$packages->{state}{rejected}}) { my ($name) = /(.*)-[^\-]*-[^\-]*$/ or next; exists $skip{$name} and next; $skip{$name} = undef; $size -= $packages->{sizes}{$name}; } $size; } sub size2time { my ($x, $max) = @_; my $A = 7e-07; my $limit = min($max * 3 / 4, 9e8); if ($x < $limit) { $A * $x; } else { $x -= $limit; my $B = 6e-16; my $C = 15e-07; $B * $x ** 2 + $C * $x + $A * $limit; } } sub packagesProviding { my ($packages, $name) = @_; map { $packages->{depslist}[$_] } keys %{$packages->{provides}{$name} || {}}; } #- searching and grouping methods. #- package is a reference to list that contains #- a hash to search by name and #- a list to search by id. sub packageByName { my ($packages, $name) = @_; #- search package with given name and compatible with current architecture. #- take the best one found (most up-to-date). my @packages; foreach my $pkg (packagesProviding($packages, $name)) { $pkg->is_arch_compat or next; $pkg->name eq $name or next; push @packages, $pkg; } my $best; foreach (@packages) { if ($best && $best != $_) { $_->compare_pkg($best) > 0 and $best = $_; } else { $best = $_; } } $best or log::l("unknown package `$name'"); $best; } sub analyse_kernel_name { my $kernels = join('|', map { "-$_" } '(p3|i586|i686)-(up|smp)-(1GB|4GB|64GB)', qw(enterprise secure smp multimedia multimedia-smp xbox), ); my @l = $_[0] =~ /kernel[^\-]*($kernels)?(-([^\-]+))?$/ or return; $l[0], $l[-1]; } sub packages2kernels { my ($packages) = @_; sort { $a->{ext} cmp $b->{ext} || URPM::rpmvercmp($b->{version}, $a->{version}); } map { if (my ($ext, $version) = analyse_kernel_name($_->name)) { { pkg => $_, ext => $ext, version => $version }; } else { log::l("ERROR: unknown package " . $_->name . " providing kernel"); (); } } packagesProviding($packages, 'kernel'); } sub bestKernelPackage { my ($packages) = @_; my @kernels = packages2kernels($packages) or internal_error('no kernel available'); my ($version_BOOT) = c::kernel_version() =~ /^(\d+\.\d+)/; if (my @l = grep { $_->{version} =~ /\Q$version_BOOT/ } @kernels) { #- favour versions corresponding to current BOOT version @kernels = @l; } my @preferred_exts = $::build_globetrotter ? '' : detect_devices::is_xbox() ? '-xbox' : detect_devices::is_i586() ? '-i586-up-1GB' : !detect_devices::has_cpu_flag('pae') ? ('-i686-up-4GB', '-i586-up-1GB') : detect_devices::hasSMP() ? '-smp' : ''; foreach my $prefered_ext (@preferred_exts, '') { if (my @l = grep { $_->{ext} eq $prefered_ext } @kernels) { @kernels = @l; } } log::l("bestKernelPackage (" . join(':', @preferred_exts) . "): " . join(' ', map { $_->{pkg}->name } @kernels) . (@kernels > 1 ? ' (choosing the first)' : '')); $preferred{'kernel-source-' . $kernels[0]{version}} = undef; $kernels[0]{pkg}; } sub packagesOfMedium { my ($packages, $medium) = @_; defined $medium->{start} && defined $medium->{end} ? @{$packages->{depslist}}[$medium->{start} .. $medium->{end}] : (); } sub packagesToInstall { my ($packages) = @_; my @packages; foreach (values %{$packages->{mediums}}) { $_->{selected} or next; log::l("examining packagesToInstall of medium $_->{descr}"); push @packages, grep { $_->flag_selected } packagesOfMedium($packages, $_); } log::l("found " . scalar(@packages) . " packages to install"); @packages; } sub allMediums { my ($packages) = @_; sort { #- put supplementary media at the end my @x = ($a, $b); foreach (@x) { install_medium::by_id($_, $packages)->is_suppl and $_ += 100 } $x[0] <=> $x[1]; } keys %{$packages->{mediums}}; } sub packageRequest { my ($packages, $pkg) = @_; #- check if the same or better version is installed, #- do not select in such case. $pkg && ($pkg->flag_upgrade || !$pkg->flag_installed) or return; #- check for medium selection, if the medium has not been #- selected, the package cannot be selected. foreach (values %{$packages->{mediums}}) { !$_->{selected} && $pkg->id >= $_->{start} && $pkg->id <= $_->{end} and return; } return { $pkg->id => 1 }; } sub packageCallbackChoices { my ($urpm, $_db, $state, $choices) = @_; if (my $prefer = find { $_->arch ne 'src' && exists $preferred{$_->name} } @$choices) { log::l("packageCallbackChoices: prefered choice " . $prefer->name . " from ", join(",", map { $_->name } @$choices)); $prefer; } else { my @l = grep { #- or even if a package requires a specific locales which #- is already selected. find { /locales-/ && do { my $p = packageByName($urpm, $_); $p && $p->flag_available; }; } $_->requires_nosense; } @$choices; if (!@l) { @l = $choices->[0]; log::l("packageCallbackChoices: default choice from ", join(",", map { $_->name } @$choices), " in ", join(",", map { $urpm->{depslist}[$_]->name } keys %{$state->{selected}})); } #-log::l("packageCallbackChoices: chosen " . join(" ", map { $_->name } @l)); @l; } } sub select_by_package_names { my ($packages, $names, $b_base, $o_otherOnly) = @_; foreach (@$names) { my $p = packageByName($packages, $_) or next; selectPackage($packages, $p, $b_base, $o_otherOnly); } } #- selection, unselection of package. sub selectPackage { my ($packages, $pkg, $b_base, $o_otherOnly) = @_; #- select package and dependancies, o_otherOnly may be a reference #- to a hash to indicate package that will strictly be selected #- when value is true, may be selected when value is false (this #- is only used for unselection, not selection) my $state = $packages->{state} ||= {}; $packages->{rpmdb} ||= rpmDbOpen(); my @l = $packages->resolve_requested($packages->{rpmdb}, $state, packageRequest($packages, $pkg) || {}, callback_choices => \&packageCallbackChoices); if ($b_base || $o_otherOnly) { foreach (@l) { $b_base and $_->set_flag_base; $o_otherOnly and $o_otherOnly->{$_->id} = $_->flag_requested; } $o_otherOnly and $packages->disable_selected($packages->{rpmdb}, $state, @l); } 1; } sub unselectPackage($$;$) { my ($packages, $pkg, $o_otherOnly) = @_; #- base packages are not unselectable, #- and already unselected package are no more unselectable. $pkg->flag_base and return; $pkg->flag_selected or return; my $state = $packages->{state} ||= {}; log::l("removing selection on package " . $pkg->fullname); my @l = $packages->disable_selected($packages->{rpmdb}, $state, $pkg); log::l(" removed selection on package " . $pkg->fullname . "gives " . join(',', map { scalar $_->fullname } @l)); if ($o_otherOnly) { foreach (@l) { $o_otherOnly->{$_->id} = undef; } log::l(" reselecting removed selection..."); $packages->resolve_requested($packages->{rpmdb}, $state, $o_otherOnly, callback_choices => \&packageCallbackChoices); log::l(" done"); } 1; } sub unselectAllPackages($) { my ($packages) = @_; my %keep_selected; log::l("unselecting all packages..."); foreach (@{$packages->{depslist}}) { if ($_->flag_base || $_->flag_installed && $_->flag_selected) { #- keep track of packages that should be kept selected. $keep_selected{$_->id} = $_; } else { #- deselect all packages except base or packages that need to be upgraded. $_->set_flag_required(0); $_->set_flag_requested(0); } } #- clean state, in order to start with a brand new set... $packages->{state} = {}; $packages->resolve_requested($packages->{rpmdb}, $packages->{state}, \%keep_selected, callback_choices => \&packageCallbackChoices); } sub urpmidir() { my $v = "$::prefix/var/lib/urpmi"; -l $v && !-e $v and unlink $v and mkdir $v, 0755; #- dangling symlink -w $v ? $v : '/tmp'; } sub psUpdateHdlistsDeps { my ($packages) = @_; my $need_copy = 0; my $urpmidir = urpmidir(); #- check if current configuration is still up-to-date and do not need to be updated. foreach (values %{$packages->{mediums}}) { next if ref $_ ne 'install_medium'; #- skip empty hash artifact $_->selected || $_->ignored or next; my $hdlistf = "$urpmidir/hdlist.$_->{fakemedium}.cz" . ($_->{hdlist} =~ /\.cz2/ && "2"); my $synthesisf = "$urpmidir/synthesis.hdlist.$_->{fakemedium}.cz" . ($_->{hdlist} =~ /\.cz2/ && "2"); if (-s $hdlistf != $_->{hdlist_size}) { install_any::getAndSaveFile("media/media_info/$_->{hdlist}", $hdlistf) or die "no $_->{hdlist} found"; symlinkf $hdlistf, "/tmp/$_->{hdlist}"; ++$need_copy; chown 0, 0, $hdlistf; } if (-s $synthesisf != $_->{synthesis_hdlist_size}) { install_any::getAndSaveFile("media/media_info/synthesis.$_->{hdlist}", $synthesisf); if (-s $synthesisf > 0) { chown 0, 0, $synthesisf } else { unlink $synthesisf } } } if ($need_copy) { #- this is necessary for urpmi. install_any::getAndSaveFile("media/media_info/$_", "$urpmidir/$_") && chown 0, 0, "$urpmidir/$_" foreach qw(rpmsrate); } } sub psUsingHdlists { my ($o, $method, $o_hdlistsprefix, $o_packages, $o_initialmedium, $o_callback) = @_; my $is_ftp = $o_hdlistsprefix =~ /^ftp:/; my $listf = install_any::getFile($o_hdlistsprefix && !$is_ftp ? "$o_hdlistsprefix/media/media_info/hdlists" : 'media/media_info/hdlists') or die "no hdlists found"; my ($suppl_CDs, $deselectionAllowed) = ($o->{supplmedia} || 0, $o->{askmedia} || 0); if (!$o_packages) { $o_packages = new URPM; #- add additional fields used by DrakX. @$o_packages{qw(count mediums)} = (0, {}); } #- parse hdlists file. my $medium_name = $o_initialmedium || 1; my (@hdlists, %mediumsize); foreach (<$listf>) { chomp; s/\s*#.*$//; /^\s*$/ and next; #- we'll ask afterwards for supplementary CDs, if the hdlists file contains #- a line that begins with "suppl" if (/^suppl/) { $suppl_CDs = 1; next } #- if the hdlists contains a line "askmedia", deletion of media found #- in this hdlist is allowed if (/^askmedia/) { $deselectionAllowed = 1; next } my $cdsuppl = index($medium_name, 's') >= 0; my ($noauto, $hdlist, $rpmsdir, $descr, $size) = m/^\s*(noauto:)?(hdlist\S*\.cz2?)\s+(\S+)\s*([^(]*)(\(.+\))?$/ or die qq(invalid hdlist description "$_" in hdlists file); $descr =~ s/\s+$//; push @hdlists, [ $hdlist, $medium_name, $rpmsdir, $descr, !$noauto, #- hdlist path, suppl CDs are mounted on /mnt/cdrom : $o_hdlistsprefix ? ($is_ftp ? "media/media_info/$hdlist" : "$o_hdlistsprefix/media/media_info/$hdlist") : undef, ]; if ($size) { ($mediumsize{$hdlist}) = $size =~ /(\d+)/; #- XXX assume Mo } else { $mediumsize{$hdlist} = 0; } $cdsuppl ? ($medium_name = ($medium_name + 1) . 's') : ++$medium_name; } my $copy_rpms_on_disk = 0; if ($deselectionAllowed && !defined $o_initialmedium) { (my $finalhdlists, $copy_rpms_on_disk) = $o->deselectFoundMedia(\@hdlists, \%mediumsize); @hdlists = @$finalhdlists; } foreach my $h (@hdlists) { my $medium = psUsingHdlist($method, $o_packages, @$h); $o_callback and $o_callback->($medium, $o_hdlistsprefix, $method); } log::l("psUsingHdlists read " . int(@{$o_packages->{depslist}}) . " headers on " . int(keys %{$o_packages->{mediums}}) . " hdlists"); return $o_packages, $suppl_CDs, $copy_rpms_on_disk; } sub psUsingHdlist { my ($method, $packages, $hdlist, $medium_name, $rpmsdir, $descr, $selected, $o_fhdlist, $o_pubkey, $o_nocopy) = @_; my $fakemedium = "$descr ($method$medium_name)"; my $urpmidir = urpmidir(); log::l("trying to read $hdlist for medium $medium_name"); my $m = install_medium->new( hdlist => $hdlist, method => $method, medium => $medium_name, rpmsdir => $rpmsdir, #- where is RPMS directory. descr => $descr, fakemedium => $fakemedium, selected => $selected, #- this is !$noauto from the hdlists file ignored => !$selected, #- keep track of ignored medium by DrakX. pubkey => [], #- all pubkey blocks here ); #- copy hdlist file directly to urpmi directory, this will be used #- for getting header of package during installation or after by urpmi. my $newf = "$urpmidir/hdlist.$fakemedium.cz" . ($hdlist =~ /\.cz2/ && "2"); unless ($o_nocopy) { my $w_wait; $w_wait = $::o->wait_message(N("Please wait"), N("Downloading file %s...", $hdlist)) if $method =~ /^(?:ftp|http|nfs)$/; -e $newf and do { unlink $newf or die "cannot remove $newf: $!" }; install_any::getAndSaveFile($o_fhdlist || "media/media_info/$hdlist", $newf) or do { unlink $newf; die "no $hdlist found" }; $m->{hdlist_size} = -s $newf; #- keep track of size for post-check. symlinkf $newf, "/tmp/$hdlist"; undef $w_wait; } my $newsf = "$urpmidir/synthesis.hdlist.$fakemedium.cz" . ($hdlist =~ /\.cz2/ && "2"); #- if $o_fhdlist is a filehandle, it's preferable not to try to find the associated synthesis. if (!$o_nocopy && !ref $o_fhdlist) { #- copy existing synthesis file too. my $synth; if ($o_fhdlist) { $synth = $o_fhdlist; $synth =~ s/hdlist/synthesis.hdlist/ or $synth = undef; } $synth ||= "media/media_info/synthesis.$hdlist"; install_any::getAndSaveFile($synth, $newsf); $m->{synthesis_hdlist_size} = -s $newsf; #- keep track of size for post-check. -s $newsf > 0 or unlink $newsf; } chown 0, 0, $newf, $newsf; #- get all keys corresponding in the right pubkey file, #- they will be added in rpmdb later if not found. if (!$o_fhdlist || $o_pubkey) { $m->{pubkey} = $o_pubkey; unless ($m->{pubkey}) { my $pubkey = install_any::getFile("media/media_info/pubkey" . ($hdlist =~ /hdlist(\S*)\.cz2?/ && $1)); $m->{pubkey} = [ $packages->parse_armored_file($pubkey) ]; } } #- integrate medium in media list, only here to avoid download error (update) to be propagated. $packages->{mediums}{$medium_name} = $m; #- parse synthesis (if available) of directly hdlist (with packing). if ($m->ignored) { log::l("ignoring packages in $hdlist"); } else { my $nb_suppl_pkg_skipped = 0; my $callback = sub { my (undef, $p) = @_; our %uniq_pkg_seen; if ($uniq_pkg_seen{$p->fullname}++) { log::l("skipping " . scalar $p->fullname); ++$nb_suppl_pkg_skipped; return 0; } else { return 1; } }; if (-s $newsf) { ($m->{start}, $m->{end}) = $packages->parse_synthesis($newsf, callback => $callback); } elsif (-s $newf) { ($m->{start}, $m->{end}) = $packages->parse_hdlist($newf, callback => $callback); } else { delete $packages->{mediums}{$medium_name}; unlink $newf; $o_fhdlist or unlink $newsf; die "fatal: no hdlist nor synthesis to read for $fakemedium"; } $m->{start} > $m->{end} and do { delete $packages->{mediums}{$medium_name}; unlink $newf; $o_fhdlist or unlink $newsf; die "fatal: nothing read in hdlist or synthesis for $fakemedium" }; log::l("read " . ($m->{end} - $m->{start} + 1) . " packages in $hdlist, $nb_suppl_pkg_skipped skipped"); } $m; } sub read_rpmsrate_raw { my ($f) = @_; my $line_nb = 0; my $fatal_error; my (%flags, %rates, @need_to_copy); my (@l); local $_; while (<$f>) { $line_nb++; /\t/ and die "tabulations not allowed at line $line_nb\n"; s/#.*//; # comments my ($indent, $data) = /(\s*)(.*)/; next if !$data; # skip empty lines @l = grep { $_->[0] < length $indent } @l; my @m = @l ? @{$l[-1][1]} : (); my ($t, $flag, @l2); while ($data =~ /^(( [1-5] | (?: (?: !\s*)? [0-9A-Z_]+(?:".*?")?) (?: \s*\|\|\s* (?: !\s*)? [0-9A-Z_]+(?:".*?")?)* ) (?:\s+|$) )(.*)/x) { #@")) { ($t, $flag, $data) = ($1,$2,$3); while ($flag =~ s,^\s*(("[^"]*"|[^"\s]*)*)\s+,$1,) {} push @m, $flag; push @l2, [ length $indent, [ @m ] ]; $indent .= $t; } if ($data) { # has packages on same line my ($rates, $flags) = partition { /^\d$/ } @m; my ($rate) = @$rates or die sprintf qq(missing rate for "%s" at line %d (flags are %s)\n), $data, $line_nb, join('&&', @m); foreach my $name (split ' ', $data) { if (uc($name) eq $name) { log::l("$name is parsed as a package name, not as a flag"); } if (member('INSTALL', @$flags)) { push @need_to_copy, $name if !member('NOCOPY', @$flags); next; #- do not need to put INSTALL flag for a package. } if (member('PRINTER', @$flags)) { push @need_to_copy, $name; } my @new_flags = @$flags; if (my $previous = $flags{$name}) { my @common = intersection($flags, $previous); my @diff1 = difference2($flags, \@common); my @diff2 = difference2($previous, \@common); if (!@diff1 || !@diff2) { @new_flags = @common; } elsif (@diff1 == 1 && @diff2 == 1) { @new_flags = (@common, join('||', $diff1[0], $diff2[0])); } else { log::l("can not handle complicate flags for packages appearing twice ($name)"); $fatal_error++; } log::l("package $name appearing twice with different rates ($rate != " . $rates{$name} . ")") if $rate != $rates{$name}; } $rates{$name} = $rate; $flags{$name} = \@new_flags; } push @l, @l2; } else { push @l, [ $l2[0][0], $l2[-1][1] ]; } } $fatal_error and die "$fatal_error fatal errors in rpmsrate"; \%rates, \%flags, \@need_to_copy; } sub read_rpmsrate { my ($packages, $rpmsrate_flags_chosen, $f) = @_; my ($rates, $flags, $need_to_copy) = read_rpmsrate_raw($f); foreach (keys %$flags) { my $p = packageByName($packages, $_) or next; my @flags = (@{$flags->{$_}}, map { if_(/locales-(.*)/, qq(LOCALES"$1")) } $p->requires_nosense); @flags = map { my ($user_flags, $known_flags) = partition { /^!?CAT_/ } split('\|\|', $_); my $ok = find { my $inv = s/^!//; $inv xor do { if (my ($p) = /^HW"(.*)"/) { return $inv ^ $::o->{build_live_system} || detect_devices::matching_desc__regexp($p); } elsif (($p) = /^HW_CAT"(.*)"/) { return $inv ^ $::o->{build_live_system} || modules::probe_category($p); } elsif (($p) = /^DRIVER"(.*)"/) { return $inv ^ $::o->{build_live_system} || detect_devices::matching_driver__regexp($p); } elsif (($p) = /^TYPE"(.*)"/) { return $inv ^ $::o->{build_live_system} || detect_devices::matching_type($p); } else { $rpmsrate_flags_chosen->{$_}; } }; } @$known_flags; $ok ? 'TRUE' : @$user_flags ? join('||', @$user_flags) : 'FALSE'; } @flags; $p->set_rate($rates->{$_}); $p->set_rflags(member('FALSE', @flags) ? 'FALSE' : @flags); } push @{$packages->{needToCopy} ||= []}, @$need_to_copy; } sub readCompssUsers { my ($file) = @_; my $f = -e $file ? install_any::getLocalFile($file) : install_any::getFile($file) or do { log::l("can not find $file: $!"); return undef, undef }; my ($compssUsers, $gtk_display_compssUsers) = eval join('', <$f>); if ($@) { log::l("ERROR: bad $file: $@"); } else { log::l("compssUsers.pl got: ", join(', ', map { qq("$_->{path}|$_->{label}") } @$compssUsers)); } ($compssUsers, $gtk_display_compssUsers); } sub saveCompssUsers { my ($packages, $compssUsers) = @_; my $flat; foreach (@$compssUsers) { my %fl = map { ("CAT_$_" => 1) } @{$_->{flags}}; $flat .= "$_->{label} [icon=xxx] [path=$_->{path}]\n"; foreach my $p (@{$packages->{depslist}}) { my @flags = $p->rflags; if ($p->rate && any { any { !/^!/ && $fl{$_} } split('\|\|') } @flags) { $flat .= sprintf "\t%d %s\n", $p->rate, $p->name; } } } my $urpmidir = urpmidir(); output "$urpmidir/compssUsers.flat", $flat; } sub setSelectedFromCompssList { my ($packages, $rpmsrate_flags_chosen, $min_level, $max_size) = @_; $rpmsrate_flags_chosen->{TRUE} = 1; #- ensure TRUE is set my $nb = selectedSize($packages); foreach my $p (sort { $b->rate <=> $a->rate } @{$packages->{depslist}}) { my @flags = $p->rflags; next if !$p->rate || $p->rate < $min_level || any { !any { /^!(.*)/ ? !$rpmsrate_flags_chosen->{$1} : $rpmsrate_flags_chosen->{$_} } split('\|\|') } @flags; #- determine the packages that will be selected when #- selecting $p. the packages are not selected. my $state = $packages->{state} ||= {}; my @l = $packages->resolve_requested($packages->{rpmdb}, $state, packageRequest($packages, $p) || {}, callback_choices => \&packageCallbackChoices); #- this enable an incremental total size. my $old_nb = $nb; foreach (@l) { $nb += $_->size; } if ($max_size && $nb > $max_size) { $nb = $old_nb; $min_level = $p->rate; $packages->disable_selected($packages->{rpmdb}, $state, @l); last; } } my @flags = map_each { if_($::b, $::a) } %$rpmsrate_flags_chosen; log::l("setSelectedFromCompssList: reached size ", formatXiB($nb), ", up to indice $min_level (less than ", formatXiB($max_size), ") for flags ", join(' ', sort @flags)); log::l("setSelectedFromCompssList: ", join(" ", sort map { $_->name } grep { $_->flag_selected } @{$packages->{depslist}})); $min_level; } #- useful to know the size it would take for a given min_level/max_size #- just save the selected packages, call setSelectedFromCompssList, and restore the selected packages sub saveSelected { my ($packages) = @_; my $state = delete $packages->{state}; my @l = @{$packages->{depslist}}; my @flags = map { ($_->flag_requested && 1) + ($_->flag_required && 2) + ($_->flag_upgrade && 4) } @l; [ $packages, $state, \@l, \@flags ]; } sub restoreSelected { my ($packages, $state, $l, $flags) = @{$_[0]}; $packages->{state} = $state; mapn { my ($pkg, $flag) = @_; $pkg->set_flag_requested($flag & 1); $pkg->set_flag_required($flag & 2); $pkg->set_flag_upgrade($flag & 4); } $l, $flags; } sub computeGroupSize { my ($packages, $min_level) = @_; sub inside { my ($l1, $l2) = @_; my $i = 0; return if @$l1 > @$l2; foreach (@$l1) { my $c; while ($c = $l2->[$i++] cmp $_) { return if $c == 1 || $i > @$l2; } } 1; } sub or_ify { my ($first, @other) = @_; my @l = split('\|\|', $first); foreach (@other) { @l = map { my $n = $_; map { "$_&&$n" } @l; } split('\|\|'); } @l; } my %or_ify_cache; my $or_ify_cached = sub { $or_ify_cache{$_[0]} ||= join("\t", or_ify(split("\t", $_[0]))); }; sub or_clean { my ($flags) = @_; my @l = split("\t", $flags); @l = map { [ sort split('&&') ] } @l; my @r; B: while (@l) { my $e = shift @l; foreach (@r, @l) { inside($_, $e) and next B; } push @r, $e; } join("\t", map { join('&&', @$_) } @r); } my (%group, %memo, $slowpart_counter); log::l("pkgs::computeGroupSize"); my $time = time(); my %pkgs_with_same_rflags; foreach (@{$packages->{depslist}}) { next if !$_->rate || $_->rate < $min_level || $_->flag_available; my $flags = join("\t", $_->rflags); next if $flags eq 'FALSE'; push @{$pkgs_with_same_rflags{$flags}}, $_; } foreach my $raw_flags (keys %pkgs_with_same_rflags) { my $flags = $or_ify_cached->($raw_flags); my @pkgs = @{$pkgs_with_same_rflags{$raw_flags}}; #- determine the packages that will be selected when selecting $p. #- make a fast selection (but potentially erroneous). #- installed and upgrade flags must have been computed (see compute_installed_flags). my %newSelection; my @l2 = map { $_->id } @pkgs; my $id; while (defined($id = shift @l2)) { exists $newSelection{$id} and next; $newSelection{$id} = undef; my $pkg = $packages->{depslist}[$id]; foreach ($pkg->requires_nosense) { my @choices = keys %{$packages->{provides}{$_} || {}}; if (@choices <= 1) { push @l2, @choices; } elsif (! find { exists $newSelection{$_} } @choices) { my ($candidate_id, $prefer_id); foreach (@choices) { ++$slowpart_counter; my $ppkg = $packages->{depslist}[$_] or next; $ppkg->flag_available and $prefer_id = $candidate_id = undef, last; exists $preferred{$ppkg->name} and $prefer_id = $_; $ppkg->name =~ /kernel-\d/ and $prefer_id ||= $_; foreach my $l ($ppkg->requires_nosense) { /locales-/ or next; my $pppkg = packageByName($packages, $l) or next; $pppkg->flag_available and $prefer_id ||= $_; } $candidate_id = $_; } if (defined $prefer_id || defined $candidate_id) { push @l2, defined $prefer_id ? $prefer_id : $candidate_id; } } } } foreach (keys %newSelection) { my $p = $packages->{depslist}[$_] or next; next if $p->flag_selected; #- always installed (accounted in system_size) my $s = $group{$p->name} || $or_ify_cached->(join("\t", $p->rflags)); my $m = "$flags\t$s"; $group{$p->name} = ($memo{$m} ||= or_clean($m)); } } my (%sizes, %pkgs); while (my ($k, $v) = each %group) { my $pkg = packageByName($packages, $k) or next; push @{$pkgs{$v}}, $k; $sizes{$v} += $pkg->size - $packages->{sizes}{$pkg->name}; } log::l("pkgs::computeGroupSize took: ", formatTimeRaw(time() - $time)); log::l(sprintf "%s %dMB %s", $_, $sizes{$_} / sqr(1024), join(',', @{$pkgs{$_}})) foreach keys %sizes; \%sizes, \%pkgs; } sub openInstallLog() { my $f = "$::prefix/root/drakx/install.log"; open(my $LOG, ">> $f") ? log::l("opened $f") : log::l("Failed to open $f. No install log will be kept."); #-# CORE::select((CORE::select($LOG), $| = 1)[0]); URPM::rpmErrorWriteTo(fileno $LOG); $LOG; } sub rpmDbOpen { my ($o_rebuild_needed) = @_; if ($o_rebuild_needed) { if (my $pid = fork()) { waitpid $pid, 0; $? & 0xff00 and die "rebuilding of rpm database failed"; } else { log::l("rebuilding rpm database"); my $rebuilddb_dir = "$::prefix/var/lib/rpmrebuilddb.$$"; -d $rebuilddb_dir and log::l("removing stale directory $rebuilddb_dir"), rm_rf($rebuilddb_dir); URPM::DB::rebuild($::prefix) or log::l("rebuilding of rpm database failed: " . URPM::rpmErrorString()), c::_exit(2); c::_exit(0); } } my $db; if ($db = URPM::DB::open($::prefix)) { log::l("opened rpm database for examining existing packages"); } else { log::l("unable to open rpm database, using empty rpm db emulation"); $db = new URPM; } $db; } sub rpmDbCleanLogs() { unlink glob("$::prefix/var/lib/rpm/__db.*"); } sub open_rpm_db_rw() { my $db = URPM::DB::open($::prefix, 1); $db and log::l("opened rpmdb for writing in $::prefix"); $db; } sub cleanOldRpmDb() { my $failed; foreach (qw(Basenames Conflictname Group Name Packages Providename Requirename Triggername)) { -s "$::prefix/var/lib/rpm/$_" or $failed = 'failed'; } #- rebuilding has been successfull, so remove old rpm database if any. #- once we have checked the rpm4 db file are present and not null, in case #- of doubt, avoid removing them... unless ($failed) { log::l("rebuilding rpm database completed successfully"); foreach (qw(conflictsindex.rpm fileindex.rpm groupindex.rpm nameindex.rpm packages.rpm providesindex.rpm requiredby.rpm triggerindex.rpm)) { -e "$::prefix/var/lib/rpm/$_" or next; log::l("removing old rpm file $_"); rm_rf("$::prefix/var/lib/rpm/$_"); } } } sub selectPackagesAlreadyInstalled { my ($packages) = @_; log::l("computing installed flags and size of installed packages"); $packages->compute_installed_flags($packages->{rpmdb}); my %sizes; $packages->{rpmdb}->traverse(sub { my ($p) = @_; $sizes{$p->name} += $p->size; }); $packages->{sizes} = \%sizes; } sub selectPackagesToUpgrade { my ($packages, $o_medium) = @_; #- check before that if medium is given, it should be valid. $o_medium && (! defined $o_medium->{start} || ! defined $o_medium->{end}) and return; log::l("selecting packages to upgrade"); my $state = $packages->{state} ||= {}; $state->{selected} = {}; my %selection; $packages->request_packages_to_upgrade($packages->{rpmdb}, $state, \%selection, requested => undef, $o_medium ? (start => $o_medium->{start}, end => $o_medium->{end}) : (), ); log::l("resolving dependencies..."); $packages->resolve_requested($packages->{rpmdb}, $state, \%selection, callback_choices => \&packageCallbackChoices); log::l("...done"); } sub allowedToUpgrade { $_[0] !~ /^(kernel|kernel22|kernel2.2|kernel-secure|kernel-smp|kernel-linus|kernel-linus2.2|hackkernel|kernel-enterprise)$/ } sub supplCDMountPoint() { install_medium::by_id(1)->method eq 'cdrom' ? "/tmp/image" : "/mnt/cdrom" } sub installTransactionClosure { my ($packages, $id2pkg) = @_; my ($id, %closure, @l, $medium, $min_id, $max_id); @l = sort { $a <=> $b } keys %$id2pkg; #- search first usable medium (sorted by medium ordering). foreach (sort { $a->{start} <=> $b->{start} } values %{$packages->{mediums}}) { next if ref $_ ne 'install_medium'; #- skip empty hash artifact unless ($_->selected) { #- this medium is not selected, but we have to make sure no package is left #- in $id2pkg. if (defined $_->{start} && defined $_->{end}) { foreach ($_->{start} .. $_->{end}) { delete $id2pkg->{$_}; } @l = sort { $a <=> $b } keys %$id2pkg; } #- anyway, examine the next one. next; } if ($l[0] <= $_->{end}) { #- we have a candidate medium, it could be the right one containing #- the first package of @l... $l[0] >= $_->{start} and $medium = $_, last; #- ... but it could be necessary to find the first #- medium containing package of @l. foreach my $id (@l) { $id >= $_->{start} && $id <= $_->{end} and $medium = $_, last; } $medium and last; } } $medium or return (); #- no more medium usable -> end of installation by returning empty list. ($min_id, $max_id) = ($medium->{start}, $medium->{end}); #- Supplementary CD : switch temporarily to "cdrom" method my $suppl_CD = $medium->is_suppl_cd; local $::o->{method} = do { my $cdrom; cat_("/proc/mounts") =~ m,(/dev/\S+)\s+(?:/mnt/cdrom|/tmp/image), and $cdrom = $1; if (!defined $cdrom) { (my $cdromdev) = detect_devices::cdroms(); $cdrom = $cdromdev->{device}; log::l("cdrom redetected at $cdrom"); devices::make($cdrom); install_any::ejectCdrom($cdrom) if $::o->{method} eq 'cdrom'; install_any::mountCdrom(supplCDMountPoint(), $cdrom); } else { log::l("cdrom already found at $cdrom") } 'cdrom'; } if $suppl_CD; #- it is sure at least one package will be installed according to medium chosen. install_any::useMedium($medium->{medium}); if (install_any::method_allows_medium_change($medium->method)) { my $pkg = $packages->{depslist}[$l[0]]; #- force changeCD callback to be called from main process. install_any::getFile($pkg->filename, $::o->{method}, $suppl_CD ? supplCDMountPoint() : undef); #- close opened handle above. install_any::getFile('XXX'); } while (defined($id = shift @l)) { my @l2 = $id; while (defined($id = shift @l2)) { exists $closure{$id} and next; $id >= $min_id && $id <= $max_id or next; $closure{$id} = undef; my $pkg = $packages->{depslist}[$id]; foreach ($pkg->requires_nosense) { foreach (keys %{$packages->{provides}{$_} || {}}) { if ($id2pkg->{$_}) { push @l2, $_; last; } } } } keys %closure >= $limitMinTrans and last; } map { delete $id2pkg->{$_} } grep { $id2pkg->{$_} } sort { $a <=> $b } keys %closure; } sub installCallback { # my (undef, $msg, @para) = @_; # log::l("$msg: " . join(',', @para)); } sub install { my ($isUpgrade, $toInstall, $packages, $callback) = @_; my %packages; delete $packages->{rpmdb}; #- make sure rpmdb is closed before. #- avoid potential problems with rpm db personality change rpmDbCleanLogs(); return if !@$toInstall; #- for root loopback'ed /boot my $loop_boot = fs::loopback::prepare_boot(); #- first stage to extract some important information #- about the selected packages. This is used to select #- one or many transactions. my ($total, $nb); foreach my $pkg (@$toInstall) { $packages{$pkg->id} = $pkg; $nb++; $total += to_int($pkg->size); #- do not correct for upgrade! } log::l("pkgs::install $::prefix"); log::l("pkgs::install the following: ", join(" ", map { $_->name } values %packages)); URPM::read_config_files(); URPM::add_macro(join(' ', '__dbi_cdb', URPM::expand('%__dbi_cdb'), 'nofsync')); my $LOG = openInstallLog(); #- do not modify/translate the message used with installCallback since #- these are keys during progressing installation, or change in other #- place (install_steps_gtk.pm,...). $callback->($packages, user => undef, install => $nb, $total); do { my @transToInstall = installTransactionClosure($packages, \%packages); $nb = values %packages; #- added to exit typically after last media unselected. if ($nb == 0 && scalar(@transToInstall) == 0) { cleanHeaders(); fs::loopback::save_boot($loop_boot); return; } #- extract headers for parent as they are used by callback. extractHeaders(\@transToInstall, $packages->{mediums}); my $close = sub { my ($pkg) = @_; #- update flag associated to package. $pkg->set_flag_installed(1); $pkg->set_flag_upgrade(0); #- update obsoleted entry. my $rejected = $packages->{state}{rejected}; foreach (keys %$rejected) { if (delete $rejected->{$_}{closure}{$pkg->fullname}) { %{$rejected->{$_}{closure}} or delete $rejected->{$_}; } } }; my ($retry_pkg, $retry_count); while ($retry_pkg || @transToInstall) { if ($::testing) { my $size_typical = $nb ? int($total/$nb) : 0; foreach (@transToInstall) { log::l("i would install ", $_->name, " now"); my $id = $_->id; $callback->($packages, inst => $id, start => 0, $size_typical); $callback->($packages, inst => $id, progress => 0, $size_typical); $close->($_); } } else { my $db = open_rpm_db_rw() or die "error opening RPM database: ", URPM::rpmErrorString(); my $trans = $db->create_transaction($::prefix); if ($retry_pkg) { log::l("opened rpm database for retry transaction of 1 package only"); $trans->add($retry_pkg, $isUpgrade && allowedToUpgrade($retry_pkg->name)) or log::l("add failed for " . $retry_pkg->fullname); } else { log::l("opened rpm database for transaction of " . int(@transToInstall) . " new packages, still $nb after that to do"); $trans->add($_, $isUpgrade && allowedToUpgrade($_->name)) foreach @transToInstall; } my @checks = $trans->check; @checks and log::l("check failed : " . join("\n ", @checks)); $trans->order or die "error ordering package list: " . URPM::rpmErrorString(); $trans->set_script_fd(fileno $LOG); log::l("rpm transactions start"); my $fd; #- since we return the "fileno", perl does not know we're still using it, and so closes it, and :-( my @probs = $trans->run($packages, force => 1, nosize => 1, callback_open => sub { my ($packages, $_type, $id) = @_; &$callback; my $pkg = defined $id && $packages->{depslist}[$id]; my $medium = packageMedium($packages, $pkg); my $f = $pkg && $pkg->filename; print $LOG "$f\n"; if ($medium->is_suppl_cd) { $fd = install_any::getFile($f, $::o->{method}, supplCDMountPoint()); } else { $fd = install_any::getFile($f, $::o->{method}, $medium->{prefix}); } $fd ? fileno $fd : -1; }, callback_close => sub { my ($packages, $_type, $id) = @_; &$callback; my $pkg = defined $id && $packages->{depslist}[$id] or return; my $check_installed; $db->traverse_tag('name', [ $pkg->name ], sub { my ($p) = @_; $check_installed ||= $pkg->compare_pkg($p) == 0; }); $check_installed or log::l($pkg->name . " not installed, " . URPM::rpmErrorString()); $check_installed and $close->($pkg); }, callback_inst => $callback, ); log::l("transactions done, now trying to close still opened fd"); install_any::getFile('XXX'); #- close still opened fd. @probs and die "installation of rpms failed:\n ", join("\n ", @probs); } #- if we are using a retry mode, this means we have to split the transaction with only #- one package for each real transaction. if (!$retry_pkg) { my @badPackages; foreach (@transToInstall) { if (!$_->flag_installed && packageMedium($packages, $_)->selected && !exists($ignoreBadPkg{$_->name})) { push @badPackages, $_; log::l("bad package " . $_->fullname); } else { $_->free_header; } } @transToInstall = @badPackages; #- if we are in retry mode, we have to fetch only one package at a time. $retry_pkg = shift @transToInstall; $retry_count = 3; } else { my $name; if (!$retry_pkg->flag_installed && packageMedium($packages, $retry_pkg)->selected && !exists($ignoreBadPkg{$retry_pkg->name})) { if ($retry_count) { log::l("retrying installing package " . $retry_pkg->fullname . " alone in a transaction"); --$retry_count; } else { log::l("bad package " . $retry_pkg->fullname . " unable to be installed"); $retry_pkg->set_flag_requested(0); $retry_pkg->set_flag_required(0); #- keep name to display (problem of displaying ?). $name = $retry_pkg->fullname; $retry_pkg->free_header; $retry_pkg = shift @transToInstall; $retry_count = 3; #- now it could be safe to display error message ? cdie("error installing package list: $name"); } } #- check if name has been set (so that the following code has been executed already). if (!$name && ($retry_pkg->flag_installed || !$retry_pkg->flag_selected)) { $retry_pkg->free_header; $retry_pkg = shift @transToInstall; $retry_count = 3; } } } cleanHeaders(); } while $nb > 0 && !$pkgs::cancel_install; log::l("closing install.log file"); close $LOG; eval { fs::mount::umount("/mnt/cdrom") }; cleanHeaders(); fs::loopback::save_boot($loop_boot); } sub upgrade_by_removing_pkgs { my ($packages, $callback, $extension, $upgrade_name) = @_; my $upgrade_data; if ($upgrade_name) { my @l = glob("$ENV{SHARE_PATH}/upgrade/$upgrade_name*"); @l == 0 and log::l("upgrade_by_removing_pkgs: no special upgrade data"); @l > 1 and log::l("upgrade_by_removing_pkgs: many special upgrade data (" . join(' ', @l) . ")"); $upgrade_data = $l[0]; } log::l("upgrade_by_removing_pkgs (extension=$extension, upgrade_data=$upgrade_data)"); #- put the release file in /root/drakx so that we continue an upgrade even if the file has gone my $f = common::release_file($::prefix); if (dirname($f) eq '/etc') { output_p("$::prefix/root/drakx/" . basename($f) . '.upgrading', cat_("$::prefix$f")); } my $busy_var_tmp = "$::prefix/var/tmp/ensure-rpm-does-not-remove-this-dir"; touch($busy_var_tmp); if ($upgrade_data) { foreach (glob("$upgrade_data/pre.*")) { my $f = '/tmp/' . basename($_); cp_af($_, "$::prefix$f"); run_program::rooted($::prefix, $f); unlink "$::prefix$f"; } } my @was_installed = remove_pkgs_to_upgrade($packages, $callback, $extension); { my @restore_files = qw(/etc/passwd /etc/group /etc/ld.so.conf); foreach (@restore_files) { rename "$::prefix$_.rpmsave", "$::prefix$_"; } install_any::create_minimal_files(); unlink $busy_var_tmp; } my %map = map { chomp; my ($name, @new) = split; $name => \@new; } $upgrade_data ? cat_("$upgrade_data/map") : (); log::l("upgrade_by_removing_pkgs: map $upgrade_data/map gave " . (int keys %map) . " rules"); my $log; my @to_install = uniq(map { $log .= " $_=>" . join('+', @{$map{$_}}) if $map{$_}; $map{$_} ? @{$map{$_}} : $_; } @was_installed); log::l("upgrade_by_removing_pkgs special maps:$log"); log::l("upgrade_by_removing_pkgs: wanted packages: ", join(' ', sort @to_install)); @to_install; } sub removed_pkgs_to_upgrade_file() { "$::prefix/root/drakx/removed_pkgs_to_upgrade" } sub remove_pkgs_to_upgrade { my ($packages, $callback, $extension) = @_; my @to_remove; my @was_installed; { $packages->{rpmdb} ||= pkgs::rpmDbOpen(); $packages->{rpmdb}->traverse(sub { my ($pkg) = @_; if ($pkg->release =~ /$extension$/) { push @was_installed, $pkg->name; push @to_remove, scalar $pkg->fullname; } }); } if (-e removed_pkgs_to_upgrade_file()) { log::l("removed_pkgs_to_upgrade: using saved installed packages list ", removed_pkgs_to_upgrade_file()); @was_installed = chomp_(cat_(removed_pkgs_to_upgrade_file())); } else { log::l("removed_pkgs_to_upgrade: saving (old) installed packages in ", removed_pkgs_to_upgrade_file()); output_p(removed_pkgs_to_upgrade_file(), map { "$_\n" } @was_installed); } delete $packages->{rpmdb}; #- make sure rpmdb is closed before. remove(\@to_remove, $callback, noscripts => 1); @was_installed; } sub remove_marked_ask_remove { my ($packages, $callback) = @_; my @to_remove = keys %{$packages->{state}{ask_remove}} or return; delete $packages->{rpmdb}; #- make sure rpmdb is closed before. #- we are not checking depends since it should come when #- upgrading a system. although we may remove some functionalities ? remove(\@to_remove, $callback, force => 1); delete $packages->{state}{ask_remove}{$_} foreach @to_remove; } sub remove_raw { my ($to_remove, $callback, %run_transaction_options) = @_; log::l("removing: " . join(' ', @$to_remove)); URPM::read_config_files(); URPM::add_macro(URPM::expand('__dbi_cdb %__dbi_cdb nofsync')); my $db = open_rpm_db_rw() or die "error opening RPM database: ", URPM::rpmErrorString(); my $trans = $db->create_transaction($::prefix); #- stuff remove all packages that matches $p, not a problem since $p has name-version-release format. $trans->remove($_) foreach @$to_remove; $callback->($db, user => undef, remove => scalar @$to_remove); $trans->run(undef, %run_transaction_options, callback_uninst => $callback); } sub remove { my ($_to_remove, $_callback, %run_transaction_options) = @_; my @pbs = &remove_raw; if (@pbs && !$run_transaction_options{noscripts}) { $run_transaction_options{noscripts} = 1; @pbs = &remove_raw; } if (@pbs) { die "removing of old rpms failed:\n ", join("\n ", @pbs); } } sub selected_leaves { my ($packages) = @_; my $provides = $packages->{provides}; my @l = grep { $_->flag_requested || $_->flag_installed } @{$packages->{depslist}}; my %required_ids; foreach (@l) { foreach ($_->requires_nosense) { my $h = $provides->{$_} or next; my @provides = keys %$h; $required_ids{$provides[0]} = 1 if @provides == 1; } } [ map { $_->name } grep { !$required_ids{$_->id} } @l ]; } sub naughtyServers_list { my ($quiet) = @_; my @_old_81 = qw( freeswan ); my @_old_82 = qw( vnc-server postgresql-server ); my @_old_92 = qw( postfix ypbind bind ibod ); my @_removed_92 = qw( mcserv samba lpr ); my @_moved_to_contrib_92 = qw( boa LPRng wu-ftpd am-utils ); my @new_80 = qw( jabber am-utils boa cups drakxtools-http finger-server imap leafnode ntp openssh-server pidentd proftpd rwall squid webmin wu-ftpd ); my @new_81 = qw( ftp-server-krb5 telnet-server-krb5 ypserv ); my @new_82 = qw( LPRng inn netatalk nfs-utils rusers-server samba-swat tftp-server ucd-snmp ); my @new_92 = qw( clusternfs gkrellm-server mon net-snmp openldap-servers samba-server saned vsftpd ); my @new_2006 = qw( apache-conf bpalogin cfengine-cfservd freeradius mDNSResponder openslp pxe routed sendmail spamassassin-spamd ); my @not_warned = qw( lisa nfs-utils-clients portmap howl ); # X server (@new_80, @new_81, @new_82, @new_92, @new_2006, if_(!$quiet, @not_warned)); } sub naughtyServers { my ($packages) = @_; grep { my $p = packageByName($packages, $_); $p && $p->flag_selected; } naughtyServers_list('quiet'); } package install_medium; use strict; #- list of fields : #- descr (text description) #- end (last rpm id) #- fakemedium ("$descr ($method$medium_name)", used locally by urpmi) #- hdlist #- hdlist_size #- ignored #- issuppl (is a supplementary media) #- key_ids (hashref, values are key ids) #- medium (number of the medium) #- method #- prefix #- finalprefix (for install_urpmi) #- pubkey #- rpmsdir #- selected #- start (first rpm id) #- synthesis_hdlist_size #- update (for install_urpmi) #- with_hdlist (for install_urpmi) #- create a new medium sub new { my ($class, %h) = @_; bless \%h, $class } #- retrieve medium by id (usually a number) or an empty placeholder sub by_id { my ($medium_id, $o_packages) = @_; $o_packages = $::o->{packages} unless defined $o_packages; defined $o_packages->{mediums}{$medium_id} ? $o_packages->{mediums}{$medium_id} #- if the medium is not known, return a placeholder : bless { invalid => 1, medium => $medium_id }; } #- is this medium a supplementary medium ? sub is_suppl { my ($self) = @_; $self->{issuppl} } sub mark_suppl { my ($self) = @_; $self->{issuppl} = 1 } #- is this medium a supplementary CD ? sub is_suppl_cd { my ($self) = @_; $self->{method} eq 'cdrom' && $self->is_suppl } sub method { my ($self) = @_; $self->{method}; } sub selected { my ($self) = @_; $self->{selected} } sub select { my ($self) = @_; $self->{selected} = 1 } #- unselect, keep it mind it was unselected sub refuse { my ($self) = @_; $self->{selected} = undef } #- XXX this function seems to be obsolete sub ignored { my ($self) = @_; $self->{ignored} } #- guess the CD number for this media. #- XXX lots of heuristics here, must design this properly sub get_cd_number { my ($self) = @_; my $description = $self->{descr}; (my $cd) = $description =~ /\b(?:CD|DVD) ?(\d+)\b/i; if (!$cd) { #- test for single unnumbered DVD $cd = 1 if $description =~ /\bDVD\b/i; } if (!$cd) { #- test for mini-ISO $cd = 1 if $description =~ /\bmini.?cd\b/i; } #- don't mix suppl. cds with regular ones if ($description =~ /suppl/i) { $cd += 100 } $cd; } 1;