Well here is a little description of what DrakX needs to work in comparison to the standard newt install. ******************************************************************************** * CVS ************************************************************************** ******************************************************************************** Like all good free software, DrakX is in CVS :) You can access it using: % export CVSROOT=:pserver:anoncvs@linux-mandrake.com:/home/cvs/cooker % cvs login % Passwd: cvs % cvs checkout gi This is only read-only access. If you want more, tell me (pixel@mandrakesoft.com) Alas, all is not in CVS as a lot of things are binary files. For the other things, take cooker-contrib others/src/gi.tar.bz2 Please note that redoing *all* the stuff is not for the faint of heart. I myself sometimes wonder what the whole make does :-% Instead, changing some .pm files is quite easy (nice interpreted language) ******************************************************************************** * Making your custom install cdrom ********************************************* ******************************************************************************** If you have your own rpms you want to add, or make your own updated cdrom, you just have to update: - Mandrake/base/hdlist.cz2: use ``misc/genhdlists --distrib .'' - Mandrake/base/depslist: use ``misc/gendepslist2 -o Mandrake/base/depslist Mandrake/base/hdlist.cz2'' Optionnally, you can modify Mandrake/base/compssList and compssUsers. Also, mdkinst_stage2.gz must be remade if you modify files in Mandrake/mdkinst. See below for information about these files. ******************************************************************************** * FILES ************************************************************************ ******************************************************************************** First he are the different things needed : Mandrake/base/hdlist obsolete in 7.1 Mandrake/base/hdlist.cz2 table of rpm's headers. ! Need to be remade when Mandrake/RPMS changes (with ``misc/genhdlists --distrib .'') ! Mandrake/base/depslist for each packages, tell which package it depends on. Also contains the size for some (obscure) bloody reasons. ! Need to be remade when Mandrake/RPMS changes ! (with ``misc/gendepslist2 -o Mandrake/base/depslist Mandrake/base/hdlist.cz2'') Mandrake/base/depslist.ordered more compact depslist with closure done, internally indexed Mandrake/base/compss obsolete in 7.1 Mandrake/base/compssUsers obsoletes comps. It contains the different user classes like ``Graphics Manipulation'' and ``Games'' Mandrake/base/compssList for each packages, it gives the appreciation for each type of user. used to choose packages (see beginning of perl-install/pkgs.pm for more) Mandrake/mdkinst live system used on certain installs. See ``Ramdisk or not'' below for more. Mandrake/base/mdkinst_stage2.gz for the ramdisk. live sytem in ext2 filesystem gzipped. generated from Mandrake/mdkinst tree using misc/make_mdkinst_stage2 See ``Ramdisk or not'' below for more. images/*.img boot images to use with DrakX. Use: - all for everything, but need 2.88MB media (like el torito cdrom boot) - hd for hard-disk install - cdrom for cdrom install - network for ftp/nfs install (non-pcmcia devices) - pcmcia for pcmcia install (see ``PCMCIA install'' below for more) the following modules have been removed from: network.img: acenic sk98lin de4x5 cdrom.img and hd.img: BusLogic seagate fdomain g_NCR5380 dc395x_trm tmscsim hd.img: dpt_i2o eata eata_pio eata_dma cdrom.img: aztcd gscd isp16 mcd mcdx optcd cm206 sjcd pcmcia.img: apa1480_cb they are now in "other.img", if you think one of those modules is used a lot, tell me, i may find some room to put it back on the main floppies. ******************************************************************************** * logs ************************************************************************* ******************************************************************************** During install, a lot of interesting stuff can be found in different places: in consoles and in files. To switch to console 2 for example, do Ctrl-Alt-F2 from the X install. - alt-F1: the stdout of the install. Not very interesting stuff - alt-F2: simple shell. Quite a lot of commands are available but as they are written in perl (for space), they do not handle the very same options as normal. After install, you can do ``chroot /mnt'' to see your system just like after rebooting. ``rpm -qa'' works for example. - alt-F3: a lot of interesting things. Be carefull, some ``ERROR'' messages are not interesting. - alt-F4: kernel's place. aka the output of dmesg. - alt-F5: the graphical install lives there (may switch to console 7 one day :) - command "bug" puts on floppy lots of interesting stuff. - /tmp/ddebug.log: same (or nearly the same) as alt-F3 - /tmp/syslog: same as alt-F4 - /mnt/root/ddebug.log: at the end of each step, DrakX tries to backup /tmp/ddebug.log to /mnt/root. Available only after mounting of /. - /mnt/root/install.log: the log of the installation (or upgrade) of the rpms (just like rpm's /mnt/tmp/(install|upgrade).log) - /mnt/root/auto_inst.cfg.pl: a kickstart file generated at the end of each step. Can be used in 2 ways: kickstart install or ``defcfg'' install. Hopefully you know about kickstart. ``defcfg'' is a way to customize the default values in install. For example, French can be the default language with a qwerty keyboard, the auto-partitionning partitions can be changed, the default user class can be set to developer (!)... ******************************************************************************** * po translation files ********************************************************* ******************************************************************************** DrakX uses .po files for its translation. A script takes the different strings out of the .pm files. It generates the DrakX.pot file which contains all the english strings to translate. To add a new language, you just have to add it to lang.pm (if it's not there already) and put the .po in the perl-install/po directory (see ``Ramdisk or not'' to know if you have to regenerate the mdkinst_stage2.gz) ******************************************************************************** * PCMCIA install *************************************************************** ******************************************************************************** If the media you use to install is a pcmcia device, you have two choices: - use the pcmcia boot disk - use another boot disk and it will ask you a supplementary disk. Give it the pcmcia disk. ******************************************************************************** * Ramdisk or not *************************************************************** ******************************************************************************** The DrakX install is much bigger than the newt one. So the ramdisk which was used is getting big, and costs a lot in memory (eg: the mdkinst_stage2 is 14MB - 23/09/99) | | newt | DrakX |-------+---------+---------------------------------------------------------- | nfs | live | live | ftp | ramdisk | ramdisk | http | ramdisk | ramdisk | hd | ramdisk | live if Mandrake/mdkinst/usr/bin/runinstall2 is a link, | | | ramdisk otherwise | cdrom | ramdisk | live if memory < 40MB, ramdisk otherwise When i say live, it means that the install1 stage will *mount* the Mandrake/mdkinst and use it that way. The ramdisk is used in place of the live in some cases. This ramdisk is filled with mdkinst_stage2.gz For cdrom install, the ramdisk is used to speed up things (access time is quite high on cdrom drives) For pcmcia, it depends on the type of install. ******************************************************************************** * modules ********************************************************************** ******************************************************************************** Modules can be found in at least 2 places: - in /modules/modules.cgz - in /lib/modules.cz2 /modules/modules.cgz is used in stage1. It contains only modules interesting for one kind of install. For example in an hd install, it contains scsi modules. For an network install, it contains network card modules. /lib/modules.cz2 contains every module, it is used in stage2. To install a module, use modprobe which is in /usr/bin. It's a perl wrapper around /usr/bin/insmod. It uses the dependencies found in /modules/modules.dep (stage1). /usr/bin/insmod is a wrapper around /usr/bin/insmod_. It just extracts the module out of /lib/modules.cz2 in /tmp. Then it calls insmod_. /usr/bin/insmod_ is the real prog (which you usually find in /sbin/). You need to give it the complete path. ******************************************************************************** * Making screenshots *********************************************************** ******************************************************************************** On a test machine, make a network install, switch to console (ctrl-alt-F2), enter: % xhost+ then, on another computer: % DISPLAY=test_machine:0 xwd -root | convert - screenshot.png ******************************************************************************** * Adding a new step to DrakX *************************************************** ******************************************************************************** Say we want to add a question for setting "alawindows" option. We put it pretty early in the install, let's say after "Select Installation Class". 1. in install2.pm add selectAlawindows => [ __("A la windows or not"), 0, 1, '' ], after selectInstallClass => [ __("Select installation class"), 1, 1, '' ], the 0, 1, '' means not "redoable", "skip on error", "don't hide" 2. add your function selectAlawindows in install2.pm sub selectAlawindows { $o->selectAlawindows } 3. add your function selectAlawindows in install_steps_interactive.pm sub selectAlawindows { my ($o) = @_; $o->{alawindows} = $o->ask_yesorno('', _("Throw everything away as windobe does?"), 1); } 4. add your function selectAlawindows in install_steps.pm (not needed in that case, except for auto_install) sub selectAlawindows {} ******************************************************************************** * Miscellaneous **************************************************************** ******************************************************************************** > o Media access methods: nfs, ftp, http, hd, cdrom > o Stages: install1, stage1, stage2 > - What exactly each stage does the stage1 takes care of loading the stage2 :) the stage2 is too big to fit on a floppy, that's why stage1 exists. > - How each stage relates to the various media access methods stage1 knows only how to access to the media is compiled for. It contains only the kernel modules needed for that media. For eg, the nfs/ftp/http stage1 doesn't contain scsi modules nor ide. > - How one stage terminates and another begins. i.e., How does > stage1 find, mount, and launch stage2? /sbin/init just starts /sbin/install /sbin/install takes care of mounting stage2 (in ramdisk if necessary) then it runs /usr/bin/runinstall2 > o Text and Graphic mode installers > - Architectural overview of each have a look at gi/install.fig ******************************************************************************** * OEM ************************************************************************** ******************************************************************************** > I am a system OEM in Bangalore,India selling systems bundled with > Mandrake Linux. The problem is that with every system I sell, I need to > install & configure the system which takes HOURS!. Can I do a diskcopy > instead? > > Please Help. This is a major bottleneck for me. many solutions: - make an install on drive hdb, then either 1. dd if=/dev/hdb of=/dev/hdc 2. dd if=/dev/hdb of=/dev/hdc count=1 ; kernel_reread /dev/hdc ; mke2fs /dev/hdc1 ; mount /dev/hdb1 /source ; mount /dev/hdc1 /dest ; cp -a /source /dest - try the oem feature 3. - burn a cd out of *latest* cooker - boot on it telling "oem" to syslinux !! it will destroy every data on the harddrive !! - you now have a very automated install matrix (duplicate it with "dd if=/dev/hdb of=/dev/hdc bs=1M count=730") put the harddrive in the oem box, the user will now have an *very* automated install, just asking the root password and user password. 4. (just like 3. without burning a cd, doing the first part by hand) have a look at the /etc/oem script on the rescue and do it by hand... cu Pixel. comments: 1. maybe copy unnecessary things -> take too long solution -> use bs=8k count=xxxx 2. kernel_reread can be found on the new rescue, source is also at end of this mail. This solution works with one partition. Can be easily enhanced to many primary partitions... For extended partitions, more complicated, but not much :) 3. has just been added in latest cooker. It may still have some pb. The main current limitation is IDE only, though it can be fixed easily for special cases. -------------------------------------------------------------------------------- #include <stdio.h> #include <sys/mount.h> #include <fcntl.h> void die(char *msg) { perror(msg); exit(1); } void kernel_read(char *dev) { int fd; if ((fd = open(dev, O_RDONLY)) == -1) die("can't open device"); ioctl(fd, BLKRRPART, 0); close(fd); } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: kernel_read_part <hard drive device>\n"); exit(1); } kernel_read(argv[1]); } n234'>234</a> <a id='n235' href='#n235'>235</a> <a id='n236' href='#n236'>236</a> <a id='n237' href='#n237'>237</a> <a id='n238' href='#n238'>238</a> <a id='n239' href='#n239'>239</a> <a id='n240' href='#n240'>240</a> <a id='n241' href='#n241'>241</a> <a id='n242' href='#n242'>242</a> <a id='n243' href='#n243'>243</a> <a id='n244' href='#n244'>244</a> <a id='n245' href='#n245'>245</a> <a id='n246' href='#n246'>246</a> <a id='n247' href='#n247'>247</a> <a id='n248' href='#n248'>248</a> <a id='n249' href='#n249'>249</a> <a id='n250' href='#n250'>250</a> <a id='n251' href='#n251'>251</a> <a id='n252' href='#n252'>252</a> <a id='n253' href='#n253'>253</a> <a id='n254' href='#n254'>254</a> <a id='n255' href='#n255'>255</a> <a id='n256' href='#n256'>256</a> <a id='n257' href='#n257'>257</a> <a id='n258' href='#n258'>258</a> <a id='n259' href='#n259'>259</a> <a id='n260' href='#n260'>260</a> <a id='n261' href='#n261'>261</a> <a id='n262' href='#n262'>262</a> <a id='n263' href='#n263'>263</a> <a id='n264' href='#n264'>264</a> <a id='n265' href='#n265'>265</a> <a id='n266' href='#n266'>266</a> <a id='n267' href='#n267'>267</a> <a id='n268' href='#n268'>268</a> <a id='n269' href='#n269'>269</a> <a id='n270' href='#n270'>270</a> <a id='n271' href='#n271'>271</a> <a id='n272' href='#n272'>272</a> <a id='n273' href='#n273'>273</a> <a id='n274' href='#n274'>274</a> <a id='n275' href='#n275'>275</a> <a id='n276' href='#n276'>276</a> <a id='n277' href='#n277'>277</a> <a id='n278' href='#n278'>278</a> <a id='n279' href='#n279'>279</a> <a id='n280' href='#n280'>280</a> <a id='n281' href='#n281'>281</a> <a id='n282' href='#n282'>282</a> <a id='n283' href='#n283'>283</a> <a id='n284' href='#n284'>284</a> <a id='n285' href='#n285'>285</a> <a id='n286' href='#n286'>286</a> <a id='n287' href='#n287'>287</a> <a id='n288' href='#n288'>288</a> <a id='n289' href='#n289'>289</a> <a id='n290' href='#n290'>290</a> <a id='n291' href='#n291'>291</a> <a id='n292' href='#n292'>292</a> <a id='n293' href='#n293'>293</a> <a id='n294' href='#n294'>294</a> <a id='n295' href='#n295'>295</a> <a id='n296' href='#n296'>296</a> <a id='n297' href='#n297'>297</a> <a id='n298' href='#n298'>298</a> <a id='n299' href='#n299'>299</a> <a id='n300' href='#n300'>300</a> <a id='n301' href='#n301'>301</a> <a id='n302' href='#n302'>302</a> <a id='n303' href='#n303'>303</a> <a id='n304' href='#n304'>304</a> <a id='n305' href='#n305'>305</a> <a id='n306' href='#n306'>306</a> <a id='n307' href='#n307'>307</a> <a id='n308' href='#n308'>308</a> <a id='n309' href='#n309'>309</a> <a id='n310' href='#n310'>310</a> <a id='n311' href='#n311'>311</a> <a id='n312' href='#n312'>312</a> <a id='n313' href='#n313'>313</a> <a id='n314' href='#n314'>314</a> <a id='n315' href='#n315'>315</a> <a id='n316' href='#n316'>316</a> <a id='n317' href='#n317'>317</a> <a id='n318' href='#n318'>318</a> <a id='n319' href='#n319'>319</a> <a id='n320' href='#n320'>320</a> <a id='n321' href='#n321'>321</a> <a id='n322' href='#n322'>322</a> <a id='n323' href='#n323'>323</a> <a id='n324' href='#n324'>324</a> <a id='n325' href='#n325'>325</a> <a id='n326' href='#n326'>326</a> <a id='n327' href='#n327'>327</a> <a id='n328' href='#n328'>328</a> <a id='n329' href='#n329'>329</a> <a id='n330' href='#n330'>330</a> <a id='n331' href='#n331'>331</a> <a id='n332' href='#n332'>332</a> <a id='n333' href='#n333'>333</a> <a id='n334' href='#n334'>334</a> <a id='n335' href='#n335'>335</a> <a id='n336' href='#n336'>336</a> <a id='n337' href='#n337'>337</a> <a id='n338' href='#n338'>338</a> <a id='n339' href='#n339'>339</a> <a id='n340' href='#n340'>340</a> <a id='n341' href='#n341'>341</a> <a id='n342' href='#n342'>342</a> <a id='n343' href='#n343'>343</a> <a id='n344' href='#n344'>344</a> <a id='n345' href='#n345'>345</a> <a id='n346' href='#n346'>346</a> <a id='n347' href='#n347'>347</a> <a id='n348' href='#n348'>348</a> <a id='n349' href='#n349'>349</a> <a id='n350' href='#n350'>350</a> <a id='n351' href='#n351'>351</a> <a id='n352' href='#n352'>352</a> <a id='n353' href='#n353'>353</a> <a id='n354' href='#n354'>354</a> <a id='n355' href='#n355'>355</a> <a id='n356' href='#n356'>356</a> <a id='n357' href='#n357'>357</a> <a id='n358' href='#n358'>358</a> <a id='n359' href='#n359'>359</a> <a id='n360' href='#n360'>360</a> <a id='n361' href='#n361'>361</a> <a id='n362' href='#n362'>362</a> <a id='n363' href='#n363'>363</a> <a id='n364' href='#n364'>364</a> <a id='n365' href='#n365'>365</a> <a id='n366' href='#n366'>366</a> <a id='n367' href='#n367'>367</a> <a id='n368' href='#n368'>368</a> <a id='n369' href='#n369'>369</a> <a id='n370' href='#n370'>370</a> <a id='n371' href='#n371'>371</a> <a id='n372' href='#n372'>372</a> <a id='n373' href='#n373'>373</a> <a id='n374' href='#n374'>374</a> <a id='n375' href='#n375'>375</a> <a id='n376' href='#n376'>376</a> <a id='n377' href='#n377'>377</a> <a id='n378' href='#n378'>378</a> <a id='n379' href='#n379'>379</a> <a id='n380' href='#n380'>380</a> <a id='n381' href='#n381'>381</a> <a id='n382' href='#n382'>382</a> <a id='n383' href='#n383'>383</a> <a id='n384' href='#n384'>384</a> </pre></td> <td class='lines'><pre><code><span class="hl kwa">package</span> services<span class="hl opt">;</span> <span class="hl slc"># $Id$</span> <span class="hl slc">#-######################################################################################</span> <span class="hl slc">#- misc imports</span> <span class="hl slc">#-######################################################################################</span> <span class="hl kwa">use</span> strict<span class="hl opt">;</span> <span class="hl kwa">use</span> common<span class="hl opt">;</span> <span class="hl kwa">use</span> run_program<span class="hl opt">;</span> <span class="hl kwa">use</span> common<span class="hl opt">;</span> <span class="hl kwa">use</span> run_program<span class="hl opt">;</span> <span class="hl kwa">sub</span> description <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">%services</span> <span class="hl opt">= (</span> alsa <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Launch the ALSA (Advanced Linux Sound Architecture) sound system"</span><span class="hl opt">),</span> anacron <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Anacron is a periodic command scheduler."</span><span class="hl opt">),</span> apmd <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"apmd is used for monitoring battery status and logging it via syslog.</span> <span class="hl str">It can also be used for shutting down the machine when the battery is low."</span><span class="hl opt">),</span> atd <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Runs commands scheduled by the at command at the time specified when</span> <span class="hl str">at was run, and runs batch commands when the load average is low enough."</span><span class="hl opt">),</span> crond <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"cron is a standard UNIX program that runs user-specified programs</span> <span class="hl str">at periodic scheduled times. vixie cron adds a number of features to the basic</span> <span class="hl str">UNIX cron, including better security and more powerful configuration options."</span><span class="hl opt">),</span> fam <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"FAM is a file monitoring daemon. It is used to get reports when files change.</span> <span class="hl str">It is used by GNOME and KDE"</span><span class="hl opt">),</span> gpm <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"GPM adds mouse support to text-based Linux applications such the</span> <span class="hl str">Midnight Commander. It also allows mouse-based console cut-and-paste operations,</span> <span class="hl str">and includes support for pop-up menus on the console."</span><span class="hl opt">),</span> harddrake <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"HardDrake runs a hardware probe, and optionally configures</span> <span class="hl str">new/changed hardware."</span><span class="hl opt">),</span> httpd <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Apache is a World Wide Web server. It is used to serve HTML files and CGI."</span><span class="hl opt">),</span> inet <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"The internet superserver daemon (commonly called inetd) starts a</span> <span class="hl str">variety of other internet services as needed. It is responsible for starting</span> <span class="hl str">many services, including telnet, ftp, rsh, and rlogin. Disabling inetd disables</span> <span class="hl str">all of the services it is responsible for."</span><span class="hl opt">),</span> ipchains <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Launch packet filtering for Linux kernel 2.2 series, to set</span> <span class="hl str">up a firewall to protect your machine from network attacks."</span><span class="hl opt">),</span> keytable <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"This package loads the selected keyboard map as set in</span> <span class="hl str">/etc/sysconfig/keyboard. This can be selected using the kbdconfig utility.</span> <span class="hl str">You should leave this enabled for most machines."</span><span class="hl opt">),</span> kheader <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Automatic regeneration of kernel header in /boot for</span> <span class="hl str">/usr/include/linux/{autoconf,version}.h"</span><span class="hl opt">),</span> kudzu <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Automatic detection and configuration of hardware at boot."</span><span class="hl opt">),</span> linuxconf <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Linuxconf will sometimes arrange to perform various tasks</span> <span class="hl str">at boot-time to maintain the system configuration."</span><span class="hl opt">),</span> lpd <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"lpd is the print daemon required for lpr to work properly. It is</span> <span class="hl str">basically a server that arbitrates print jobs to printer(s)."</span><span class="hl opt">),</span> lvs <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Linux Virtual Server, used to build a high-performance and highly</span> <span class="hl str">available server."</span><span class="hl opt">),</span> named <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"named (BIND) is a Domain Name Server (DNS) that is used to resolve host names to IP addresses."</span><span class="hl opt">),</span> netfs <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Mounts and unmounts all Network File System (NFS), SMB (Lan</span> <span class="hl str">Manager/Windows), and NCP (NetWare) mount points."</span><span class="hl opt">),</span> network <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Activates/Deactivates all network interfaces configured to start</span> <span class="hl str">at boot time."</span><span class="hl opt">),</span> nfs <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"NFS is a popular protocol for file sharing across TCP/IP networks.</span> <span class="hl str">This service provides NFS server functionality, which is configured via the</span> <span class="hl str">/etc/exports file."</span><span class="hl opt">),</span> nfslock <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"NFS is a popular protocol for file sharing across TCP/IP</span> <span class="hl str">networks. This service provides NFS file locking functionality."</span><span class="hl opt">),</span> numlock <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Automatically switch on numlock key locker under console</span> <span class="hl str">and Xorg at boot."</span><span class="hl opt">),</span> oki4daemon <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Support the OKI 4w and compatible winprinters."</span><span class="hl opt">),</span> pcmcia <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"PCMCIA support is usually to support things like ethernet and</span> <span class="hl str">modems in laptops. It won't get started unless configured so it is safe to have</span> <span class="hl str">it installed on machines that don't need it."</span><span class="hl opt">),</span> portmap <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"The portmapper manages RPC connections, which are used by</span> <span class="hl str">protocols such as NFS and NIS. The portmap server must be running on machines</span> <span class="hl str">which act as servers for protocols which make use of the RPC mechanism."</span><span class="hl opt">),</span> postfix <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Postfix is a Mail Transport Agent, which is the program that moves mail from one machine to another."</span><span class="hl opt">),</span> random <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Saves and restores system entropy pool for higher quality random</span> <span class="hl str">number generation."</span><span class="hl opt">),</span> rawdevices <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Assign raw devices to block devices (such as hard drive</span> <span class="hl str">partitions), for the use of applications such as Oracle or DVD players"</span><span class="hl opt">),</span> routed <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"The routed daemon allows for automatic IP router table updated via</span> <span class="hl str">the RIP protocol. While RIP is widely used on small networks, more complex</span> <span class="hl str">routing protocols are needed for complex networks."</span><span class="hl opt">),</span> rstatd <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"The rstat protocol allows users on a network to retrieve</span> <span class="hl str">performance metrics for any machine on that network."</span><span class="hl opt">),</span> rusersd <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"The rusers protocol allows users on a network to identify who is</span> <span class="hl str">logged in on other responding machines."</span><span class="hl opt">),</span> rwhod <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"The rwho protocol lets remote users get a list of all of the users</span> <span class="hl str">logged into a machine running the rwho daemon (similar to finger)."</span><span class="hl opt">),</span> sound <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Launch the sound system on your machine"</span><span class="hl opt">),</span> syslog <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Syslog is the facility by which many daemons use to log messages</span> <span class="hl str">to various system log files. It is a good idea to always run syslog."</span><span class="hl opt">),</span> usb <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Load the drivers for your usb devices."</span><span class="hl opt">),</span> xfs <span class="hl opt">=></span> N_<span class="hl opt">(</span><span class="hl str">"Starts the X Font Server (this is mandatory for Xorg to run)."</span><span class="hl opt">),</span> <span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$name</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$s</span> <span class="hl opt">=</span> <span class="hl kwb">$services</span><span class="hl opt">{</span><span class="hl kwb">$name</span><span class="hl opt">};</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$s</span><span class="hl opt">) {</span> <span class="hl kwb">$s</span> <span class="hl opt">=</span> translate<span class="hl opt">(</span><span class="hl kwb">$s</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">$s</span> <span class="hl opt">= -</span>e <span class="hl str">"$::prefix/etc/rc.d/init.d/</span><span class="hl ipl">$name</span><span class="hl str">"</span> <span class="hl opt">&&</span> cat_<span class="hl opt">(</span><span class="hl str">"$::prefix/etc/rc.d/init.d/</span><span class="hl ipl">$name</span><span class="hl str">"</span><span class="hl opt">);</span> <span class="hl kwb">$s</span> <span class="hl opt">||= -</span>e <span class="hl str">"$::prefix/etc/init.d/</span><span class="hl ipl">$name</span><span class="hl str">"</span> <span class="hl opt">&&</span> cat_<span class="hl opt">(</span><span class="hl str">"$::prefix/etc/init.d/</span><span class="hl ipl">$name</span><span class="hl str">"</span><span class="hl opt">);</span> <span class="hl kwb">$s</span> <span class="hl opt">||= -</span>e <span class="hl str">"$::prefix/etc/xinetd.d/</span><span class="hl ipl">$name</span><span class="hl str">"</span> <span class="hl opt">&&</span> cat_<span class="hl opt">(</span><span class="hl str">"$::prefix/etc/xinetd.d/</span><span class="hl ipl">$name</span><span class="hl str">"</span><span class="hl opt">);</span> <span class="hl kwb">$s</span> <span class="hl opt">=~</span> <span class="hl kwd">s/\\\s*\n#\s*//mg</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$s</span> <span class="hl opt">=~</span> <span class="hl kwd">/^# description:\s+\S/sm</span><span class="hl opt">) {</span> <span class="hl opt">(</span><span class="hl kwb">$s</span><span class="hl opt">) =</span> <span class="hl kwb">$s</span> <span class="hl opt">=~</span> <span class="hl kwd">/^# description:\s+(.*?)^(?:[^#]|# {0,2}\S)/sm</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl opt">(</span><span class="hl kwb">$s</span><span class="hl opt">) =</span> <span class="hl kwb">$s</span> <span class="hl opt">=~</span> <span class="hl kwd">/^#\s*(.*?)^[^#]/sm</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwb">$s</span> <span class="hl opt">=~</span> <span class="hl kwd">s/#\s*//mg</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwb">$s</span> <span class="hl opt">=~</span> <span class="hl kwd">s/\n/ /gm</span><span class="hl opt">;</span> <span class="hl kwb">$s</span> <span class="hl opt">=~</span> <span class="hl kwd">s/\s+$//</span><span class="hl opt">;</span> <span class="hl kwb">$s</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> ask_install_simple <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$l, $on_services</span><span class="hl opt">) =</span> services<span class="hl opt">();</span> <span class="hl kwb">$in</span><span class="hl opt">-></span><span class="hl kwd">ask_many_from_list</span><span class="hl opt">(</span><span class="hl str">"drakxservices"</span><span class="hl opt">,</span> N<span class="hl opt">(</span><span class="hl str">"Choose which services should be automatically started at boot time"</span><span class="hl opt">),</span> <span class="hl opt">{</span> list <span class="hl opt">=></span> <span class="hl kwb">$l,</span> help <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> description<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]) },</span> <span class="hl kwc">values</span> <span class="hl opt">=></span> <span class="hl kwb">$on_services,</span> <span class="hl kwc">sort</span> <span class="hl opt">=></span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl opt">});</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> ask_install <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">%root_services</span> <span class="hl opt">= (</span> N<span class="hl opt">(</span><span class="hl str">"Printing"</span><span class="hl opt">) => [</span> <span class="hl str">qw(cups cupslpd lpr lpd oki4daemon hpoj cups-lpd)</span> <span class="hl opt">],</span> N<span class="hl opt">(</span><span class="hl str">"Internet"</span><span class="hl opt">) => [</span> <span class="hl str">qw(httpd boa tux roxen ftp pftp tftp proftpd wu-ftpd pure-ftpdipsec proftpd-xinetd</span> <span class="hl str"> ipchains iptables ipvsadm isdn4linux ibod jabber jabber-icq adsl squid</span> <span class="hl str"> portsentry prelude nessusd junkbuster radvd cddbp ippl iptoip jail.init)</span> <span class="hl opt">],</span> N<span class="hl opt">(</span><span class="hl str">"File sharing"</span><span class="hl opt">) => [</span> <span class="hl str">qw(nfs nfslock smb nettalk netfs mcserv autofs amd</span> <span class="hl str"> venus.init auth2.init codasrv.init update.init swat)</span> <span class="hl opt">],</span> N<span class="hl opt">(</span><span class="hl str">"System"</span><span class="hl opt">) => [</span> <span class="hl str">qw(usb usbd pcmcia irda xinetd inetd kudzu harddrake apmd sound network xfs</span> <span class="hl str"> alsa functions halt kheader killall mandrake_everytime mandrake_firstime</span> <span class="hl str"> random rawdevices single keytable syslog crond medusa-init portmap acon</span> <span class="hl str"> anacron atd gpm psacct wine acpid numlock jserver sensors mosix bpowerd bpowerfail</span> <span class="hl str"> fcron powertweak.init ups syslog-ng cvs apcupsd)</span> <span class="hl opt">],</span> N<span class="hl opt">(</span><span class="hl str">"Remote Administration"</span><span class="hl opt">) => [</span> <span class="hl str">qw(sshd telnetd telnet rsh rlogin rexec webmin cfd heartbeat ldirectord</span> <span class="hl str"> iplog mon vncserver netsaint olympusd drakxtools_http)</span> <span class="hl opt">],</span> <span class="hl slc"># N("Network Client") => [ qw(ypbind nscd arpwatch fetchmail dnrd_rc diald rsync) ],</span> <span class="hl slc"># N("Network Server") => [ qw(named bootparamd ntpd xntpd chronyd postfix sendmail</span> <span class="hl slc"># imap imaps ipop2 ipop3 pop3s routed yppasswdd ypserv ldap dhcpd dhcrelay</span> <span class="hl slc"># hylafax innd identd rstatd rusersd rwalld rwhod gated</span> <span class="hl slc"># kadmin kprop krb524 krb5kdc krb5server hldsld bayonne sockd dhsd gnu-pop3d</span> <span class="hl slc"># gdips pptpd.conf vrrpd crossfire bnetd pvmd ircd sympa finger ntalk talk) ],</span> N<span class="hl opt">(</span><span class="hl str">"Database Server"</span><span class="hl opt">) => [</span> <span class="hl str">qw(mysql postgresql)</span> <span class="hl opt">],</span> <span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">%services_root</span><span class="hl opt">;</span> <span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$root</span> <span class="hl opt">(</span><span class="hl kwc">keys</span> <span class="hl kwb">%root_services</span><span class="hl opt">) {</span> <span class="hl kwb">$services_root</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} =</span> <span class="hl kwb">$root</span> <span class="hl kwa">foreach</span> <span class="hl opt">@{</span><span class="hl kwb">$root_services</span><span class="hl opt">{</span><span class="hl kwb">$root</span><span class="hl opt">}};</span> <span class="hl opt">}</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$l, $on_services</span><span class="hl opt">) =</span> services<span class="hl opt">();</span> <span class="hl kwc">my</span> <span class="hl kwb">%services</span><span class="hl opt">;</span> <span class="hl kwb">$services</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} =</span> <span class="hl num">0</span> <span class="hl kwa">foreach</span> <span class="hl opt">@{</span><span class="hl kwb">$l</span> <span class="hl opt">|| []};</span> <span class="hl kwb">$services</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} =</span> <span class="hl num">1</span> <span class="hl kwa">foreach</span> <span class="hl opt">@{</span><span class="hl kwb">$on_services</span> <span class="hl opt">|| []};</span> <span class="hl kwb">$in</span><span class="hl opt">-></span><span class="hl kwd">ask_browse_tree_info</span><span class="hl opt">(</span><span class="hl str">'drakxservices'</span><span class="hl opt">,</span> N<span class="hl opt">(</span><span class="hl str">"Choose which services should be automatically started at boot time"</span><span class="hl opt">),</span> <span class="hl opt">{</span> node_state <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$services</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]}</span> ? <span class="hl str">'selected'</span> <span class="hl opt">:</span> <span class="hl str">'unselected'</span> <span class="hl opt">},</span> build_tree <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$add_node, $flat</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$add_node</span><span class="hl opt">->(</span><span class="hl kwb">$_,</span> <span class="hl opt">!</span><span class="hl kwb">$flat</span> <span class="hl opt">&& (</span><span class="hl kwb">$services_root</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} ||</span> N<span class="hl opt">(</span><span class="hl str">"Other"</span><span class="hl opt">)))</span> <span class="hl kwa">foreach</span> <span class="hl kwc">sort keys</span> <span class="hl kwb">%services</span><span class="hl opt">;</span> <span class="hl opt">},</span> grep_unselected <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwc">grep</span> <span class="hl opt">{ !</span><span class="hl kwb">$services</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">@_</span> <span class="hl opt">},</span> toggle_nodes <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$set_state, @nodes</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$new_state</span> <span class="hl opt">= !</span><span class="hl kwb">$services</span><span class="hl opt">{</span><span class="hl kwb">$nodes</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]};</span> <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">@nodes</span><span class="hl opt">) {</span> <span class="hl kwb">$set_state</span><span class="hl opt">->(</span><span class="hl kwb">$_, $new_state</span> ? <span class="hl str">'selected'</span> <span class="hl opt">:</span> <span class="hl str">'unselected'</span><span class="hl opt">);</span> <span class="hl kwb">$services</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} =</span> <span class="hl kwb">$new_state</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl opt">},</span> get_status <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> N<span class="hl opt">(</span><span class="hl str">"Services:</span> <span class="hl ipl">%d</span> <span class="hl str">activated for</span> <span class="hl ipl">%d</span> <span class="hl str">registered"</span><span class="hl opt">,</span> <span class="hl kwc">scalar</span><span class="hl opt">(</span><span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span> <span class="hl opt">}</span> <span class="hl kwc">values</span> <span class="hl kwb">%services</span><span class="hl opt">),</span> <span class="hl kwc">scalar</span><span class="hl opt">(</span><span class="hl kwc">values</span> <span class="hl kwb">%services</span><span class="hl opt">));</span> <span class="hl opt">},</span> get_info <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> formatLines<span class="hl opt">(</span>description<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">])) },</span> interactive_help_id <span class="hl opt">=></span> <span class="hl str">'configureServices'</span><span class="hl opt">,</span> <span class="hl opt">})</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl kwb">$l, $on_services</span><span class="hl opt">;</span> <span class="hl slc">#- no change on cancel.</span> <span class="hl opt">[</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$services</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">@$l</span> <span class="hl opt">];</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> ask_standalone_gtk <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$_in</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$l, $on_services</span><span class="hl opt">) =</span> services<span class="hl opt">();</span> <span class="hl kwc">my</span> <span class="hl kwb">@xinetd_services</span> <span class="hl opt">=</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->[</span><span class="hl num">0</span><span class="hl opt">] } @{(</span>services_raw<span class="hl opt">())[</span><span class="hl num">1</span><span class="hl opt">]};</span> <span class="hl kwa">require</span> ugtk2<span class="hl opt">;</span> ugtk2-<span class="hl opt">></span><span class="hl kwd">import</span><span class="hl opt">(</span><span class="hl str">qw(:wrappers :create)</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$W</span> <span class="hl opt">=</span> ugtk2-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">"Services"</span><span class="hl opt">));</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$x, $y, $w_popup</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$nopop</span> <span class="hl opt">=</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$w_popup</span> <span class="hl kwc">and</span> <span class="hl kwb">$w_popup</span><span class="hl opt">-></span><span class="hl kwd">destroy</span><span class="hl opt">;</span> <span class="hl kwc">undef</span> <span class="hl kwb">$w_popup</span> <span class="hl opt">};</span> <span class="hl kwc">my</span> <span class="hl kwb">$display</span> <span class="hl opt">=</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$text</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$nopop</span><span class="hl opt">->();</span> gtkshow<span class="hl opt">(</span>gtkadd<span class="hl opt">(</span><span class="hl kwb">$w_popup</span> <span class="hl opt">=</span> Gtk2<span class="hl opt">::</span>Window-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl str">'popup'</span><span class="hl opt">),</span> gtksignal_connect<span class="hl opt">(</span>gtkadd<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>EventBox-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">,</span> gtkadd<span class="hl opt">(</span>gtkset_shadow_type<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>Frame-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">,</span> <span class="hl str">'etched_out'</span><span class="hl opt">),</span> gtkset_justify<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>Label-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl kwb">$text</span><span class="hl opt">),</span> <span class="hl str">'left'</span><span class="hl opt">))),</span> button_press_event <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$nopop</span><span class="hl opt">->() }</span> <span class="hl opt">)))-></span><span class="hl kwd">move</span><span class="hl opt">(</span><span class="hl kwb">$x, $y</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">$text</span><span class="hl opt">;</span> <span class="hl opt">};</span> <span class="hl kwc">my</span> <span class="hl kwb">$update_service</span> <span class="hl opt">=</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service, $label</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$started</span> <span class="hl opt">= -</span>e <span class="hl str">"/var/lock/subsys/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">;</span> <span class="hl kwb">$label</span><span class="hl opt">-></span><span class="hl kwd">set_label</span><span class="hl opt">(</span><span class="hl kwb">$started</span> ? N<span class="hl opt">(</span><span class="hl str">"running"</span><span class="hl opt">) :</span> N<span class="hl opt">(</span><span class="hl str">"stopped"</span><span class="hl opt">));</span> <span class="hl opt">};</span> <span class="hl kwc">my</span> <span class="hl kwb">$b</span> <span class="hl opt">=</span> Gtk2<span class="hl opt">::</span>EventBox-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">;</span> <span class="hl kwb">$b</span><span class="hl opt">-></span><span class="hl kwd">set_events</span><span class="hl opt">(</span><span class="hl str">'pointer_motion_mask'</span><span class="hl opt">);</span> gtkadd<span class="hl opt">(</span><span class="hl kwb">$W</span><span class="hl opt">->{</span>window<span class="hl opt">},</span> gtkadd<span class="hl opt">(</span><span class="hl kwb">$b,</span> gtkpack_<span class="hl opt">(</span><span class="hl kwb">$W</span><span class="hl opt">-></span><span class="hl kwd">create_box_with_title</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">"Services and daemons"</span><span class="hl opt">)),</span> <span class="hl num">1</span><span class="hl opt">,</span> gtkset_size_request<span class="hl opt">(</span>create_scrolled_window<span class="hl opt">(</span>create_packtable<span class="hl opt">({</span> col_spacings <span class="hl opt">=></span> <span class="hl num">10</span><span class="hl opt">,</span> row_spacings <span class="hl opt">=></span> <span class="hl num">3</span> <span class="hl opt">},</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">$service</span> <span class="hl opt">=</span> <span class="hl kwb">$_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$is_xinetd_service</span> <span class="hl opt">=</span> member<span class="hl opt">(</span><span class="hl kwb">$service, @xinetd_services</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$infos</span> <span class="hl opt">=</span> warp_text<span class="hl opt">(</span>description<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">),</span> <span class="hl num">40</span><span class="hl opt">);</span> <span class="hl kwb">$infos</span> <span class="hl opt">||=</span> N<span class="hl opt">(</span><span class="hl str">"No additional information</span><span class="hl esc">\n</span><span class="hl str">about this service, sorry."</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$label</span> <span class="hl opt">=</span> gtkset_justify<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>Label-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">,</span> <span class="hl str">'left'</span><span class="hl opt">);</span> <span class="hl kwb">$update_service</span><span class="hl opt">->(</span><span class="hl kwb">$service, $label</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$is_xinetd_service</span><span class="hl opt">;</span> <span class="hl opt">[</span> gtkpack__<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>HBox-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">),</span> <span class="hl kwb">$_</span><span class="hl opt">),</span> gtkpack__<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>HBox-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">),</span> <span class="hl kwb">$label</span><span class="hl opt">),</span> gtkpack__<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>HBox-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">),</span> gtksignal_connect<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>Button-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">"Info"</span><span class="hl opt">)),</span> clicked <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$display</span><span class="hl opt">->(</span><span class="hl kwb">$infos</span><span class="hl opt">) })),</span> gtkpack__<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>HBox-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">),</span> gtkset_active<span class="hl opt">(</span>gtksignal_connect<span class="hl opt">(</span> Gtk2<span class="hl opt">::</span>CheckButton-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl kwb">$is_xinetd_service</span> ? N<span class="hl opt">(</span><span class="hl str">"Start when requested"</span><span class="hl opt">) :</span> N<span class="hl opt">(</span><span class="hl str">"On boot"</span><span class="hl opt">)),</span> clicked <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]-></span><span class="hl kwd">get_active</span><span class="hl opt">) {</span> <span class="hl kwc">push</span> <span class="hl kwb">@$on_services, $service</span> <span class="hl kwa">if</span> <span class="hl opt">!</span>member<span class="hl opt">(</span><span class="hl kwb">$service, @$on_services</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">@$on_services</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span> <span class="hl kwc">ne</span> <span class="hl kwb">$service</span> <span class="hl opt">}</span> <span class="hl kwb">@$on_services</span><span class="hl opt">;</span> <span class="hl opt">} }),</span> member<span class="hl opt">(</span><span class="hl kwb">$service, @$on_services</span><span class="hl opt">))),</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">$a</span> <span class="hl opt">=</span> <span class="hl kwb">$_</span><span class="hl opt">;</span> gtkpack__<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>HBox-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">),</span> gtksignal_connect<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>Button-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span>translate<span class="hl opt">(</span><span class="hl kwb">$a</span><span class="hl opt">)),</span> clicked <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">$action</span> <span class="hl opt">=</span> <span class="hl kwb">$a</span> <span class="hl kwc">eq</span> <span class="hl str">"Start"</span> ? <span class="hl str">'restart'</span> <span class="hl opt">:</span> <span class="hl str">'stop'</span><span class="hl opt">;</span> <span class="hl kwc">local</span> <span class="hl kwb">$_</span> <span class="hl opt">=</span> <span class="hl str">`service</span> <span class="hl ipl">$service</span> <span class="hl str"></span><span class="hl ipl">$action</span> <span class="hl str">2>&1`</span><span class="hl opt">;</span> <span class="hl kwd">s/\033\[[^mG]*[mG]//g</span><span class="hl opt">;</span> <span class="hl kwb">$update_service</span><span class="hl opt">->(</span><span class="hl kwb">$service, $label</span><span class="hl opt">);</span> <span class="hl kwb">$display</span><span class="hl opt">->(</span><span class="hl kwb">$_</span><span class="hl opt">);</span> <span class="hl opt">}))</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$is_xinetd_service</span><span class="hl opt">;</span> <span class="hl opt">} (</span>N_<span class="hl opt">(</span><span class="hl str">"Start"</span><span class="hl opt">),</span> N_<span class="hl opt">(</span><span class="hl str">"Stop"</span><span class="hl opt">))</span> <span class="hl opt">]</span> <span class="hl opt">}</span> <span class="hl kwb">@$l</span><span class="hl opt">), [ $::</span>isEmbedded ? <span class="hl str">'automatic'</span> <span class="hl opt">:</span> <span class="hl str">'never'</span><span class="hl opt">,</span> <span class="hl str">'automatic'</span> <span class="hl opt">]), -</span><span class="hl num">1</span><span class="hl opt">, $::</span>isEmbedded ? <span class="hl opt">-</span><span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl num">400</span><span class="hl opt">),</span> <span class="hl num">0</span><span class="hl opt">,</span> gtkpack<span class="hl opt">(</span>gtkset_border_width<span class="hl opt">(</span>Gtk2<span class="hl opt">::</span>HBox-<span class="hl opt">></span><span class="hl kwd">new</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">),</span><span class="hl num">5</span><span class="hl opt">),</span> <span class="hl kwb">$W</span><span class="hl opt">-></span><span class="hl kwd">create_okcancel</span><span class="hl opt">)</span> <span class="hl opt">))</span> <span class="hl opt">);</span> <span class="hl kwb">$b</span><span class="hl opt">-></span><span class="hl kwd">signal_connect</span><span class="hl opt">(</span>motion_notify_event <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$w, $e</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$ox, $oy</span><span class="hl opt">) =</span> <span class="hl kwb">$w</span><span class="hl opt">-></span><span class="hl kwd">window</span><span class="hl opt">-></span><span class="hl kwd">get_origin</span><span class="hl opt">;</span> <span class="hl kwb">$x</span> <span class="hl opt">=</span> <span class="hl kwb">$e</span><span class="hl opt">-></span><span class="hl kwd">x</span><span class="hl opt">+</span><span class="hl kwb">$ox</span><span class="hl opt">;</span> <span class="hl kwb">$y</span> <span class="hl opt">=</span> <span class="hl kwb">$e</span><span class="hl opt">-></span><span class="hl kwd">y</span><span class="hl opt">+</span><span class="hl kwb">$oy</span> <span class="hl opt">});</span> <span class="hl kwb">$b</span><span class="hl opt">-></span><span class="hl kwd">signal_connect</span><span class="hl opt">(</span>button_press_event <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$nopop</span><span class="hl opt">->() });</span> <span class="hl opt">$::</span>isEmbedded <span class="hl kwc">and</span> gtkflush<span class="hl opt">();</span> <span class="hl kwb">$W</span><span class="hl opt">-></span><span class="hl kwd">main</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwb">$on_services</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> ask <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl opt">!$::</span>isInstall <span class="hl opt">&&</span> <span class="hl kwb">$in</span><span class="hl opt">-></span><span class="hl kwd">isa</span><span class="hl opt">(</span><span class="hl str">'interactive::gtk'</span><span class="hl opt">)</span> ? <span class="hl opt">&</span>ask_standalone_gtk <span class="hl opt">: &</span>ask_install<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> doit <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$in, $on_services</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$l, $was_on_services</span><span class="hl opt">) =</span> services<span class="hl opt">();</span> <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">@$l</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">$before</span> <span class="hl opt">=</span> member<span class="hl opt">(</span><span class="hl kwb">$_, @$was_on_services</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$after</span> <span class="hl opt">=</span> member<span class="hl opt">(</span><span class="hl kwb">$_, @$on_services</span><span class="hl opt">);</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$before</span> <span class="hl opt">!=</span> <span class="hl kwb">$after</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">$script</span> <span class="hl opt">=</span> <span class="hl str">"/etc/rc.d/init.d/</span><span class="hl ipl">$_</span><span class="hl str">"</span><span class="hl opt">;</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"chkconfig"</span><span class="hl opt">,</span> <span class="hl kwb">$after</span> ? <span class="hl str">"--add"</span> <span class="hl opt">:</span> <span class="hl str">"--del"</span><span class="hl opt">,</span> <span class="hl kwb">$_</span><span class="hl opt">);</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$after</span> <span class="hl opt">&&</span> cat_<span class="hl opt">(</span><span class="hl str">"$::prefix</span><span class="hl ipl">$script</span><span class="hl str">"</span><span class="hl opt">) =~</span> <span class="hl kwd">/^#\s+chkconfig:\s+-/m</span><span class="hl opt">) {</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"chkconfig"</span><span class="hl opt">,</span> <span class="hl str">"--level"</span><span class="hl opt">,</span> <span class="hl str">"35"</span><span class="hl opt">,</span> <span class="hl kwb">$_,</span> <span class="hl str">"on"</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$after</span> <span class="hl opt">&& !$::</span>isInstall <span class="hl opt">&& !</span><span class="hl kwb">$in</span><span class="hl opt">-></span><span class="hl kwd">isa</span><span class="hl opt">(</span><span class="hl str">'interactive::gtk'</span><span class="hl opt">)) {</span> <span class="hl slc">#- only done after install AND when not using the gtk frontend (since it allows one to start/stop services)</span> <span class="hl slc">#- this allows to skip stopping service "dm"</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl kwb">$script,</span> <span class="hl str">"stop"</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> services_raw<span class="hl opt">() {</span> <span class="hl kwc">local</span> <span class="hl kwb">$ENV</span><span class="hl opt">{</span>LANGUAGE<span class="hl opt">} =</span> <span class="hl str">'C'</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">@services, @xinetd_services</span><span class="hl opt">);</span> <span class="hl kwa">foreach</span> <span class="hl opt">(</span>run_program<span class="hl opt">::</span>rooted_get_stdout<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">'/sbin/chkconfig'</span><span class="hl opt">,</span> <span class="hl str">'--list'</span><span class="hl opt">)) {</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$xinetd_name, $on_off</span><span class="hl opt">) =</span> <span class="hl kwd">m!^\t(\S+):\s*(on|off)!</span><span class="hl opt">) {</span> <span class="hl kwc">push</span> <span class="hl kwb">@xinetd_services,</span> <span class="hl opt">[</span> <span class="hl kwb">$xinetd_name, $on_off</span> <span class="hl kwc">eq</span> <span class="hl str">'on'</span> <span class="hl opt">];</span> <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$name, $l</span><span class="hl opt">) =</span> <span class="hl kwd">m!^(\S+)\s+(0:(on|off).*)!</span><span class="hl opt">) {</span> <span class="hl kwc">push</span> <span class="hl kwb">@services,</span> <span class="hl opt">[</span> <span class="hl kwb">$name,</span> <span class="hl opt">[</span> <span class="hl kwb">$l</span> <span class="hl opt">=~</span> <span class="hl kwd">/(\d+):on/g</span> <span class="hl opt">] ];</span> <span class="hl opt">}</span> <span class="hl opt">}</span> \<span class="hl kwb">@services,</span> \<span class="hl kwb">@xinetd_services</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl slc">#- returns: </span> <span class="hl slc">#--- the listref of installed services</span> <span class="hl slc">#--- the listref of "on" services</span> <span class="hl kwa">sub</span> services<span class="hl opt">() {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$services, $xinetd_services</span><span class="hl opt">) =</span> services_raw<span class="hl opt">();</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> <span class="hl kwb">@$xinetd_services</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">($::</span>isInstall<span class="hl opt">) {</span> <span class="hl kwc">push</span> <span class="hl kwb">@l,</span> <span class="hl kwc">map</span> <span class="hl opt">{ [</span> <span class="hl kwb">$_</span><span class="hl opt">->[</span><span class="hl num">0</span><span class="hl opt">], @{</span><span class="hl kwb">$_</span><span class="hl opt">->[</span><span class="hl num">1</span><span class="hl opt">]} ></span> <span class="hl num">0</span> <span class="hl opt">] }</span> <span class="hl kwb">@$services</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">$runlevel</span> <span class="hl opt">= (</span><span class="hl kwc">split</span> <span class="hl str">" "</span><span class="hl opt">,</span> <span class="hl str">`/sbin/runlevel`</span><span class="hl opt">)[</span><span class="hl num">1</span><span class="hl opt">];</span> <span class="hl kwc">push</span> <span class="hl kwb">@l,</span> <span class="hl kwc">map</span> <span class="hl opt">{ [</span> <span class="hl kwb">$_</span><span class="hl opt">->[</span><span class="hl num">0</span><span class="hl opt">],</span> member<span class="hl opt">(</span><span class="hl kwb">$runlevel,</span> <span class="hl opt">@{</span><span class="hl kwb">$_</span><span class="hl opt">->[</span><span class="hl num">1</span><span class="hl opt">]}) ] }</span> <span class="hl kwb">@$services</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> <span class="hl kwc">sort</span> <span class="hl opt">{</span> <span class="hl kwb">$a</span><span class="hl opt">->[</span><span class="hl num">0</span><span class="hl opt">]</span> <span class="hl kwc">cmp</span> <span class="hl kwb">$b</span><span class="hl opt">->[</span><span class="hl num">0</span><span class="hl opt">] }</span> <span class="hl kwb">@l</span><span class="hl opt">;</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->[</span><span class="hl num">0</span><span class="hl opt">] }</span> <span class="hl kwb">@l</span> <span class="hl opt">], [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->[</span><span class="hl num">0</span><span class="hl opt">] }</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->[</span><span class="hl num">1</span><span class="hl opt">] }</span> <span class="hl kwb">@l</span> <span class="hl opt">];</span> <span class="hl opt">}</span> <span class="hl slc"># the following functions are mostly by printer related modules</span> <span class="hl kwa">sub</span> restart <span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl slc"># Exit silently if the service is not installed</span> <span class="hl kwa">return</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl opt">!(-</span>x <span class="hl str">"$::prefix/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">);</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl str">"restart"</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> start <span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl slc"># Exit silently if the service is not installed</span> <span class="hl kwa">return</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl opt">!(-</span>x <span class="hl str">"$::prefix/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">);</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl str">"start"</span><span class="hl opt">);</span> <span class="hl kwa">return</span> <span class="hl opt">((</span><span class="hl kwb">$?</span> <span class="hl opt">>></span> <span class="hl num">8</span><span class="hl opt">) !=</span> <span class="hl num">0</span><span class="hl opt">)</span> ? <span class="hl num">0</span> <span class="hl opt">:</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> start_not_running_service <span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl slc"># Exit silently if the service is not installed</span> <span class="hl kwa">return</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl opt">!(-</span>x <span class="hl str">"$::prefix/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">);</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl str">"status"</span><span class="hl opt">);</span> <span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">$?</span> <span class="hl opt">>></span> <span class="hl num">8</span><span class="hl opt">) !=</span> <span class="hl num">0</span><span class="hl opt">) {</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl str">"start"</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">return</span> <span class="hl opt">((</span><span class="hl kwb">$?</span> <span class="hl opt">>></span> <span class="hl num">8</span><span class="hl opt">) !=</span> <span class="hl num">0</span><span class="hl opt">)</span> ? <span class="hl num">0</span> <span class="hl opt">:</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> stop <span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl slc"># Exit silently if the service is not installed</span> <span class="hl kwa">return</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl opt">!(-</span>x <span class="hl str">"$::prefix/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">);</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl str">"stop"</span><span class="hl opt">);</span> <span class="hl kwa">return</span> <span class="hl opt">((</span><span class="hl kwb">$?</span> <span class="hl opt">>></span> <span class="hl num">8</span><span class="hl opt">) !=</span> <span class="hl num">0</span><span class="hl opt">)</span> ? <span class="hl num">0</span> <span class="hl opt">:</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> is_service_running <span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl slc"># Exit silently if the service is not installed</span> <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl opt">!(-</span>x <span class="hl str">"$::prefix/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">);</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"/etc/rc.d/init.d/</span><span class="hl ipl">$service</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl str">"status"</span><span class="hl opt">);</span> <span class="hl slc"># The exit status is not zero when the service is not running</span> <span class="hl kwa">return</span> <span class="hl opt">((</span><span class="hl kwb">$?</span> <span class="hl opt">>></span> <span class="hl num">8</span><span class="hl opt">) !=</span> <span class="hl num">0</span><span class="hl opt">)</span> ? <span class="hl num">0</span> <span class="hl opt">:</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> starts_on_boot <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwc">undef</span><span class="hl opt">,</span> <span class="hl kwb">$on_services</span><span class="hl opt">) =</span> services<span class="hl opt">();</span> member<span class="hl opt">(</span><span class="hl kwb">$service, @$on_services</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> start_service_on_boot <span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"/sbin/chkconfig"</span><span class="hl opt">,</span> <span class="hl str">"--add"</span><span class="hl opt">,</span> <span class="hl kwb">$service</span><span class="hl opt">)</span> ? <span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> do_not_start_service_on_boot <span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$service</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">($::</span>prefix<span class="hl opt">,</span> <span class="hl str">"/sbin/chkconfig"</span><span class="hl opt">,</span> <span class="hl str">"--del"</span><span class="hl opt">,</span> <span class="hl kwb">$service</span><span class="hl opt">)</span> ? <span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl num">1</span><span class="hl opt">;</span> </code></pre></td></tr></table> </div> <!-- class=content --> <div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.1</a> (<a href='https://git-scm.com/'>git 2.21.0</a>) at 2025-02-23 16:48:52 +0000</div> </div> <!-- id=cgit --> </body> </html>