home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / lib / YaST2 / servers_non_y2 / ag_initscripts < prev    next >
Text File  |  2006-11-29  |  9KB  |  345 lines

  1. #!/bin/bash
  2.  
  3. # File:        ag_initscripts
  4. # Package:    yast2
  5. # Summary:    Agent for reading initscripts info
  6. # Authors:    Martin Vidner <mvidner@suse.cz>
  7. #        Petr Blahos <pblahos@suse.cz>
  8. #
  9. # $Id: ag_initscripts 28325 2006-02-23 12:11:10Z mvidner $
  10. #
  11. ################################################################
  12. # Runlevels are single character strings.
  13. # Except default_runlevel, all paths are read-only.
  14. # Assuming that the agent is mounted at .init.scripts:
  15. ################################################################
  16. # .init.scripts.comments
  17. #    returns a map of services, e.g.:
  18. #     $[
  19. #     "inetd" : $[
  20. #       "provides" : [ "inetd",],        # apache has apache, httpd
  21. #          "reqstart" : [ "$network", "$remote_fs", ],
  22. #          "reqstop" : [ "$network", ],
  23. #       "shouldstart" : [ "portmap", "autofs", ],
  24. #       "shouldstop" : [ "portmap", ],
  25. #          "defstart" : [ "3", "5", ],
  26. #          "defstop" : [ "0", "1", "2", "6", ],
  27. #       "defenabled": false,
  28. #          "description": "Start the inet daemon.",
  29. #       "shortdescription": "Inet daemon",
  30. #     ],
  31. #     ]
  32. # .init.scripts.comment
  33. #   Read (.init.scripts.comment, "script")
  34. #   reads the same but for a given script, a singleton map
  35. #
  36. # Not all of the fields are needed/used by the runlevel editor.
  37. # TODO: what if some fields are missing?
  38. ################################################################
  39. # .init.scripts.runlevels
  40. #   return maps of services and runlevels they run in,
  41. #   according to the symlinks, e.g.:
  42. #     $[
  43. #     "xfs" : $[
  44. #           "start" : [ "3", "5", ]
  45. #           "stop"  : [ "1", "2", "6",  ]
  46. #     ]
  47. #     ]
  48. # .init.scripts.runlevel
  49. #   Read (.init.scripts.runlevel, "script")
  50. #   reads the same but for a given script, a singleton map
  51. ################################################################
  52. # .init.scripts.current_runlevel
  53. #   return string -- current runlevel.
  54. ################################################################
  55. # .init.scripts.runlevel_list
  56. #   return list of runlevels
  57. ################################################################
  58. # .init.scripts.default_runlevel
  59. #   read/write default runlevel
  60. ################################################################
  61. # .init.scripts.exists
  62. #   Read (.init.scripts.exists, "script")
  63. #   returns true if file /etc/init.d/script exits, false otherwise
  64. ################################################################
  65.  
  66. export LC_ALL=C
  67.  
  68. # InitScripts can initialize this to a different value
  69. #  Useful for .comments
  70. #  Does not work for .runlevels which wants a fixed number of slashes
  71. INITD="/etc/init.d"
  72.  
  73. get_script_info () {
  74. [ -r "$1" ] && awk '
  75.     BEGIN {
  76.         in_comment = 0; in_descr = 0; skip_file = 0; first_time = 1;
  77.         header_printed = 0;
  78.     }
  79.     first_time {
  80.         first_time = 0;
  81.         if (FILENAME ~ /\.local$/ || FILENAME ~ /\.rpm/ || FILENAME ~ /\.ba/ ||
  82.         FILENAME ~ /\.old$/ || FILENAME ~ /\.new$/ || FILENAME ~ /\.save$/ ||
  83.         FILENAME ~ /\.swp$/ || FILENAME ~ /\.core$/ || FILENAME ~ /~$/ ||
  84.         FILENAME ~ /boot\.klog/ ||
  85.         FILENAME ~ /^Makefile/ ||
  86. # why was this here??
  87. # bug 34775: dont skip boot.hotplug-beta, boot.restore_permissions
  88. #        FILENAME ~ /\.[^0-9$.#_\-\\*]*[0-9$.#_\-\\*]/
  89.         0)
  90.         skipfile = 1;
  91.         else {
  92.         printf "\"%s\" : $[\n", FILENAME ;
  93.         header_printed = 1;
  94.         }
  95.     }
  96.     END {
  97.     if (header_printed)
  98.         print "],";
  99.     }
  100.     skipfile {
  101.         nextfile;
  102.     }
  103.     { in_continue = 1; }
  104.     /^### BEGIN INIT INFO/ {
  105.         in_continue = 0;
  106.         in_descr = 0;
  107.         description = "";
  108.         in_comment = 1;
  109.     }
  110.     in_continue && /^### END INIT INFO/ {
  111.         in_continue = 0;
  112.         in_descr = 0;
  113.         in_comment = 0;
  114.         gsub (/\\/, "\\\\", description);
  115.         gsub (/"/, "\\\"", description);
  116.         print "     \"description\": \""description"\",";
  117.         # we print ] in END rule
  118.         nextfile;
  119.     }
  120.     in_continue && in_comment && $2 == "Default-Start:" {
  121.         in_continue = 0;
  122.         in_descr = 0;
  123.         printf "     \"defstart\" : [ ";
  124.         for (i = 3; i<= NF; i++) printf ("\"%s\", ", $i) ;
  125.         print "],";
  126.     }
  127.     in_continue && in_comment && $2 == "Default-Stop:" {
  128.         in_continue = 0;
  129.         in_descr = 0;
  130.         printf "     \"defstop\" : [ ";
  131.         for (i = 3; i<= NF; i++) printf ("\"%s\", ", $i) ;
  132.         print "],";
  133.     }
  134.     in_continue && in_comment && $2 == "Required-Start:" {
  135.         in_continue = 0;
  136.         in_descr = 0;
  137.         printf "     \"reqstart\" : [ ";
  138.         for (i = 3; i<= NF; i++) printf ("\"%s\", ", $i) ;
  139.         print "],";
  140.     }
  141.     in_continue && in_comment && $2 == "Required-Stop:" {
  142.         in_continue = 0;
  143.         in_descr = 0;
  144.         printf "     \"reqstop\" : [ ";
  145.         for (i = 3; i<= NF; i++) printf ("\"%s\", ", $i) ;
  146.         print "],";
  147.     }
  148.     in_continue && in_comment && ($2 ~ /^(X-SuSE-|X-UnitedLinux-|)Should-Start:$/) {
  149.         in_continue = 0;
  150.         in_descr = 0;
  151.         printf "     \"shouldstart\" : [ ";
  152.         for (i = 3; i<= NF; i++) printf ("\"%s\", ", $i) ;
  153.         print "],";
  154.     }
  155.     in_continue && in_comment && ($2 ~ /^(X-SuSE-|X-UnitedLinux-|)Should-Stop:$/) {
  156.         in_continue = 0;
  157.         in_descr = 0;
  158.         printf "     \"shouldstop\" : [ ";
  159.         for (i = 3; i<= NF; i++) printf ("\"%s\", ", $i) ;
  160.         print "],";
  161.     }
  162.     in_continue && in_comment && $2 == "X-UnitedLinux-Default-Enabled:" {
  163.         in_continue = 0;
  164.         in_descr = 0;
  165.         printf "     \"defenabled\" : ";
  166.         if ($3 == "yes" || $3 == "true")
  167.         printf "true";
  168.         else
  169.         printf "false";
  170.          print ",";
  171.     }
  172.     in_continue && in_comment && $2 == "Provides:" {
  173.         in_continue = 0;
  174.         in_descr = 0;
  175.         printf "     \"provides\" : [ ";
  176.         for (i = 3; i<= NF; i++) printf ("\"%s\", ", $i) ;
  177.         print "],";
  178.     }
  179.     in_continue && in_comment && $2 == "Short-Description:" {
  180.         in_continue = 0;
  181.         in_descr = 0;
  182.         shortdescription = $0;
  183.         gsub (/.*Short-Description:[ \t]*/, "", shortdescription);
  184.         gsub (/\\/, "\\\\", shortdescription);
  185.         gsub (/"/, "\\\"", shortdescription);
  186.         print "     \"shortdescription\": \""shortdescription"\",";
  187.     }
  188.     in_continue && in_comment && $2 == "Description:" {
  189.         in_continue = 0;
  190.         in_descr = 1;
  191.         description = $3;
  192.         for (i = 4; i<= NF; i++) description = description " " $i;
  193.     }
  194.     in_continue && in_comment && in_descr && (/^#\ [\t ]/ || /^#\t/) {
  195.         in_continue = 0;
  196.         $1 = "";
  197.         description = description $0;
  198.     }
  199.     in_continue && in_comment { in_descr = 0; }
  200.  
  201. '  $1
  202. }
  203.  
  204. process_all_scripts () {
  205.     cd $INITD
  206.     for i in * ; do
  207.     if [ -f $i ] ; then
  208.         case "$i" in
  209.         "reboot" | "halt" | "single" | "README" | "core" | "rc" | "rx" | "skeleton" | "skeleton."* | "powerfail" | "boot" | "boot.orig" )
  210.             ;;
  211.         *)
  212.             get_script_info $i
  213.         esac
  214.     fi
  215.     done
  216. }
  217.  
  218. # Read (.runlevels)
  219. read_runlevels () {
  220.     find $INITD -name "*$1" | awk -F / '
  221.     BEGIN { SUBSEP = ":"; }
  222.     $4 ~ /^rc.\.d$/ && $5 ~ /^[SK][0-9][0-9]/ {
  223.     script = substr ($5, 4);
  224.     scripts [script] = 1;
  225.     if (substr ($5, 1, 1) == "K") {
  226.         K [script] = K [script] "\"" substr ($4, 3, 1) "\", ";
  227.     }
  228.     else if (substr ($5, 1, 1) == "S") {
  229.         S [script] = S [script] "\"" substr ($4, 3, 1) "\", ";
  230.     }
  231.     }
  232.     $4 ~ /^boot.d$/ && $5 ~ /^[SK][0-9][0-9]/ {
  233.     script = substr ($5, 4);
  234.     scripts [script] = 1;
  235.     if (substr ($5, 1, 1) == "K") {
  236.         K [script] = K [script] "\"B\", ";
  237.     }
  238.     else if (substr ($5, 1, 1) == "S") {
  239.         S [script] = S [script] "\"B\", ";
  240.     }
  241.     }
  242.     END {
  243.     print "$[";
  244.     for (i in scripts) {
  245.         printf "\"%s\" : $[\n", i;
  246.         printf "     \"start\" : [ %s ],\n", S [i];
  247.         printf "     \"stop\"  : [ %s ],\n", K [i];
  248.         print "],"
  249.     }
  250.     print "]";
  251.     }
  252.     '
  253. }
  254.  
  255. while true ; do
  256.     IFS=
  257.     read COMMAND || exit
  258.  
  259.     # delete starting backquote    
  260.     COMMAND=${COMMAND#\`}
  261.  
  262.     unset IFS
  263.  
  264.     case "$COMMAND" in
  265.     "result ("*)
  266.         exit
  267.         ;;
  268.  
  269.     "InitScripts ("*)
  270.         INITD=$(echo "$COMMAND" | sed 's/^InitScripts ("\(.*\)")/\1/')
  271.         echo nil
  272.         ;;
  273.  
  274.     'Dir (.)')
  275.         echo '[ "comments", "comment", "runlevels", "runlevel", "exists", "current_runlevel", "default_runlevel", "runlevel_list" ]'
  276.         ;;
  277.  
  278.     'Read (.comments)')
  279.         echo '$['
  280.         process_all_scripts
  281.         echo ']'
  282.         ;;
  283.  
  284.     "Read (.comment,"*)
  285.         rootpart=$(echo "$COMMAND" | sed 's/^Read (.comment, *"\(.*\)")/\1/')
  286.         echo '$['
  287.         cd $INITD
  288.         if [ -f $rootpart ] ; then
  289.         get_script_info $rootpart
  290.         else
  291.         echo "\"$rootpart\" : \$[ ]"
  292.         fi
  293.         echo ']'
  294.         ;;
  295.  
  296.     "Read (.runlevel,"*)
  297.         rootpart=$(echo "$COMMAND" | sed 's/^Read (.runlevel, *"\(.*\)")/\1/')
  298.         read_runlevels $rootpart;
  299.         ;;
  300.  
  301.     'Read (.runlevels)')
  302.         read_runlevels "";
  303.         ;;
  304.  
  305.     "Read (.exists,"*)
  306.         rootpart=$(echo "$COMMAND" | sed 's/^Read (.exists, *"\(.*\)")/\1/')
  307.         if [ -f $INITD/$rootpart ] ; then
  308.         echo true
  309.         else
  310.         echo false
  311.         fi
  312.         ;;
  313.  
  314.     'Read (.current_runlevel)')
  315.         /sbin/runlevel | awk ' { print "\"" $2 "\"" }'
  316.         ;;
  317.  
  318.     'Read (.default_runlevel)')
  319.         grep 'id:.:initdefault:' /etc/inittab | sed -e s/id:/\"/g -e s/:initdefault:/\"/g
  320.         ;;
  321.  
  322.     'Read (.runlevel_list)')
  323.         echo -n "[ \"B\", "
  324.         awk '/^[^#]..*\/etc\/init\.d\/rc / { print "\"" $2 "\"," }' /etc/inittab
  325.         echo "]"
  326.         ;;
  327.  
  328.     "Write (.default_runlevel,"*)
  329.         rootpart=$(echo "$COMMAND" | sed 's/^Write (.default_runlevel, *"\(.*\)")/\1/')
  330.         sed s/^id:.:initdefault:/id:$rootpart:initdefault:/g /etc/inittab > /etc/inittab.yast2.tmp
  331.         if [ $? = 0 ] ; then
  332.         mv /etc/inittab.yast2.tmp /etc/inittab
  333.         chmod 0644 /etc/inittab
  334.         chown root:root /etc/inittab
  335.         echo "true"
  336.         else
  337.         echo "false"
  338.         fi
  339.         ;;
  340.  
  341.     *)
  342.         echo nil
  343.     esac
  344. done
  345.