1 #
   2 # CDDL HEADER START
   3 #
   4 # The contents of this file are subject to the terms of the
   5 # Common Development and Distribution License (the "License").
   6 # You may not use this file except in compliance with the License.
   7 #
   8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9 # or http://www.opensolaris.org/os/licensing.
  10 # See the License for the specific language governing permissions
  11 # and limitations under the License.
  12 #
  13 # When distributing Covered Code, include this CDDL HEADER in each
  14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15 # If applicable, add the following below this CDDL HEADER, with the
  16 # fields enclosed by brackets "[]" replaced with your own identifying
  17 # information: Portions Copyright [yyyy] [name of copyright owner]
  18 #
  19 # CDDL HEADER END
  20 #
  21 
  22 #
  23 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  24 # Use is subject to license terms.
  25 #
  26 
  27 #
  28 # A number of functions to create each of the different pieces
  29 # that will make up a manifest.
  30 #
  31 
  32 #
  33 # Write the piece out to the xml file
  34 #
  35 # This recursively works through the piece tree building out the
  36 # xml file from the start to the end.
  37 #
  38 sub write_piece() {
  39         my $p = shift;
  40 
  41         $p->write->($p);
  42 
  43         $tablvl++;
  44         foreach $ap (@{$p->associations}) {
  45                 &write_piece($ap);
  46         }
  47         if (length($p->close) > 0) {
  48                 printf(TESTXML "%s\n", $p->close);
  49         }
  50 
  51         $tablvl--;
  52 }
  53 
  54 
  55 #
  56 # Write a service bundle piece
  57 #
  58 sub write_service_bundle() {
  59         my $p = shift;
  60 
  61         printf(TESTXML "<service_bundle ");
  62         foreach my $v (@{$p->values}) {
  63                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
  64         }
  65 
  66         printf(TESTXML ">\n");
  67         $p->close("</service_bundle>");
  68 }
  69 
  70 #
  71 # Write a service piece
  72 #
  73 sub write_service() {
  74         my $p = shift;
  75 
  76         printf(TESTXML "<service ");
  77         foreach my $v (@{$p->values}) {
  78                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
  79         }
  80 
  81         printf(TESTXML ">\n");
  82         $p->close("</service>");
  83 }
  84 
  85 #
  86 # Write an exec_method piece
  87 #
  88 sub write_exec_method() {
  89         my $p = shift;
  90 
  91         printf(TESTXML "<exec_method ");
  92         foreach my $v (@{$p->values}) {
  93                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
  94         }
  95 
  96         printf(TESTXML "/>\n");
  97         $p->close("");
  98 }
  99 
 100 #
 101 # Write a default_instance piece
 102 #
 103 sub write_create_default_instance() {
 104         my $p = shift;
 105 
 106         $v = ${$p->values}[0];
 107         printf(TESTXML "<create_default_instance ");
 108         printf(TESTXML "enabled='%s' />\n", $v->leftside);
 109         $p->close("");
 110 }
 111 
 112 #
 113 # Write a single instance piece
 114 #
 115 sub write_single_instance() {
 116         my $p = shift;
 117 
 118         printf(TESTXML "<single_instance/>\n");
 119         $p->close("");
 120 }
 121 
 122 #
 123 # Write a restarter piece
 124 #
 125 sub write_restarter() {
 126         my $p = shift;
 127 
 128         printf(TESTXML "<restarter>\n");
 129         $p->close("</restarter>");
 130 
 131 }
 132 
 133 #
 134 # Write a dependency piece
 135 #
 136 sub write_dependency() {
 137         my $p = shift;
 138 
 139         printf(TESTXML "<dependency ");
 140         foreach my $v (@{$p->values}) {
 141                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 142         }
 143 
 144         printf(TESTXML ">\n");
 145         $p->close("</dependency>");
 146 }
 147 
 148 #
 149 # Write a dependent piece
 150 #
 151 sub write_dependent() {
 152         my $p = shift;
 153 
 154         printf(TESTXML "<dependent ");
 155         foreach my $v (@{$p->values}) {
 156                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 157         }
 158 
 159         printf(TESTXML ">\n");
 160         $p->close("</dependent>");
 161 }
 162 
 163 #
 164 # Write a method piece
 165 #
 166 sub write_method_context() {
 167         my $p = shift;
 168 
 169         printf(TESTXML "<method_context>\n");
 170         $p->close("</method_context>\n");
 171 }
 172 
 173 #
 174 # Write a property group piece
 175 #
 176 sub write_property_group() {
 177         my $p = shift;
 178 
 179         printf(TESTXML "<property_group ");
 180         foreach my $v (@{$p->values}) {
 181                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 182         }
 183 
 184         printf(TESTXML ">\n");
 185         $p->close("</property_group>");
 186 }
 187 
 188 #
 189 # Write a instance piece
 190 #
 191 sub write_instance() {
 192         my $p = shift;
 193 
 194         printf(TESTXML "<instance ");
 195         foreach my $v (@{$p->values}) {
 196                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 197         }
 198 
 199         printf(TESTXML ">\n");
 200         $p->close("</instance>");
 201 }
 202 
 203 #
 204 # Write a stability piece
 205 #
 206 sub write_stability() {
 207         my $p = shift;
 208 
 209         printf(TESTXML "<instance ");
 210         foreach my $v (@{$p->values}) {
 211                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 212         }
 213 
 214         printf(TESTXML "/>\n");
 215         $p->close("");
 216 }
 217 
 218 #
 219 # Write a template piece
 220 #
 221 sub write_template() {
 222         my $p = shift;
 223 
 224         printf(TESTXML "<template>\n");
 225         $p->close("</template>");
 226 }
 227 
 228 #
 229 # Write a common_name piece
 230 #
 231 sub write_common_name() {
 232         my $p = shift;
 233 
 234         printf(TESTXML "<common_name>\n");
 235         foreach $v (@{$p->values}) {
 236                 if ($v->leftside eq "lang") {
 237                         my $lang = $v->rightside;
 238                         my $cname = "";
 239                         foreach $vn (@{$p->values}) {
 240                                 if ($vn->leftside eq "${lang}_cname") {
 241                                         $cname = $vn->rightside;
 242                                         last;
 243                                 }
 244                         }
 245 
 246                         if ($cname) {
 247                                 printf(TESTXML "\t<loctext xml:lang='$lang'>\n");
 248                                 printf(TESTXML "\t\t$cname\n");
 249                                 printf(TESTXML "\t</loctext>\n");
 250                         }
 251                 }
 252         }
 253 
 254         printf(TESTXML "</common_name>\n");
 255 }
 256 
 257 #
 258 # Write a description piece
 259 #
 260 sub write_description() {
 261         my $p = shift;
 262 
 263         printf(TESTXML "<description>\n");
 264         foreach $v (@{$p->values}) {
 265                 if ($v->leftside eq "lang") {
 266                         my $lang = $v->rightside;
 267                         my $cname = "";
 268                         foreach $vn (@{$p->values}) {
 269                                 if ($vn->leftside eq "${lang}_cname") {
 270                                         $cname = $vn->rightside;
 271                                         last;
 272                                 }
 273                         }
 274 
 275                         if ($cname) {
 276                                 printf(TESTXML "\t<loctext xml:lang='$lang'>\n");
 277                                 printf(TESTXML "\t\t$cname\n");
 278                                 printf(TESTXML "\t</loctext>\n");
 279                         }
 280                 }
 281         }
 282 
 283         printf(TESTXML "</description>\n");
 284 }
 285 
 286 #
 287 # Write a documentation piece
 288 #
 289 sub write_documentation() {
 290         my $p = shift;
 291 
 292         printf(TESTXML "<documentation>\n");
 293         $p->close("</documentation>");
 294 }
 295 
 296 #
 297 # Write a pg_pattern piece
 298 #
 299 sub write_pg_pattern() {
 300         my $p = shift;
 301 
 302         printf(TESTXML "<pg_pattern ");
 303         foreach my $v (@{$p->values}) {
 304                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 305         }
 306 
 307         printf(TESTXML ">\n");
 308         $p->close("</pg_pattern>");
 309 }
 310 
 311 #
 312 # Write a prop_pattern piece
 313 #
 314 sub write_prop_pattern() {
 315         my $p = shift;
 316 
 317         printf(TESTXML "<prop_pattern ");
 318         foreach my $v (@{$p->values}) {
 319                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 320         }
 321 
 322         printf(TESTXML ">\n");
 323         $p->close("</prop_pattern>");
 324 }
 325 
 326 #
 327 # Write a units piece
 328 #
 329 sub write_units() {
 330         my $p = shift;
 331 
 332         printf(TESTXML "<units>\n");
 333         foreach $v (@{$p->values}) {
 334                 if ($v->leftside eq "lang") {
 335                         my $lang = $v->rightside;
 336                         my $cname = "";
 337                         foreach $vn (@{$p->values}) {
 338                                 if ($vn->leftside eq "${lang}_cname") {
 339                                         $cname = $vn->rightside;
 340                                         last;
 341                                 }
 342                         }
 343 
 344                         if ($cname) {
 345                                 printf(TESTXML "\t<loctext xml:lang='$lang'>\n");
 346                                 printf(TESTXML "\t\t$cname\n");
 347                                 printf(TESTXML "\t</loctext>\n");
 348                         }
 349                 }
 350         }
 351 
 352         printf(TESTXML "</units>\n");
 353 }
 354 
 355 #
 356 # Write a visibility piece
 357 #
 358 sub write_visibility() {
 359         my $p = shift;
 360 
 361         printf(TESTXML "<prop_pattern ");
 362         foreach my $v (@{$p->values}) {
 363                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 364         }
 365 
 366         printf(TESTXML "/>\n");
 367         $p->close("");
 368 }
 369 
 370 #
 371 # Write a cardinality piece
 372 #
 373 sub write_cardinality() {
 374         my $p = shift;
 375 
 376         printf(TESTXML "<cardinality ");
 377         foreach my $v (@{$p->values}) {
 378                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 379         }
 380 
 381         printf(TESTXML "/>\n");
 382         $p->close("");
 383 }
 384 
 385 #
 386 # Write an internal separators piece
 387 #
 388 sub write_internal_separators() {
 389         printf("write_internal_separators Not yet implemented\n");
 390 }
 391 
 392 #
 393 # Write a values piece
 394 #
 395 sub write_values() {
 396         my $p = shift;
 397 
 398         printf(TESTXML "<values>");
 399         $p->close("</values>");
 400 }
 401 
 402 #
 403 # Write a constraints piece
 404 #
 405 sub write_constraints() {
 406         my $p = shift;
 407 
 408         printf(TESTXML "<constraints>\n");
 409         $p->close("</constraints>");
 410 }
 411 
 412 #
 413 # Write a choices piece
 414 #
 415 sub write_choices() {
 416         my $p = shift;
 417 
 418         printf(TESTXML "<choices>");
 419         $p->close("</choices>");
 420 }
 421 
 422 #
 423 # Write a value piece
 424 #
 425 sub write_value() {
 426         my $p = shift;
 427 
 428         printf(TESTXML "<value ");
 429         foreach my $v (@{$p->values}) {
 430                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 431         }
 432 
 433         printf(TESTXML ">\n");
 434         $p->close("</value>");
 435 }
 436 
 437 #
 438 # Write a range piece
 439 #
 440 sub write_range() {
 441         my $p = shift;
 442 
 443         printf(TESTXML "<range ");
 444         foreach my $v (@{$p->values}) {
 445                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 446         }
 447 
 448         printf(TESTXML "/>\n");
 449         $p->close("");
 450 }
 451 
 452 #
 453 # Write a valueset piece
 454 #
 455 sub write_valueset() {
 456         my $p = shift;
 457 
 458         printf(TESTXML "<valueset ");
 459         foreach my $v (@{$p->values}) {
 460                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 461         }
 462 
 463         printf(TESTXML "/>\n");
 464         $p->close("");
 465 }
 466 
 467 #
 468 # Write an allvalues piece
 469 #
 470 sub write_allvalues() {
 471         my $p = shift;
 472 
 473         printf(TESTXML "<allvalues ");
 474         foreach my $v (@{$p->values}) {
 475                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 476         }
 477 
 478         printf(TESTXML "/>\n");
 479         $p->close("");
 480 }
 481 
 482 #
 483 # Write a doc_link piece
 484 #
 485 sub write_doc_link() {
 486         my $p = shift;
 487 
 488         printf(TESTXML "<doc_link");
 489         foreach my $v (@{$p->values}) {
 490                 printf(TESTXML "\n");
 491                 printf(TESTXML "\t%s='%s'", $v->leftside, $v->rightside);
 492         }
 493 
 494         printf(TESTXML "/>\n");
 495         $p->close("");
 496 }
 497 
 498 #
 499 # Write a manpage piece
 500 #
 501 sub write_manpage() {
 502         my $p = shift;
 503 
 504         printf(TESTXML "<manpage ");
 505         foreach my $v (@{$p->values}) {
 506                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 507         }
 508 
 509         printf(TESTXML "/>\n");
 510         $p->close("");
 511 }
 512 
 513 #
 514 # Write a service fmri piece
 515 #
 516 sub write_service_fmri() {
 517         my $p = shift;
 518 
 519         printf(TESTXML "<service_fmri ");
 520         foreach my $v (@{$p->values}) {
 521                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 522         }
 523 
 524         printf(TESTXML "/>\n");
 525         $p->close("");
 526 }
 527 
 528 #
 529 # Write a method_propfile piece
 530 #
 531 sub write_method_profile() {
 532         printf("write_method_credential Not yet implemented\n");
 533 }
 534 
 535 #
 536 # Write a method credential piece
 537 #
 538 sub write_method_credential() {
 539         my $p = shift;
 540 
 541         printf(TESTXML "<method_credential ");
 542         foreach my $v (@{$p->values}) {
 543                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 544         }
 545 
 546         printf(TESTXML "/>\n");
 547         $p->close("");
 548 }
 549 
 550 #
 551 # Write a method environment piece
 552 #
 553 sub write_method_environment() {
 554         printf("write_mathod_environment Not yet implemented\n");
 555 }
 556 
 557 #
 558 # Write a propval piece
 559 #
 560 sub write_propval() {
 561         my $p = shift;
 562 
 563         printf(TESTXML "<propval ");
 564         foreach my $v (@{$p->values}) {
 565                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 566         }
 567 
 568         printf(TESTXML "/>\n");
 569         $p->close("");
 570 }
 571 
 572 #
 573 # Write a property piece
 574 #
 575 sub write_property() {
 576         my $p = shift;
 577 
 578         printf(TESTXML "<property ");
 579         foreach my $v (@{$p->values}) {
 580                 printf(TESTXML "%s='%s' ", $v->leftside, $v->rightside);
 581         }
 582 
 583         printf(TESTXML ">\n");
 584         $p->close("</property>");
 585 }
 586 
 587 #
 588 # Write a count list piece
 589 #
 590 sub write_count_list() {
 591         my $p = shift;
 592 
 593         printf(TESTXML "<count_list>\n");
 594         foreach my $v (@{$p->values}) {
 595                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 596         }
 597 
 598         printf(TESTXML "</count_list>\n");
 599 }
 600 
 601 #
 602 # Write a integer list piece
 603 #
 604 sub write_integer_list() {
 605         my $p = shift;
 606 
 607         printf(TESTXML "<integer_list>\n");
 608         foreach my $v (@{$p->values}) {
 609                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 610         }
 611 
 612         printf(TESTXML "</integer_list>\n");
 613 }
 614 
 615 #
 616 # Write an opaque list piece
 617 #
 618 sub write_opaque_list() {
 619         my $p = shift;
 620 
 621         printf(TESTXML "<opaque_list>\n");
 622         foreach my $v (@{$p->values}) {
 623                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 624         }
 625 
 626         printf(TESTXML "</opaque_list>\n");
 627 }
 628 
 629 #
 630 # Write a host list piece
 631 #
 632 sub write_host_list() {
 633         my $p = shift;
 634 
 635         printf(TESTXML "<host_list>\n");
 636         foreach my $v (@{$p->values}) {
 637                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 638         }
 639 
 640         printf(TESTXML "</host_list>\n");
 641 }
 642 
 643 #
 644 # Write a hostname list piece
 645 #
 646 sub write_host_name_list() {
 647         my $p = shift;
 648 
 649         printf(TESTXML "<host_name_list>\n");
 650         foreach my $v (@{$p->values}) {
 651                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 652         }
 653 
 654         printf(TESTXML "</host_name_list>\n");
 655 }
 656 
 657 #
 658 # Write a netaddress v4 list piece
 659 #
 660 sub write_net_address_v4_list() {
 661         my $p = shift;
 662 
 663         printf(TESTXML "<net_address_v4_list>\n");
 664         foreach my $v (@{$p->values}) {
 665                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 666         }
 667 
 668         printf(TESTXML "</net_address_v4_list>\n");
 669 }
 670 
 671 #
 672 # Write a netaddress v6 list piece
 673 #
 674 sub write_net_address_v6_list() {
 675         my $p = shift;
 676 
 677         printf(TESTXML "<net_address_v6_list>\n");
 678         foreach my $v (@{$p->values}) {
 679                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 680         }
 681 
 682         printf(TESTXML "</net_address_v6_list>\n");
 683 }
 684 
 685 #
 686 # Write a time list piece
 687 #
 688 sub write_time_list() {
 689         my $p = shift;
 690 
 691         printf(TESTXML "<time_list>\n");
 692         foreach my $v (@{$p->values}) {
 693                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 694         }
 695 
 696         printf(TESTXML "</time_list>\n");
 697 }
 698 
 699 #
 700 # Write a astring list piece
 701 #
 702 sub write_astring_list() {
 703         my $p = shift;
 704 
 705         printf(TESTXML "<astring_list>\n");
 706         foreach my $v (@{$p->values}) {
 707                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 708         }
 709 
 710         printf(TESTXML "</astring_list>\n");
 711         $p->close("");
 712 }
 713 
 714 #
 715 # Write a ustring list piece
 716 #
 717 sub write_ustring_list() {
 718         my $p = shift;
 719 
 720         printf(TESTXML "<ustring_list>\n");
 721         foreach my $v (@{$p->values}) {
 722                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 723         }
 724 
 725         printf(TESTXML "</ustring_list>\n");
 726 }
 727 
 728 #
 729 # Write a boolean list piece
 730 #
 731 sub write_boolean_list() {
 732         my $p = shift;
 733 
 734         printf(TESTXML "<boolean_list>\n");
 735         foreach my $v (@{$p->values}) {
 736                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 737         }
 738 
 739         printf(TESTXML "</boolean_list>\n");
 740 }
 741 
 742 #
 743 # Write a fmri list piece
 744 #
 745 sub write_fmri_list() {
 746         my $p = shift;
 747 
 748         printf(TESTXML "<fmri_list>\n");
 749         foreach my $v (@{$p->values}) {
 750                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 751         }
 752 
 753         printf(TESTXML "</fmri_list>\n");
 754 }
 755 
 756 #
 757 # Write a uri list piece
 758 #
 759 sub write_uri_list() {
 760         my $p = shift;
 761 
 762         printf(TESTXML "<uri_list>\n");
 763         foreach my $v (@{$p->values}) {
 764                 printf(TESTXML "\t<value_node value='%s' />\n", $v->rightside);
 765         }
 766 
 767         printf(TESTXML "</uri_list>\n");
 768 }
 769 return (1);