sosreport-3.5/0000755000175000017500000000000013203300002013232 5ustar cariboucaribousosreport-3.5/.coverage0000644000175000017500000007211713203273413015055 0ustar cariboucaribou!coverage.py: This is a private format, don't read it directly!{"lines": {"/home/caribou/git/sosreport/sos/plugins/yum.py": [15, 18, 20, 22, 23, 25, 26, 29, 30, 31, 34], "/home/caribou/git/sosreport/sos/plugins/hardware.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/ppp.py": [17, 20, 22, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/plugins/quagga.py": [17, 20, 22, 24, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/openstack_ansible.py": [36, 17, 20, 21, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/sssd.py": [17, 20, 22, 24, 25, 26, 28, 44, 51, 53, 57, 59], "/home/caribou/git/sosreport/sos/plugins/pcp.py": [17, 18, 19, 20, 23, 25, 27, 28, 29, 31, 34, 36, 37, 38, 40, 42, 50, 77], "/home/caribou/git/sosreport/sos/__init__.py": [34, 35, 37, 22, 24, 26, 28, 29, 31], "/home/caribou/git/sosreport/sos/plugins/openstack_manila.py": [71, 74, 17, 20, 22, 23, 24, 25, 27, 38, 50, 51, 58, 62, 63], "/home/caribou/git/sosreport/sos/plugins/virsh.py": [15, 16, 17, 20, 22, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/plugins/opencl.py": [15, 18, 20, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/ntp.py": [15, 18, 20, 22, 23, 25, 27, 39, 41, 47, 49], "/home/caribou/git/sosreport/sos/plugins/distupgrade.py": [35, 38, 17, 20, 21, 23, 24, 26, 29], "/home/caribou/git/sosreport/sos/plugins/ldap.py": [15, 18, 20, 22, 23, 24, 26, 30, 34, 36, 37, 39, 55, 69, 71, 72, 74, 96], "/home/caribou/git/sosreport/sos/plugins/sar.py": [15, 16, 19, 21, 23, 24, 26, 27, 28, 29, 32, 34, 77, 79, 82, 84], "/home/caribou/git/sosreport/sos/plugins/cman.py": [65, 15, 16, 17, 20, 22, 24, 25, 28, 29, 30, 33, 35, 36, 38], "/home/caribou/git/sosreport/sos/plugins/openshift.py": [15, 16, 25, 26, 28, 29, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 49, 52, 117], "/home/caribou/git/sosreport/sos/plugins/lilo.py": [15, 18, 20, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/rhui.py": [15, 18, 20, 22, 23, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/apt.py": [17, 20, 22, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/cgroups.py": [37, 39, 15, 18, 20, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/symcli.py": [37, 28, 17, 18, 21, 89, 23, 25, 26, 92], "/home/caribou/git/sosreport/sos/plugins/openstack_keystone.py": [68, 73, 77, 18, 19, 22, 24, 25, 26, 28, 30, 83, 57], "/home/caribou/git/sosreport/sos/plugins/vhostmd.py": [15, 16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/acpid.py": [32, 15, 18, 19, 20, 21, 24, 25, 31], "/home/caribou/git/sosreport/sos/plugins/nis.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/block.py": [15, 16, 19, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/grub.py": [35, 15, 18, 20, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/kpatch.py": [16, 17, 20, 22, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/dpkg.py": [16, 19, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/usb.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/named.py": [15, 16, 19, 21, 23, 24, 25, 26, 28, 40, 50, 56, 58, 60, 61, 62, 64, 73, 75, 76, 77, 78, 79, 80, 82], "/home/caribou/git/sosreport/sos/plugins/ceph_ansible.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/keepalived.py": [16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/nscd.py": [17, 20, 22, 24, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/etcd.py": [17, 20, 23, 25], "/home/caribou/git/sosreport/sos/plugins/manageiq.py": [20, 22, 25, 27, 29, 31, 33, 35, 36, 37, 41, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 101], "/home/caribou/git/sosreport/sos/policies/ubuntu.py": [1, 3, 4, 7, 8, 9, 10, 12, 13, 14, 16, 20, 21, 22, 26], "/home/caribou/git/sosreport/sos/plugins/lsbrelease.py": [16, 19, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/policies/osx.py": [1, 2, 5, 7, 9, 11, 12], "/home/caribou/git/sosreport/sos/plugins/subscription_manager.py": [15, 18, 20, 22, 23, 25, 26, 28], "/home/caribou/git/sosreport/sos/plugins/satellite.py": [15, 18, 20, 22, 23, 24, 25, 27, 29, 38, 42], "/home/caribou/git/sosreport/sos/plugins/unity.py": [15, 18, 20, 22, 23, 27, 30], "/home/caribou/git/sosreport/sos/plugins/redis.py": [41, 17, 20, 22, 24, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/scsi.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/ptp.py": [17, 20, 22, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/plugins/navicli.py": [67, 17, 18, 22, 25, 27, 29, 30, 32, 35, 46], "/home/caribou/git/sosreport/sos/plugins/apache.py": [22, 15, 18, 83, 84, 21, 86, 25, 28, 33, 37, 40, 20], "/home/caribou/git/sosreport/sos/plugins/pci.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/tomcat.py": [15, 16, 50, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/pam.py": [15, 18, 20, 22, 23, 24, 26, 38, 39, 41, 45, 46, 48], "/home/caribou/git/sosreport/sos/plugins/tftpserver.py": [17, 20, 22, 24, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/sapnw.py": [139, 15, 16, 19, 27, 28, 30, 31, 33, 35, 100], "/home/caribou/git/sosreport/sos/plugins/grub2.py": [44, 15, 18, 20, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/services.py": [15, 18, 20, 22, 23, 25, 26, 28, 41, 43, 48, 50], "/home/caribou/git/sosreport/sos/plugins/kernel.py": [15, 16, 17, 20, 22, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/plugins/rpm.py": [15, 18, 20, 22, 23, 25, 26, 27, 30, 31, 32, 33, 34, 37], "/home/caribou/git/sosreport/sos/plugins/qpid.py": [15, 18, 20, 22, 23, 25, 26, 28, 30, 31, 33], "/home/caribou/git/sosreport/sos/plugins/ipa.py": [135, 17, 18, 19, 22, 24, 26, 27, 29, 30, 32, 33, 35, 44, 50, 55, 73, 78], "/home/caribou/git/sosreport/sos/plugins/dbus.py": [15, 18, 19, 21, 22, 24], "/home/caribou/git/sosreport/sos/plugins/upstart.py": [17, 20, 22, 24, 25, 26, 28], "/home/caribou/git/sosreport/sos/plugins/ds.py": [32, 41, 18, 19, 22, 24, 26, 27, 29, 30], "/home/caribou/git/sosreport/sos/plugins/processor.py": [15, 18, 20, 22, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/java.py": [15, 18, 19, 21, 22, 24], "/home/caribou/git/sosreport/sos/plugins/gdm.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/anaconda.py": [15, 16, 49, 19, 21, 23, 24, 28, 31], "/home/caribou/git/sosreport/sos/plugins/boot.py": [15, 16, 19, 21, 23, 24, 27, 30], "/home/caribou/git/sosreport/sos/plugins/virtwho.py": [15, 18, 20, 22, 23, 24, 26, 29], "/home/caribou/git/sosreport/sos/plugins/insights.py": [36, 15, 18, 20, 21, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/omsa.py": [16, 19, 21, 23, 24, 26, 27, 29, 31], "/home/caribou/git/sosreport/sos/plugins/foreman.py": [17, 20, 22, 24, 25, 26, 28], "/home/caribou/git/sosreport/sos/plugins/snmp.py": [17, 20, 22, 23, 24, 26, 28, 32, 34, 36, 40, 42, 44], "/home/caribou/git/sosreport/sos/plugins/nodejs.py": [36, 40, 41, 17, 21, 22, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/policies/suse.py": [17, 18, 19, 21, 22, 23, 26, 27, 28, 29, 30, 32, 52, 57, 59, 81, 86, 90, 91, 92, 93, 94, 105, 107, 110, 114], "/home/caribou/git/sosreport/sos/plugins/monit.py": [18, 19, 22, 24, 25, 26, 27, 31, 32, 33, 36, 38, 40, 44], "/home/caribou/git/sosreport/sos/plugins/pacemaker.py": [72, 15, 16, 17, 20, 21, 23, 24, 25, 28, 29, 32], "/home/caribou/git/sosreport/sos/plugins/salt.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/process.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/nfsganesha.py": [15, 18, 20, 21, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/openstack_trove.py": [18, 21, 23, 25, 26, 27, 29, 42, 54, 57, 58, 59, 60, 63, 67, 69, 71], "/home/caribou/git/sosreport/sos/plugins/openstack_nova.py": [128, 130, 146, 149, 22, 23, 153, 26, 28, 29, 30, 32, 75, 89, 91, 113, 116, 120], "/home/caribou/git/sosreport/sos/plugins/s390.py": [34, 17, 20, 22, 24, 25, 29], "/home/caribou/git/sosreport/sos/plugins/vulkan.py": [15, 18, 20, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/python.py": [17, 20, 22, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/plugins/teamd.py": [39, 16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/networking.py": [15, 16, 17, 20, 22, 23, 24, 25, 27, 28, 32, 34, 52, 95, 64, 324, 333, 334, 336, 82, 350, 351, 353, 107, 115, 122], "/home/caribou/git/sosreport/sos/plugins/grafana.py": [48, 17, 20, 22, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/smartcard.py": [17, 20, 22, 24, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/dhcp.py": [15, 18, 20, 22, 23, 26, 28, 29, 31, 39, 41, 42, 44], "/home/caribou/git/sosreport/sos/sosreport.py": [4, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 47, 48, 49, 51, 52, 54, 57, 60, 78, 80, 81, 82, 84, 85, 87, 88, 89, 91, 105, 107, 109, 124, 126, 127, 128, 129, 131, 133, 141, 144, 146, 148, 149, 150, 151, 152, 153, 155, 156, 162, 163, 187, 212, 219, 232, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 261, 263, 264, 265, 269, 274, 276, 277, 280, 287, 289, 290, 293, 298, 300, 301, 303, 308, 310, 311, 314, 319, 321, 322, 325, 330, 332, 333, 336, 341, 343, 345, 346, 349, 356, 362, 369, 375, 383, 389, 396, 402, 409, 411, 412, 415, 422, 428, 435, 437, 438, 441, 448, 450, 451, 454, 461, 467, 472, 478, 483, 485, 486, 489, 494, 496, 497, 500, 505, 507, 508, 511, 516, 518, 519, 522, 527, 533, 540, 542, 543, 546, 551, 553, 554, 557, 566, 572, 577, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 600, 601, 602, 603, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 663, 664, 665, 667, 669, 672, 674, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 689, 690, 691, 695, 696, 697, 699, 700, 704, 707, 709, 710, 717, 720, 721, 723, 725, 727, 728, 730, 733, 736, 738, 744, 745, 746, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 764, 765, 767, 777, 782, 783, 784, 785, 787, 788, 792, 794, 810, 814, 815, 818, 820, 826, 827, 828, 829, 833, 834, 835, 836, 844, 846, 847, 848, 849, 850, 851, 852, 853, 855, 856, 857, 858, 861, 865, 866, 869, 870, 871, 872, 873, 874, 876, 878, 879, 880, 881, 882, 884, 896, 897, 898, 901, 903, 904, 905, 906, 913, 914, 915, 917, 918, 919, 920, 922, 927, 931, 932, 933, 934, 935, 938, 944, 946, 947, 948, 949, 950, 951, 952, 953, 955, 957, 958, 959, 962, 963, 964, 965, 966, 968, 970, 972, 973, 980, 981, 982, 983, 984, 987, 989, 990, 994, 998, 999, 1000, 1024, 1030, 1031, 1037, 1038, 1039, 1040, 1042, 1045, 1088, 1089, 1090, 1091, 1092, 1099, 1100, 1106, 1116, 1168, 1190, 1202, 1211, 1245, 1266, 1279, 1313, 1332, 1371, 1382, 1442, 1457, 1467, 1474, 1570, 1571, 1572, 1573, 1576, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1589, 1592, 1597, 1598, 1629, 1631, 1632], "/home/caribou/git/sosreport/sos/plugins/openstack_horizon.py": [20, 23, 25, 27, 28, 29, 31, 45, 58, 63, 66, 71, 76, 79, 84, 88, 91], "/home/caribou/git/sosreport/sos/plugins/powerpc.py": [32, 18, 19, 22, 24, 26, 27, 29], "/home/caribou/git/sosreport/sos/policies/__init__.py": [1, 3, 4, 5, 6, 7, 8, 9, 11, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 29, 30, 31, 33, 34, 35, 36, 37, 38, 40, 43, 46, 55, 57, 58, 60, 61, 62, 63, 64, 67, 71, 73, 77, 78, 80, 84, 85, 88, 90, 98, 99, 100, 101, 104, 113, 115, 119, 120, 121, 123, 130, 132, 147, 149, 150, 151, 152, 153, 155, 156, 158, 164, 165, 166, 167, 168, 169, 170, 172, 173, 175, 176, 178, 181, 182, 183, 184, 187, 194, 197, 199, 200, 202, 208, 216, 226, 227, 229, 231, 232, 233, 237, 238, 239, 241, 245, 246, 248, 249, 251, 257, 263, 264, 266, 268, 269, 270, 271, 272, 273, 275, 276, 278, 279, 281, 282, 284, 287, 289, 294, 321, 330, 346, 348, 350, 354, 356, 358, 359, 360, 362, 364, 365, 367, 386, 395, 398, 401, 404, 407, 411, 414, 417], "/home/caribou/git/sosreport/sos/plugins/cobbler.py": [15, 18, 19, 22, 24, 26, 27, 29, 38, 40, 42], "/home/caribou/git/sosreport/sos/plugins/kernelrt.py": [17, 20, 22, 24, 25, 29, 31], "/home/caribou/git/sosreport/sos/plugins/corosync.py": [71, 73, 77, 15, 16, 17, 82, 20, 22, 24, 25, 26, 79, 28, 63], "/home/caribou/git/sosreport/sos/plugins/npm.py": [16, 17, 19, 23, 26, 28, 29, 30, 34, 37, 39, 48, 87, 102, 105, 109], "/home/caribou/git/sosreport/sos/plugins/krb5.py": [17, 20, 22, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/haproxy.py": [16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/md.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/devicemapper.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/sysvipc.py": [16, 19, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/kimchi.py": [17, 20, 22, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/abrt.py": [33, 38, 17, 20, 22, 24, 25, 26, 27, 30], "/home/caribou/git/sosreport/sos/plugins/pxe.py": [15, 18, 20, 21, 22, 23, 24, 27, 29, 30, 32, 40, 42, 44], "/home/caribou/git/sosreport/sos/plugins/soundcard.py": [34, 36, 45, 15, 18, 20, 22, 23, 25, 47], "/home/caribou/git/sosreport/sos/plugins/origin.py": [17, 18, 165, 41, 42, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 57, 190, 192, 194, 67, 71, 75, 97], "/home/caribou/git/sosreport/sos/plugins/powerpath.py": [43, 16, 56, 19, 21, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/openstack_ceilometer.py": [66, 70, 79, 21, 24, 25, 26, 27, 29, 31, 43, 56, 57], "/home/caribou/git/sosreport/sos/plugins/gluster.py": [15, 16, 17, 18, 19, 20, 23, 24, 26, 27, 29, 30, 31, 33, 47, 58, 70, 81], "/home/caribou/git/sosreport/sos/plugins/jars.py": [17, 18, 19, 20, 21, 22, 23, 26, 27, 29, 30, 31, 34, 45, 48, 79, 95, 123], "/home/caribou/git/sosreport/sos/plugins/dovecot.py": [15, 18, 20, 22, 23, 25, 30, 32, 33, 36, 37, 40, 42, 43, 46], "/home/caribou/git/sosreport/sos/plugins/ssh.py": [17, 20, 22, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/gnocchi.py": [34, 36, 18, 19, 22, 23, 24, 26, 31, 63], "/home/caribou/git/sosreport/sos/plugins/openstack_sahara.py": [17, 20, 21, 22, 23, 25, 27, 42, 53, 54, 61, 64, 68, 69, 75, 78], "/home/caribou/git/sosreport/sos/plugins/ssmtp.py": [35, 16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/openstack_swift.py": [65, 69, 78, 20, 23, 24, 25, 26, 28, 30, 43, 55], "/home/caribou/git/sosreport/sos/plugins/filesys.py": [15, 18, 20, 22, 23, 56, 25, 26, 27, 29], "/home/caribou/git/sosreport/sos/plugins/libvirt.py": [71, 15, 16, 17, 20, 22, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/ctdb.py": [16, 47, 48, 19, 21, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/apport.py": [16, 19, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/system.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/openstack_cinder.py": [21, 24, 26, 27, 28, 30, 31, 33, 50, 68, 70, 78, 81, 85, 89, 91, 94, 96, 100], "/home/caribou/git/sosreport/sos/plugins/logs.py": [66, 69, 72, 15, 16, 19, 20, 22, 23, 25, 91, 93, 53], "/home/caribou/git/sosreport/sos/plugins/ovirt_hosted_engine.py": [32, 33, 35, 36, 38, 18, 21, 24, 25, 29], "/home/caribou/git/sosreport/sos/plugins/lightdm.py": [17, 20, 22, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/mysql.py": [15, 16, 19, 21, 23, 24, 25, 27, 30, 31, 32, 35, 81, 87, 90, 99, 105, 108], "/home/caribou/git/sosreport/sos/plugins/hpasm.py": [16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/policies/ibmkvm.py": [19, 21, 22, 24, 27, 28, 29, 30, 32, 36, 40, 42, 52, 53, 54, 55, 57, 61, 65, 67], "/home/caribou/git/sosreport/sos/plugins/xfs.py": [15, 16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/dmraid.py": [35, 37, 15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/landscape.py": [45, 15, 18, 20, 22, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/zfs.py": [16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/devices.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/mrgmessg.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/x11.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/sunrpc.py": [34, 39, 41, 17, 20, 22, 24, 25, 26, 28], "/home/caribou/git/sosreport/sos/plugins/samba.py": [54, 15, 18, 20, 21, 22, 23, 25, 52], "/home/caribou/git/sosreport/sos/plugins/storageconsole.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/maas.py": [17, 20, 22, 24, 25, 28, 29, 30, 31, 32, 35, 39, 47], "/home/caribou/git/sosreport/sos/plugins/veritas.py": [34, 15, 16, 19, 21, 23, 24, 29, 31], "/home/caribou/git/sosreport/sos/plugins/infiniband.py": [17, 20, 22, 24, 25, 26, 28], "/home/caribou/git/sosreport/sos/plugins/openstack_heat.py": [67, 76, 80, 18, 19, 22, 89, 24, 25, 26, 28, 30, 57], "/home/caribou/git/sosreport/sos/plugins/cups.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/saltmaster.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/ovirt.py": [19, 20, 21, 24, 28, 29, 31, 32, 41, 44, 45, 53, 57, 62, 63, 64, 65, 68, 111], "/home/caribou/git/sosreport/sos/plugins/systemtap.py": [17, 20, 22, 24, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/mpt.py": [17, 20, 22, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/multipath.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/nfs.py": [15, 18, 20, 21, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/ata.py": [15, 16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/postfix.py": [15, 18, 20, 21, 22, 24, 26, 34, 36, 37, 39, 44, 46, 48], "/home/caribou/git/sosreport/sos/plugins/postgresql.py": [136, 138, 20, 21, 23, 24, 27, 28, 30, 31, 33, 35, 37, 40, 41, 42, 43, 44, 45, 48, 83, 96, 108, 110], "/home/caribou/git/sosreport/sos/plugins/vsftpd.py": [15, 18, 20, 22, 23, 25, 26, 28], "/home/caribou/git/sosreport/sos/plugins/openstack_neutron.py": [18, 19, 22, 24, 25, 26, 28, 53, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 83, 86, 91, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 111, 114], "/home/caribou/git/sosreport/sos/plugins/opengl.py": [15, 18, 20, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/lstopo.py": [15, 16, 19, 21, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/dracut.py": [17, 20, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/collectd.py": [45, 16, 17, 20, 23, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/plugins/azure.py": [17, 20, 22, 24, 25, 26, 28], "/home/caribou/git/sosreport/sos/plugins/openstack_ironic.py": [18, 19, 22, 24, 25, 26, 28, 53, 65, 68, 69, 70, 73, 77, 80, 81, 82, 86, 87, 90], "/home/caribou/git/sosreport/sos/plugins/__init__.py": [17, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 37, 43, 45, 46, 47, 48, 49, 52, 53, 54, 55, 56, 57, 60, 61, 64, 79, 102, 104, 105, 106, 107, 108, 109, 110, 111, 113, 114, 115, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 130, 131, 134, 135, 136, 137, 139, 144, 145, 146, 148, 149, 151, 154, 157, 158, 160, 161, 163, 164, 166, 167, 168, 169, 171, 172, 174, 176, 178, 179, 181, 185, 187, 189, 223, 262, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 287, 289, 303, 306, 308, 309, 312, 314, 322, 324, 325, 327, 329, 331, 337, 338, 341, 342, 347, 348, 349, 350, 352, 353, 354, 355, 356, 357, 365, 366, 367, 368, 369, 370, 371, 373, 374, 375, 376, 378, 385, 390, 391, 392, 394, 395, 397, 398, 400, 401, 402, 403, 404, 406, 407, 408, 410, 411, 412, 415, 423, 426, 430, 432, 433, 434, 435, 438, 442, 443, 445, 446, 448, 452, 454, 455, 456, 457, 459, 461, 470, 472, 475, 476, 477, 479, 481, 482, 483, 484, 485, 487, 488, 489, 490, 492, 494, 498, 499, 500, 501, 502, 503, 505, 506, 508, 514, 515, 517, 518, 520, 521, 523, 524, 527, 528, 530, 531, 532, 533, 535, 536, 537, 539, 540, 541, 542, 543, 544, 546, 547, 549, 550, 551, 552, 553, 554, 555, 556, 558, 559, 586, 587, 594, 601, 602, 603, 616, 617, 618, 629, 642, 649, 653, 671, 673, 674, 675, 677, 678, 679, 716, 724, 730, 736, 737, 797, 798, 800, 801, 802, 803, 805, 806, 824, 825, 839, 841, 842, 843, 844, 845, 846, 848, 850, 851, 852, 857, 867, 868, 869, 871, 872, 874, 875, 876, 878, 883, 890, 895, 949, 950, 951, 954, 955, 956, 959, 960, 961, 964, 965, 966, 969, 970, 971, 974, 975, 976, 979, 980, 981, 984, 985, 986, 989, 994, 995, 997], "/home/caribou/git/sosreport/sos/plugins/ipmitool.py": [16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/saphana.py": [15, 16, 19, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/nfsserver.py": [45, 17, 18, 19, 22, 24, 26, 27, 29], "/home/caribou/git/sosreport/sos/plugins/libraries.py": [15, 18, 20, 22, 23, 26, 29], "/home/caribou/git/sosreport/sos/plugins/dlm.py": [70, 15, 16, 17, 20, 21, 23, 24, 25, 27, 30, 31, 33, 45, 60], "/home/caribou/git/sosreport/sos/plugins/general.py": [15, 18, 19, 21, 22, 24, 42, 44, 53, 58, 60], "/home/caribou/git/sosreport/sos/plugins/cron.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/openvswitch.py": [97, 99, 17, 20, 22, 23, 24, 26, 92, 94], "/home/caribou/git/sosreport/sos/plugins/rabbitmq.py": [15, 18, 20, 21, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/dnf.py": [33, 17, 20, 21, 22, 23, 25, 26, 29, 30], "/home/caribou/git/sosreport/sos/plugins/tuned.py": [17, 20, 22, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/numa.py": [16, 17, 20, 22, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/plugins/memory.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/kvm.py": [18, 19, 22, 24, 26, 27, 28, 30, 32, 35, 52], "/home/caribou/git/sosreport/sos/plugins/qpid_dispatch.py": [17, 18, 21, 23, 25, 26, 28, 29, 31, 33, 34, 36], "/home/caribou/git/sosreport/sos/plugins/firewalld.py": [17, 20, 22, 24, 25, 27, 29], "/home/caribou/git/sosreport/sos/plugins/kubernetes.py": [128, 17, 18, 21, 24, 28, 29, 32, 33, 34, 35, 36, 39, 47], "/home/caribou/git/sosreport/sos/plugins/xinetd.py": [17, 20, 22, 24, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/mrggrid.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/activemq.py": [16, 19, 21, 23, 24, 25, 26, 28, 37, 47, 49, 57, 58], "/home/caribou/git/sosreport/sos/plugins/puppet.py": [34, 15, 16, 19, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/crypto.py": [17, 20, 22, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/docker.py": [16, 19, 22, 24, 25, 26, 29, 30, 31, 32, 33, 36, 100, 102, 104, 112, 114, 117, 119], "/home/caribou/git/sosreport/sos/plugins/systemd.py": [33, 17, 20, 22, 24, 25, 27, 30], "/home/caribou/git/sosreport/sos/plugins/apparmor.py": [16, 19, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/xen.py": [15, 16, 17, 18, 21, 23, 25, 26, 28, 43, 46, 51, 62], "/home/caribou/git/sosreport/sos/plugins/sanlock.py": [35, 37, 39, 15, 18, 20, 21, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/atomichost.py": [32, 17, 18, 21, 22, 24, 26, 29], "/home/caribou/git/sosreport/sos/plugins/autofs.py": [65, 67, 17, 20, 22, 24, 25, 27, 28, 30, 42, 50, 57, 59], "/home/caribou/git/sosreport/sos/plugins/psacct.py": [15, 18, 20, 21, 22, 24, 25, 27, 30, 32, 34, 41, 43, 44, 46], "/home/caribou/git/sosreport/sos/plugins/last.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/mongodb.py": [17, 20, 22, 24, 25, 27, 28, 30, 36, 44, 46], "/home/caribou/git/sosreport/sos/plugins/auditd.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/chrony.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/openssl.py": [17, 20, 22, 24, 25, 26, 28, 44, 46, 48, 50, 55, 57, 59, 61], "/home/caribou/git/sosreport/sos/plugins/i18n.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/fcoe.py": [15, 18, 20, 22, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/anacron.py": [15, 18, 19, 21, 22, 26], "/home/caribou/git/sosreport/sos/plugins/openswan.py": [17, 20, 22, 24, 25, 26, 27, 28, 30, 31, 33], "/home/caribou/git/sosreport/sos/plugins/lvm2.py": [15, 18, 20, 22, 23, 25, 26, 27, 28, 30, 45], "/home/caribou/git/sosreport/sos/plugins/radius.py": [17, 20, 22, 24, 25, 26, 29, 31, 33, 41, 46, 48, 50], "/home/caribou/git/sosreport/sos/plugins/ntb.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/utilities.py": [15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 30, 31, 34, 36, 37, 38, 39, 42, 44, 45, 46, 47, 48, 49, 50, 52, 55, 70, 77, 78, 79, 81, 82, 83, 85, 86, 88, 89, 92, 95, 97, 98, 99, 101, 104, 107, 108, 109, 112, 113, 121, 127, 129, 131, 135, 136, 139, 140, 141, 143, 144, 145, 146, 147, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 162, 163, 165, 166, 167, 171, 176, 177, 178, 179, 180, 181, 182, 184, 187, 191, 192, 195, 199, 201, 205, 207, 209, 210, 211, 213, 214, 215, 216, 217, 218, 220, 221, 222, 223, 224, 225, 229, 232, 233, 234, 235, 237], "/home/caribou/git/sosreport/sos/plugins/iscsi.py": [16, 19, 21, 23, 24, 27, 29, 31], "/home/caribou/git/sosreport/sos/policies/debian.py": [1, 2, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 27, 31, 33], "/home/caribou/git/sosreport/sos/plugins/selinux.py": [15, 18, 20, 22, 23, 25, 26, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/targetcli.py": [17, 20, 22, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/canonical_livepatch.py": [16, 19, 21, 23, 24, 25, 27], "/home/caribou/git/sosreport/sos/plugins/lxd.py": [17, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/ipsec.py": [17, 20, 22, 24, 25, 26, 29, 31, 33, 37, 39, 41], "/home/caribou/git/sosreport/sos/plugins/hts.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/juju.py": [17, 18, 19, 22, 23, 24, 36, 37, 40, 42, 44, 45, 46, 49, 50, 51, 53, 56, 62, 79], "/home/caribou/git/sosreport/sos/plugins/openstack_glance.py": [22, 70, 78, 82, 21, 86, 25, 26, 27, 28, 30, 32, 59], "/home/caribou/git/sosreport/sos/plugins/keyutils.py": [16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/iscsitarget.py": [18, 21, 23, 25, 26, 29, 31, 33, 39, 41, 43], "/home/caribou/git/sosreport/sos/archive.py": [18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 30, 32, 34, 35, 36, 37, 40, 41, 42, 45, 46, 48, 52, 54, 56, 57, 59, 60, 62, 65, 68, 71, 72, 74, 75, 76, 82, 85, 88, 91, 94, 97, 103, 109, 118, 122, 131, 133, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 147, 148, 149, 150, 152, 153, 154, 156, 157, 159, 160, 161, 162, 163, 167, 169, 170, 173, 174, 178, 179, 180, 184, 194, 195, 197, 198, 199, 200, 201, 202, 203, 204, 205, 211, 212, 214, 215, 216, 217, 218, 219, 220, 222, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 239, 240, 242, 249, 252, 255, 260, 261, 262, 264, 265, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 288, 291, 292, 354, 355, 357, 358, 360, 361, 362, 363, 365, 366, 367, 368, 369, 372, 373, 374, 378, 379, 380, 381, 382, 383, 384, 385, 386, 390, 391, 393, 400, 401, 403, 408, 410, 413, 416, 417, 418, 420, 421, 423, 424, 425, 428, 431, 432, 433, 434, 436, 437, 438, 439, 440, 442, 443, 445, 446], "/home/caribou/git/sosreport/sos/plugins/ipvs.py": [16, 19, 21, 23, 24, 26, 28], "/home/caribou/git/sosreport/sos/plugins/openstack_instack.py": [78, 18, 19, 22, 24, 25, 26, 28, 112, 115, 116, 119], "/home/caribou/git/sosreport/sos/plugins/squid.py": [15, 18, 20, 22, 23, 26, 28, 29, 31, 40, 42, 43, 44, 46], "/home/caribou/git/sosreport/sos/plugins/logrotate.py": [15, 18, 20, 22, 23, 25], "/home/caribou/git/sosreport/sos/plugins/gfs2.py": [15, 16, 19, 20, 22, 23, 24, 27, 28, 29, 32, 33, 35, 48, 58], "/home/caribou/git/sosreport/sos/plugins/ceph.py": [32, 35, 15, 18, 20, 22, 23], "/home/caribou/git/sosreport/sos/plugins/procenv.py": [16, 19, 21, 23, 24, 26], "/home/caribou/git/sosreport/sos/plugins/vmware.py": [15, 18, 20, 22, 23, 25, 27], "/home/caribou/git/sosreport/sos/plugins/cs.py": [19, 20, 21, 24, 26, 28, 29, 34, 40, 43, 54], "/home/caribou/git/sosreport/sos/policies/redhat.py": [18, 19, 20, 22, 23, 24, 26, 27, 28, 31, 33, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 75, 80, 82, 97, 119, 124, 128, 129, 132, 133, 134, 135, 136, 155, 157, 160, 164, 167, 184, 194, 198, 199, 200, 216, 218, 220, 221, 222, 234, 236, 237, 238, 240, 243, 247, 249], "/home/caribou/git/sosreport/sos/plugins/openhpi.py": [15, 18, 20, 22, 23, 25, 31], "/home/caribou/git/sosreport/sos/plugins/ubuntu.py": [15, 18, 20, 22, 23, 26, 27, 30], "/home/caribou/git/sosreport/sos/plugins/oddjob.py": [17, 20, 22, 24, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/sendmail.py": [17, 20, 22, 24, 25, 27, 30, 32, 33, 35, 43, 45, 46, 48], "/home/caribou/git/sosreport/sos/plugins/megacli.py": [35, 18, 19, 20, 23, 25, 27, 28, 30], "/home/caribou/git/sosreport/sos/plugins/iprconfig.py": [33, 17, 18, 19, 20, 23, 25, 27, 29], "/home/caribou/git/sosreport/sos/reporting.py": [20, 22, 23, 28, 29, 32, 34, 35, 37, 41, 42, 43, 46, 47, 49, 50, 52, 53, 55, 56, 57, 58, 61, 63, 65, 66, 67, 69, 70, 72, 73, 74, 75, 78, 80, 82, 83, 84, 85, 88, 90, 92, 93, 94, 97, 99, 101, 102, 105, 107, 109, 110, 113, 115, 117, 121, 122, 124, 125, 126, 127, 130, 131, 132, 133, 134, 137, 139, 140, 142, 143, 144, 145, 146, 147, 148, 149, 154, 156, 157, 158, 159, 161, 163, 164, 165, 166, 167], "/home/caribou/git/sosreport/sos/plugins/kdump.py": [15, 18, 20, 22, 23, 25, 31, 33, 34, 36, 44, 46, 47, 49], "/home/caribou/git/sosreport/sos/plugins/udev.py": [15, 18, 20, 22, 23, 25]}}sosreport-3.5/sos/0000755000175000017500000000000013203300002014036 5ustar cariboucaribousosreport-3.5/sos/__init__.py0000644000175000017500000000216013203300002016146 0ustar cariboucaribou# Copyright 2010 Red Hat, Inc. # Author: Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ This module houses the i18n setup and message function. The default is to use gettext to internationalize messages. """ import gettext __version__ = "3.5" gettext_dir = "/usr/share/locale" gettext_app = "sos" gettext.bindtextdomain(gettext_app, gettext_dir) def _default(msg): return gettext.dgettext(gettext_app, msg) _sos = _default sosreport-3.5/sos/__pycache__/0000755000175000017500000000000013203254630016265 5ustar cariboucaribousosreport-3.5/sos/utilities.py0000644000175000017500000001750613203300002016434 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import with_statement import os import re import inspect from subprocess import Popen, PIPE, STDOUT import logging import fnmatch import errno import shlex import glob from contextlib import closing # PYCOMPAT import six from six import StringIO def tail(filename, number_of_bytes): """Returns the last number_of_bytes of filename""" with open(filename, "rb") as f: if os.stat(filename).st_size > number_of_bytes: f.seek(-number_of_bytes, 2) return f.read() def fileobj(path_or_file, mode='r'): """Returns a file-like object that can be used as a context manager""" if isinstance(path_or_file, six.string_types): try: return open(path_or_file, mode) except: log = logging.getLogger('sos') log.debug("fileobj: %s could not be opened" % path_or_file) return closing(StringIO()) else: return closing(path_or_file) def convert_bytes(bytes_, K=1 << 10, M=1 << 20, G=1 << 30, T=1 << 40): """Converts a number of bytes to a shorter, more human friendly format""" fn = float(bytes_) if bytes_ >= T: return '%.1fT' % (fn / T) elif bytes_ >= G: return '%.1fG' % (fn / G) elif bytes_ >= M: return '%.1fM' % (fn / M) elif bytes_ >= K: return '%.1fK' % (fn / K) else: return '%d' % bytes_ def find(file_pattern, top_dir, max_depth=None, path_pattern=None): """Generator function to find files recursively. Usage:: for filename in find("*.properties", "/var/log/foobar"): print filename """ if max_depth: base_depth = os.path.dirname(top_dir).count(os.path.sep) max_depth += base_depth for path, dirlist, filelist in os.walk(top_dir): if max_depth and path.count(os.path.sep) >= max_depth: del dirlist[:] if path_pattern and not fnmatch.fnmatch(path, path_pattern): continue for name in fnmatch.filter(filelist, file_pattern): yield os.path.join(path, name) def grep(pattern, *files_or_paths): """Returns lines matched in fnames, where fnames can either be pathnames to files to grep through or open file objects to grep through line by line""" matches = [] for fop in files_or_paths: with fileobj(fop) as fo: matches.extend((line for line in fo if re.match(pattern, line))) return matches def is_executable(command): """Returns if a command matches an executable on the PATH""" paths = os.environ.get("PATH", "").split(os.path.pathsep) candidates = [command] + [os.path.join(p, command) for p in paths] return any(os.access(path, os.X_OK) for path in candidates) def sos_get_command_output(command, timeout=300, stderr=False, chroot=None, chdir=None, env=None): """Execute a command and return a dictionary of status and output, optionally changing root or current working directory before executing command. """ # Change root or cwd for child only. Exceptions in the prexec_fn # closure are caught in the parent (chroot and chdir are bound from # the enclosing scope). def _child_prep_fn(): if (chroot): os.chroot(chroot) if (chdir): os.chdir(chdir) cmd_env = os.environ # ensure consistent locale for collected command output cmd_env['LC_ALL'] = 'C' # optionally add an environment change for the command if env: for key, value in env.items(): cmd_env[key] = value # use /usr/bin/timeout to implement a timeout if timeout and is_executable("timeout"): command = "timeout %ds %s" % (timeout, command) # shlex.split() reacts badly to unicode on older python runtimes. if not six.PY3: command = command.encode('utf-8', 'ignore') args = shlex.split(command) # Expand arguments that are wildcard paths. expanded_args = [] for arg in args: expanded_arg = glob.glob(arg) if expanded_arg: expanded_args.extend(expanded_arg) else: expanded_args.append(arg) try: p = Popen(expanded_args, shell=False, stdout=PIPE, stderr=STDOUT if stderr else PIPE, bufsize=-1, env=cmd_env, close_fds=True, preexec_fn=_child_prep_fn) stdout, stderr = p.communicate() except OSError as e: if e.errno == errno.ENOENT: return {'status': 127, 'output': ""} else: raise e if p.returncode == 126 or p.returncode == 127: stdout = six.binary_type(b"") return { 'status': p.returncode, 'output': stdout.decode('utf-8', 'ignore') } def import_module(module_fqname, superclasses=None): """Imports the module module_fqname and returns a list of defined classes from that module. If superclasses is defined then the classes returned will be subclasses of the specified superclass or superclasses. If superclasses is plural it must be a tuple of classes.""" module_name = module_fqname.rpartition(".")[-1] module = __import__(module_fqname, globals(), locals(), [module_name]) modules = [class_ for cname, class_ in inspect.getmembers(module, inspect.isclass) if class_.__module__ == module_fqname] if superclasses: modules = [m for m in modules if issubclass(m, superclasses)] return modules def shell_out(cmd, timeout=30, chroot=None, runat=None): """Shell out to an external command and return the output or the empty string in case of error. """ return sos_get_command_output(cmd, timeout=timeout, chroot=chroot, chdir=runat)['output'] class ImporterHelper(object): """Provides a list of modules that can be imported in a package. Importable modules are located along the module __path__ list and modules are files that end in .py. """ def __init__(self, package): """package is a package module import my.package.module helper = ImporterHelper(my.package.module)""" self.package = package def _plugin_name(self, path): "Returns the plugin module name given the path" base = os.path.basename(path) name, ext = os.path.splitext(base) return name def _get_plugins_from_list(self, list_): plugins = [self._plugin_name(plugin) for plugin in list_ if "__init__" not in plugin and plugin.endswith(".py")] plugins.sort() return plugins def _find_plugins_in_dir(self, path): if os.path.exists(path): py_files = list(find("*.py", path)) pnames = self._get_plugins_from_list(py_files) if pnames: return pnames else: return [] def get_modules(self): """Returns the list of importable modules in the configured python package. """ plugins = [] for path in self.package.__path__: if os.path.isdir(path) or path == '': plugins.extend(self._find_plugins_in_dir(path)) return plugins # vim: set et ts=4 sw=4 : sosreport-3.5/sos/reporting.py0000644000175000017500000001130313203300002016417 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., # Bryn M. Reeves # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ This provides a restricted tag language to define the sosreport index/report """ try: import json except ImportError: import simplejson as json # PYCOMPAT from six import iteritems import six class Node(object): def __str__(self): return json.dumps(self.data) def can_add(self, node): return False class Leaf(Node): """Marker class that can be added to a Section node""" pass class Report(Node): """The root element of a report. This is a container for sections.""" def __init__(self): self.data = {} def can_add(self, node): return isinstance(node, Section) def add(self, *nodes): for node in nodes: if self.can_add(node): self.data[node.name] = node.data class Section(Node): """A section is a container for leaf elements. Sections may be nested inside of Report objects only.""" def __init__(self, name): self.name = name self.data = {} def can_add(self, node): return isinstance(node, Leaf) def add(self, *nodes): for node in nodes: if self.can_add(node): self.data.setdefault(node.ADDS_TO, []).append(node.data) class Command(Leaf): ADDS_TO = "commands" def __init__(self, name, return_code, href): self.data = {"name": name, "return_code": return_code, "href": href} class CopiedFile(Leaf): ADDS_TO = "copied_files" def __init__(self, name, href): self.data = {"name": name, "href": href} class CreatedFile(Leaf): ADDS_TO = "created_files" def __init__(self, name): self.data = {"name": name} class Alert(Leaf): ADDS_TO = "alerts" def __init__(self, content): self.data = content class Note(Leaf): ADDS_TO = "notes" def __init__(self, content): self.data = content def ends_bs(string): """ Return True if 'string' ends with a backslash, and False otherwise. Define this as a named function for no other reason than that pep8 now forbids binding of a lambda expression to a name: 'E731 do not assign a lambda expression, use a def' """ return string.endswith('\\') class PlainTextReport(object): """Will generate a plain text report from a top_level Report object""" LEAF = " * %(name)s" ALERT = " ! %s" NOTE = " * %s" DIVIDER = "=" * 72 subsections = ( (Command, LEAF, "- commands executed:"), (CopiedFile, LEAF, "- files copied:"), (CreatedFile, LEAF, "- files created:"), (Alert, ALERT, "- alerts:"), (Note, NOTE, "- notes:"), ) line_buf = [] def __init__(self, report_node): self.report_node = report_node def unicode(self): self.line_buf = line_buf = [] for section_name, section_contents in sorted(iteritems( self.report_node.data)): line_buf.append(section_name + "\n" + self.DIVIDER) for type_, format_, header in self.subsections: self.process_subsection(section_contents, type_.ADDS_TO, header, format_) # Workaround python.six mishandling of strings ending in '/' by # adding a single space following any '\' at end-of-line. # See Six issue #60. line_buf = [line + " " if ends_bs(line) else line for line in line_buf] output = u'\n'.join(map(lambda i: (i if isinstance(i, six.text_type) else six.u(i)), line_buf)) if six.PY3: return output else: return output.encode('utf8') def process_subsection(self, section, key, header, format_): if key in section: self.line_buf.append(header) for item in section.get(key): self.line_buf.append(format_ % item) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/0000755000175000017500000000000013203300044015525 5ustar cariboucaribousosreport-3.5/sos/plugins/dracut.py0000644000175000017500000000230313203300002017351 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Dracut(Plugin, RedHatPlugin): """ Dracut initramfs generator """ plugin_name = "dracut" packages = ("dracut",) def setup(self): self.add_copy_spec([ "/etc/dracut.conf", "/etc/dracut.conf.d" ]) self.add_cmd_output([ "dracut --list-modules", "dracut --print-cmdline" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/teamd.py0000644000175000017500000000363713203300002017174 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Teamd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Network interface teaming """ plugin_name = 'teamd' profiles = ('network', 'hardware', ) packages = ('teamd',) def _get_team_interfaces(self): teams = [] ip_result = self.get_command_output("ip -o link") if ip_result['status'] != 0: return teams for line in ip_result['output'].splitlines(): fields = line.split() if fields[1][0:4] == 'team': teams.append(fields[1][:-1]) return teams def setup(self): self.add_copy_spec([ "/etc/dbus-1/system.d/teamd.conf", "/usr/lib/systemd/system/teamd@.service" ]) teams = self._get_team_interfaces() for team in teams: self.add_cmd_output([ "teamdctl %s state" % team, "teamdctl %s state dump" % team, "teamdctl %s config dump" % team, "teamnl %s option" % team, "teamnl %s ports" % team ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/anaconda.py0000644000175000017500000000332713203300002017642 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os class Anaconda(Plugin, RedHatPlugin): """Anaconda installer """ plugin_name = 'anaconda' profiles = ('system',) packages = ('anaconda',) files = ( '/var/log/anaconda.log', '/var/log/anaconda' ) def setup(self): paths = [ "/root/anaconda-ks.cfg" ] if os.path.isdir('/var/log/anaconda'): # new anaconda paths.append('/var/log/anaconda') else: paths = paths + [ "/var/log/anaconda.*", "/root/install.log", "/root/install.log.syslog" ] self.add_copy_spec(paths) def postproc(self): self.do_file_sub( "/root/anaconda-ks.cfg", r"(\s*rootpw\s*).*", r"\1********" ) self.do_file_sub( "/root/anaconda-ks.cfg", r"(user.*--password=*\s*)\s*(\S*)", r"\1********" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/omsa.py0000644000175000017500000000416413203300002017035 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class omsa(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): '''Dell OpenManage Server Administrator (OMSA) ''' plugin_name = 'omsa' profiles = ('hardware', 'debug') files = ('/opt/dell/srvadmin/bin/omreport',) packages = ('srvadmin-omacore',) omreport = '/opt/dell/srvadmin/bin/omreport' def setup(self): self.add_copy_spec([ "/var/log/dell/updatepackage/log/support", "/opt/dell/srvadmin/var/log/openmanage/Inventory.xml*", "/opt/dell/srvadmin/etc/omreg.cfg", "/opt/dell/srvadmin/etc/openmanage/oma/ini", "/opt/dell/srvadmin/etc/srvadmin-deng/ini", "/opt/dell/srvadmin/etc/srvadmin-isvc/ini/d*ini", ]) self.add_cmd_output([ "{0} system alertaction".format(self.omreport), "{0} system alertlog".format(self.omreport), "{0} system cmdlog".format(self.omreport), "{0} system pedestinations".format(self.omreport), "{0} system platformevents".format(self.omreport), "{0} system summary".format(self.omreport), "{0} system events".format(self.omreport), "{0} chassis info".format(self.omreport), "{0} chassis biossetup".format(self.omreport), "{0} storage controller".format(self.omreport), ], timeout=30) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/veritas.py0000644000175000017500000000321513203300002017547 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os class Veritas(Plugin, RedHatPlugin): """Veritas software """ plugin_name = 'veritas' profiles = ('cluster', 'storage') # Information about VRTSexplorer obtained from # http://seer.entsupport.symantec.com/docs/243150.htm option_list = [("script", "Define VRTSexplorer script path", "", "/opt/VRTSspt/VRTSexplorer")] def check_enabled(self): return os.path.isfile(self.get_option("script")) def setup(self): """ interface with vrtsexplorer to capture veritas related data """ r = self.call_ext_prog(self.get_option("script")) if r['status'] == 0: tarfile = "" for line in r['output']: line = line.strip() tarfile = self.do_regex_find_all(r"ftp (.*tar.gz)", line) if len(tarfile) == 1: self.add_copy_spec(tarfile[0]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_ceilometer.py0000644000175000017500000000651013203300002022272 0ustar cariboucaribou# Copyright (C) 2013 Red Hat, Inc., Eoghan Lynn # Copyright (C) 2012 Rackspace US, Inc. # 2012 Justin Shepherd # Copyright (C) 2009 Red Hat, Inc. # 2009 Joey Boggs # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenStackCeilometer(Plugin): """Openstack Ceilometer""" plugin_name = "openstack_ceilometer" profiles = ('openstack', 'openstack_controller', 'openstack_compute') option_list = [] var_puppet_gen = "/var/lib/config-data/puppet-generated/ceilometer" def setup(self): # Ceilometer self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/ceilometer/*", "/var/log/containers/ceilometer/*" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/ceilometer/*.log", "/var/log/containers/ceilometer/*.log" ], sizelimit=self.limit) self.add_copy_spec([ "/etc/ceilometer/*", self.var_puppet_gen + "/etc/ceilometer/*" ]) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) def postproc(self): protect_keys = [ "admin_password", "connection_password", "host_password", "memcache_secret_key", "os_password", "password", "qpid_password", "rabbit_password", "readonly_user_password", "secret_key", "ssl_key_password", "telemetry_secret", "connection", "metering_secret" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/ceilometer/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/ceilometer/*", regexp, r"\1*********" ) class DebianCeilometer(OpenStackCeilometer, DebianPlugin, UbuntuPlugin): packages = ( 'ceilometer-api', 'ceilometer-agent-central', 'ceilometer-agent-compute', 'ceilometer-collector', 'ceilometer-common', 'python-ceilometer', 'python-ceilometerclient' ) class RedHatCeilometer(OpenStackCeilometer, RedHatPlugin): packages = ( 'openstack-ceilometer', 'openstack-ceilometer-api', 'openstack-ceilometer-central', 'openstack-ceilometer-collector', 'openstack-ceilometer-common', 'openstack-ceilometer-compute', 'python-ceilometerclient' ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ipmitool.py0000644000175000017500000000305113203300002017724 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin class IpmiTool(Plugin, RedHatPlugin, DebianPlugin): """IpmiTool hardware information. """ plugin_name = 'ipmitool' profiles = ('hardware', 'system', ) packages = ('ipmitool',) def setup(self): result = self.get_command_output("ipmitool -I usb mc info") have_usbintf = result['status'] if not have_usbintf: cmd = "ipmitool -I usb" else: cmd = "ipmitool" self.add_cmd_output([ "%s sel info" % cmd, "%s sel list" % cmd, "%s sensor list" % cmd, "%s chassis status" % cmd, "%s fru print" % cmd, "%s mc info" % cmd, "%s sdr info" % cmd ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/__init__.py0000644000175000017500000012535013203300002017636 0ustar cariboucaribou# Copyright (C) 2006 Steve Conklin # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ This exports methods available for use by plugins for sos """ from __future__ import with_statement from sos.utilities import (sos_get_command_output, import_module, grep, fileobj, tail, is_executable) import os import glob import re import stat from time import time import logging import fnmatch import errno # PYCOMPAT import six from six.moves import zip, filter def _to_u(s): if not isinstance(s, six.text_type): # Workaround python.six mishandling of strings ending in '\' by # adding a single space following any '\' at end-of-line. # See Six issue #60. if s.endswith('\\'): s += " " s = six.u(s) return s def regex_findall(regex, fname): '''Return a list of all non overlapping matches in the string(s)''' try: with fileobj(fname) as f: return re.findall(regex, f.read(), re.MULTILINE) except AttributeError: return [] def _mangle_command(command, name_max): mangledname = re.sub(r"^/(usr/|)(bin|sbin)/", "", command) mangledname = re.sub(r"[^\w\-\.\/]+", "_", mangledname) mangledname = re.sub(r"/", ".", mangledname).strip(" ._-") mangledname = mangledname[0:name_max] return mangledname def _path_in_path_list(path, path_list): return any(p in path for p in path_list) def _node_type(st): """ return a string indicating the type of special node represented by the stat buffer st (block, character, fifo, socket). """ _types = [ (stat.S_ISBLK, "block device"), (stat.S_ISCHR, "character device"), (stat.S_ISFIFO, "named pipe"), (stat.S_ISSOCK, "socket") ] for t in _types: if t[0](st.st_mode): return t[1] def _file_is_compressed(path): """Check if a file appears to be compressed Return True if the file specified by path appears to be compressed, or False otherwise by testing the file name extension against a list of known file compression extentions. """ return path.endswith(('.gz', '.xz', '.bz', '.bz2')) class Plugin(object): """ This is the base class for sosreport plugins. Plugins should subclass this and set the class variables where applicable. plugin_name is a string returned by plugin.name(). If this is set to None (the default) class\_.__name__.tolower() will be returned. Be sure to set this if you are defining multiple plugins that do the same thing on different platforms. requires_root is a boolean that specifies whether or not sosreport should execute this plugin as a super user. version is a string representing the version of the plugin. This can be useful for post-collection tooling. packages (files) is an iterable of the names of packages (the paths of files) to check for before running this plugin. If any of these packages or files is found on the system, the default implementation of check_enabled will return True. profiles is an iterable of profile names that this plugin belongs to. Whenever any of the profiles is selected on the command line the plugin will be enabled (subject to normal check_enabled tests). """ plugin_name = None requires_root = True version = 'unversioned' packages = () files = () commands = () archive = None profiles = () sysroot = '/' def __init__(self, commons): if not getattr(self, "option_list", False): self.option_list = [] self.copied_files = [] self.executed_commands = [] self.alerts = [] self.custom_text = "" self.opt_names = [] self.opt_parms = [] self.commons = commons self.forbidden_paths = [] self.copy_paths = set() self.copy_strings = [] self.collect_cmds = [] self.sysroot = commons['sysroot'] self.soslog = self.commons['soslog'] if 'soslog' in self.commons \ else logging.getLogger('sos') # get the option list into a dictionary for opt in self.option_list: self.opt_names.append(opt[0]) self.opt_parms.append({'desc': opt[1], 'speed': opt[2], 'enabled': opt[3]}) @classmethod def name(cls): """Returns the plugin's name as a string. This should return a lowercase string. """ if cls.plugin_name: return cls.plugin_name return cls.__name__.lower() def _format_msg(self, msg): return "[plugin:%s] %s" % (self.name(), msg) def _log_error(self, msg): self.soslog.error(self._format_msg(msg)) def _log_warn(self, msg): self.soslog.warning(self._format_msg(msg)) def _log_info(self, msg): self.soslog.info(self._format_msg(msg)) def _log_debug(self, msg): self.soslog.debug(self._format_msg(msg)) def policy(self): return self.commons["policy"] def join_sysroot(self, path): if path[0] == os.sep: path = path[1:] return os.path.join(self.sysroot, path) def strip_sysroot(self, path): if not self.use_sysroot(): return path if path.startswith(self.sysroot): return path[len(self.sysroot):] return path def use_sysroot(self): return self.sysroot != os.path.abspath(os.sep) def tmp_in_sysroot(self): paths = [self.sysroot, self.archive.get_tmp_dir()] return os.path.commonprefix(paths) == self.sysroot def is_installed(self, package_name): '''Is the package $package_name installed?''' return self.policy().pkg_by_name(package_name) is not None def do_cmd_private_sub(self, cmd): '''Remove certificate and key output archived by sosreport. cmd is the command name from which output is collected (i.e. exlcuding parameters). Any matching instances are replaced with: '-----SCRUBBED' and this function does not take a regexp or substituting string. This function returns the number of replacements made. ''' globstr = '*' + cmd + '*' self._log_debug("Scrubbing certs and keys for commands matching %s" % (cmd)) if not self.executed_commands: return 0 replacements = None try: for called in self.executed_commands: if called['file'] is None: continue if fnmatch.fnmatch(called['exe'], globstr): path = os.path.join(self.commons['cmddir'], called['file']) readable = self.archive.open_file(path) certmatch = re.compile("-----BEGIN.*?-----END", re.DOTALL) result, replacements = certmatch.subn( "-----SCRUBBED", readable.read()) if replacements: self.archive.add_string(result, path) except Exception as e: msg = "Certificate/key scrubbing failed for '%s' with: '%s'" self._log_error(msg % (called['exe'], e)) replacements = None return replacements def do_cmd_output_sub(self, cmd, regexp, subst): '''Apply a regexp substitution to command output archived by sosreport. cmd is the command name from which output is collected (i.e. excluding parameters). The regexp can be a string or a compiled re object. The substitution string, subst, is a string that replaces each occurrence of regexp in each file collected from cmd. Internally 'cmd' is treated as a glob with a leading and trailing '*' and each matching file from the current module's command list is subjected to the replacement. This function returns the number of replacements made. ''' globstr = '*' + cmd + '*' self._log_debug("substituting '%s' for '%s' in commands matching '%s'" % (subst, regexp, globstr)) if not self.executed_commands: return 0 replacements = None try: for called in self.executed_commands: # was anything collected? if called['file'] is None: continue if fnmatch.fnmatch(called['exe'], globstr): path = os.path.join(self.commons['cmddir'], called['file']) self._log_debug("applying substitution to '%s'" % path) readable = self.archive.open_file(path) result, replacements = re.subn( regexp, subst, readable.read()) if replacements: self.archive.add_string(result, path) except Exception as e: msg = "regex substitution failed for '%s' with: '%s'" self._log_error(msg % (called['exe'], e)) replacements = None return replacements def do_file_sub(self, srcpath, regexp, subst): '''Apply a regexp substitution to a file archived by sosreport. srcpath is the path in the archive where the file can be found. regexp can be a regexp string or a compiled re object. subst is a string to replace each occurance of regexp in the content of srcpath. This function returns the number of replacements made. ''' try: path = self._get_dest_for_srcpath(srcpath) self._log_debug("substituting scrpath '%s'" % srcpath) self._log_debug("substituting '%s' for '%s' in '%s'" % (subst, regexp, path)) if not path: return 0 readable = self.archive.open_file(path) result, replacements = re.subn(regexp, subst, readable.read()) if replacements: self.archive.add_string(result, srcpath) else: replacements = 0 except Exception as e: msg = "regex substitution failed for '%s' with: '%s'" self._log_error(msg % (path, e)) replacements = 0 return replacements def do_path_regex_sub(self, pathexp, regexp, subst): '''Apply a regexp substituation to a set of files archived by sos. The set of files to be substituted is generated by matching collected file pathnames against pathexp which may be a regular expression string or compiled re object. The portion of the file to be replaced is specified via regexp and the replacement string is passed in subst.''' if not hasattr(pathexp, "match"): pathexp = re.compile(pathexp) match = pathexp.match file_list = [f for f in self.copied_files if match(f['srcpath'])] for file in file_list: self.do_file_sub(file['srcpath'], regexp, subst) def do_regex_find_all(self, regex, fname): return regex_findall(regex, fname) def _copy_symlink(self, srcpath): # the target stored in the original symlink linkdest = os.readlink(srcpath) dest = os.path.join(os.path.dirname(srcpath), linkdest) # Absolute path to the link target. If SYSROOT != '/' this path # is relative to the host root file system. absdest = os.path.normpath(dest) # adjust the target used inside the report to always be relative if os.path.isabs(linkdest): reldest = os.path.relpath(linkdest, os.path.dirname(srcpath)) # trim leading /sysroot if self.use_sysroot(): reldest = reldest[len(os.sep + os.pardir):] self._log_debug("made link target '%s' relative as '%s'" % (linkdest, reldest)) else: reldest = linkdest self._log_debug("copying link '%s' pointing to '%s' with isdir=%s" % (srcpath, linkdest, os.path.isdir(absdest))) dstpath = self.strip_sysroot(srcpath) # use the relative target path in the tarball self.archive.add_link(reldest, dstpath) if os.path.isdir(absdest): self._log_debug("link '%s' is a directory, skipping..." % linkdest) return # copy the symlink target translating relative targets # to absolute paths to pass to _do_copy_path. self._log_debug("normalized link target '%s' as '%s'" % (linkdest, absdest)) # skip recursive copying of symlink pointing to itself. if (absdest != srcpath): self._do_copy_path(self.strip_sysroot(absdest)) else: self._log_debug("link '%s' points to itself, skipping target..." % linkdest) self.copied_files.append({'srcpath': srcpath, 'dstpath': dstpath, 'symlink': "yes", 'pointsto': linkdest}) def _copy_dir(self, srcpath): try: for afile in os.listdir(srcpath): self._log_debug("recursively adding '%s' from '%s'" % (afile, srcpath)) self._do_copy_path(os.path.join(srcpath, afile), dest=None) except OSError as e: if e.errno == errno.ELOOP: msg = "Too many levels of symbolic links copying" self._log_error("_copy_dir: %s '%s'" % (msg, srcpath)) return raise e def _get_dest_for_srcpath(self, srcpath): if self.use_sysroot(): srcpath = self.join_sysroot(srcpath) for copied in self.copied_files: if srcpath == copied["srcpath"]: return copied["dstpath"] return None def _is_forbidden_path(self, path): if self.use_sysroot(): path = self.join_sysroot(path) return _path_in_path_list(path, self.forbidden_paths) def _copy_node(self, path, st): dev_maj = os.major(st.st_rdev) dev_min = os.minor(st.st_rdev) mode = st.st_mode self.archive.add_node(path, mode, os.makedev(dev_maj, dev_min)) # Methods for copying files and shelling out def _do_copy_path(self, srcpath, dest=None): '''Copy file or directory to the destination tree. If a directory, then everything below it is recursively copied. A list of copied files are saved for use later in preparing a report. ''' if self._is_forbidden_path(srcpath): self._log_debug("skipping forbidden path '%s'" % srcpath) return '' if not dest: dest = srcpath if self.use_sysroot(): dest = self.strip_sysroot(dest) try: st = os.lstat(srcpath) except (OSError, IOError): self._log_info("failed to stat '%s'" % srcpath) return if stat.S_ISLNK(st.st_mode): self._copy_symlink(srcpath) return else: if stat.S_ISDIR(st.st_mode): self._copy_dir(srcpath) return # handle special nodes (block, char, fifo, socket) if not (stat.S_ISREG(st.st_mode) or stat.S_ISDIR(st.st_mode)): ntype = _node_type(st) self._log_debug("creating %s node at archive:'%s'" % (ntype, dest)) self._copy_node(srcpath, st) return # if we get here, it's definitely a regular file (not a symlink or dir) self._log_debug("copying path '%s' to archive:'%s'" % (srcpath, dest)) # if not readable(srcpath) if not st.st_mode & 0o444: # FIXME: reflect permissions in archive self.archive.add_string("", dest) else: self.archive.add_file(srcpath, dest) self.copied_files.append({ 'srcpath': srcpath, 'dstpath': dest, 'symlink': "no" }) def add_forbidden_path(self, forbidden): """Specify a path to not copy, even if it's part of a copy_specs[] entry. """ if self.use_sysroot(): forbidden = self.join_sysroot(forbidden) # Glob case handling is such that a valid non-glob is a reduced glob for path in glob.glob(forbidden): self.forbidden_paths.append(path) def get_all_options(self): """return a list of all options selected""" return (self.opt_names, self.opt_parms) def set_option(self, optionname, value): '''set the named option to value.''' for name, parms in zip(self.opt_names, self.opt_parms): if name == optionname: parms['enabled'] = value return True else: return False def get_option(self, optionname, default=0): """Returns the first value that matches 'optionname' in parameters passed in via the command line or set via set_option or via the global_plugin_options dictionary, in that order. optionaname may be iterable, in which case the first option that matches any of the option names is returned. """ global_options = ('verify', 'all_logs', 'log_size') if optionname in global_options: return getattr(self.commons['cmdlineopts'], optionname) def _check(key): if hasattr(optionname, "__iter__"): return key in optionname else: return key == optionname for name, parms in zip(self.opt_names, self.opt_parms): if _check(name): val = parms['enabled'] if val is not None: return val items = six.iteritems(self.commons.get('global_plugin_options', {})) for key, value in items: if _check(key): return value return default def get_option_as_list(self, optionname, delimiter=",", default=None): '''Will try to return the option as a list separated by the delimiter. ''' option = self.get_option(optionname) try: opt_list = [opt.strip() for opt in option.split(delimiter)] return list(filter(None, opt_list)) except Exception: return default def _add_copy_paths(self, copy_paths): self.copy_paths.update(copy_paths) def add_copy_spec(self, copyspecs, sizelimit=None, tailit=True): """Add a file or glob but limit it to sizelimit megabytes. If fname is a single file the file will be tailed to meet sizelimit. If the first file in a glob is too large it will be tailed to meet the sizelimit. """ if self.get_option('all_logs'): sizelimit = None if sizelimit: sizelimit *= 1024 * 1024 # in MB if not copyspecs: return False if isinstance(copyspecs, six.string_types): copyspecs = [copyspecs] for copyspec in copyspecs: if not (copyspec and len(copyspec)): return False if self.use_sysroot(): copyspec = self.join_sysroot(copyspec) files = self._expand_copy_spec(copyspec) if len(files) == 0: continue # Files hould be sorted in most-recently-modified order, so that # we collect the newest data first before reaching the limit. def getmtime(path): try: return os.path.getmtime(path) except (OSError, FileNotFoundError): return 0 files.sort(key=getmtime, reverse=True) current_size = 0 limit_reached = False _file = None for _file in files: try: current_size += os.stat(_file)[stat.ST_SIZE] except (OSError, FileNotFoundError): self._log_info("failed to stat '%s'" % _file) if sizelimit and current_size > sizelimit: limit_reached = True break self._add_copy_paths([_file]) if limit_reached and tailit and not _file_is_compressed(_file): file_name = _file if file_name[0] == os.sep: file_name = file_name.lstrip(os.sep) strfile = file_name.replace(os.path.sep, ".") + ".tailed" self.add_string_as_file(tail(_file, sizelimit), strfile) rel_path = os.path.relpath('/', os.path.dirname(_file)) link_path = os.path.join(rel_path, 'sos_strings', self.name(), strfile) self.archive.add_link(link_path, _file) def get_command_output(self, prog, timeout=300, stderr=True, chroot=True, runat=None, env=None): if chroot or self.commons['cmdlineopts'].chroot == 'always': root = self.sysroot else: root = None result = sos_get_command_output(prog, timeout=timeout, stderr=stderr, chroot=root, chdir=runat, env=env) if result['status'] == 124: self._log_warn("command '%s' timed out after %ds" % (prog, timeout)) # command not found or not runnable if result['status'] == 126 or result['status'] == 127: # automatically retry chroot'ed commands in the host namespace if root and root != '/': if self.commons['cmdlineopts'].chroot != 'always': self._log_info("command '%s' not found in %s - " "re-trying in host root" % (prog.split()[0], root)) return self.get_command_output(prog, timeout=timeout, chroot=False, runat=runat, env=env) self._log_debug("could not run '%s': command not found" % prog) return result def call_ext_prog(self, prog, timeout=300, stderr=True, chroot=True, runat=None): """Execute a command independantly of the output gathering part of sosreport. """ return self.get_command_output(prog, timeout=timeout, stderr=stderr, chroot=chroot, runat=runat) def check_ext_prog(self, prog): """Execute a command independently of the output gathering part of sosreport and check the return code. Return True for a return code of 0 and False otherwise. """ return self.call_ext_prog(prog)['status'] == 0 def _add_cmd_output(self, cmd, suggest_filename=None, root_symlink=None, timeout=300, stderr=True, chroot=True, runat=None, env=None): """Internal helper to add a single command to the collection list.""" cmdt = ( cmd, suggest_filename, root_symlink, timeout, stderr, chroot, runat, env ) _tuplefmt = "('%s', '%s', '%s', %s, '%s', '%s', '%s', '%s')" _logstr = "packed command tuple: " + _tuplefmt self._log_debug(_logstr % cmdt) self.collect_cmds.append(cmdt) self._log_info("added cmd output '%s'" % cmd) def add_cmd_output(self, cmds, suggest_filename=None, root_symlink=None, timeout=300, stderr=True, chroot=True, runat=None, env=None): """Run a program or a list of programs and collect the output""" if isinstance(cmds, six.string_types): cmds = [cmds] if len(cmds) > 1 and (suggest_filename or root_symlink): self._log_warn("ambiguous filename or symlink for command list") for cmd in cmds: self._add_cmd_output(cmd, suggest_filename, root_symlink, timeout, stderr, chroot, runat, env) def get_cmd_output_path(self, name=None, make=True): """Return a path into which this module should store collected command output """ cmd_output_path = os.path.join(self.archive.get_tmp_dir(), 'sos_commands', self.name()) if name: cmd_output_path = os.path.join(cmd_output_path, name) if make: os.makedirs(cmd_output_path) return cmd_output_path def file_grep(self, regexp, *fnames): """Returns lines matched in fnames, where fnames can either be pathnames to files to grep through or open file objects to grep through line by line. """ return grep(regexp, *fnames) def _mangle_command(self, exe): name_max = self.archive.name_max() return _mangle_command(exe, name_max) def _make_command_filename(self, exe): """The internal function to build up a filename based on a command.""" outfn = os.path.join(self.commons['cmddir'], self.name(), self._mangle_command(exe)) # check for collisions if os.path.exists(outfn): inc = 2 while True: newfn = "%s_%d" % (outfn, inc) if not os.path.exists(newfn): outfn = newfn break inc += 1 return outfn def add_string_as_file(self, content, filename): """Add a string to the archive as a file named `filename`""" self.copy_strings.append((content, filename)) if isinstance(content, six.string_types): content = "..." + content.splitlines()[0] else: content = ("..." + (content.splitlines()[0]).decode('utf8', 'ignore')) self._log_debug("added string '%s' as '%s'" % (content, filename)) def get_cmd_output_now(self, exe, suggest_filename=None, root_symlink=False, timeout=300, stderr=True, chroot=True, runat=None, env=None): """Execute a command and save the output to a file for inclusion in the report. """ start = time() result = self.get_command_output(exe, timeout=timeout, stderr=stderr, chroot=chroot, runat=runat, env=env) self._log_debug("collected output of '%s' in %s" % (exe.split()[0], time() - start)) if suggest_filename: outfn = self._make_command_filename(suggest_filename) else: outfn = self._make_command_filename(exe) outfn_strip = outfn[len(self.commons['cmddir'])+1:] self.archive.add_string(result['output'], outfn) if root_symlink: self.archive.add_link(outfn, root_symlink) # save info for later # save in our list self.executed_commands.append({'exe': exe, 'file': outfn_strip}) self.commons['xmlreport'].add_command(cmdline=exe, exitcode=result['status'], f_stdout=outfn_strip) return os.path.join(self.archive.get_archive_path(), outfn) def is_module_loaded(self, module_name): """Return whether specified moudle as module_name is loaded or not""" if len(grep("^" + module_name + " ", "/proc/modules")) == 0: return None else: return True # For adding output def add_alert(self, alertstring): """Add an alert to the collection of alerts for this plugin. These will be displayed in the report """ self.alerts.append(alertstring) def add_custom_text(self, text): """Append text to the custom text that is included in the report. This is freeform and can include html. """ self.custom_text += text def add_journal(self, units=None, boot=None, since=None, until=None, lines=None, allfields=False, output=None, timeout=None): """ Collect journald logs from one of more units. Keyword arguments: units -- A string, or list of strings specifying the systemd units for which journal entries will be collected. boot -- A string selecting a boot index using the journalctl syntax. The special values 'this' and 'last' are also accepted. since -- A string representation of the start time for journal messages. until -- A string representation of the end time for journal messages. lines -- The maximum number of lines to be collected. allfields -- Include all journal fields regardless of size or non-printable characters. output -- A journalctl output control string, for example "verbose". timeout -- An optional timeout in seconds. """ journal_cmd = "journalctl --no-pager " unit_opt = " --unit %s" boot_opt = " --boot %s" since_opt = " --since %s" until_opt = " --until %s" lines_opt = " --lines %s" output_opt = " --output %s" if isinstance(units, six.string_types): units = [units] if units: for unit in units: journal_cmd += unit_opt % unit if allfields: journal_cmd += " --all" if boot: if boot == "this": boot = "" if boot == "last": boot = "-1" journal_cmd += boot_opt % boot if since: journal_cmd += since_opt % since if until: journal_cmd += until_opt % until if lines: journal_cmd += lines_opt % lines if output: journal_cmd += output_opt % output self._log_debug("collecting journal: %s" % journal_cmd) self._add_cmd_output(journal_cmd, None, None, timeout) def _expand_copy_spec(self, copyspec): return glob.glob(copyspec) def _collect_copy_specs(self): for path in self.copy_paths: self._log_info("collecting path '%s'" % path) self._do_copy_path(path) def _collect_cmd_output(self): for progs in zip(self.collect_cmds): ( prog, suggest_filename, root_symlink, timeout, stderr, chroot, runat, env ) = progs[0] self._log_debug("unpacked command tuple: " + "('%s', '%s', '%s', %s, '%s', '%s', '%s', '%s')" % progs[0]) self._log_info("collecting output of '%s'" % prog) self.get_cmd_output_now(prog, suggest_filename=suggest_filename, root_symlink=root_symlink, timeout=timeout, stderr=stderr, chroot=chroot, runat=runat, env=env) def _collect_strings(self): for string, file_name in self.copy_strings: content = "..." if isinstance(string, six.string_types): content = "..." + content.splitlines()[0] else: content = ("..." + (content.splitlines()[0]).decode('utf8', 'ignore')) self._log_info("collecting string '%s' as '%s'" % (content, file_name)) try: self.archive.add_string(string, os.path.join('sos_strings', self.name(), file_name)) except Exception as e: self._log_debug("could not add string '%s': %s" % (file_name, e)) def collect(self): """Collect the data for a plugin.""" start = time() self._collect_copy_specs() self._collect_cmd_output() self._collect_strings() fields = (self.name(), time() - start) self._log_debug("collected plugin '%s' in %s" % fields) def get_description(self): """ This function will return the description for the plugin""" try: if hasattr(self, '__doc__') and self.__doc__: return self.__doc__.strip() return super(self.__class__, self).__doc__.strip() except: return "" def check_enabled(self): """This method will be used to verify that a plugin should execute given the condition of the underlying environment. The default implementation will return True if none of class.files, class.packages, nor class.commands is specified. If any of these is specified the plugin will check for the existence of any of the corresponding paths, packages or commands and return True if any are present. For SCLPlugin subclasses, it will check whether the plugin can be run for any of installed SCLs. If so, it will store names of these SCLs on the plugin class in addition to returning True. For plugins with more complex enablement checks this method may be overridden. """ # some files or packages have been specified for this package if any([self.files, self.packages, self.commands]): if isinstance(self.files, six.string_types): self.files = [self.files] if isinstance(self.packages, six.string_types): self.packages = [self.packages] if isinstance(self.commands, six.string_types): self.commands = [self.commands] if isinstance(self, SCLPlugin): # save SCLs that match files or packages type(self)._scls_matched = [] for scl in self._get_scls(): files = [f % {"scl_name": scl} for f in self.files] packages = [p % {"scl_name": scl} for p in self.packages] commands = [c % {"scl_name": scl} for c in self.commands] if self._files_pkgs_or_cmds_present(files, packages, commands): type(self)._scls_matched.append(scl) return len(type(self)._scls_matched) > 0 return self._files_pkgs_or_cmds_present(self.files, self.packages, self.commands) if isinstance(self, SCLPlugin): # if files and packages weren't specified, we take all SCLs type(self)._scls_matched = self._get_scls() return True def _files_pkgs_or_cmds_present(self, files, packages, commands): return (any(os.path.exists(fname) for fname in files) or any(self.is_installed(pkg) for pkg in packages) or any(is_executable(cmd) for cmd in commands)) def default_enabled(self): """This decides whether a plugin should be automatically loaded or only if manually specified in the command line.""" return True def setup(self): """Collect the list of files declared by the plugin. This method may be overridden to add further copy_specs, forbidden_paths, and external programs if required. """ self.add_copy_spec(list(self.files)) def setup_verify(self): if not hasattr(self, "verify_packages") or not self.verify_packages: if hasattr(self, "packages") and self.packages: # Limit automatic verification to only the named packages self.verify_packages = [p + "$" for p in self.packages] else: return pm = self.policy().package_manager verify_cmd = pm.build_verify_command(self.verify_packages) if verify_cmd: self.add_cmd_output(verify_cmd) def postproc(self): """Perform any postprocessing. To be replaced by a plugin if required. """ pass def report(self): """ Present all information that was gathered in an html file that allows browsing the results. """ # make this prettier html = u'
\n' % self.name() # Intro html = html + "

Plugin " + self.name() + "

\n" # Files if len(self.copied_files): html = html + "

Files copied:

    \n" for afile in self.copied_files: html = html + '
  • %s' % \ (u'..' + _to_u(afile['dstpath']), _to_u(afile['srcpath'])) if afile['symlink'] == "yes": html = html + " (symlink to %s)" % _to_u(afile['pointsto']) html = html + '
  • \n' html = html + "

\n" # Command Output if len(self.executed_commands): html = html + "

Commands Executed:

    \n" # convert file name to relative path from our root # don't use relpath - these are HTML paths not OS paths. for cmd in self.executed_commands: if cmd["file"] and len(cmd["file"]): cmd_rel_path = u"../" + _to_u(self.commons['cmddir']) \ + "/" + _to_u(cmd['file']) html = html + '
  • %s
  • \n' % \ (cmd_rel_path, _to_u(cmd['exe'])) else: html = html + '
  • %s
  • \n' % (_to_u(cmd['exe'])) html = html + "

\n" # Alerts if len(self.alerts): html = html + "

Alerts:

    \n" for alert in self.alerts: html = html + '
  • %s
  • \n' % _to_u(alert) html = html + "

\n" # Custom Text if self.custom_text != "": html = html + "

Additional Information:
\n" html = html + _to_u(self.custom_text) + "

\n" if six.PY2: return html.encode('utf8') else: return html class RedHatPlugin(object): """Tagging class for Red Hat's Linux distributions""" pass class SCLPlugin(RedHatPlugin): """Superclass for plugins operating on Software Collections (SCLs). Subclasses of this plugin class can specify class.files and class.packages using "%(scl_name)s" interpolation. The plugin invoking mechanism will try to match these against all found SCLs on the system. SCLs that do match class.files or class.packages are then accessible via self.scls_matched when the plugin is invoked. Additionally, this plugin class provides "add_cmd_output_scl" (run a command in context of given SCL), and "add_copy_spec_scl" and "add_copy_spec_limit_scl" (copy package from file system of given SCL). For example, you can implement a plugin that will list all global npm packages in every SCL that contains "npm" package: class SCLNpmPlugin(Plugin, SCLPlugin): packages = ("%(scl_name)s-npm",) def setup(self): for scl in self.scls_matched: self.add_cmd_output_scl(scl, "npm ls -g --json") """ @property def scls_matched(self): if not hasattr(type(self), '_scls_matched'): type(self)._scls_matched = [] return type(self)._scls_matched def _get_scls(self): output = sos_get_command_output("scl -l")["output"] return [scl.strip() for scl in output.splitlines()] def add_cmd_output_scl(self, scl, cmds, **kwargs): """Same as add_cmd_output, except that it wraps command in "scl enable" call. """ if isinstance(cmds, six.string_types): cmds = [cmds] scl_cmds = [] scl_cmd_tpl = "scl enable %s \"%s\"" for cmd in cmds: scl_cmds.append(scl_cmd_tpl % (scl, cmd)) self.add_cmd_output(scl_cmds, **kwargs) # config files for Software Collections are under /etc/opt/rh/${scl} and # var files are under /var/opt/rh/${scl}. So we need to insert the paths # after the appropriate root dir. def convert_copyspec_scl(self, scl, copyspec): for rootdir in ['etc', 'var']: p = re.compile('^/%s/' % rootdir) copyspec = p.sub('/%s/opt/rh/%s/' % (rootdir, scl), copyspec) return copyspec def add_copy_spec_scl(self, scl, copyspecs): """Same as add_copy_spec, except that it prepends path to SCL root to "copyspecs". """ if isinstance(copyspecs, six.string_types): copyspecs = [copyspecs] scl_copyspecs = [] for copyspec in copyspecs: scl_copyspecs.append(self.convert_copyspec_scl(scl, copyspec)) self.add_copy_spec(scl_copyspecs) def add_copy_spec_limit_scl(self, scl, copyspec, **kwargs): """Same as add_copy_spec_limit, except that it prepends path to SCL root to "copyspec". """ self.add_copy_spec_limit( self.convert_copyspec_scl(scl, copyspec), **kwargs ) class PowerKVMPlugin(RedHatPlugin): """Tagging class for IBM PowerKVM Linux""" pass class ZKVMPlugin(RedHatPlugin): """Tagging class for IBM ZKVM Linux""" pass class UbuntuPlugin(object): """Tagging class for Ubuntu Linux""" pass class DebianPlugin(object): """Tagging class for Debian Linux""" pass class SuSEPlugin(object): """Tagging class for SuSE Linux distributions""" pass class IndependentPlugin(object): """Tagging class for plugins that can run on any platform""" pass class ExperimentalPlugin(object): """Tagging class that indicates that this plugin is experimental""" pass def import_plugin(name, superclasses=None): """Import name as a module and return a list of all classes defined in that module. superclasses should be a tuple of valid superclasses to import, this defaults to (Plugin,). """ plugin_fqname = "sos.plugins.%s" % name if not superclasses: superclasses = (Plugin,) return import_module(plugin_fqname, superclasses) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/dovecot.py0000644000175000017500000000272613203300002017543 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Dovecot(Plugin): """Dovecot IMAP and POP3 """ plugin_name = "dovecot" profiles = ('mail',) def setup(self): self.add_copy_spec("/etc/dovecot*") self.add_cmd_output("dovecot -n") class RedHatDovecot(Dovecot, RedHatPlugin): """dovecot server related information """ def setup(self): super(RedHatDovecot, self).setup() packages = ('dovecot', ) files = ('/etc/dovecot.conf',) class DebianDovecot(Dovecot, DebianPlugin, UbuntuPlugin): """dovecot server related information for Debian based distribution """ def setup(self): super(DebianDovecot, self).setup() files = ('/etc/dovecot/README',) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ssmtp.py0000644000175000017500000000245513203300002017245 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Ssmtp(Plugin, RedHatPlugin): """sSMTP information """ plugin_name = 'ssmtp' profiles = ('mail', 'system') packages = ('ssmtp',) def setup(self): self.add_copy_spec([ "/etc/ssmtp/ssmtp.conf", "/etc/ssmtp/revaliases", "/etc/aliases" ]) def postproc(self): self.do_file_sub( '/etc/ssmtp/ssmtp.conf', r'AuthPass=(\S*)', r'AuthPass=********' ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/nodejs.py0000644000175000017500000000277213203300002017363 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc., Tomas Tomecek # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, \ SuSEPlugin class NodeJS(Plugin, RedHatPlugin, SuSEPlugin): """ Get runtime version of NodeJS """ plugin_name = 'nodejs' profiles = ('system',) packages = ('nodejs',) def setup(self): # we could get much more info with: # p = require("process"); console.log(p) # unfortunately 'process' module is not available on 0.10 self.add_cmd_output("node -v", suggest_filename="nodejs-version") class NodeJSUbuntu(NodeJS, UbuntuPlugin, DebianPlugin): """ Ubuntu/Debian require nodejs-legacy package in order to have a node executable """ packages = ('nodejs', 'nodejs-legacy') # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/hardware.py0000644000175000017500000000244313203300002017671 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Hardware(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """General hardware information """ plugin_name = "hardware" profiles = ('system', 'hardware') def setup(self): self.add_copy_spec([ "/proc/interrupts", "/proc/irq", "/proc/dma", "/proc/devices", "/proc/rtc", "/var/log/mcelog", "/sys/class/dmi/id/*" ]) self.add_cmd_output("dmidecode", root_symlink="dmidecode") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/mongodb.py0000644000175000017500000000375613203300002017531 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class MongoDb(Plugin, DebianPlugin, UbuntuPlugin): """MongoDB document database """ plugin_name = 'mongodb' profiles = ('services',) packages = ('mongodb-server',) var_puppet_gen = "/var/lib/config-data/puppet-generated/mongodb" files = ( '/etc/mongodb.conf', var_puppet_gen + '/etc/mongod.conf' ) def setup(self): self.add_copy_spec([ "/etc/mongodb.conf", self.var_puppet_gen + "/etc/", self.var_puppet_gen + "/etc/systemd/system/mongod.service.d/", "/var/log/mongodb/mongodb.log", "/var/log/containers/mongodb/mongodb.log" ]) def postproc(self): self.do_file_sub( "/etc/mongodb.conf", r"(mms-token\s*=\s*.*)", r"mms-token = ********" ) self.do_file_sub( self.var_puppet_gen + "/etc/mongodb.conf", r"(mms-token\s*=\s*.*)", r"mms-token = ********" ) class RedHatMongoDb(MongoDb, RedHatPlugin): def setup(self): super(RedHatMongoDb, self).setup() self.add_copy_spec("/etc/sysconfig/mongodb") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ipa.py0000644000175000017500000001265613203300002016654 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Kent Lamb # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin from glob import glob from os.path import exists class Ipa(Plugin, RedHatPlugin): """ Identity, policy, audit """ plugin_name = 'ipa' profiles = ('identity',) ipa_server = False ipa_client = False files = ('/etc/ipa',) packages = ('ipa-server', 'ipa-client', 'freeipa-server', 'freeipa-client') def check_ipa_server_version(self): if self.is_installed("pki-server") \ or exists("/var/lib/pki") \ or exists("/usr/share/doc/ipa-server-4.2.0"): return "v4" elif self.is_installed("pki-common") \ or exists("/var/lib/pki-ca/"): return "v3" def ca_installed(self): # Follow the same checks as IPA CA installer code if exists("%s/conf/ca/CS.cfg" % self.pki_tomcat_dir_v4) \ or exists("%s/conf/CS.cfg" % self.pki_tomcat_dir_v3): return True def ipa_server_installed(self): if self.is_installed("ipa-server") \ or self.is_installed("freeipa-server"): return True def retrieve_pki_logs(self, ipa_version): if ipa_version == "v4": self.add_copy_spec([ "/var/log/pki/pki-tomcat/ca/debug", "/var/log/pki/pki-tomcat/ca/system", "/var/log/pki/pki-tomcat/ca/transactions", "/var/log/pki/pki-tomcat/catalina.*", "/var/log/pki/pki-ca-spawn.*" ]) elif ipa_version == "v3": self.add_copy_spec([ "/var/log/pki-ca/debug", "/var/log/pki-ca/system", "/var/log/pki-ca/transactions", "/var/log/pki-ca/catalina.*", "/var/log/pki/pki-ca-spawn.*" ]) def check_enabled(self): self.ipa_server = self.is_installed("ipa-server") self.ipa_client = self.is_installed("ipa-client") return Plugin.check_enabled(self) def setup(self): self.pki_tomcat_dir_v4 = "/var/lib/pki/pki-tomcat" self.pki_tomcat_dir_v3 = "/var/lib/pki-ca" if self.ipa_server_installed(): self._log_debug("IPA server install detected") ipa_version = self.check_ipa_server_version() self._log_debug("IPA version is [%s]" % ipa_version) self.add_copy_spec([ "/var/log/ipaserver-install.log", "/var/log/ipareplica-install.log" ]) if self.ca_installed(): self._log_debug("CA is installed: retrieving PKI logs") self.retrieve_pki_logs(ipa_version) self.add_copy_spec([ "/var/log/ipaclient-install.log", "/var/log/ipaupgrade.log", "/var/log/krb5kdc.log", "/var/log/dirsrv/slapd-*/logs/access", "/var/log/dirsrv/slapd-*/logs/errors", "/etc/dirsrv/slapd-*/dse.ldif", "/etc/dirsrv/slapd-*/schema/99user.ldif", "/etc/hosts", "/etc/named.*", "/etc/pki-ca/CS.cfg", "/etc/ipa/ca.crt", "/etc/ipa/default.conf", "/var/lib/certmonger/requests/[0-9]*", "/var/lib/certmonger/cas/[0-9]*" ]) self.add_forbidden_path("/etc/pki/nssdb/key*") self.add_forbidden_path("/etc/pki-ca/flatfile.txt") self.add_forbidden_path("/etc/pki-ca/password.conf") self.add_forbidden_path("/var/lib/pki-ca/alias/key*") self.add_forbidden_path("/etc/dirsrv/slapd-*/key*") self.add_forbidden_path("/etc/dirsrv/slapd-*/pin.txt") self.add_forbidden_path("/etc/dirsrv/slapd-*/pwdfile.txt") self.add_forbidden_path("/etc/named.keytab") self.add_cmd_output([ "ls -la /etc/dirsrv/slapd-*/schema/", "getcert list", "certutil -L -d /var/lib/pki-ca/alias", "certutil -L -d /etc/httpd/alias/", "klist -ket /etc/dirsrv/ds.keytab", "klist -ket /etc/httpd/conf/ipa.keytab" ]) for certdb_directory in glob("/etc/dirsrv/slapd-*/"): self.add_cmd_output(["certutil -L -d %s" % certdb_directory]) return def postproc(self): match = r"(\s*arg \"password )[^\"]*" subst = r"\1********" self.do_file_sub("/etc/named.conf", match, subst) self.do_cmd_output_sub("getcert list", r"(pin=)'(\d+)'", r"\1'***'") request_logs = "/var/lib/certmonger/requests/[0-9]*" for request_log in glob(request_logs): self.do_file_sub(request_log, r"(key_pin=)(\d+)", r"\1***") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/kernelrt.py0000644000175000017500000000306313073155336017750 0ustar cariboucaribou# -*- python -*- # -*- coding: utf-8 -*- # # Copyright 2012 Red Hat Inc. # Guy Streeter # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; version 2. # # This application is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. from sos.plugins import Plugin, RedHatPlugin class KernelRT(Plugin, RedHatPlugin): '''Realtime kernel variant ''' plugin_name = 'kernelrt' profiles = ('system', 'hardware', 'kernel', 'mrg') # this file exists only when the realtime kernel is booted # this plugin will not be called is this file does not exist files = ('/sys/kernel/realtime',) def setup(self): clocksource_path = '/sys/devices/system/clocksource/clocksource0/' self.add_copy_spec([ '/etc/rtgroups', '/proc/sys/kernel/sched_rt_period_us', '/proc/sys/kernel/sched_rt_runtime_us', '/sys/kernel/realtime', clocksource_path + 'available_clocksource', clocksource_path + 'current_clocksource' ]) # note: rhbz#1059685 'tuna - NameError: global name 'cgroups' is not # defined this command throws an exception on versions prior to # 0.10.4-5. self.add_cmd_output('tuna -CP') # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/md.py0000644000175000017500000000231313203300002016470 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Md(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """MD RAID subsystem """ plugin_name = 'md' profiles = ('storage',) def setup(self): self.add_cmd_output("mdadm -D /dev/md*") self.add_copy_spec([ "/proc/mdstat", "/etc/mdadm.conf", "/dev/md/md-device-map", "/proc/sys/dev/raid/*", "/sys/block/md*/md*" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/docker.py0000644000175000017500000000773713203300002017356 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin class Docker(Plugin): """Docker containers """ plugin_name = 'docker' profiles = ('virt',) docker_cmd = "docker" option_list = [ ("all", "enable capture for all containers, even containers " "that have terminated", 'fast', False), ("logs", "capture logs for running containers", 'fast', False), ("size", "capture image sizes for docker ps", 'slow', False) ] def setup(self): self.add_copy_spec([ "/var/lib/docker/repositories-*" ]) subcmds = [ 'info', 'images', 'network ls', 'ps', 'ps -a', 'stats --no-stream', 'version' ] for subcmd in subcmds: self.add_cmd_output( "{0} {1}".format(self.docker_cmd, subcmd) ) # separately grab ps -s as this can take a *very* long time if self.get_option('size'): self.add_cmd_output('{0} ps -as'.format(self.docker_cmd)) self.add_journal(units="docker") self.add_cmd_output("ls -alhR /etc/docker") net_cmd = '{0} network ls'.format(self.docker_cmd) nets = self.get_command_output(net_cmd) if nets['status'] == 0: n = [n.split()[1] for n in nets['output'].splitlines()[1:]] for net in n: self.add_cmd_output( "{0} network inspect {1}".format( self.docker_cmd, net ) ) ps_cmd = "{0} ps -q".format(self.docker_cmd) if self.get_option('all'): ps_cmd = "{0} -a".format(ps_cmd) img_cmd = '{0} images -q'.format(self.docker_cmd) insp = set() for icmd in [ps_cmd, img_cmd]: result = self.get_command_output(icmd) if result['status'] == 0: for con in result['output'].splitlines(): insp.add(con) insp = list(insp) if insp: for container in insp: self.add_cmd_output( "{0} inspect {1}".format( self.docker_cmd, container ) ) if self.get_option('logs'): for container in containers: self.add_cmd_output( "{0} logs {1}".format( self.docker_cmd, container ) ) class RedHatDocker(Docker, RedHatPlugin): packages = ('docker', 'docker-latest', 'docker-io', 'docker-engine') def setup(self): super(RedHatDocker, self).setup() self.add_copy_spec([ "/etc/udev/rules.d/80-docker.rules" ]) class UbuntuDocker(Docker, UbuntuPlugin): packages = ('docker.io', 'docker-engine') def setup(self): super(UbuntuDocker, self).setup() self.add_copy_spec([ "/etc/default/docker", "/etc/docker/daemon.json", "/var/run/docker/libcontainerd/containerd/events.log" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/libraries.py0000644000175000017500000000237313203300002020052 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin class Libraries(Plugin, RedHatPlugin, UbuntuPlugin): """Dynamic shared libraries """ plugin_name = 'libraries' profiles = ('system',) option_list = [ ('ldconfigv', 'collect verbose ldconfig output', "slow", False) ] def setup(self): self.add_copy_spec(["/etc/ld.so.conf", "/etc/ld.so.conf.d"]) if self.get_option("ldconfigv"): self.add_cmd_output("ldconfig -v -N -X") self.add_cmd_output("ldconfig -p -N -X") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/saltmaster.py0000644000175000017500000000232313203300002020250 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin class SaltMaster(Plugin, RedHatPlugin, DebianPlugin): """Salt Master """ plugin_name = 'saltmaster' profiles = ('sysmgmt',) packages = ('salt-master',) def setup(self): if not self.get_option("all_logs"): limit = self.get_option("log_size") else: limit = 0 self.add_copy_spec("/var/log/salt/master", sizelimit=limit) self.add_cmd_output("salt-key --list all") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/general.py0000644000175000017500000000402013203300002017502 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin class General(Plugin): """general system information""" plugin_name = "general" profiles = ('system', 'sysmgmt') def setup(self): self.add_copy_spec([ "/etc/sos.conf", "/etc/sysconfig", "/proc/stat", "/var/log/pm/suspend.log", "/etc/hostid", "/etc/localtime", "/etc/os-release" ]) self.add_cmd_output("hostname -f") self.add_cmd_output("hostname", root_symlink='hostname') self.add_cmd_output("date", root_symlink="date") self.add_cmd_output("uptime", root_symlink="uptime") class RedHatGeneral(General, RedHatPlugin): def setup(self): super(RedHatGeneral, self).setup() self.add_copy_spec([ "/etc/redhat-release", "/etc/fedora-release", "/var/log/up2date" ]) def postproc(self): self.do_file_sub("/etc/sysconfig/rhn/up2date", r"(\s*proxyPassword\s*=\s*)\S+", r"\1***") class DebianGeneral(General, DebianPlugin): def setup(self): super(DebianGeneral, self).setup() self.add_copy_spec([ "/etc/default", "/etc/lsb-release", "/etc/debian_version" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/tftpserver.py0000644000175000017500000000213113203300002020272 0ustar cariboucaribou# Copyright (C) 2007 Shijoe George # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class TftpServer(Plugin, RedHatPlugin): """TFTP server """ plugin_name = 'tftpserver' profiles = ('sysmgmt', 'network') files = ('/etc/xinetd.d/tftp',) packages = ('tftp-server',) def setup(self): self.add_cmd_output("ls -lanR /tftpboot") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openhpi.py0000644000175000017500000000231213203300002017531 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class OpenHPI(Plugin, RedHatPlugin): """Open Hardware Platform Interface """ plugin_name = 'openhpi' profiles = ('system', 'hardware') def setup(self): self.add_copy_spec([ "/etc/openhpi/openhpi.conf", "/etc/openhpi/openhpiclient.conf" ]) def postproc(self): self.do_file_sub("/etc/openhpi/openhpi.conf", r'(\s*[Pp]ass.*\s*=\s*).*', r'\1********') # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/rabbitmq.py0000644000175000017500000000336013203300002017674 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class RabbitMQ(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """RabbitMQ messaging service """ plugin_name = 'rabbitmq' profiles = ('services',) var_puppet_gen = "/var/lib/config-data/puppet-generated/rabbitmq" files = ( '/etc/rabbitmq/rabbitmq.conf', var_puppet_gen + '/etc/rabbitmq/rabbitmq.config' ) packages = ('rabbitmq-server',) def setup(self): self.add_cmd_output("rabbitmqctl report") self.add_cmd_output("rabbitmqctl cluster_status") self.add_cmd_output("rabbitmqctl list_policies") self.add_copy_spec([ "/etc/rabbitmq/*", self.var_puppet_gen + "/etc/rabbitmq/*", self.var_puppet_gen + "/etc/security/limits.d/", self.var_puppet_gen + "/etc/systemd/" ]) self.add_copy_spec([ "/var/log/rabbitmq/*", "/var/log/containers/rabbitmq/*" ], sizelimit=self.get_option('log_size')) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/sas3ircu.py0000644000175000017500000000311713203300002017627 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # This sosreport plugin is meant for sas adapters. # This plugin logs inforamtion on each adapter it finds. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class SAS3ircu(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): plugin_name = "sas3ircu" commands = ("sas3ircu",) def setup(self): # get list of adapters result = self.call_ext_prog("sas3ircu list", timeout=5) if (result["status"] == 0): self.add_cmd_output("sas3ircu list", timeout=5) # only want devices sas_lst = result["output"].splitlines()[10:-1] # for each adapter get some basic info for sas_info in sas_lst: sas_num = sas_info.split()[0] self.add_cmd_output("sas3ircu %s display" % sas_num, timeout=5) self.add_cmd_output("sas3ircu %s status" % sas_num, timeout=5) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/soundcard.py0000644000175000017500000000272713203300002020063 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Soundcard(Plugin): """ Sound devices """ plugin_name = "soundcard" profiles = ('desktop', 'hardware') def setup(self): self.add_copy_spec("/proc/asound/*") self.add_cmd_output([ "aplay -l", "aplay -L", "amixer" ]) class RedHatSoundcard(Soundcard, RedHatPlugin): def setup(self): super(RedHatSoundcard, self).setup() self.add_copy_spec([ "/etc/alsa/*", "/etc/asound.*" ]) class DebianSoundcard(Soundcard, DebianPlugin, UbuntuPlugin): def setup(self): super(DebianSoundcard, self).setup() self.add_copy_spec("/etc/pulse/*") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_neutron.py0000644000175000017500000001255513203300002021642 0ustar cariboucaribou# Copyright (C) 2013 Red Hat, Inc., Brent Eagles # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class OpenStackNeutron(Plugin): """OpenStack Networking """ plugin_name = "openstack_neutron" profiles = ('openstack', 'openstack_controller', 'openstack_compute') var_puppet_gen = "/var/lib/config-data/puppet-generated/neutron" def setup(self): self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/neutron/", "/var/log/containers/neutron/", "/var/log/containers/httpd/neutron-api/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/neutron/*.log", "/var/log/containers/neutron/*.log", "/var/log/containers/httpd/neutron-api/*log" ], sizelimit=self.limit) self.add_copy_spec([ "/etc/neutron/", self.var_puppet_gen + "/etc/neutron/", self.var_puppet_gen + "/etc/default/neutron-server", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf" ]) self.add_copy_spec("/var/lib/neutron/") if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD']] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME']] if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. Source " "the environment file for the user intended " "to connect to the OpenStack environment.") else: self.add_cmd_output("openstack subnet list") self.add_cmd_output("openstack port list") self.add_cmd_output("openstack router list") self.add_cmd_output("openstack network agent list") self.add_cmd_output("openstack network list") self.add_cmd_output("openstack extension list") self.add_cmd_output("openstack floating ip list") self.add_cmd_output("openstack security group list") def postproc(self): protect_keys = [ "rabbit_password", "qpid_password", "nova_admin_password", "xenapi_connection_password", "password", "connection", "admin_password", "metadata_proxy_shared_secret", "eapi_password", "crd_password", "primary_l3_host_password", "serverauth", "ucsm_password", "ha_vrrp_auth_password", "ssl_key_password", "nsx_password", "vcenter_password", "edge_appliance_password", "tenant_admin_password", "apic_password", "server_auth" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/neutron/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/neutron/*", regexp, r"\1*********" ) class DebianNeutron(OpenStackNeutron, DebianPlugin, UbuntuPlugin): packages = [ 'neutron-common', 'neutron-plugin-cisco', 'neutron-plugin-linuxbridge-agent', 'neutron-plugin-nicira', 'neutron-plugin-openvswitch', 'neutron-plugin-openvswitch-agent', 'neutron-plugin-ryu', 'neutron-plugin-ryu-agent', 'neutron-server', 'python-neutron', 'python-neutronclient' ] def check_enabled(self): return self.is_installed("neutron-common") def setup(self): super(DebianNeutron, self).setup() self.add_copy_spec("/etc/sudoers.d/neutron_sudoers") class RedHatNeutron(OpenStackNeutron, RedHatPlugin): packages = [ 'openstack-neutron', 'openstack-neutron-linuxbridge' 'openstack-neutron-metaplugin', 'openstack-neutron-openvswitch', 'openstack-neutron-bigswitch', 'openstack-neutron-brocade', 'openstack-neutron-cisco', 'openstack-neutron-hyperv', 'openstack-neutron-midonet', 'openstack-neutron-nec' 'openstack-neutron-nicira', 'openstack-neutron-plumgrid', 'openstack-neutron-ryu', 'python-neutron', 'python-neutronclient' ] def check_enabled(self): return self.is_installed("openstack-neutron") def setup(self): super(RedHatNeutron, self).setup() self.add_copy_spec("/etc/sudoers.d/neutron-rootwrap") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/sysvipc.py0000644000175000017500000000237513203300002017600 0ustar cariboucaribou# Copyright (C) 2007-2012 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class SysVIPC(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """SysV IPC """ plugin_name = "sysvipc" profiles = ('system', 'services') def setup(self): self.add_copy_spec([ "/proc/sysvipc/msg", "/proc/sysvipc/sem", "/proc/sysvipc/shm" ]) self.add_cmd_output([ "ipcs", "ipcs -u" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openssl.py0000644000175000017500000000362013203300002017555 0ustar cariboucaribou# Copyright (C) 2007 Sadique Puthen # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenSSL(Plugin): """OpenSSL configuration """ plugin_name = "openssl" profiles = ('network', 'security') packages = ('openssl',) verify_packages = ('openssl.*',) def postproc(self): protect_keys = [ "input_password", "output_password", "challengePassword" ] regexp = r"(?m)^(\s*#?\s*(%s).*=)(.*)" % "|".join(protect_keys) self.do_file_sub( '/etc/ssl/openssl.cnf', regexp, r"\1 ******" ) class RedHatOpenSSL(OpenSSL, RedHatPlugin): """openssl related information """ files = ('/etc/pki/tls/openssl.cnf',) def setup(self): super(RedHatOpenSSL, self).setup() self.add_copy_spec("/etc/pki/tls/openssl.cnf") class DebianOpenSSL(OpenSSL, DebianPlugin, UbuntuPlugin): """openssl related information for Debian distributions """ files = ('/etc/ssl/openssl.cnf',) def setup(self): super(DebianOpenSSL, self).setup() self.add_copy_spec("/etc/ssl/openssl.cnf") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ssh.py0000644000175000017500000000223113203300002016664 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Eugene Teo # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Ssh(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Secure shell service """ plugin_name = 'ssh' profiles = ('services', 'security', 'identity') def setup(self): self.add_copy_spec([ "/etc/ssh/ssh_config", "/etc/ssh/sshd_config" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_cinder.py0000644000175000017500000001112413203300002021403 0ustar cariboucaribou# Copyright (C) 2009 Red Hat, Inc., Joey Boggs # Copyright (C) 2012 Rackspace US, Inc., # Justin Shepherd # Copyright (C) 2013 Red Hat, Inc., Flavio Percoco # Copyright (C) 2013 Red Hat, Inc., Jeremy Agee # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenStackCinder(Plugin): """OpenStack cinder """ plugin_name = "openstack_cinder" profiles = ('openstack', 'openstack_controller') option_list = [("db", "gathers openstack cinder db version", "slow", False)] var_puppet_gen = "/var/lib/config-data/puppet-generated/cinder" def setup(self): if self.get_option("db"): self.add_cmd_output( "cinder-manage db version", suggest_filename="cinder_db_version") self.add_copy_spec([ "/etc/cinder/", self.var_puppet_gen + "/etc/cinder/", self.var_puppet_gen + "/etc/httpd/conf/", self.var_puppet_gen + "/etc/httpd/conf.d/", self.var_puppet_gen + "/etc/httpd/conf.modules.d/*.conf", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf", self.var_puppet_gen + "/etc/sysconfig/", ]) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/cinder/", "/var/log/httpd/cinder*", "/var/log/containers/cinder/", "/var/log/containers/httpd/cinder-api/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/cinder/*.log", "/var/log/httpd/cinder*.log", "/var/log/containers/cinder/*.log", "/var/log/containers/httpd/cinder-api/*log" ], sizelimit=self.limit) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) def postproc(self): protect_keys = [ "admin_password", "backup_tsm_password", "chap_password", "nas_password", "cisco_fc_fabric_password", "coraid_password", "eqlx_chap_password", "fc_fabric_password", "hitachi_auth_password", "hitachi_horcm_password", "hp3par_password", "hplefthand_password", "memcache_secret_key", "netapp_password", "netapp_sa_password", "nexenta_password", "password", "qpid_password", "rabbit_password", "san_password", "ssl_key_password", "vmware_host_password", "zadara_password", "zfssa_initiator_password", "connection", "zfssa_target_password", "os_privileged_user_password", "hmac_keys" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/cinder/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/cinder/*", regexp, r"\1*********" ) class DebianCinder(OpenStackCinder, DebianPlugin, UbuntuPlugin): cinder = False packages = ( 'cinder-api', 'cinder-backup', 'cinder-common', 'cinder-scheduler', 'cinder-volume', 'python-cinder', 'python-cinderclient' ) def check_enabled(self): self.cinder = self.is_installed("cinder-common") return self.cinder def setup(self): super(DebianCinder, self).setup() class RedHatCinder(OpenStackCinder, RedHatPlugin): cinder = False packages = ('openstack-cinder', 'python-cinder', 'python-cinderclient') def check_enabled(self): self.cinder = self.is_installed("openstack-cinder") return self.cinder def setup(self): super(RedHatCinder, self).setup() self.add_copy_spec(["/etc/sudoers.d/cinder"]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/azure.py0000644000175000017500000000251713203300002017224 0ustar cariboucaribou# Copyright (C) 2013 Adam Stokes # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin, RedHatPlugin class Azure(Plugin, UbuntuPlugin, RedHatPlugin): """ Microsoft Azure client """ plugin_name = 'azure' profiles = ('virt',) packages = ('walinuxagent',) def setup(self): self.add_copy_spec([ "/var/log/waagent*", "/var/lib/cloud", "/etc/default/kv-kvp-daemon-init", "/etc/waagent.conf", "/sys/module/hv_netvsc/parameters/ring_size", "/sys/module/hv_storvsc/parameters/storvsc_ringbuffer_size" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/tuned.py0000644000175000017500000000262113203300002017211 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., Peter Portante # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Tuned(Plugin, RedHatPlugin): """Tuned system tuning daemon """ packages = ('tuned',) profiles = ('system', 'performance') plugin_name = 'tuned' def setup(self): self.add_cmd_output([ "tuned-adm list", "tuned-adm active", "tuned-adm recommend" ]) self.add_copy_spec([ "/etc/tuned.conf", "/etc/tune-profiles" ]) self.add_copy_spec([ "/etc/tuned", "/usr/lib/tuned", "/var/log/tuned/tuned.log" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ppp.py0000644000175000017500000000232713203300002016674 0ustar cariboucaribou# Copyright (C) 2007 Sadique Puthen # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Ppp(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Point-to-point protocol """ plugin_name = 'ppp' profiles = ('system', 'network') packages = ('ppp',) def setup(self): self.add_copy_spec([ "/etc/wvdial.conf", "/etc/ppp", "/var/log/ppp" ]) self.add_cmd_output("adsl-status") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/npm.py0000644000175000017500000001036413203300002016667 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc., Tomas Tomecek # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import json from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, \ SuSEPlugin class Npm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, SuSEPlugin): """ Get info about available npm modules """ requires_root = False plugin_name = 'npm' profiles = ('system',) option_list = [("project_path", 'List npm modules of a project specified by path', 'fast', 0)] # in Fedora, Debian, Ubuntu and Suse the package is called npm packages = ('npm',) def _get_npm_output(self, cmd, filename, working_directory=None): # stderr output is already part of the json, key "problems" self.add_cmd_output( cmd, suggest_filename=filename, stderr=False, runat=working_directory ) def _find_modules_in_npm_cache(self): """ Example 'npm cache ls' output ~/.npm ~/.npm/acorn ~/.npm/acorn/1.2.2 ~/.npm/acorn/1.2.2/package.tgz ~/.npm/acorn/1.2.2/package ~/.npm/acorn/1.2.2/package/package.json ~/.npm/acorn/4.0.3 ~/.npm/acorn/4.0.3/package.tgz ~/.npm/acorn/4.0.3/package ~/.npm/acorn/4.0.3/package/package.json ~/.npm/registry.npmjs.org ~/.npm/registry.npmjs.org/acorn ~/.npm/registry.npmjs.org/acorn/.cache.json https://docs.npmjs.com/cli/cache """ output = {} # with chroot=True (default) the command fails when run as non-root user_cache = self.get_command_output("npm cache ls", chroot=False) if user_cache['status'] == 0: # filter out dirs with .cache.json ('registry.npmjs.org') for package in [l for l in user_cache['output'].splitlines() if l.endswith('package.tgz')]: five_tuple = package.split(os.path.sep) if len(five_tuple) != 5: # sanity check continue home, cache, name, version, package_tgz = five_tuple if name not in output: output[name] = [version] else: output[name].append(version) self._log_debug("modules in cache: %s" % output) outfn = self._make_command_filename("npm_cache_modules") self.archive.add_string(json.dumps(output), outfn) def setup(self): if self.get_option("project_path") != 0: project_path = os.path.abspath(os.path.expanduser( self.get_option("project_path"))) self._get_npm_output("npm ls --json", "npm_ls_project", working_directory=project_path) self._get_npm_output("npm config list -l", "npm_config_list_project", working_directory=project_path) self._get_npm_output("npm ls -g --json", "npm_ls_global") self._get_npm_output("npm config list -l", "npm_config_list_global") self._find_modules_in_npm_cache() class NpmViaNodeJS(Npm): """ some distribution methods don't provide 'npm' via npm package """ # upstream doesn't have an npm package, it's just nodejs # also in Fedora 24+ it is just nodejs, no npm package packages = ('nodejs', ) # TODO: in RHEL npm and nodejs is available via software collections # this should be handled separately # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/samba.py0000644000175000017500000000413113203300002017153 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Samba(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Samba Windows interoperability """ packages = ('samba-common',) plugin_name = "samba" profiles = ('services',) def setup(self): self.limit = self.get_option("log_size") self.add_copy_spec([ "/etc/samba/smb.conf", "/etc/samba/lmhosts", ]) self.add_copy_spec("/var/log/samba/log.smbd", sizelimit=self.limit) self.add_copy_spec("/var/log/samba/log.nmbd", sizelimit=self.limit) self.add_copy_spec("/var/log/samba/log.winbindd", sizelimit=self.limit) self.add_copy_spec("/var/log/samba/log.winbindd-idmap", sizelimit=self.limit) self.add_copy_spec("/var/log/samba/log.winbindd-dc-connect", sizelimit=self.limit) self.add_copy_spec("/var/log/samba/log.wb-*", sizelimit=self.limit) if self.get_option("all_logs"): self.add_copy_spec("/var/log/samba/", sizelimit=self.limit) self.add_cmd_output([ "wbinfo --domain='.' -g", "wbinfo --domain='.' -u", "testparm -s", ]) class RedHatSamba(Samba, RedHatPlugin): def setup(self): super(RedHatSamba, self).setup() self.add_copy_spec("/etc/sysconfig/samba") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/devices.py0000644000175000017500000000214113203300002017511 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Devices(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """ devices specific commands """ plugin_name = 'devices' profiles = ('system', 'hardware', 'boot') packages = ('udev', 'systemd-udev') files = ('/dev',) def setup(self): self.add_cmd_output("udevadm info --export-db") # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/vdo.py0000644000175000017500000000224113203300002016660 0ustar cariboucaribou# # Copyright (c) 2017 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it would be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # from sos.plugins import Plugin, RedHatPlugin class Vdo(Plugin, RedHatPlugin): """Virtual Data Optimizer """ plugin_name = 'vdo' profiles = ('storage',) packages = ('vdo',) files = ( '/sys/vdo', '/sys/albireo', '/etc/vdoconf.yml', '/etc/vdoconf.xml' ) def setup(self): self.add_copy_spec(self.files) self.add_cmd_output("vdo status") # vim set et ts=4 sw=4 : sosreport-3.5/sos/plugins/dmraid.py0000644000175000017500000000324113203300002017331 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Dmraid(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """dmraid software RAID """ plugin_name = 'dmraid' profiles = ('hardware', 'storage') packages = ('dmraid',) option_list = [ ("metadata", "capture dmraid device metadata", "slow", False) ] # V - {-V/--version} # b - {-b|--block_devices} # r - {-r|--raid_devices} # s - {-s|--sets} # t - [-t|--test] # a - {-a|--activate} {y|n|yes|no} # D - [-D|--dump_metadata] dmraid_options = ['V', 'b', 'r', 's', 'tay'] def setup(self): for opt in self.dmraid_options: self.add_cmd_output("dmraid -%s" % (opt,)) if self.get_option("metadata"): metadata_path = self.get_cmd_output_path("metadata") self.add_cmd_output("dmraid -rD", runat=metadata_path, chroot=self.tmp_in_sysroot()) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/iscsi.py0000644000175000017500000000340013203300002017200 0ustar cariboucaribou# Copyright (C) 2007-2012 Red Hat, Inc., Ben Turner # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Iscsi(Plugin): """iSCSI initiator """ plugin_name = "iscsi" profiles = ('storage',) def setup(self): var_puppet_gen = "/var/lib/config-data/puppet-generated/iscsid" self.add_copy_spec([ "/etc/iscsi/iscsid.conf", "/etc/iscsi/initiatorname.iscsi", var_puppet_gen + "/etc/iscsi/initiatorname.iscsi", "/var/lib/iscsi" ]) self.add_cmd_output([ "iscsiadm -m session -P 3", "iscsiadm -m node -P 1", "iscsiadm -m iface -P 1", "iscsiadm -m node --op=show" ]) class RedHatIscsi(Iscsi, RedHatPlugin): packages = ('iscsi-initiator-utils',) def setup(self): super(RedHatIscsi, self).setup() class DebianIscsi(Iscsi, DebianPlugin, UbuntuPlugin): packages = ('open-iscsi',) def setup(self): super(DebianIscsi, self).setup() # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_ansible.py0000644000175000017500000000332113203300002021554 0ustar cariboucaribou# Copyright (C) 2017 Major Hayden # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenStackAnsible(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """OpenStack-Ansible sos plugin.""" plugin_name = "openstack_ansible" profiles = ('openstack',) files = ('/etc/openstack_deploy/',) def setup(self): """Gathering the contents of the report.""" self.add_copy_spec([ "/etc/openstack_deploy/", "/etc/openstack-release", "/etc/rpc_deploy/", "/etc/rpc-release" ]) def postproc(self): """Remove sensitive keys and passwords from YAML files.""" secrets_files = [ "/etc/openstack_deploy/user_secrets.yml", "/etc/rpc_deploy/user_secrets.yml" ] regexp = r"(?m)^\s*#*([\w_]*:\s*).*" for secrets_file in secrets_files: self.do_path_regex_sub( secrets_file, regexp, r"\1*********") sosreport-3.5/sos/plugins/yum.py0000644000175000017500000000611213203300002016703 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Yum(Plugin, RedHatPlugin): """yum information """ plugin_name = 'yum' profiles = ('system', 'packagemanager', 'sysmgmt') files = ('/etc/yum.conf',) packages = ('yum',) verify_packages = ('yum',) option_list = [ ("yumlist", "list repositories and packages", "slow", False), ("yumdebug", "gather yum debugging data", "slow", False), ("yum-history-info", "gather yum history info", "slow", False), ] def setup(self): # Pull all yum related information self.add_copy_spec([ "/etc/yum", "/etc/yum.repos.d", "/etc/yum.conf", "/var/log/yum.log" ]) # Get a list of channels the machine is subscribed to. self.add_cmd_output("yum -C repolist") # candlepin info self.add_forbidden_path("/etc/pki/entitlement/key.pem") self.add_forbidden_path("/etc/pki/entitlement/*-key.pem") self.add_copy_spec([ "/etc/pki/product/*.pem", "/etc/pki/consumer/cert.pem", "/etc/pki/entitlement/*.pem" ]) self.add_cmd_output("yum history") # packages installed/erased/updated per transaction if self.get_option("yum-history-info"): history = self.call_ext_prog("yum history") transactions = None if history['output']: for line in history['output'].splitlines(): try: transactions = int(line.split('|')[0].strip()) break except ValueError: pass for tr_id in range(1, transactions+1): self.add_cmd_output("yum history info %d" % tr_id) if self.get_option("yumlist"): # List various information about available packages self.add_cmd_output("yum list") if self.get_option("yumdebug") and self.is_installed('yum-utils'): # RHEL6+ alternative for this whole function: # self.add_cmd_output("yum-debug-dump '%s'" # % os.path.join(self.commons['dstroot'],"yum-debug-dump")) r = self.call_ext_prog("yum-debug-dump") try: self.add_cmd_output("zcat %s" % (r['output'].split()[-1],)) except IndexError: pass # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/tomcat.py0000644000175000017500000000437213203300002017366 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin from datetime import datetime class Tomcat(Plugin, RedHatPlugin): """Apache Tomcat server """ plugin_name = 'tomcat' profiles = ('webserver', 'java', 'services', 'sysmgmt') packages = ('tomcat', 'tomcat6', 'tomcat7', 'tomcat8') def setup(self): self.add_copy_spec([ "/etc/tomcat", "/etc/tomcat6", "/etc/tomcat7", "/etc/tomcat8" ]) limit = self.get_option("log_size") if not self.get_option("all_logs"): log_glob = "/var/log/tomcat*/catalina.out" self.add_copy_spec(log_glob, sizelimit=limit) # get today's date in iso format so that days/months below 10 # prepend 0 today = datetime.date(datetime.now()).isoformat() log_glob = "/var/log/tomcat*/catalina.%s.log" % today self.add_copy_spec(log_glob, sizelimit=limit) else: self.add_copy_spec("/var/log/tomcat*/*") def postproc(self): serverXmlPasswordAttributes = ['keyPass', 'keystorePass', 'truststorePass', 'SSLPassword'] for attr in serverXmlPasswordAttributes: self.do_path_regex_sub( r"\/etc\/tomcat.*\/server.xml", r"%s=(\S*)" % attr, r'%s="********"' % attr ) self.do_path_regex_sub( r"\/etc\/tomcat.*\/tomcat-users.xml", r"password=(\S*)", r'password="********"' ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/sar.py0000644000175000017500000000576313203300002016671 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class Sar(Plugin,): """System Activity Reporter """ plugin_name = 'sar' profiles = ('system', 'performance') packages = ('sysstat',) sa_path = '/var/log/sa' option_list = [("all_sar", "gather all system activity records", "", False)] # size-limit SAR data collected by default (MB) sa_size = 20 def setup(self): if self.get_option("all_sar"): self.sa_size = 0 # Copy all sa??, sar??, sa??.* and sar??.* files, which will net # compressed and uncompressed versions, typically. for suffix in ('', '.*'): self.add_copy_spec( os.path.join(self.sa_path, "sa[0-3][0-9]" + suffix), sizelimit=self.sa_size, tailit=False ) self.add_copy_spec( os.path.join(self.sa_path, "sar[0-3][0-9]" + suffix), sizelimit=self.sa_size, tailit=False ) try: dir_list = os.listdir(self.sa_path) except: self._log_warn("sar: could not list %s" % self.sa_path) return # find all the sa files that don't have an existing sar file for fname in dir_list: if fname.startswith('sar'): continue if not fname.startswith('sa'): continue if len(fname) != 4: # We either have an "sa" or "sa?" file, or more likely, a # compressed data file like, "sa??.xz". # # FIXME: We don't have a detector for the kind of compression # use for this file right now, so skip these kinds of files. continue sa_data_path = os.path.join(self.sa_path, fname) sar_filename = 'sar' + fname[2:] if sar_filename not in dir_list: sar_cmd = 'sh -c "sar -A -f %s"' % sa_data_path self.add_cmd_output(sar_cmd, sar_filename) sadf_cmd = "sadf -x %s" % sa_data_path self.add_cmd_output(sadf_cmd, "%s.xml" % fname) class RedHatSar(Sar, RedHatPlugin): sa_path = '/var/log/sa' class DebianSar(Sar, DebianPlugin, UbuntuPlugin): sa_path = '/var/log/sysstat' # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/xen.py0000644000175000017500000000757513203300002016701 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os import re from stat import * class Xen(Plugin, RedHatPlugin): """Xen virtualization """ plugin_name = 'xen' profiles = ('virt',) def determine_xen_host(self): if os.access("/proc/acpi/dsdt", os.R_OK): result = self.call_ext_prog("grep -qi xen /proc/acpi/dsdt") if result['status'] == 0: return "hvm" if os.access("/proc/xen/capabilities", os.R_OK): result = self.call_ext_prog( "grep -q control_d /proc/xen/capabilities") if result['status'] == 0: return "dom0" else: return "domU" return "baremetal" def check_enabled(self): return (self.determine_xen_host() == "baremetal") def is_running_xenstored(self): xs_pid = self.call_ext_prog("pidof xenstored")['output'] xs_pidnum = re.split('\n$', xs_pid)[0] return xs_pidnum.isdigit() def dom_collect_proc(self): self.add_copy_spec([ "/proc/xen/balloon", "/proc/xen/capabilities", "/proc/xen/xsd_kva", "/proc/xen/xsd_port"]) # determine if CPU has PAE support self.add_cmd_output("grep pae /proc/cpuinfo") # determine if CPU has Intel-VT or AMD-V support self.add_cmd_output("egrep -e 'vmx|svm' /proc/cpuinfo") def setup(self): host_type = self.determine_xen_host() if host_type == "domU": # we should collect /proc/xen and /sys/hypervisor self.dom_collect_proc() # determine if hardware virtualization support is enabled # in BIOS: /sys/hypervisor/properties/capabilities self.add_copy_spec("/sys/hypervisor") elif host_type == "hvm": # what do we collect here??? pass elif host_type == "dom0": # default of dom0, collect lots of system information self.add_copy_spec([ "/var/log/xen", "/etc/xen", "/sys/hypervisor/version", "/sys/hypervisor/compilation", "/sys/hypervisor/properties", "/sys/hypervisor/type"]) self.add_cmd_output([ "xm dmesg", "xm info", "xm list", "xm list --long", "brctl show" ]) self.dom_collect_proc() if self.is_running_xenstored(): self.add_copy_spec("/sys/hypervisor/uuid") self.add_cmd_output("xenstore-ls") else: # we need tdb instead of xenstore-ls if cannot get it. self.add_copy_spec("/var/lib/xenstored/tdb") # FIXME: we *might* want to collect things in /sys/bus/xen*, # /sys/class/xen*, /sys/devices/xen*, /sys/modules/blk*, # /sys/modules/net*, but I've never heard of them actually being # useful, so I'll leave it out for now else: # for bare-metal, we don't have to do anything special return # USEFUL self.add_custom_text("Xen hostType: "+host_type) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/lvm2.py0000644000175000017500000000603613203300002016756 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Lvm2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """LVM2 volume manager """ plugin_name = 'lvm2' profiles = ('storage',) option_list = [("lvmdump", 'collect an lvmdump tarball', 'fast', False), ("lvmdump-am", 'attempt to collect an lvmdump with ' 'advanced options and raw metadata collection', 'slow', False)] def do_lvmdump(self, metadata=False): """Collects an lvmdump in standard format with optional metadata archives for each physical volume present. """ lvmdump_path = self.get_cmd_output_path(name="lvmdump", make=False) lvmdump_cmd = "lvmdump %s -d '%s'" lvmdump_opts = "" if metadata: lvmdump_opts = "-a -m" cmd = lvmdump_cmd % (lvmdump_opts, lvmdump_path) self.add_cmd_output(cmd, chroot=self.tmp_in_sysroot()) def setup(self): # use locking_type 0 (no locks) when running LVM2 commands, # from lvm.conf: # Turn locking off by setting to 0 (dangerous: risks metadata # corruption if LVM2 commands get run concurrently). # None of the commands issued by sos ever modify metadata and this # avoids the possibility of hanging lvm commands when another process # or node holds a conflicting lock. lvm_opts = '--config="global{locking_type=0}"' self.add_cmd_output( "vgdisplay -vv %s" % lvm_opts, root_symlink="vgdisplay" ) pvs_cols = 'pv_mda_free,pv_mda_size,pv_mda_count,pv_mda_used_count' pvs_cols = pvs_cols + ',' + 'pe_start' vgs_cols = 'vg_mda_count,vg_mda_free,vg_mda_size,vg_mda_used_count' vgs_cols = vgs_cols + ',' + 'vg_tags' lvs_cols = 'lv_tags,devices' self.add_cmd_output([ "vgscan -vvv %s" % lvm_opts, "pvscan -v %s" % lvm_opts, "pvs -a -v -o +%s %s" % (pvs_cols, lvm_opts), "vgs -v -o +%s %s" % (vgs_cols, lvm_opts), "lvs -a -o +%s %s" % (lvs_cols, lvm_opts) ]) self.add_copy_spec("/etc/lvm") if self.get_option('lvmdump'): self.do_lvmdump() elif self.get_option('lvmdump-am'): self.do_lvmdump(metadata=True) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/monit.py0000644000175000017500000000537113203300002017225 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., # Pablo Iranzo Gomez # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin from glob import glob class Monit(Plugin, RedHatPlugin): """Monit monitoring daemon """ packages = ('monit',) profiles = ('system',) plugin_name = 'monit' # Define configuration files # FIXME: direct globs will fail in container environments. monit_conf = glob("/etc/monit.d/*") monit_conf.append("/etc/monit.conf") monit_conf.append("/etc/monitrc") # Define log files monit_log = ["/var/log/monit.log"] option_list = [] def setup(self): self.add_cmd_output("monit status") self.add_copy_spec(self.monit_log + self.monit_conf) def postproc(self): # Post process the files included to scrub any # password or other sensitive data # usernames and emails are cleaned to not disclose any # confidential data for file in self.monit_conf: # Remove username:password from files self.do_file_sub(file, r"allow (.*):(.*)", r"allow ********:********" ) self.do_file_sub(file, r"ALLOW (.*):(.*)", r"ALLOW ********:********" ) # Remove MAILSERVER username/password self.do_file_sub(file, r"username (\w)+", r"username ********" ) self.do_file_sub(file, r"password (\w)+", r"password ********" ) self.do_file_sub(file, r"USERNAME (\w)+", r"USERNAME ********" ) self.do_file_sub(file, r"PASSWORD (\w)+", r"PASSWORD ********" ) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/apache.py0000644000175000017500000000776513203300002017331 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Apache(Plugin): """Apache http daemon """ plugin_name = "apache" profiles = ('webserver', 'openshift') packages = ('httpd',) files = ('/var/www/',) option_list = [ ("log", "gathers all apache logs", "slow", False) ] def setup(self): # collect list of installed modules self.add_cmd_output(["apachectl -M"]) class RedHatApache(Apache, RedHatPlugin): files = ( '/etc/httpd/conf/httpd.conf', '/etc/httpd22/conf/httpd.conf', '/etc/httpd24/conf/httpd.conf' ) def setup(self): super(RedHatApache, self).setup() self.add_copy_spec([ "/etc/httpd/conf/httpd.conf", "/etc/httpd/conf.d/*.conf", "/etc/httpd/conf.modules.d/*.conf", # JBoss Enterprise Web Server 2.x "/etc/httpd22/conf/httpd.conf", "/etc/httpd22/conf.d/*.conf", # Red Hat JBoss Web Server 3.x "/etc/httpd24/conf/httpd.conf", "/etc/httpd24/conf.d/*.conf", "/etc/httpd24/conf.modules.d/*.conf", ]) self.add_forbidden_path("/etc/httpd/conf/password.conf") # determine how much logs to collect self.limit = None if self.get_option("all_logs") else 5 # collect only the current log set by default self.add_copy_spec("/var/log/httpd/access_log", self.limit) self.add_copy_spec("/var/log/httpd/error_log", self.limit) self.add_copy_spec("/var/log/httpd/ssl_access_log", self.limit) self.add_copy_spec("/var/log/httpd/ssl_error_log", self.limit) # JBoss Enterprise Web Server 2.x self.add_copy_spec("/var/log/httpd22/access_log", self.limit) self.add_copy_spec("/var/log/httpd22/error_log", self.limit) self.add_copy_spec("/var/log/httpd22/ssl_access_log", self.limit) self.add_copy_spec("/var/log/httpd22/ssl_error_log", self.limit) # Red Hat JBoss Web Server 3.x self.add_copy_spec("/var/log/httpd24/access_log", self.limit) self.add_copy_spec("/var/log/httpd24/error_log", self.limit) self.add_copy_spec("/var/log/httpd24/ssl_access_log", self.limit) self.add_copy_spec("/var/log/httpd24/ssl_error_log", self.limit) if self.get_option("log") or self.get_option("all_logs"): self.add_copy_spec([ "/var/log/httpd/*", # JBoss Enterprise Web Server 2.x "/var/log/httpd22/*", # Red Hat JBoss Web Server 3.x "/var/log/httpd24/*" ]) class DebianApache(Apache, DebianPlugin, UbuntuPlugin): files = ('/etc/apache2/apache2.conf',) def setup(self): super(DebianApache, self).setup() self.add_copy_spec([ "/etc/apache2/*", "/etc/default/apache2" ]) # determine how much logs to collect self.limit = None if self.get_option("all_logs") else 15 # collect only the current log set by default self.add_copy_spec("/var/log/apache2/access_log", self.limit) self.add_copy_spec("/var/log/apache2/error_log", self.limit) if self.get_option("log") or self.get_option("all_logs"): self.add_copy_spec("/var/log/apache2/*") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/gdm.py0000644000175000017500000000216513203300002016644 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Gdm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """GNOME display manager """ plugin_name = 'gdm' profiles = ('desktop',) packages = ('gdm',) def setup(self): self.add_copy_spec("/etc/gdm/*") self.add_journal(units="gdm") self.add_cmd_output("systemctl status gdm.service") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/block.py0000644000175000017500000000372213203300002017167 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Block(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Block device information """ plugin_name = 'block' profiles = ('storage', 'hardware') verify_packages = ('util-linux',) files = ('/sys/block',) def setup(self): self.add_cmd_output([ "lsblk", "lsblk -t", "blkid -c /dev/null", "blockdev --report", "ls -lanR /dev", "ls -lanR /sys/block" ]) # legacy location for non-/run distributions self.add_copy_spec([ "/etc/blkid.tab", "/run/blkid/blkid.tab", "/proc/partitions", "/proc/diskstats", "/sys/block/*/queue/scheduler" ]) if os.path.isdir("/sys/block"): for disk in os.listdir("/sys/block"): if disk.startswith("ram"): continue disk_path = os.path.join('/dev/', disk) self.add_cmd_output([ "udevadm info -ap /sys/block/%s" % (disk), "parted -s %s unit s print" % (disk_path), "fdisk -l %s" % disk_path ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/keepalived.py0000644000175000017500000000224613203300002020206 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Keepalived(Plugin, RedHatPlugin): """Keepalived routing server """ plugin_name = 'keepalived' profiles = ('webserver', 'network', 'cluster') packages = ('keepalived',) def setup(self): self.add_copy_spec([ "/etc/keepalived/keepalived.conf", "/etc/sysconfig/keepalived" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/lstopo.py0000644000175000017500000000310113203300002017404 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin from distutils.spawn import find_executable class Lstopo(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """lstopo / machine topology/numa node information """ plugin_name = "lstopo" profiles = ("system", "hardware") packages = ("hwloc-libs", ) def setup(self): # binary depends on particular package, both require hwloc-libs one # hwloc-gui provides lstopo command # hwloc provides lstopo-no-graphics command if find_executable("lstopo"): cmd = "lstopo" else: cmd = "lstopo-no-graphics" self.add_cmd_output("%s --whole-io --of console" % cmd, suggest_filename="lstopo.txt") self.add_cmd_output("%s --whole-io --of xml" % cmd, suggest_filename="lstopo.xml") sosreport-3.5/sos/plugins/pcp.py0000644000175000017500000001242713203300002016661 0ustar cariboucaribou# Copyright (C) 2014 Michele Baldessari # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin import os import os.path from socket import gethostname class Pcp(Plugin, RedHatPlugin, DebianPlugin): """Performance Co-Pilot data """ plugin_name = 'pcp' profiles = ('system', 'performance') packages = ('pcp',) pcp_conffile = '/etc/pcp.conf' # size-limit of PCP logger and manager data collected by default (MB) option_list = [ ("pcplogs", "size-limit in MB of pmlogger and pmmgr logs", "", 100), ] pcp_sysconf_dir = None pcp_var_dir = None pcp_log_dir = None pcp_hostname = '' def get_size(self, path): total_size = 0 for dirpath, dirnames, filenames in os.walk(path): for f in filenames: fp = os.path.join(dirpath, f) total_size += os.path.getsize(fp) return total_size def pcp_parse_conffile(self): try: pcpconf = open(self.pcp_conffile, "r") lines = pcpconf.readlines() pcpconf.close() except: return False env_vars = {} for line in lines: if line.startswith('#'): continue try: (key, value) = line.strip().split('=') env_vars[key] = value except: pass try: self.pcp_sysconf_dir = env_vars['PCP_SYSCONF_DIR'] self.pcp_var_dir = env_vars['PCP_VAR_DIR'] self.pcp_log_dir = env_vars['PCP_LOG_DIR'] except: # Fail if all three env variables are not found return False return True def setup(self): self.limit = (None if self.get_option("all_logs") else self.get_option("pcplogs")) if not self.pcp_parse_conffile(): self._log_warn("could not parse %s" % self.pcp_conffile) return # Add PCP_SYSCONF_DIR (/etc/pcp) and PCP_VAR_DIR (/var/lib/pcp/config) # unconditionally. Obviously if someone messes up their /etc/pcp.conf # in a ridiculous way (i.e. setting PCP_SYSCONF_DIR to '/') this will # break badly. var_conf_dir = os.path.join(self.pcp_var_dir, 'config') self.add_copy_spec([ self.pcp_sysconf_dir, self.pcp_conffile, var_conf_dir ]) # We explicitely avoid /var/lib/pcp/config/{pmchart,pmlogconf,pmieconf, # pmlogrewrite} as in 99% of the cases they are just copies from the # rpms. It does not make up for a lot of size but it contains many # files self.add_forbidden_path(os.path.join(var_conf_dir, 'pmchart')) self.add_forbidden_path(os.path.join(var_conf_dir, 'pmlogconf')) self.add_forbidden_path(os.path.join(var_conf_dir, 'pmieconf')) self.add_forbidden_path(os.path.join(var_conf_dir, 'pmlogrewrite')) # Take PCP_LOG_DIR/pmlogger/`hostname` + PCP_LOG_DIR/pmmgr/`hostname` # The *default* directory structure for pmlogger is the following: # Dir: PCP_LOG_DIR/pmlogger/HOST/ (we only collect the HOST data # itself) # - YYYYMMDD.HH.MM.{N,N.index,N.meta} N in [0,1,...] # - Latest # - pmlogger.{log,log.prior} # # Can be changed via configuration in PCP_SYSCONF_DIR/pmlogger/control # As a default strategy, collect up to 100MB data from each dir. # Can be overwritten either via pcp.pcplogsize option or all_logs. self.pcp_hostname = gethostname() # Make sure we only add the two dirs if hostname is set, otherwise # we would collect everything if self.pcp_hostname != '': for pmdir in ('pmlogger', 'pmmgr'): path = os.path.join(self.pcp_log_dir, pmdir, self.pcp_hostname) self.add_copy_spec(path, sizelimit=self.limit) self.add_copy_spec([ # Collect PCP_LOG_DIR/pmcd and PCP_LOG_DIR/NOTICES os.path.join(self.pcp_log_dir, 'pmcd'), os.path.join(self.pcp_log_dir, 'NOTICES*'), # Collect PCP_VAR_DIR/pmns os.path.join(self.pcp_var_dir, 'pmns'), # Also collect any other log and config files # (as suggested by fche) os.path.join(self.pcp_log_dir, '*/*.log*'), os.path.join(self.pcp_log_dir, '*/*/*.log*'), os.path.join(self.pcp_log_dir, '*/*/config*') ]) # Need to get the current status of the PCP infrastructure self.add_cmd_output("pcp") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/iprconfig.py0000644000175000017500000001112213203300002020046 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # This plugin enables collection of logs for Power systems import os import re from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin from sos.utilities import is_executable class IprConfig(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """IBM Power RAID storage adapter configuration information """ plugin_name = 'iprconfig' def check_enabled(self): arch = self.policy().get_arch() return "ppc64" in arch and is_executable("iprconfig") def setup(self): self.add_cmd_output([ "iprconfig -c show-config", "iprconfig -c show-alt-config", "iprconfig -c show-arrays", "iprconfig -c show-jbod-disks", "iprconfig -c show-ioas", ]) show_ioas = self.call_ext_prog("iprconfig -c show-ioas") if not show_ioas['status'] == 0: return devices = [] if show_ioas['output']: p = re.compile('sg') for line in show_ioas['output'].splitlines(): temp = line.split(' ') # temp[0] holds the device name if p.search(temp[0]): devices.append(temp[0]) for device in devices: self.add_cmd_output("iprconfig -c show-details %s" % (device,)) # Look for IBM Power RAID enclosures (iprconfig lists them) show_config = self.call_ext_prog("iprconfig -c show-config") if not show_config['status'] == 0: return if not show_config['output']: return # iprconfig -c show-config # Name PCI/SCSI Location Description Status # ------ ------------------------- ------------------------- ----------------- # 0005:60:00.0/0: PCI-E SAS RAID Adapter Operational # sda 0005:60:00.0/0:0:0:0 Physical Disk Active # sdb 0005:60:00.0/0:1:0:0 Physical Disk Active # sdc 0005:60:00.0/0:2:0:0 Physical Disk Active # sdd 0005:60:00.0/0:3:0:0 Physical Disk Active # sde 0005:60:00.0/0:4:0:0 Physical Disk Active # sdf 0005:60:00.0/0:5:0:0 Physical Disk Active # 0005:60:00.0/0:8:0:0 Enclosure Active # 0005:60:00.0/0:8:1:0 Enclosure Active show_alt_config = "iprconfig -c show-alt-config" altconfig = self.call_ext_prog(show_alt_config) if not (altconfig['status'] == 0): return if not altconfig['output']: return # iprconfig -c show-alt-config # Name Resource Path/Address Vendor Product ID Status # ------ -------------------------- -------- ---------------- ----------------- # sg9 0: IBM 57C7001SISIOA Operational # sg0 0:0:0:0 IBM MBF2300RC Active # sg1 0:1:0:0 IBM MBF2300RC Active # sg2 0:2:0:0 IBM HUC106030CSS600 Active # sg3 0:3:0:0 IBM HUC106030CSS600 Active # sg4 0:4:0:0 IBM HUC106030CSS600 Active # sg5 0:5:0:0 IBM HUC106030CSS600 Active # sg7 0:8:0:0 IBM VSBPD6E4A 3GSAS Active # sg8 0:8:1:0 IBM VSBPD6E4B 3GSAS Active for line in show_config['output'].splitlines(): if "Enclosure" in line: temp = re.split('\s+', line) # temp[1] holds the PCI/SCSI location pci, scsi = temp[1].split('/') for line in altconfig['output'].splitlines(): if scsi in line: temp = line.split(' ') # temp[0] holds device name self.add_cmd_output("iprconfig -c " "query-ses-mode %s" % (temp[0],)) sosreport-3.5/sos/plugins/jars.py0000644000175000017500000001260513203300002017034 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc., Michal Srb # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import hashlib import json import os import re import zipfile from functools import partial from sos.plugins import Plugin, RedHatPlugin class Jars(Plugin, RedHatPlugin): """Collect information about available Java archives.""" plugin_name = "jars" version = "1.0.0" profiles = ("java",) option_list = [ ("append_locations", "colon-separated list of additional JAR paths", "fast", ""), ("all_known_locations", "scan all known paths", "slow", False) ] # There is no standard location for JAR files and scanning # the whole filesystem could be very slow. Therefore we only # scan directories in which JARs can be typically found. jar_locations = ( "/usr/share/java", # common location for JARs "/usr/lib/java" # common location for JARs containing native code ) # Following paths can be optionally scanned as well. Note the scan can take # *very* long time. extra_jar_locations = ( "/opt", # location for RHSCL and 3rd party software "/usr/local", # used by sysadmins when installing SW locally "/var/lib" # Java services commonly explode WARs there ) def setup(self): results = {"jars": []} jar_paths = [] locations = list(Jars.jar_locations) if self.get_option("all_known_locations"): locations += list(Jars.extra_jar_locations) # append also user-defined locations, if any user_locations = self.get_option("append_locations") if user_locations: locations += user_locations.split(":") # find all JARs in given locations for location in locations: for dirpath, _, filenames in os.walk(location): for filename in filenames: path = os.path.join(dirpath, filename) if Jars.is_jar(path): jar_paths.append(path) # try to extract information about found JARs for jar_path in jar_paths: maven_id = Jars.get_maven_id(jar_path) jar_id = Jars.get_jar_id(jar_path) if maven_id or jar_id: record = {"path": jar_path, "sha1": jar_id, "maven_id": maven_id } results["jars"].append(record) results_str = json.dumps(results, indent=4, separators=(",", ": ")) self.add_string_as_file(results_str, "jars.json") @staticmethod def is_jar(path): """Check whether given file is a JAR file. JARs are ZIP files which usually include a manifest at the canonical location 'META-INF/MANIFEST.MF'. """ if os.path.isfile(path) and zipfile.is_zipfile(path): try: with zipfile.ZipFile(path) as f: if "META-INF/MANIFEST.MF" in f.namelist(): return True except (IOError, zipfile.BadZipfile): pass return False @staticmethod def get_maven_id(jar_path): """Extract Maven coordinates from a given JAR file, if possible. JARs build by Maven (most popular Java build system) contain 'pom.properties' file. We can extract Maven coordinates from there. """ props = {} try: with zipfile.ZipFile(jar_path) as f: r = re.compile("META-INF/maven/[^/]+/[^/]+/pom.properties$") result = [x for x in f.namelist() if r.match(x)] if len(result) != 1: return None with f.open(result[0]) as props_f: for line in props_f.readlines(): line = line.strip() if not line.startswith(b"#"): try: (key, value) = line.split(b"=") key = key.decode('utf8').strip() value = value.decode('utf8').strip() props[key] = value except ValueError: return None except IOError: pass return props @staticmethod def get_jar_id(jar_path): """Compute JAR id. Returns sha1 hash of a given JAR file. """ jar_id = "" try: with open(jar_path, mode="rb") as f: m = hashlib.sha1() for buf in iter(partial(f.read, 4096), b''): m.update(buf) jar_id = m.hexdigest() except IOError: pass return jar_id sosreport-3.5/sos/plugins/docker_distribution.py0000644000175000017500000000317413203300002022144 0ustar cariboucaribou# Copyright (C) 2017 Red Hat, Inc. Jake Hunsaker # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os class DockerDistribution(Plugin): """Docker Distribution""" plugin_name = "docker_distribution" def setup(self): self.add_copy_spec('/etc/docker-distribution/') self.add_journal('docker-distribution') if os.path.exists('/etc/docker-distribution/registry/config.yml'): with open('/etc/docker-distribution/registry/config.yml') as f: for line in f: if 'rootdirectory' in line: loc = line.split()[1] self.add_cmd_output('tree ' + loc) class RedHatDockerDistribution(DockerDistribution, RedHatPlugin): packages = ('docker-distribution',) def setup(self): self.add_forbidden_path('/etc/docker-distribution/registry/*passwd') super(RedHatDockerDistribution, self).setup() sosreport-3.5/sos/plugins/logs.py0000644000175000017500000001027313203300002017040 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Logs(Plugin): """System logs""" plugin_name = "logs" profiles = ('system', 'hardware', 'storage') def setup(self): self.add_copy_spec([ "/etc/syslog.conf", "/etc/rsyslog.conf", "/etc/rsyslog.d" ]) self.limit = (None if self.get_option("all_logs") else self.get_option("log_size")) self.add_copy_spec("/var/log/boot.log", sizelimit=self.limit) self.add_copy_spec("/var/log/cloud-init*", sizelimit=self.limit) self.add_journal(boot="this") self.add_journal(boot="this", allfields=True, output="verbose") self.add_cmd_output("journalctl --disk-usage") if self.get_option('all_logs'): syslog_conf = self.join_sysroot("/etc/syslog.conf") logs = self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+", syslog_conf) if self.is_installed("rsyslog") \ or os.path.exists("/etc/rsyslog.conf"): rsyslog_conf = self.join_sysroot("/etc/rsyslog.conf") logs += self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+", rsyslog_conf) for i in logs: if i.startswith("-"): i = i[1:] if os.path.isfile(i): self.add_copy_spec(i, sizelimit=self.limit) def postproc(self): self.do_path_regex_sub( r"/etc/rsyslog*", r"ActionLibdbiPassword (.*)", r"ActionLibdbiPassword [********]" ) self.do_path_regex_sub( r"/etc/rsyslog*", r"pwd=.*", r"pwd=[******]" ) class RedHatLogs(Logs, RedHatPlugin): option_list = [ ("log_days", "the number of days logs to collect", "", 3) ] def setup(self): super(RedHatLogs, self).setup() messages = "/var/log/messages" self.add_copy_spec("/var/log/secure*", sizelimit=self.limit) self.add_copy_spec(messages + "*", sizelimit=self.limit) # collect three days worth of logs by default if the system is # configured to use the journal and not /var/log/messages if not os.path.exists(messages) and self.is_installed("systemd"): try: days = int(self.get_option("log_days")) except: days = 3 if self.get_option("all_logs"): since = "" else: since = "-%ddays" % days self.add_journal(since=since) class DebianLogs(Logs, DebianPlugin, UbuntuPlugin): def setup(self): super(DebianLogs, self).setup() if not self.get_option("all_logs"): self.add_copy_spec("/var/log/syslog", sizelimit=self.limit) self.add_copy_spec("/var/log/syslog.1", sizelimit=self.limit) self.add_copy_spec("/var/log/kern.log", sizelimit=self.limit) self.add_copy_spec("/var/log/kern.log.1", sizelimit=self.limit) self.add_copy_spec("/var/log/udev", sizelimit=self.limit) self.add_copy_spec("/var/log/dist-upgrade", sizelimit=self.limit) self.add_copy_spec("/var/log/installer", sizelimit=self.limit) self.add_copy_spec("/var/log/unattended-upgrades", sizelimit=self.limit) self.add_cmd_output('ls -alRh /var/log/') else: self.add_copy_spec("/var/log/") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/__pycache__/0000755000175000017500000000000013203254631017747 5ustar cariboucaribousosreport-3.5/sos/plugins/corosync.py0000644000175000017500000000510613203300002017732 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os.path import re class Corosync(Plugin): """ Corosync cluster engine """ plugin_name = "corosync" profiles = ('cluster',) packages = ('corosync',) def setup(self): self.add_copy_spec([ "/etc/corosync", "/var/lib/corosync/fdata", "/var/log/cluster/corosync.log" ]) self.add_cmd_output([ "corosync-quorumtool -l", "corosync-quorumtool -s", "corosync-cpgtool", "corosync-cfgtool -s", "corosync-blackbox", "corosync-objctl -a", "corosync-cmapctl" ]) self.call_ext_prog("killall -USR2 corosync") corosync_conf = "/etc/corosync/corosync.conf" if not os.path.exists(corosync_conf): return # collect user-defined logfiles, matching either of pattern: # log_size: filename # or # logging.log_size: filename # (it isnt precise but sufficient) pattern = '^\s*(logging.)?logfile:\s*(\S+)$' try: with open("/etc/corosync/corosync.conf") as f: for line in f: if re.match(pattern, line): self.add_copy_spec(re.search(pattern, line).group(2)) except IOError as e: self._log_warn("could not read from %s: %s", corosync_conf, e) def postproc(self): self.do_cmd_output_sub( "corosync-objctl", r"(.*fence.*\.passwd=)(.*)", r"\1******" ) class RedHatCorosync(Corosync, RedHatPlugin): def setup(self): super(RedHatCorosync, self).setup() class DebianCorosync(Corosync, DebianPlugin, UbuntuPlugin): def setup(self): super(DebianCorosync, self).setup() files = ('/usr/sbin/corosync',) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/salt.py0000644000175000017500000000245713203300002017044 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin class Salt(Plugin, RedHatPlugin, DebianPlugin): """Salt """ plugin_name = 'salt' profiles = ('sysmgmt',) packages = ('salt',) def setup(self): all_logs = self.get_option("all_logs") limit = self.get_option("log_size") if not all_logs: self.add_copy_spec("/var/log/salt/minion", sizelimit=limit) else: self.add_copy_spec("/var/log/salt", sizelimit=limit) self.add_copy_spec("/etc/salt") self.add_forbidden_path("/etc/salt/pki/*/*.pem") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/apparmor.py0000644000175000017500000000263413203300002017717 0ustar cariboucaribou# Copyright (c) 2012 Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin class Apparmor(Plugin, UbuntuPlugin): """Apparmor mandatory access control """ plugin_name = 'apparmor' profiles = ('security',) def setup(self): self.add_copy_spec([ "/etc/apparmor*" ]) self.add_forbidden_path("/etc/apparmor.d/cache") self.add_forbidden_path("/etc/apparmor.d/libvirt/libvirt*") self.add_forbidden_path("/etc/apparmor.d/abstractions") self.add_cmd_output([ "apparmor_status", "ls -alh /etc/apparmor.d/abstractions", "ls -alh /etc/apparmor.d/libvirt", ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/pam.py0000644000175000017500000000303113203300002016643 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Pam(Plugin): """Pluggable Authentication Modules """ plugin_name = "pam" profiles = ('security', 'identity', 'system') verify_packages = ('pam_.*',) security_libs = "" def setup(self): self.add_copy_spec([ "/etc/pam.d", "/etc/security" ]) self.add_cmd_output([ "ls -lanF %s" % self.security_libs, "pam_tally2", "faillock" ]) class RedHatPam(Pam, RedHatPlugin): security_libs = "/lib*/security" def setup(self): super(RedHatPam, self).setup() class DebianPam(Pam, DebianPlugin, UbuntuPlugin): security_libs = "/lib/x86_64-linux-gnu/security" def setup(self): super(DebianPam, self).setup() # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ceph.py0000644000175000017500000000574413203300002017022 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin class Ceph(Plugin, RedHatPlugin, UbuntuPlugin): """CEPH distributed storage """ plugin_name = 'ceph' profiles = ('storage', 'virt') packages = ( 'ceph', 'ceph-mds', 'ceph-common', 'libcephfs1', 'ceph-fs-common', 'calamari-server', 'librados2' ) def setup(self): all_logs = self.get_option("all_logs") limit = self.get_option("log_size") if not all_logs: self.add_copy_spec([ "/var/log/ceph/*.log", "/var/log/radosgw/*.log", "/var/log/calamari/*.log" ], sizelimit=limit) else: self.add_copy_spec([ "/var/log/ceph/", "/var/log/calamari", "/var/log/radosgw" ], sizelimit=limit) self.add_copy_spec([ "/etc/ceph/", "/etc/calamari/", "/var/lib/ceph/", "/var/run/ceph/" ]) self.add_cmd_output([ "ceph status", "ceph health detail", "ceph osd tree", "ceph osd stat", "ceph osd dump", "ceph mon stat", "ceph mon dump", "ceph df", "ceph report", "ceph osd df tree", "ceph fs dump --format json-pretty", "ceph fs ls", "ceph pg dump", "ceph health detail --format json-pretty", "ceph osd crush show-tunables", "ceph-disk list" ]) self.add_forbidden_path("/etc/ceph/*keyring*") self.add_forbidden_path("/var/lib/ceph/*keyring*") self.add_forbidden_path("/var/lib/ceph/*/*keyring*") self.add_forbidden_path("/var/lib/ceph/*/*/*keyring*") self.add_forbidden_path("/var/lib/ceph/osd/*") self.add_forbidden_path("/var/lib/ceph/mon/*") # Excludes temporary ceph-osd mount location like # /var/lib/ceph/tmp/mnt.XXXX from sos collection. # In the /var/lib/ceph/tmp/ can still other files of potential # interest exists, so exclude only known temporary mount locations. self.add_forbidden_path("/var/lib/ceph/tmp/*mnt*") self.add_forbidden_path("/etc/ceph/*bindpass*") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/keyutils.py0000644000175000017500000000232713203300002017746 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Keyutils(Plugin, RedHatPlugin): """Kernel key ring """ plugin_name = 'keyutils' profiles = ('system', 'kernel', 'security', 'storage') packages = ('keyutils',) def setup(self): self.add_copy_spec([ "/etc/request-key.conf", "/etc/request-key.d", "/proc/key-users" ]) self.add_cmd_output("keyctl show") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_sahara.py0000644000175000017500000000623413203300002021404 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc.,Poornima M. Kshirsagar # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenStackSahara(Plugin): """OpenStack Sahara""" plugin_name = 'openstack_sahara' profiles = ('openstack', 'openstack_controller') option_list = [] var_puppet_gen = "/var/lib/config-data/puppet-generated/sahara" def setup(self): self.add_copy_spec([ "/etc/sahara/", self.var_puppet_gen + "/etc/sahara/" ]) self.add_journal(units="openstack-sahara-all") self.add_journal(units="openstack-sahara-api") self.add_journal(units="openstack-sahara-engine") self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/sahara/", "/var/log/containers/sahara/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/sahara/*.log", "/var/log/containers/sahara/*.log" ], sizelimit=self.limit) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) def postproc(self): protect_keys = [ "admin_password", "memcache_secret_key", "password", "qpid_password", "rabbit_password", "ssl_key_password", "xenapi_connection_password", "connection" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/sahara/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/sahara/*", regexp, r"\1*********" ) class DebianSahara(OpenStackSahara, DebianPlugin, UbuntuPlugin): """OpenStackSahara related information for Debian based distributions.""" packages = ( 'sahara-api', 'sahara-common', 'sahara-engine', 'python-sahara', 'python-saharaclient', ) def setup(self): super(DebianSahara, self).setup() class RedHatSahara(OpenStackSahara, RedHatPlugin): """OpenStack sahara related information for Red Hat distributions.""" packages = ( 'openstack-sahara', 'openstack-sahara-api', 'openstack-sahara-engine', 'python-saharaclient' ) def setup(self): super(RedHatSahara, self).setup() self.add_copy_spec("/etc/sudoers.d/sahara*") # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/networking.py0000644000175000017500000003574513203300002020276 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin import os import re class Networking(Plugin): """network and device configuration """ plugin_name = "networking" profiles = ('network', 'hardware', 'system') trace_host = "www.example.com" option_list = [( ("traceroute", "collect a traceroute to %s" % trace_host, "slow", False) )] # switch to enable netstat "wide" (non-truncated) output mode ns_wide = "-W" def get_bridge_name(self, brctl_file): """Return a list for which items are bridge name according to the output of brctl show stored in brctl_file. """ out = [] try: brctl_out = open(brctl_file).read() except: return out for line in brctl_out.splitlines(): if line.startswith("bridge name") \ or line.isspace() \ or line[:1].isspace(): continue br_name, br_rest = line.split(None, 1) out.append(br_name) return out def get_eth_interfaces(self, ip_link_out): """Return a dictionary for which keys are ethernet interface names taken from the output of "ip -o link". """ out = {} for line in ip_link_out.splitlines(): match = re.match('.*link/ether', line) if match: iface = match.string.split(':')[1].lstrip() out[iface] = True return out def get_ip_netns(self, ip_netns_file): """Returns a list for which items are namespaces in the output of ip netns stored in the ip_netns_file. """ out = [] try: ip_netns_out = open(ip_netns_file).read() except: return out for line in ip_netns_out.splitlines(): # If there's no namespaces, no need to continue if line.startswith("Object \"netns\" is unknown") \ or line.isspace() \ or line[:1].isspace(): return out out.append(line.partition(' ')[0]) return out def get_netns_devs(self, namespace): """Returns a list for which items are devices that exist within the provided namespace. """ ip_link_result = self.call_ext_prog("ip netns exec " + namespace + " ip -o link") dev_list = [] if ip_link_result['status'] == 0: for eth in self.get_eth_interfaces(ip_link_result['output']): dev = eth.replace('@NONE', '') dev_list.append(dev) return dev_list def collect_iptable(self, tablename): """ When running the iptables command, it unfortunately auto-loads the modules before trying to get output. Some people explicitly don't want this, so check if the modules are loaded before running the command. If they aren't loaded, there can't possibly be any relevant rules in that table """ modname = "iptable_"+tablename if self.check_ext_prog("grep -q %s /proc/modules" % modname): cmd = "iptables -t "+tablename+" -nvL" self.add_cmd_output(cmd) def collect_ip6table(self, tablename): """ Same as function above, but for ipv6 """ modname = "ip6table_"+tablename if self.check_ext_prog("grep -q %s /proc/modules" % modname): cmd = "ip6tables -t "+tablename+" -nvL" self.add_cmd_output(cmd) def collect_nftables(self): """ Collects nftables rulesets with 'nft' commands if the modules are present """ if self.check_ext_prog("grep -q nf_tables /proc/modules"): self.add_cmd_output("nft list ruleset") def setup(self): super(Networking, self).setup() self.add_copy_spec([ "/proc/net/", "/etc/nsswitch.conf", "/etc/yp.conf", "/etc/inetd.conf", "/etc/xinetd.conf", "/etc/xinetd.d", "/etc/host*", "/etc/resolv.conf", "/etc/network*", "/etc/NetworkManager/NetworkManager.conf", "/etc/NetworkManager/system-connections", "/etc/nftables", "/etc/sysconfig/nftables.conf", "/etc/nftables.conf", "/etc/dnsmasq*", "/sys/class/net/*/flags", "/etc/iproute2" ]) self.add_forbidden_path("/proc/net/rpc/use-gss-proxy") self.add_forbidden_path("/proc/net/rpc/*/channel") self.add_forbidden_path("/proc/net/rpc/*/flush") # Cisco CDP self.add_forbidden_path("/proc/net/cdp") self.add_forbidden_path("/sys/net/cdp") # Dialogic Diva self.add_forbidden_path("/proc/net/eicon") self.add_cmd_output("ip -o addr", root_symlink="ip_addr") self.add_cmd_output("route -n", root_symlink="route") self.add_cmd_output("plotnetcfg") # collect iptables -t for any existing table, if we can't read the # tables, collect 3 default ones (nat, mangle, filter) try: ip_tables_names = open("/proc/net/ip_tables_names").read() except: ip_tables_names = "nat\nmangle\nfilter\n" for table in ip_tables_names.splitlines(): self.collect_iptable(table) # collect the same for ip6tables try: ip_tables_names = open("/proc/net/ip6_tables_names").read() except: ip_tables_names = "nat\nmangle\nfilter\n" for table in ip_tables_names.splitlines(): self.collect_ip6table(table) self.collect_nftables() self.add_cmd_output("netstat %s -neopa" % self.ns_wide, root_symlink="netstat") self.add_cmd_output([ "netstat -s", "netstat %s -agn" % self.ns_wide, "ss -peaonmi", "ip route show table all", "ip -6 route show table all", "ip -4 rule", "ip -6 rule", "ip -s -d link", "ip -d address", "ifenslave -a", "ip mroute show", "ip maddr show", "ip neigh show", "ip neigh show nud noarp", "biosdevname -d", "tc -s qdisc show", "ip -s macsec show", ]) # When iptables is called it will load the modules # iptables and iptables_filter if they are not loaded. # The same goes for ipv6. if self.check_ext_prog("grep -q iptable_filter /proc/modules"): self.add_cmd_output("iptables -vnxL") if self.check_ext_prog("grep -q ip6table_filter /proc/modules"): self.add_cmd_output("ip6tables -vnxL") # There are some incompatible changes in nmcli since # the release of NetworkManager >= 0.9.9. In addition, # NetworkManager >= 0.9.9 will use the long names of # "nmcli" objects. # All versions conform to the following templates with differnt # strings for the object being operated on. nmcli_con_details_template = "nmcli con %s id" nmcli_dev_details_template = "nmcli dev %s" # test NetworkManager status for the specified major version def test_nm_status(version=1): status_template = "nmcli --terse --fields RUNNING %s status" obj_table = [ "nm", # < 0.9.9 "general" # >= 0.9.9 ] status = self.call_ext_prog(status_template % obj_table[version]) return status['output'].lower().startswith("running") # NetworkManager >= 0.9.9 (Use short name of objects for nmcli) if test_nm_status(version=1): self.add_cmd_output([ "nmcli general status", "nmcli con", "nmcli con show --active", "nmcli dev"]) nmcli_con_details_cmd = nmcli_con_details_template % "show" nmcli_dev_details_cmd = nmcli_dev_details_template % "show" # NetworkManager < 0.9.9 (Use short name of objects for nmcli) elif test_nm_status(version=0): self.add_cmd_output([ "nmcli nm status", "nmcli con", "nmcli con status", "nmcli dev"]) nmcli_con_details_cmd = nmcli_con_details_template % "list id" nmcli_dev_details_cmd = nmcli_dev_details_template % "list iface" # No grokkable NetworkManager version present else: nmcli_con_details_cmd = "" nmcli_dev_details_cmd = "" if len(nmcli_con_details_cmd) > 0: nmcli_con_show_result = self.call_ext_prog( "nmcli --terse --fields NAME con") if nmcli_con_show_result['status'] == 0: for con in nmcli_con_show_result['output'].splitlines(): if con[0:7] == 'Warning': continue # nm names may contain embedded quotes (" and '). These # will cause an exception in shlex.split() if the quotes # are unbalanced. This may happen with names like: # "Foobar's Wireless Network". Although the problen will # occur for both single and double quote characters the # former is considerably more likely in object names since # it is syntactically valid in many human languages. # # Reverse the normal sos quoting convention here and place # double quotes around the innermost quoted string. self.add_cmd_output('%s "%s"' % (nmcli_con_details_cmd, con)) nmcli_dev_status_result = self.call_ext_prog( "nmcli --terse --fields DEVICE dev") if nmcli_dev_status_result['status'] == 0: for dev in nmcli_dev_status_result['output'].splitlines(): if dev[0:7] == 'Warning': continue # See above comment describing quoting conventions. self.add_cmd_output('%s "%s"' % (nmcli_dev_details_cmd, dev)) # Get ethtool output for every device that does not exist in a # namespace. ip_link_result = self.call_ext_prog("ip -o link") if ip_link_result['status'] == 0: for dev in self.get_eth_interfaces(ip_link_result['output']): eth = dev.replace('@NONE', '') self.add_cmd_output([ "ethtool "+eth, "ethtool -d "+eth, "ethtool -i "+eth, "ethtool -k "+eth, "ethtool -S "+eth, "ethtool -T "+eth, "ethtool -a "+eth, "ethtool -c "+eth, "ethtool -g "+eth ]) # brctl command will load bridge and related kernel modules # if those modules are not loaded at the time of brctl command running # This behaviour causes an unexpected configuration change for system. # sosreport should aovid such situation. if self.is_module_loaded("bridge"): brctl_file = self.get_cmd_output_now("brctl show") if brctl_file: for br_name in self.get_bridge_name(brctl_file): self.add_cmd_output([ "brctl showstp "+br_name, "brctl showmacs "+br_name ]) if self.get_option("traceroute"): self.add_cmd_output("/bin/traceroute -n %s" % self.trace_host) # Capture additional data from namespaces; each command is run # per-namespace. ip_netns_file = self.get_cmd_output_now("ip netns") cmd_prefix = "ip netns exec " if ip_netns_file: for namespace in self.get_ip_netns(ip_netns_file): self.add_cmd_output([ cmd_prefix + namespace + " ip address show", cmd_prefix + namespace + " ip route show table all", cmd_prefix + namespace + " iptables-save", cmd_prefix + namespace + " ss -peaonmi" ]) # Devices that exist in a namespace use less ethtool # parameters. Run this per namespace. for namespace in self.get_ip_netns(ip_netns_file): for eth in self.get_netns_devs(namespace): ns_cmd_prefix = cmd_prefix + namespace + " " self.add_cmd_output([ ns_cmd_prefix + "ethtool " + eth, ns_cmd_prefix + "ethtool -i " + eth, ns_cmd_prefix + "ethtool -k " + eth, ns_cmd_prefix + "ethtool -S " + eth ]) return def postproc(self): for root, dirs, files in os.walk( "/etc/NetworkManager/system-connections"): for net_conf in files: self.do_file_sub( "/etc/NetworkManager/system-connections/"+net_conf, r"psk=(.*)", r"psk=***") class RedHatNetworking(Networking, RedHatPlugin): trace_host = "rhn.redhat.com" def setup(self): # Handle change from -T to -W in Red Hat netstat 2.0 and greater. try: netstat_pkg = self.policy().package_manager.all_pkgs()['net-tools'] # major version if int(netstat_pkg['version'][0]) < 2: self.ns_wide = "-T" except: # default to upstream option pass super(RedHatNetworking, self).setup() class UbuntuNetworking(Networking, UbuntuPlugin, DebianPlugin): trace_host = "archive.ubuntu.com" def setup(self): super(UbuntuNetworking, self).setup() self.add_copy_spec([ "/etc/resolvconf", "/etc/network/interfaces", "/etc/network/interfaces.d", "/etc/ufw", "/var/log/ufw.Log", "/etc/resolv.conf" ]) self.add_cmd_output([ "/usr/sbin/ufw status", "/usr/sbin/ufw app list" ]) if self.get_option("traceroute"): self.add_cmd_output("/usr/sbin/traceroute -n %s" % self.trace_host) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/qpid_dispatch.py0000644000175000017500000000460713203300002020714 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., Pavel Moravec # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin from socket import gethostname class QpidDispatch(Plugin, RedHatPlugin): """Qpid dispatch router """ plugin_name = 'qpid_dispatch' profiles = ('services',) packages = ('qdrouterd', 'qpid-dispatch-tools', 'qpid-dispatch-router') option_list = [("port", "listening port to connect to", '', ""), ("ssl-certificate", "Path to file containing client SSL certificate", '', ""), ("ssl-key", "Path to file containing client SSL private key", '', ""), ("ssl-trustfile", "trusted CA database file", '', "")] def setup(self): """ performs data collection for qpid dispatch router """ options = "" if self.get_option("port"): options = (options + " -b " + gethostname() + ":%s" % (self.get_option("port"))) # gethostname() is due to DISPATCH-156 # for either present option, add --option=value to 'options' variable for option in ["ssl-certificate", "ssl-key", "ssl-trustfile"]: if self.get_option(option): options = (options + " --%s=" % (option) + self.get_option(option)) self.add_cmd_output([ "qdstat -a" + options, # Show Router Addresses "qdstat -n" + options, # Show Router Nodes "qdstat -c" + options, # Show Connections "qdstat -m" + options # Show Broker Memory Stats ]) self.add_copy_spec([ "/etc/qpid-dispatch/qdrouterd.conf" ]) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/openstack_swift.py0000644000175000017500000000660313203300002021301 0ustar cariboucaribou# Copyright (C) 2013 Red Hat, Inc., Flavio Percoco # Copyright (C) 2012 Rackspace US, Inc., # Justin Shepherd # Copyright (C) 2009 Red Hat, Inc., Joey Boggs # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenStackSwift(Plugin): """OpenStack Swift""" plugin_name = "openstack_swift" profiles = ('openstack', 'openstack_controller') option_list = [] var_puppet_gen = "/var/lib/config-data/puppet-generated" def setup(self): self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/swift/", "/var/log/containers/swift/", "/var/log/containers/httpd/swift-proxy/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/swift/*.log", "/var/log/containers/swift/*.log", "/var/log/containers/httpd/swift-proxy/*log" ], sizelimit=self.limit) self.add_copy_spec([ "/etc/swift/", self.var_puppet_gen + "/swift/etc/*", self.var_puppet_gen + "/swift/etc/swift/*", self.var_puppet_gen + "/swift/etc/xinetd.d/*", self.var_puppet_gen + "/memcached/etc/sysconfig/memcached" ]) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) def postproc(self): protect_keys = [ "ldap_dns_password", "neutron_admin_password", "rabbit_password", "qpid_password", "powervm_mgr_passwd", "virtual_power_host_pass", "xenapi_connection_password", "password", "host_password", "vnc_password", "connection", "sql_connection", "admin_password" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/swift/.*\.conf.*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/swift/etc/swift/.*\.conf.*", regexp, r"\1*********" ) class DebianSwift(OpenStackSwift, DebianPlugin, UbuntuPlugin): packages = ( 'swift', 'swift-account', 'swift-container', 'swift-object', 'swift-proxy', 'swauth', 'python-swift', 'python-swauth' ) class RedHatSwift(OpenStackSwift, RedHatPlugin): packages = ( 'openstack-swift', 'openstack-swift-account', 'openstack-swift-container', 'openstack-swift-object', 'openstack-swift-proxy', 'swift', 'python-swiftclient' ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openshift.py0000644000175000017500000001554113203300002020076 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os.path # This plugin handles OpenShift Enterprise versions up to 2.x # which are based in the upstream code of OpenShift Origin M4 # located here: https://github.com/openshift/origin-server # # For later of OpenShift Origin based on: https://github.com/openshift/origin # like OpenShift Enterprise 3.x see the origin.py plugin class Openshift(Plugin, RedHatPlugin): '''Openshift 2.x node and broker''' plugin_name = "openshift" profiles = ('virt', 'openshift') # The 'broker' and 'node' options are obsolete but are maintained # here for compatibility with external programs that call sosreport # with these names. option_list = [("broker", "Gathers broker specific files", "slow", False), ("node", "Gathers node specific files", "slow", False)] ruby = "ruby193" vendor = "rh" mco_config_dir = "/opt/%s/%s/root/etc/mcollective" % (vendor, ruby) gear_base_dir = "/var/lib/openshift" node_settings_dir = os.path.join(gear_base_dir, ".settings") node_proxy_dir = os.path.join(gear_base_dir, ".httpd.d") httpd_config_dir = "/etc/httpd/conf.d" def is_broker(self): return os.path.exists("/etc/openshift/broker.conf") def is_node(self): return os.path.exists("/etc/openshift/node.conf") def setup(self): self.add_copy_spec([ "/etc/openshift-enterprise-release", "/var/log/openshift", "/etc/openshift/*.conf", "/etc/openshift/upgrade", ]) self.add_cmd_output("oo-diagnostics -v") if self.is_broker(): self.add_copy_spec([ "/etc/openshift/quickstarts.json", "/etc/openshift/plugins.d/*.conf", os.path.join(self.mco_config_dir, "client.cfg"), "/var/www/openshift/broker/httpd/httpd.conf", "/var/www/openshift/broker/httpd/conf.d/*.conf", "/var/www/openshift/console/httpd/httpd.conf", "/var/www/openshift/console/httpd/conf.d/*.conf", ]) self.add_cmd_output([ "oo-accept-broker -v", "oo-admin-chk -v", "oo-mco ping", ]) if self.is_node(): self.add_copy_spec([ "/etc/openshift/node-plugins.d/*.conf", "/etc/openshift/cart.conf.d", "/etc/openshift/iptables.*.rules", "/etc/openshift/env", os.path.join(self.httpd_config_dir, "openshift-vhost-logconf.include"), os.path.join(self.httpd_config_dir, "openshift-http-vhost.include"), os.path.join(self.httpd_config_dir, "openshift_restorer.include"), os.path.join(self.mco_config_dir, "server.cfg"), os.path.join(self.mco_config_dir, "facts.yaml"), os.path.join(self.node_settings_dir, "district.info"), os.path.join(self.node_proxy_dir, "*.conf"), os.path.join(self.node_proxy_dir, "aliases.txt"), os.path.join(self.node_proxy_dir, "nodes.txt"), os.path.join(self.node_proxy_dir, "idler.txt"), os.path.join(self.node_proxy_dir, "sts.txt"), os.path.join(self.node_proxy_dir, "routes.json"), os.path.join(self.node_proxy_dir, "geardb.json"), os.path.join(self.node_proxy_dir, "sniproxy.json"), "/var/log/httpd/openshift_log", "/var/log/mcollective.log", "/var/log/node-web-proxy/access.log", "/var/log/node-web-proxy/error.log", "/var/log/node-web-proxy/websockets.log", "/var/log/node-web-proxy/supervisor.log", ]) self.add_cmd_output([ "oo-accept-node -v", "oo-admin-ctl-gears list", "ls -laZ %s" % self.gear_base_dir, "ls -la %s" % self.node_proxy_dir ]) def postproc(self): # Redact broker's MongoDB credentials: # MONGO_PASSWORD="PasswordForOpenshiftUser" self.do_file_sub('/etc/openshift/broker.conf', r"(MONGO_PASSWORD\s*=\s*)(.*)", r"\1*******") # Redact session SHA keys: # SESSION_SECRET=0c31...a7c8 self.do_file_sub('/etc/openshift/broker.conf', r"(SESSION_SECRET\s*=\s*)(.*)", r"\1*******") self.do_file_sub('/etc/openshift/console.conf', r"(SESSION_SECRET\s*=\s*)(.*)", r"\1*******") # Redact passwords of the form: # plugin.activemq.pool.1.password = Pa$sW0Rd self.do_file_sub(os.path.join(self.mco_config_dir, "server.cfg"), r"(.*password\s*=\s*)\S+", r"\1********") self.do_file_sub(os.path.join(self.mco_config_dir, "client.cfg"), r"(.*password\s*=\s*)\S+", r"\1********") # Redact DNS plugin credentials # Dynect DNS: DYNECT_PASSWORD=s0ME-p4$_w0RD._ plugin_dir = '/etc/openshift/plugins.d/' self.do_file_sub(plugin_dir + 'openshift-origin-dns-dynect.conf', r"(DYNECT_PASSWORD\s*=\s*)(.*)", r"\1********") # Fog cloud: FOG_RACKSPACE_API_KEY="apikey" self.do_file_sub(plugin_dir + 'openshift-origin-dns-fog.conf', r"(FOG_RACKSPACE_API_KEY\s*=\s*)(.*)", r"\1********") # ISC bind: BIND_KEYVALUE="rndc key" self.do_file_sub(plugin_dir + 'openshift-origin-dns-nsupdate.conf', r"(BIND_KEYVALUE\s*=\s*)(.*)", r"\1********") # LDAP authentication: AuthLDAPBindPassword "IShouldNotBeHere" ldap_paths = '/var/www/openshift/(broker|console)/httpd/conf.d/.*' self.do_path_regex_sub(ldap_paths, r"(AuthLDAPBindPassword)\s*(.*)", r"\1********") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/processor.py0000644000175000017500000000306413203300002020113 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Processor(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """CPU information """ plugin_name = 'processor' profiles = ('system', 'hardware', 'memory') files = ('/proc/cpuinfo',) packages = ('cpufreq-utils', 'cpuid') def setup(self): self.add_copy_spec([ "/proc/cpuinfo", "/sys/class/cpuid", "/sys/devices/system/cpu" ]) self.add_cmd_output([ "lscpu", "cpupower info", "cpupower idle-info", "cpupower frequency-info", "cpufreq-info", "cpuid", "cpuid -r", "turbostat --debug sleep 10" ]) if '86' in self.policy().get_arch(): self.add_cmd_output("x86info -a") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ubuntu.py0000644000175000017500000000236313203300002017417 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin class Ubuntu(Plugin, UbuntuPlugin): """ Ubuntu specific information """ plugin_name = 'ubuntu' profiles = ('system',) option_list = [ ('support-show-all', 'Show all packages with their status', '', False), ] def setup(self): cmd = ["ubuntu-support-status"] if self.get_option('support-show-all'): cmd.append("--show-all") self.add_cmd_output(" ".join(cmd), suggest_filename='ubuntu-support-status.txt') sosreport-3.5/sos/plugins/puppet.py0000644000175000017500000000263213203300002017411 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin from glob import glob class Puppet(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Puppet service """ plugin_name = 'puppet' profiles = ('services',) def setup(self): self.add_copy_spec([ "/etc/puppet/*.conf", "/etc/puppet/rack/*", "/etc/puppet/manifests/*", "/var/log/puppet/*.log", ]) def postproc(self): for device_conf in glob("/etc/puppet/device.conf*"): self.do_file_sub( device_conf, r"(.*url*.ssh://.*:).*(@.*)", r"\1%s\2" % ('***') ) return # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/kdump.py0000644000175000017500000000277613203300002017225 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class KDump(Plugin): """Kdump crash dumps """ plugin_name = "kdump" profiles = ('system', 'debug') def setup(self): self.add_copy_spec([ "/proc/cmdline" ]) class RedHatKDump(KDump, RedHatPlugin): files = ('/etc/kdump.conf',) packages = ('kexec-tools',) def setup(self): self.add_copy_spec([ "/etc/kdump.conf", "/etc/udev/rules.d/*kexec.rules", "/var/crash/*/vmcore-dmesg.txt" ]) class DebianKDump(KDump, DebianPlugin, UbuntuPlugin): files = ('/etc/default/kdump-tools',) packages = ('kdump-tools',) def setup(self): self.add_copy_spec([ "/etc/default/kdump-tools" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/systemtap.py0000644000175000017500000000236513203300002020130 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Eugene Teo # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class SystemTap(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """SystemTap dynamic instrumentation """ plugin_name = 'systemtap' profiles = ('debug', 'performance') files = ('stap',) packages = ('systemtap', 'systemtap-runtime') def setup(self): self.add_cmd_output([ "stap -V 2", "uname -r", "stap-report" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/radius.py0000644000175000017500000000333313203300002017362 0ustar cariboucaribou# Copyright (C) 2007 Navid Sheikhol-Eslami # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Radius(Plugin): """RADIUS service information """ plugin_name = "radius" profiles = ('network', 'identity') packages = ('freeradius',) class RedHatRadius(Radius, RedHatPlugin): files = ('/etc/raddb',) def setup(self): super(RedHatRadius, self).setup() self.add_copy_spec([ "/etc/raddb", "/etc/pam.d/radiusd", "/var/log/radius" ]) def postproc(self): self.do_file_sub( "/etc/raddb/sql.conf", r"(\s*password\s*=\s*)\S+", r"\1***") class DebianRadius(Radius, DebianPlugin, UbuntuPlugin): files = ('/etc/freeradius',) def setup(self): super(DebianRadius, self).setup() self.add_copy_spec([ "/etc/freeradius", "/etc/pam.d/radiusd", "/etc/default/freeradius", "/var/log/freeradius" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/xinetd.py0000644000175000017500000000231413203300002017364 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Eugene Teo # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Xinetd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """xinetd information """ plugin_name = 'xinetd' profiles = ('services', 'network', 'boot') files = ('/etc/xinetd.conf',) packages = ('xinetd',) def setup(self): self.add_copy_spec([ "/etc/xinetd.conf", "/etc/xinetd.d" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/etcd.py0000644000175000017500000000437413203300002017020 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc. Neependra Khare # Copyright (C) 2015 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class etcd(Plugin, RedHatPlugin): """etcd plugin """ plugin_name = 'etcd' packages = ('etcd',) profiles = ('system', 'services', 'cluster') cmd = 'etcdctl' def setup(self): etcd_url = self.get_etcd_url() self.add_copy_spec('/etc/etcd') subcmds = [ '--version', 'member list', 'cluster-health', 'ls --recursive', ] self.add_cmd_output(['%s %s' % (self.cmd, sub) for sub in subcmd]) urls = [ '/v2/stats/leader', '/v2/stats/self', '/v2/stats/store', ] if etcd_url: self.add_cmd_output(['curl -s %s%s' % (etcd_url, u) for u in urls]) self.add_cmd_output("ls -lR /var/lib/etcd/") def get_etcd_url(self): try: with open('/etc/etcd/etcd.conf', 'r') as ef: for line in ef: if line.startswith('ETCD_LISTEN_CLIENT_URLS'): return line.split('=')[1].replace('"', '').strip() # If we can't read etcd.conf, assume defaults by etcd version except: ver = self.policy().package_manager.get_pkg_list()['etcd'] ver = ver['version'][0] if ver == '2': return 'http://localhost:4001' if ver == '3': return 'http://localhost:2379' # vim: et ts=5 sw=4 sosreport-3.5/sos/plugins/insights.py0000644000175000017500000000333413203300002017724 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class RedHatInsights(Plugin, RedHatPlugin): '''Collect config and log for Red Hat Insights ''' plugin_name = 'insights' packages = ['redhat-access-insights'] profiles = ('system', 'sysmgmt') conf_file = '/etc/redhat-access-insights/redhat-access-insights.conf' def setup(self): self.add_copy_spec(self.conf_file) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec("/var/log/redhat-access-insights/*.log*", sizelimit=self.limit) else: self.add_copy_spec("/var/log/redhat-access-insights/*.log", sizelimit=self.limit) def postproc(self): self.do_file_sub( self.conf_file, r'(password[\t\ ]*=[\t\ ]*)(.+)', r'\1********' ) self.do_file_sub( self.conf_file, r'(proxy[\t\ ]*=.*)(:)(.*)(@.*)', r'\1\2********\4' ) sosreport-3.5/sos/plugins/systemd.py0000644000175000017500000000421413203300002017562 0ustar cariboucaribou# Copyright (C) 2012 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Systemd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """ System management daemon """ plugin_name = "systemd" profiles = ('system', 'services', 'boot') packages = ('systemd',) files = ( '/usr/lib/systemd/systemd', '/lib/systemd/systemd' ) def setup(self): self.add_cmd_output([ "systemctl status --all", "systemctl show --all", "systemctl show *service --all", # It is possible to do systemctl show with target, slice, # device, socket, scope, and mount too but service and # status --all mostly seems to cover the others. "systemctl list-units", "systemctl list-units --failed", "systemctl list-unit-files", "systemctl show-environment", "systemd-delta", "systemd-analyze", "journalctl --list-boots", "ls -lR /lib/systemd", "timedatectl" ]) if self.get_option("verify"): self.add_cmd_output("journalctl --verify") self.add_copy_spec([ "/etc/systemd", "/lib/systemd/system", "/lib/systemd/user", "/etc/vconsole.conf", "/etc/yum/protected.d/systemd.conf" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/gnocchi.py0000644000175000017500000000664313203300002017514 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc., Sachin Patil # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from sos.plugins import Plugin, RedHatPlugin class GnocchiPlugin(Plugin, RedHatPlugin): """Gnocchi - Metric as a service""" plugin_name = "gnocchi" profiles = ('openstack', 'openstack_controller') packages = ( 'openstack-gnocchi-metricd', 'openstack-gnocchi-common', 'openstack-gnocchi-statsd', 'openstack-gnocchi-api', 'openstack-gnocchi-carbonara' ) requires_root = False var_puppet_gen = "/var/lib/config-data/puppet-generated/gnocchi" def setup(self): self.add_copy_spec([ "/etc/gnocchi/*", self.var_puppet_gen + "/etc/gnocchi/*", self.var_puppet_gen + "/etc/httpd/conf/*", self.var_puppet_gen + "/etc/httpd/conf.d/*", self.var_puppet_gen + "/etc/httpd/conf.modules.d/wsgi.conf", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf" ]) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/gnocchi/*", "/var/log/containers/gnocchi/*", "/var/log/containers/httpd/gnocchi-api/*"], sizelimit=self.limit ) else: self.add_copy_spec([ "/var/log/gnocchi/*.log", "/var/log/containers/gnocchi/*.log", "/var/log/containers/httpd/gnocchi-api/*log"], sizelimit=self.limit ) vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD']] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME']] if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. Source " "the environment file for the user intended " "to connect to the OpenStack environment.") else: self.add_cmd_output([ "gnocchi --version", "gnocchi status", "gnocchi capabilities list", "gnocchi archive-policy list", "gnocchi resource list", "gnocchi resource-type list" ]) def postproc(self): self.do_file_sub( "/etc/gnocchi/gnocchi.conf", r"password=(.*)", r"password=*****", ) self.do_file_sub( self.var_puppet_gen + "/etc/gnocchi/" "gnocchi.conf", r"password=(.*)", r"password=*****", ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/lxd.py0000644000175000017500000000274613203300002016671 0ustar cariboucaribou# Copyright (C) 2016 Jorge Niedbalski # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin class LXD(Plugin, UbuntuPlugin): """LXD is a containers hypervisor. """ plugin_name = 'lxd' def setup(self): self.add_copy_spec([ "/var/lib/lxd/lxd.db", "/etc/default/lxc-bridge", ]) self.add_copy_spec("/var/log/lxd*", sizelimit=self.get_option("log_size")) # List of containers available on the machine self.add_cmd_output([ "lxc list", "lxc profile list", "lxc image list", ]) self.add_cmd_output([ "find /var/lib/lxd -maxdepth 2 -type d -ls", ], suggest_filename='var-lxd-dirs.txt') # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ptp.py0000644000175000017500000000227013203300002016675 0ustar cariboucaribou# Copyright (C) 2015 Pavel Moravec # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Ptp(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Precision time protocol """ plugin_name = "ptp" profiles = ('system', 'services') packages = ('linuxptp',) def setup(self): self.add_copy_spec([ "/etc/ptp4l.conf", "/etc/timemaster.conf", "/sys/class/ptp" ]) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/nss.py0000644000175000017500000000241313203300002016674 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class NSS(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Network Security Services configuration """ plugin_name = "nss" profiles = ('network', 'security') packages = ('nss',) verify_packages = ('nss.*',) def setup(self): self.add_forbidden_path("/etc/pki/nssdb/cert*") self.add_forbidden_path("/etc/pki/nssdb/key*") self.add_forbidden_path("/etc/pki/nssdb/secmod.db") self.add_copy_spec("/etc/pki/nssdb/pkcs11.txt") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/firewalld.py0000644000175000017500000000321013203300002020036 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Jamie Bainbridge # Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class FirewallD(Plugin, RedHatPlugin): """Firewall daemon """ plugin_name = 'firewalld' profiles = ('network',) packages = ('firewalld',) def setup(self): self.add_copy_spec([ "/etc/firewalld/firewalld.conf", "/etc/firewalld/*.xml", "/etc/firewalld/icmptypes/*.xml", "/etc/firewalld/services/*.xml", "/etc/firewalld/zones/*.xml", "/etc/sysconfig/firewalld", "/var/log/firewalld", ]) # use a 10s timeout to workaround dbus problems in # docker containers. self.add_cmd_output([ "firewall-cmd --list-all-zones", "firewall-cmd --permanent --list-all-zones" ], timeout=10) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/megacli.py0000644000175000017500000000277513203300002017505 0ustar cariboucaribou# megacli.py # Copyright (C) 2007-2014 Red Hat, Inc., Jon Magrini # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import os.path from sos.plugins import Plugin, RedHatPlugin class MegaCLI(Plugin, RedHatPlugin): """LSI MegaRAID devices """ plugin_name = 'megacli' profiles = ('system', 'storage', 'hardware') def setup(self): if os.path.isfile("/opt/MegaRAID/MegaCli/MegaCli64"): self.add_custom_text("LSI MegaCLI is installed.
") self.get_megacli_files() def get_megacli_files(self): """ MegaCLI specific output """ self.add_cmd_output([ "MegaCli64 LDPDInfo -aALL", "MegaCli64 -AdpAllInfo -aALL", "MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL", "MegaCli64 -ShowSummary -a0" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/conntrackd.py0000755000175000017500000000302613203300002020223 0ustar cariboucaribou# Copyright (C) 2017 Red Hat, Inc., Marcus Linden # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, \ SuSEPlugin class Conntrackd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, SuSEPlugin): """conntrackd - netfilter connection tracking user-space daemon """ plugin_name = 'conntrackd' profiles = ('network', 'cluster') packages = ('conntrack-tools', 'conntrackd') def setup(self): self.add_copy_spec("/etc/conntrackd/conntrackd.conf") self.add_cmd_output([ "conntrackd -s network", "conntrackd -s cache", "conntrackd -s runtime", "conntrackd -s link", "conntrackd -s rsqueue", "conntrackd -s queue", "conntrackd -s ct", "conntrackd -s expect", ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/atomichost.py0000644000175000017500000000323413203300002020245 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os.path class AtomicHost(Plugin, RedHatPlugin): """ Atomic Host """ plugin_name = "atomichost" option_list = [ ("info", "gather atomic info for each image", "fast", False) ] def check_enabled(self): return self.policy().in_container() def setup(self): self.add_copy_spec("/etc/ostree/remotes.d") self.add_cmd_output("atomic host status") if self.get_option('info'): # The 'docker images' command may include duplicate rows of # output (repeated "IMAGE ID" values). Use a set to filter # these out and only obtain 'docker info' data once per image # identifier. images = self.get_command_output("docker images -q")['output'] for image in set(images.splitlines()): self.add_cmd_output("atomic info {0}".format(image)) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/lightdm.py0000644000175000017500000000331113203300002017517 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class LightDm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Light Display Manager """ packages = ('lightdm', ) profiles = ('desktop', ) plugin_name = 'lightdm' def setup(self): self.add_cmd_output("systemctl status lightdm.service") self.add_journal(units="lightdm") self.add_copy_spec([ "/etc/lightdm/lightdm.conf", "/etc/lightdm/users.conf" ]) if not self.get_option("all_logs"): limit = self.get_option("log_size") self.add_copy_spec("/var/log/lightdm/lightdm.log", sizelimit=limit) self.add_copy_spec("/var/log/lightdm/x-0-greeter.log", sizelimit=limit) self.add_copy_spec("/var/log/lightdm/x-0.log", sizelimit=limit) else: self.add_copy_spec("/var/log/lightdm") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/gluster.py0000644000175000017500000001264313203300002017564 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import time import os.path import os import glob import string from sos.plugins import Plugin, RedHatPlugin class Gluster(Plugin, RedHatPlugin): """GlusterFS storage""" plugin_name = 'gluster' profiles = ('storage', 'virt') statedump_dir = '/tmp/glusterfs-statedumps' packages = ["glusterfs", "glusterfs-core"] files = ["/etc/glusterd", "/var/lib/glusterd"] def get_volume_names(self, volume_file): """Return a dictionary for which key are volume names according to the output of gluster volume info stored in volume_file. """ out = [] fp = open(volume_file, 'r') for line in fp.readlines(): if not line.startswith("Volume Name:"): continue volname = line[12:-1] out.append(volname) fp.close() return out def make_preparations(self, name_dir): try: os.mkdir(name_dir) except: pass fp = open('/tmp/glusterdump.options', 'w') data = 'path=' + name_dir + '\n' fp.write(data) fp.write('all=yes') fp.close() def wait_for_statedump(self, name_dir): statedumps_present = 0 statedump_entries = os.listdir(name_dir) for statedump_file in statedump_entries: statedumps_present = statedumps_present+1 last_line = 'tmp' ret = -1 while ret == -1: last_line = file( name_dir + '/' + statedump_file, "r").readlines()[-1] ret = string.count(last_line, 'DUMP_END_TIME') def postproc(self): if not os.path.exists(self.statedump_dir): return try: for dirs in os.listdir(self.statedump_dir): os.remove(os.path.join(self.statedump_dir, dirs)) os.rmdir(self.statedump_dir) os.unlink('/tmp/glusterdump.options') except: pass def setup(self): self.add_forbidden_path("/var/lib/glusterd/geo-replication/secret.pem") self.add_cmd_output("gluster peer status") self.add_copy_spec([ "/etc/redhat-storage-release", # collect unified file and object storage configuration "/etc/swift/", # glusterfs-server rpm scripts stash this on migration to 3.3.x "/etc/glusterd.rpmsave", # common to all versions "/etc/glusterfs", "/var/lib/glusterd/", # collect nfs-ganesha related configuration "/var/run/gluster/shared_storage/nfs-ganesha/" ] + glob.glob('/var/run/gluster/*tier-dht/*')) # collect logs - apply log_size for any individual file # all_logs takes precedence over logsize if not self.get_option("all_logs"): limit = self.get_option("log_size") else: limit = 0 if limit: for f in (glob.glob("/var/log/glusterfs/*log") + glob.glob("/var/log/glusterfs/*/*log") + glob.glob("/var/log/glusterfs/geo-replication/*/*log")): self.add_copy_spec(f, limit) else: self.add_copy_spec("/var/log/glusterfs") self.make_preparations(self.statedump_dir) if self.check_ext_prog("killall -USR1 glusterfs glusterfsd"): # let all the processes catch the signal and create statedump file # entries. time.sleep(1) self.wait_for_statedump(self.statedump_dir) self.add_copy_spec('/tmp/glusterdump.options') self.add_copy_spec(self.statedump_dir) else: self.soslog.info("could not send SIGUSR1 to glusterfs processes") volume_file = self.get_cmd_output_now("gluster volume info") if volume_file: for volname in self.get_volume_names(volume_file): self.add_cmd_output([ "gluster volume geo-replication %s status" % volname, "gluster volume heal %s info" % volname, "gluster volume heal %s info split-brain" % volname, "gluster snapshot list %s" % volname, "gluster volume quota %s list" % volname, "gluster volume rebalance %s status" % volname, "gluster snapshot info %s" % volname, "gluster snapshot status %s" % volname]) self.add_cmd_output("gluster pool list") self.add_cmd_output("gluster volume status") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/gfs2.py0000644000175000017500000000436013203300002016735 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os.path class Gfs2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """GFS2 (Global Filesystem 2)""" plugin_name = "gfs2" profiles = ("cluster", ) packages = ["gfs2-utils"] option_list = [ ("lockdump", "capture lock dumps for all GFS2 filesystems", "slow", False), ] debugfs_path = "/sys/kernel/debug" _debugfs_cleanup = False def setup(self): self.add_copy_spec([ "/sys/fs/gfs2/*/withdraw" ]) self.add_cmd_output([ "gfs_control ls -n", "gfs_control dump" ]) if self.get_option("gfs2lockdump"): if self._mount_debug(): self.add_copy_spec(["/sys/kernel/debug/gfs2/*"]) def _mount_debug(self): if not os.path.ismount(self.debugfs_path): self._debugfs_cleanup = True r = self.call_ext_prog("mount -t debugfs debugfs %s" % self.debugfs_path) if r["status"] != 0: self._log_error("debugfs not mounted and mount attempt failed") self._debugfs_cleanup = False return os.path.ismount(self.debugfs_path) def postproc(self): if self._debugfs_cleanup and os.path.ismount(self.debugfs_path): r = self.call_ext_prog("umount %s" % self.debugfs_path) if r["status"] != 0: self._log_error("could not unmount %s" % self.debugfs_path) return # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/vsftpd.py0000644000175000017500000000205513203300002017401 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Vsftpd(Plugin, RedHatPlugin): """Vsftpd server """ plugin_name = 'vsftpd' profiles = ('services',) files = ('/etc/vsftpd',) packages = ('vsftpd',) def setup(self): self.add_copy_spec([ "/etc/ftp*", "/etc/vsftpd" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/opengl.py0000644000175000017500000000207513203300002017361 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenGL(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """OpenGL """ plugin_name = 'opengl' profiles = ('hardware', 'desktop', 'gpu') files = ('/usr/bin/glxinfo',) def setup(self): self.add_cmd_output([ "glxinfo", ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/s390.py0000644000175000017500000000463113203300002016573 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Justin Payne # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class S390(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """IBM S/390 """ plugin_name = 's390' profiles = ('system', 'hardware') # Check for s390 arch goes here def check_enabled(self): return ("s390" in self.policy().get_arch()) # Gather s390 specific information def setup(self): self.add_copy_spec([ "/proc/cio_ignore", "/proc/crypto", "/proc/dasd/devices", "/proc/dasd/statistics", "/proc/qeth", "/proc/qeth_perf", "/proc/qeth_ipa_takeover", "/proc/sys/appldata/*", "/proc/sys/kernel/hz_timer", "/proc/sysinfo", "/sys/bus/ccwgroup/drivers/qeth/0.*/*", "/sys/bus/ccw/drivers/zfcp/0.*/*", "/sys/bus/ccw/drivers/zfcp/0.*/0x*/*", "/sys/bus/ccw/drivers/zfcp/0.*/0x*/0x*/*", "/etc/zipl.conf", "/etc/zfcp.conf", "/etc/sysconfig/dumpconf", "/etc/src_vipa.conf", "/etc/ccwgroup.conf", "/etc/chandev.conf"]) self.add_cmd_output([ "lscss", "lsdasd", "lstape", "find /proc/s390dbf -type f", "qethconf list_all", "lsqeth", "lszfcp" ]) r = self.call_ext_prog("ls /dev/dasd?") dasd_dev = r['output'] for x in dasd_dev.split('\n'): self.add_cmd_output([ "dasdview -x -i -j -l -f %s" % (x,), "fdasd -p %s" % (x,) ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/zfs.py0000644000175000017500000000217013203300002016673 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin, DebianPlugin class Zfs(Plugin, UbuntuPlugin, DebianPlugin): """ZFS filesystem """ plugin_name = 'zfs' profiles = ('storage',) packages = ('zfsutils-linux',) def setup(self): self.add_cmd_output([ "zfs get all", "zfs list -t all -o space", "zpool list", "zpool status -x" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/pci.py0000644000175000017500000000227113203300002016646 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Pci(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """PCI devices """ plugin_name = "pci" profiles = ('hardware', 'system') def setup(self): self.add_copy_spec([ "/proc/ioports", "/proc/iomem", "/proc/bus/pci" ]) self.add_cmd_output("lspci -nnvv", root_symlink="lspci") self.add_cmd_output("lspci -tv") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/saphana.py0000644000175000017500000000625513203300002017514 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from sos.plugins import Plugin, RedHatPlugin class saphana(Plugin, RedHatPlugin): """SAP HANA""" plugin_name = 'saphana' profiles = ['sap'] files = ['/hana'] def setup(self): sids = [] if os.path.isdir("/hana/shared"): s = os.listdir("/hana/shared") for sid in s: if len(sid) == 3: sid = sid.strip() sids.append(sid) for sid in sids: sidadm = '%sadm' % sid.lower() prefix = 'su - %s -c' % sidadm self.add_cmd_output('%s "HDB info"' % prefix, suggest_filename="%s_HDB_info" % sid) self.add_cmd_output('%s "hdbsrvutil -v"' % prefix, suggest_filename="%s_version" % sid) self.add_cmd_output('%s \'hdbcons "mm l -s -S -p"\'' % prefix, suggest_filename="%s_memusage" % sid) self.add_cmd_output('%s \'hdbcons -e hdbindexserver \ "replication info"\'' % prefix, suggest_filename="%s_replicainfo" % sid) if os.path.isdir("/hana/shared/%s/" % sid): i = os.listdir("/hana/shared/%s/" % sid) for inst in i: if "HDB" in inst: inst = inst.strip()[-2:] # get GREEN/RED status self.add_cmd_output( 'su - %s -c "sapcontrol -nr %s \ -function GetProcessList"' % (sidadm, inst), suggest_filename="%s_%s_status" % (sid, inst) ) path = '/usr/sap/%s/HDB%s/exe/python_support' path %= (sid, inst) if os.path.isdir("%s" % path): # SCALE OUT - slow self.add_cmd_output( 'su - %s -c "python \ %s/landscapeHostConfiguration.py"' % (sidadm, path), suggest_filename="%s_%s_landscapeConfig" % (sid, inst) ) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/fcoe.py0000644000175000017500000000252313203300002017007 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class fcoe(Plugin, RedHatPlugin): """Fibre Channel over Ethernet """ plugin_name = 'fcoe' profiles = ('storage', 'hardware') packages = ('fcoe-utils',) def setup(self): # Here we capture the information about all # FCoE instances with the -i option, and # information about all discovered FCFs # with the -f option self.add_cmd_output([ "fcoeadm -i", "fcoeadm -f" ]) # Here we grab information about the # interfaces's config files self.add_copy_spec("/etc/fcoe") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/lsbrelease.py0000644000175000017500000000227713203300002020222 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class LsbRelease(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Linux standard base """ plugin_name = 'lsbrelease' profiles = ('system',) def setup(self): self.add_cmd_output("lsb_release -a") self.add_cmd_output( "lsb_release -d", suggest_filename="lsb_release", root_symlink="lsb-release") self.add_copy_spec("/etc/lsb-release*") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/maas.py0000644000175000017500000000476613203300002017027 0ustar cariboucaribou# Copyright (C) 2013 Adam Stokes # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin class Maas(Plugin, UbuntuPlugin): """Ubuntu Metal-As-A-Service """ plugin_name = 'maas' profiles = ('sysmgmt',) option_list = [ ('profile-name', 'The name with which you will later refer to this remote', '', False), ('url', 'The URL of the remote API', '', False), ('credentials', 'The credentials, also known as the API key', '', False) ] def _has_login_options(self): return self.get_option("url") and self.get_option("credentials") \ and self.get_option("profile-name") def _remote_api_login(self): ret = self.call_ext_prog("maas login %s %s %s" % ( self.get_option("profile-name"), self.get_option("url"), self.get_option("credentials"))) return ret['status'] == 0 def setup(self): self.add_copy_spec([ "/etc/squid-deb-proxy", "/etc/maas", "/var/lib/maas/dhcp*", "/var/log/apache2*", "/var/log/maas*", "/var/log/upstart/maas-*", ]) self.add_cmd_output([ "apt-cache policy maas-*", "apt-cache policy python-django-*", ]) if self.is_installed("maas-region-controller"): self.add_cmd_output([ "maas-region-admin dumpdata", ]) if self._has_login_options(): if self._remote_api_login(): self.add_cmd_output("maas %s commissioning-results list" % self.get_option("profile-name")) else: self._log_error( "Cannot login into MAAS remote API with provided creds.") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/nis.py0000644000175000017500000000220513203300002016661 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Nis(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Network information service """ plugin_name = 'nis' profiles = ('identity', 'services') files = ('/var/yp',) def setup(self): self.add_copy_spec([ "/etc/yp*.conf", "/var/yp/*" ]) self.add_cmd_output("domainname") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/last.py0000644000175000017500000000217113203300002017035 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Last(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """login information """ plugin_name = 'last' profiles = ('system',) def setup(self): self.add_cmd_output("last", root_symlink="last") self.add_cmd_output([ "last reboot", "last shutdown", "lastlog" ]) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/dbus.py0000644000175000017500000000211613203300002017026 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Dbus(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """D-Bus message bus""" plugin_name = "dbus" profiles = ('system',) packages = ('dbus',) def setup(self): self.add_copy_spec([ "/etc/dbus-1", "/var/lib/dbus/machine-id" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/vulkan.py0000644000175000017500000000210313203300002017365 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Vulkan(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Vulkan """ plugin_name = 'vulkan' profiles = ('hardware', 'desktop', 'gpu') files = ('/usr/bin/vulkaninfo',) def setup(self): self.add_cmd_output([ "vulkaninfo", ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_horizon.py0000644000175000017500000001016313203300002021631 0ustar cariboucaribou# Copyright (C) 2009 Red Hat, Inc., Joey Boggs # Copyright (C) 2012 Rackspace US, Inc., # Justin Shepherd # Copyright (C) 2013 Red Hat, Inc., Jeremy Agee # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenStackHorizon(Plugin): """OpenStack Horizon """ plugin_name = "openstack_horizon" profiles = ('openstack', 'openstack_controller') option_list = [] var_puppet_gen = "/var/lib/config-data/puppet-generated" def setup(self): self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/horizon/", "/var/log/containers/horizon/", "/var/log/containers/httpd/horizon/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/horizon/*.log", "/var/log/containers/horizon/*.log", "/var/log/containers/httpd/horizon/*log" ], sizelimit=self.limit) self.add_copy_spec([ "/etc/openstack-dashboard/", self.var_puppet_gen + "/horizon/etc/openstack-dashboard/", self.var_puppet_gen + "/horizon/etc/httpd/conf/", self.var_puppet_gen + "/horizon/etc/httpd/conf.d/", self.var_puppet_gen + "/horizon/etc/httpd/conf.modules.d/*.conf", self.var_puppet_gen + "/memcached/etc/sysconfig/memcached" ]) self.add_forbidden_path("*.py[co]") if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) def postproc(self): var_puppet_gen = self.var_puppet_gen + "/horizon" protect_keys = [ "SECRET_KEY", "EMAIL_HOST_PASSWORD" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub( "/etc/openstack-dashboard/.*\.json", regexp, r"\1*********" ) self.do_path_regex_sub( var_puppet_gen + "/etc/openstack-dashboard/.*\.json", regexp, r"\1*********" ) self.do_path_regex_sub( "/etc/openstack-dashboard/local_settings/.*\.conf.*", regexp, r"\1*********" ) self.do_path_regex_sub( var_puppet_gen + "/etc/openstack-dashboard/.*\.conf.*", regexp, r"\1*********" ) class DebianHorizon(OpenStackHorizon, DebianPlugin): packages = ( 'python-django-horizon', 'openstack-dashboard', 'openstack-dashboard-apache' ) def setup(self): super(DebianHorizon, self).setup() self.add_copy_spec("/etc/apache2/sites-available/") class UbuntuHorizon(OpenStackHorizon, UbuntuPlugin): packages = ( 'python-django-horizon', 'openstack-dashboard', 'openstack-dashboard-ubuntu-theme' ) def setup(self): super(UbuntuHorizon, self).setup() self.add_copy_spec("/etc/apache2/conf.d/openstack-dashboard.conf") class RedHatHorizon(OpenStackHorizon, RedHatPlugin): packages = ( 'python-django-horizon', 'openstack-dashboard' ) def setup(self): super(RedHatHorizon, self).setup() self.add_copy_spec("/etc/httpd/conf.d/openstack-dashboard.conf") if self.get_option("log"): self.add_copy_spec("/var/log/httpd/") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/unity.py0000644000175000017500000000203013203300002017234 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin class unity(Plugin, UbuntuPlugin): """Unity """ plugin_name = 'unity' profiles = ('hardware', 'desktop') packages = ( 'nux-tools', 'unity' ) def setup(self): self.add_cmd_output("/usr/lib/nux/unity_support_test -p") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ovirt.py0000644000175000017500000001575713203300002017253 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., Sandro Bonazzola # Copyright (C) 2014 Red Hat, Inc., Bryn M. Reeves # Copyright (C) 2010 Red Hat, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import re import signal from sos.plugins import Plugin, RedHatPlugin # Class name must be the same as file name and method names must not change class Ovirt(Plugin, RedHatPlugin): """oVirt Engine""" plugin_name = "ovirt" profiles = ('virt',) packages = ( 'ovirt-engine', 'ovirt-engine-dwh', 'ovirt-engine-reports', 'ovirt-scheduler-proxy', 'rhevm', 'rhevm-dwh', 'rhevm-reports' ) DB_PASS_FILES = re.compile( flags=re.VERBOSE, pattern=r""" ^ /etc/ (rhevm|ovirt-engine|ovirt-engine-dwh)/ (engine.conf|ovirt-engine-dwhd.conf) (\.d/.+.conf)? $ """ ) DEFAULT_SENSITIVE_KEYS = ( 'ENGINE_DB_PASSWORD:ENGINE_PKI_TRUST_STORE_PASSWORD:' 'ENGINE_PKI_ENGINE_STORE_PASSWORD:DWH_DB_PASSWORD' ) option_list = [ ('jbosstrace', 'Enable oVirt Engine JBoss stack trace collection', '', True), ('sensitive_keys', 'Sensitive keys to be masked', '', DEFAULT_SENSITIVE_KEYS) ] def setup(self): if self.get_option('jbosstrace'): engine_pattern = "^ovirt-engine\ -server.*jboss-modules.jar" pgrep = "pgrep -f '%s'" % engine_pattern lines = self.call_ext_prog(pgrep)['output'].splitlines() engine_pids = [int(x) for x in lines] if not engine_pids: self.soslog.error('Unable to get ovirt-engine pid') self.add_alert('Unable to get ovirt-engine pid') for pid in engine_pids: try: # backtrace written to '/var/log/ovirt-engine/console.log os.kill(pid, signal.SIGQUIT) except OSError as e: self.soslog.error('Unable to send signal to %d' % pid, e) self.add_forbidden_path('/etc/ovirt-engine/.pgpass') self.add_forbidden_path('/etc/rhevm/.pgpass') # Copy all engine tunables and domain information self.add_cmd_output("engine-config --all") self.add_cmd_output("engine-manage-domains list") # Copy engine config files. self.add_copy_spec([ "/etc/ovirt-engine", "/etc/rhevm/", "/etc/ovirt-engine-dwh", "/etc/ovirt-engine-reports", "/var/log/ovirt-engine", "/var/log/ovirt-engine-dwh", "/var/log/ovirt-engine-reports", "/var/log/ovirt-scheduler-proxy", "/var/log/rhevm", "/etc/sysconfig/ovirt-engine", "/usr/share/ovirt-engine/conf", "/var/log/ovirt-guest-agent", "/var/lib/ovirt-engine/setup-history.txt", "/var/lib/ovirt-engine/setup/answers", "/var/lib/ovirt-engine/external_truststore", "/var/tmp/ovirt-engine/config", "/var/lib/ovirt-engine/jboss_runtime/config", "/var/lib/ovirt-engine-reports/jboss_runtime/config" ]) def postproc(self): """ Obfuscate sensitive keys. """ self.do_file_sub( "/etc/ovirt-engine/engine-config/engine-config.properties", r"Password.type=(.*)", r"Password.type=********" ) self.do_file_sub( "/etc/rhevm/rhevm-config/rhevm-config.properties", r"Password.type=(.*)", r"Password.type=********" ) engine_files = ( 'ovirt-engine.xml', 'ovirt-engine_history/current/ovirt-engine.v1.xml', 'ovirt-engine_history/ovirt-engine.boot.xml', 'ovirt-engine_history/ovirt-engine.initial.xml', 'ovirt-engine_history/ovirt-engine.last.xml', ) for filename in engine_files: self.do_file_sub( "/var/tmp/ovirt-engine/config/%s" % filename, r"(.*)", r"********" ) self.do_file_sub( "/etc/ovirt-engine/redhatsupportplugin.conf", r"proxyPassword=(.*)", r"proxyPassword=********" ) passwd_files = [ "logcollector.conf", "imageuploader.conf", "isouploader.conf" ] for conf_file in passwd_files: conf_path = os.path.join("/etc/ovirt-engine", conf_file) self.do_file_sub( conf_path, r"passwd=(.*)", r"passwd=********" ) self.do_file_sub( conf_path, r"pg-pass=(.*)", r"pg-pass=********" ) sensitive_keys = self.DEFAULT_SENSITIVE_KEYS # Handle --alloptions case which set this to True. keys_opt = self.get_option('sensitive_keys') if keys_opt and keys_opt is not True: sensitive_keys = keys_opt key_list = [x for x in sensitive_keys.split(':') if x] for key in key_list: self.do_path_regex_sub( self.DB_PASS_FILES, r'{key}=(.*)'.format(key=key), r'{key}=********'.format(key=key) ) # Answer files contain passwords for key in ( 'OVESETUP_CONFIG/adminPassword', 'OVESETUP_CONFIG/remoteEngineHostRootPassword', 'OVESETUP_DWH_DB/password', 'OVESETUP_DB/password', 'OVESETUP_REPORTS_CONFIG/adminPassword', 'OVESETUP_REPORTS_DB/password', ): self.do_path_regex_sub( r'/var/lib/ovirt-engine/setup/answers/.*', r'{key}=(.*)'.format(key=key), r'{key}=********'.format(key=key) ) # aaa profiles contain passwords protect_keys = [ "vars.password", "pool.default.auth.simple.password", "pool.default.ssl.truststore.password", "config.datasource.dbpassword" ] regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/ovirt-engine/aaa/.*\.properties", regexp, r"\1*********") # vim: expandtab tabstop=4 shiftwidth=4 sosreport-3.5/sos/plugins/storageconsole.py0000644000175000017500000000406513203300002021125 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin class StorageConsole(Plugin, RedHatPlugin, DebianPlugin): """Red Hat Storage Console """ plugin_name = 'storageconsole' profiles = ('storage',) packages = ('rhscon-core',) def setup(self): all_logs = self.get_option("all_logs") limit = self.get_option("log_size") if not all_logs: self.add_copy_spec([ "/var/log/skyring/skyring.log", "/var/log/skyring/bigfin.log", "/var/log/carbon/console.log", "/var/log/graphite-web/info.log", "/var/log/graphite-web/exception.log", ], sizelimit=limit) else: self.add_copy_spec([ "/var/log/skyring/", "/var/log/carbon/", "/var/log/graphite-web/" ]) self.add_copy_spec([ "/etc/skyring/", "/etc/carbon/", "/etc/graphite-web/" ]) self.add_cmd_output( "mongo skyring --eval 'db.getCollectionNames()'", suggest_filename="mongo_skyring_collectionnames.txt") self.add_cmd_output( "mongo skyring --eval 'DBQuery.shellBatchSize = 10000;" "db.storage_nodes.find()'", suggest_filename="mongo_skyring_storagenodes.txt") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ceph_ansible.py0000644000175000017500000000241613203300002020510 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin class CephAnsible(Plugin, RedHatPlugin, DebianPlugin): """CEPH distributed storage - Ansible installer """ plugin_name = 'ceph_ansible' profiles = ('storage',) packages = ('ceph-ansible',) def setup(self): self.add_copy_spec([ "/usr/share/ceph-ansible/group_vars/", "/usr/share/ceph-ansible/site*.yml", "/usr/share/ceph-ansible/ansible.cfg" ]) self.add_forbidden_path("/usr/share/ceph-ansible/group_vars/*.sample") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/collectd.py0000644000175000017500000000404613203300002017666 0ustar cariboucaribou# Copyright (C) 2016 Archit Sharma # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import re from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Collectd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): ''' Collectd config collector ''' plugin_name = "collectd" profiles = ('services', 'webserver') packages = ('collectd',) def setup(self): self.add_copy_spec([ '/etc/collectd.conf', '/etc/collectd.d/*.conf', ]) p = re.compile('^LoadPlugin.*') try: with open("/etc/collectd.conf") as f: for line in f: if p.match(line): self.add_alert("Active Plugin found: %s" % line.split()[-1]) except IOError as e: self._log_warn("could not open /etc/collectd.conf: %s" % e) def postproc(self): # add these to protect_keys if need be: # "Port", "[<]*Host", protect_keys = [ "Password", "User", "[<]*URL", "Address" ] regexp = r"((?m)^[#]*\s*(%s)\s* \s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub( "/etc/collectd.d/*.conf", regexp, r'\1"*********"' ) self.do_file_sub("/etc/collectd.conf", regexp, r'\1"*********"') # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/i18n.py0000644000175000017500000000215013203300002016646 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class I18n(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Internationalization """ plugin_name = 'i18n' profiles = ('system',) def setup(self): self.add_copy_spec([ "/etc/X11/xinit/xinput.d/*", "/etc/locale.conf" ]) self.add_cmd_output("locale") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openvswitch.py0000644000175000017500000001301013203300002020435 0ustar cariboucaribou# Copyright (C) 2014 Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenVSwitch(Plugin): """ OpenVSwitch networking """ plugin_name = "openvswitch" profiles = ('network', 'virt') def setup(self): all_logs = self.get_option("all_logs") limit = self.get_option("log_size") if not all_logs: self.add_copy_spec("/var/log/openvswitch/*.log", sizelimit=limit) else: self.add_copy_spec("/var/log/openvswitch/", sizelimit=limit) self.add_copy_spec([ "/var/run/openvswitch/ovsdb-server.pid", "/var/run/openvswitch/ovs-vswitchd.pid" ]) self.add_cmd_output([ # The '-s' option enables dumping of packet counters on the # ports. "ovs-dpctl -s show", # Capture the in-kernel flow information if it exists "ovs-dpctl dump-flows -m", # The '-t 5' adds an upper bound on how long to wait to connect # to the Open vSwitch server, avoiding hangs when running sos. "ovs-vsctl -t 5 show", # Gather the database. "ovsdb-client -f list dump", # List the contents of runtime directory "ls -laZ /var/run/openvswitch", # List devices and their drivers "dpdk_nic_bind --status", "dpdk_devbind.py --status", "driverctl list-devices", "driverctl list-overrides", # Capture a list of all bond devices "ovs-appctl bond/list", # Capture more details from bond devices "ovs-appctl bond/show", # Capture LACP details "ovs-appctl lacp/show", # Capture coverage stats" "ovs-appctl coverage/show", # Capture cached routes "ovs-appctl ovs/route/show", # Capture tnl arp table" "ovs-appctl tnl/arp/show", # Capture a list of listening ports" "ovs-appctl tnl/ports/show", # Capture upcall information "ovs-appctl upcall/show", # Capture DPDK and other parameters "ovs-vsctl -t 5 get Open_vSwitch . other_config", # Capture DPDK datapath packet counters and config "ovs-appctl dpctl/show -s", # Capture DPDK queue to pmd mapping "ovs-appctl dpif-netdev/pmd-rxq-show", # Capture DPDK pmd stats "ovs-appctl dpif-netdev/pmd-stats-show" ]) # Gather systemd services logs self.add_journal(units="openvswitch") self.add_journal(units="openvswitch-nonetwork") self.add_journal(units="ovs-vswitchd") self.add_journal(units="ovsdb-server") # Gather additional output for each OVS bridge on the host. br_list_result = self.call_ext_prog("ovs-vsctl list-br") if br_list_result['status'] == 0: for br in br_list_result['output'].splitlines(): self.add_cmd_output([ "ovs-appctl fdb/show %s" % br, "ovs-ofctl dump-flows %s" % br, "ovs-ofctl dump-ports-desc %s" % br, "ovs-ofctl dump-ports %s" % br, "ovs-ofctl queue-get-config %s" % br, "ovs-ofctl queue-stats %s" % br, "ovs-ofctl show %s" % br ]) # Flow protocols currently supported flow_versions = [ "OpenFlow10", "OpenFlow11", "OpenFlow12", "OpenFlow13" ] # List protocols currently in use, if any ovs_list_bridge_cmd = "ovs-vsctl list bridge %s" % br br_info_file = self.get_cmd_output_now(ovs_list_bridge_cmd) br_info = open(br_info_file).read() for line in br_info.splitlines(): if "protocols" in line: br_protos_ln = line[line.find("[")+1:line.find("]")] br_protos = br_protos_ln.replace('"', '').split(", ") # Collect flow information for relevant protocol versions only for flow in flow_versions: if flow in br_protos: self.add_cmd_output([ "ovs-ofctl -O %s dump-flows %s" % (flow, br), "ovs-ofctl -O %s dump-ports-desc %s" % (flow, br) ]) class RedHatOpenVSwitch(OpenVSwitch, RedHatPlugin): packages = ('openvswitch', 'openvswitch-dpdk') class DebianOpenVSwitch(OpenVSwitch, DebianPlugin, UbuntuPlugin): packages = ('openvswitch-switch',) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/sapnw.py0000644000175000017500000001343713203300002017231 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from sos.plugins import Plugin, RedHatPlugin def get_directory_listing(path): try: dir_list = os.listdir(path) except: dir_list = [] return dir_list class sapnw(Plugin, RedHatPlugin): """SAP NetWeaver""" plugin_name = 'sapnw' profiles = ['sap'] files = ['/usr/sap'] def collect_list_instances(self): # list installed instances inst_out = self.get_cmd_output_now("/usr/sap/hostctrl/exe/saphostctrl \ -function ListInstances", suggest_filename="SAPInstances") if not inst_out: return sidsunique = set() # Cycle through all the instances, get 'sid', 'instance_number' # and 'vhost' to determine the proper profile p = open(inst_out, "r").read().splitlines() for line in p: if "DAA" not in line: fields = line.strip().split() sid = fields[3] inst = fields[5] vhost = fields[7] sidsunique.add(sid) for line in get_directory_listing("/usr/sap/%s/SYS/profile/" % sid): if sid in line and inst in line and vhost in line: ldenv = 'LD_LIBRARY_PATH=/usr/sap/%s/SYS/exe/run' % sid # TODO: I am assuming unicode here # nuc should be accounted pt = '/usr/sap/%s/SYS/exe/uc/linuxx86_64' % sid profile = line.strip() # collect profiles self.add_cmd_output( "env -i %s %s/sappfpar \ all pf=/usr/sap/%s/SYS/profile/%s" % (ldenv, pt, sid, profile), suggest_filename="%s_parameters" % profile) # collect instance status self.add_cmd_output( "env -i %s %s/sapcontrol -nr %s \ -function GetProcessList" % (ldenv, pt, inst), suggest_filename="%s_%s_GetProcList" % (sid, inst)) # collect version info for the various components self.add_cmd_output( "env -i %s %s/sapcontrol -nr %s \ -function GetVersionInfo" % (ldenv, pt, inst), suggest_filename="%s_%s_GetVersInfo" % (sid, inst)) # collect adm user environment lowsid = sid.lower() self.add_cmd_output( "su - %sadm -c \"sapcontrol -nr %s -function \ GetEnvironment\"" % (lowsid, inst), suggest_filename="%s_%sadm_%s_userenv" % (sid, lowsid, inst)) # traverse the sids list, collecting info about dbclient for sid in sidsunique: for line in get_directory_listing("/usr/sap/%s/" % sid): if 'DVEB' in line: self.add_cmd_output( "grep 'client driver' /usr/sap/%s/%s/work/dev_w0" % (sid, line), suggest_filename="%s_dbclient" % sid) def collect_list_dbs(self): # list installed sap dbs db_out = self.get_cmd_output_now("/usr/sap/hostctrl/exe/saphostctrl \ -function ListDatabases", suggest_filename="SAPDatabases") if not db_out: return dbl = open(db_out, "r").read().splitlines() for line in dbl: if "Instance name" in line: fields = line.strip().split() dbadm = fields[2][:-1] dbtype = fields[8][:-1] sid = dbadm[3:].upper() if dbtype == 'db6': # IBM DB2 self.add_cmd_output( "su - %s -c \"db2 get dbm cfg\"" % dbadm, suggest_filename="%s_%s_db2_info" % (sid, dbadm)) if dbtype == 'sap': # SAP MAXDB sid = fields[2][:-1] self.add_copy_spec( "/sapdb/%s/data/config/%s.pah" % (sid, sid)) if dbtype == 'ora': # Oracle sid = fields[2][:-1] self.add_copy_spec("/oracle/%s/*/dbs/init.ora" % sid) if dbtype == 'syb': # Sybase sid = fields[2][:-1] self.add_copy_spec("/sybase/%s/ASE*/%s.cfg" % (sid, sid)) def setup(self): self.collect_list_instances() self.collect_list_dbs() # run sapconf in check mode self.add_cmd_output("sapconf -n", suggest_filename="sapconf_checkmode") # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/foreman.py0000644000175000017500000000237613203300002017530 0ustar cariboucaribou# Copyright (C) 2013 Red Hat, Inc., Lukas Zapletal # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Foreman(Plugin, RedHatPlugin): """Foreman/Satellite 6 systems management """ plugin_name = 'foreman' profiles = ('sysmgmt',) packages = ('foreman-debug',) def setup(self): cmd = "foreman-debug" path = self.get_cmd_output_path(name="foreman-debug") self.add_cmd_output("%s -g -q -a -d %s" % (cmd, path), chroot=self.tmp_in_sysroot(), timeout=900) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_manila.py0000644000175000017500000000644413203300002021411 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc.,Poornima M. Kshirsagar # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenStackManila(Plugin): """OpenStack Manila """ plugin_name = "openstack_manila" profiles = ('openstack', 'openstack_controller') option_list = [] var_puppet_gen = "/var/lib/config-data/puppet-generated/manila" def setup(self): self.add_copy_spec([ "/etc/manila/", self.var_puppet_gen + "/etc/manila/", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf", self.var_puppet_gen + "/etc/httpd/conf/", self.var_puppet_gen + "/etc/httpd/conf.d/", self.var_puppet_gen + "/etc/httpd/conf.modules.d/*.conf", ]) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/manila/*", "/var/log/containers/manila/*", "/var/log/containers/httpd/manila-api/*" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/manila/*.log", "/var/log/containers/manila/*.log", "/var/log/containers/httpd/manila-api/*log" ], sizelimit=self.limit) def postproc(self): protect_keys = [ "nova_admin_password", "rabbit_password", "qpid_password", "password", "netapp_nas_password", "cinder_admin_password", "neutron_admin_password", "service_instance_password", "connection", "sql_connection" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/manila/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/manila/*", regexp, r"\1*********" ) class DebianManila(OpenStackManila, DebianPlugin, UbuntuPlugin): """OpenStackManila related information for Debian based distributions.""" packages = ( 'python-manila', 'manila-common', 'manila-api', 'manila-share', 'manila-scheduler' ) class RedHatManila(OpenStackManila, RedHatPlugin): """OpenStackManila related information for Red Hat distributions.""" packages = ( 'puppet-manila', 'openstack-manila', 'openstack-manila-share', 'python-manila', 'python-manilaclient', 'python-manila-tests' ) def setup(self): super(RedHatManila, self).setup() self.add_copy_spec("/etc/sudoers.d/manila") # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/logrotate.py0000644000175000017500000000261213203300002020072 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class LogRotate(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """LogRotate service """ plugin_name = 'logrotate' profiles = ('system',) var_puppet_gen = "/var/lib/config-data/puppet-generated/crond" def setup(self): self.add_cmd_output("logrotate --debug /etc/logrotate.conf", suggest_filename="logrotate_debug") self.add_copy_spec([ "/etc/logrotate*", "/var/lib/logrotate.status", self.var_puppet_gen + "/etc/logrotate-crond.conf", self.var_puppet_gen + "/var/spool/cron/root" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/udev.py0000644000175000017500000000217513203300002017041 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Udev(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """udev dynamic device management """ plugin_name = 'udev' profiles = ('system', 'hardware', 'boot') def setup(self): self.add_copy_spec([ "/etc/udev/udev.conf", "/lib/udev/rules.d", "/etc/udev/rules.d/*" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ntb.py0000644000175000017500000000240313203300002016653 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Ntb(Plugin, RedHatPlugin): """Linux PCI-Express Non-Transparent Bridge """ plugin_name = 'ntb' profiles = ('hardware', ) def setup(self): # NTB is hardwired at PCI Bus 0, device 3, function 0 on Intel # processors (see page 8 in # http://download.intel.com/design/intarch/papers/323328.pdf). self.add_copy_spec([ '/sys/kernel/debug/ntb_hw_intel/0000:*/info', '/sys/kernel/debug/ntb_transport/0000:*/qp*/stats' ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/gluster_block.py0000644000175000017500000000262413203300002020734 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import glob from sos.plugins import Plugin, RedHatPlugin class GlusterBlock(Plugin, RedHatPlugin): """Gluster Block""" plugin_name = 'gluster_block' profiles = ('storage',) packages = ("gluster-block",) files = ("/usr/sbin/gluster-block",) def setup(self): # collect logs - apply log_size for any individual file # all_logs takes precedence over logsize if not self.get_option("all_logs"): limit = self.get_option("log_size") else: limit = 0 if limit: for f in glob.glob("/var/log/gluster-block/*.log"): self.add_copy_spec(f, limit) else: self.add_copy_spec("/var/log/gluster-block") sosreport-3.5/sos/plugins/cgroups.py0000644000175000017500000000273613203300002017563 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Cgroups(Plugin, DebianPlugin, UbuntuPlugin): """Control groups subsystem """ plugin_name = "cgroups" profiles = ('system',) files = ('/proc/cgroups',) def setup(self): self.add_copy_spec([ "/proc/cgroups", "/sys/fs/cgroup" ]) self.add_cmd_output("systemd-cgls") return class RedHatCgroups(Cgroups, RedHatPlugin): def setup(self): super(RedHatCgroups, self).setup() self.add_copy_spec([ "/etc/sysconfig/cgconfig", "/etc/sysconfig/cgred", "/etc/cgsnapshot_blacklist.conf", "/etc/cgconfig.conf", "/etc/cgrules.conf" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/java.py0000644000175000017500000000236513203300002017020 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Java(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """Java runtime""" plugin_name = "java" profiles = ('webserver', 'java') verify_packages = ('java.*',) def setup(self): self.add_copy_spec("/etc/java") self.add_forbidden_path("/etc/java/security") self.add_cmd_output("alternatives --display java", root_symlink="java") self.add_cmd_output("readlink -f /usr/bin/java") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/vhostmd.py0000644000175000017500000000422413203300002017557 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os class vhostmd(Plugin, RedHatPlugin): """vhostmd virtualization metrics collection """ plugin_name = 'vhostmd' profiles = ['sap', 'virt', 'system'] packages = ['virt-what'] def setup(self): vw = self.get_command_output("virt-what")['output'].splitlines() if not vw: return if "vmware" in vw or "kvm" in vw or "xen" in vw: if self.is_installed("vm-dump-metrics"): # if vm-dump-metrics is installed use it self.add_cmd_output("vm-dump-metrics", suggest_filename="virt_metrics") else: # otherwise use the raw vhostmd disk presented (256k size) sysblock = "/sys/block" if not os.path.isdir(sysblock): return for disk in os.listdir(sysblock): if "256K" in disk: dev = disk.split()[0] check = self.get_command_output( "dd if=/dev/%s bs=25 count=1" % dev) if 'metric' in check['output']: self.add_cmd_output("dd if=/dev/%s bs=256k count=1" % dev, suggest_filename="virt_\ metrics") # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/ipsec.py0000644000175000017500000000262113203300002017175 0ustar cariboucaribou# Copyright (C) 2007 Sadique Puthen # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class IPSec(Plugin): """Internet protocol security """ plugin_name = "ipsec" profiles = ('network',) packages = ('ipsec-tools',) class RedHatIpsec(IPSec, RedHatPlugin): files = ('/etc/racoon/racoon.conf',) def setup(self): self.add_copy_spec("/etc/racoon") class DebianIPSec(IPSec, DebianPlugin, UbuntuPlugin): files = ('/etc/ipsec-tools.conf',) def setup(self): self.add_copy_spec([ "/etc/ipsec-tools.conf", "/etc/ipsec-tools.d", "/etc/default/setkey" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/dhcp.py0000644000175000017500000000262313203300002017012 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin class Dhcp(Plugin): """DHCP daemon """ plugin_name = "dhcp" profiles = ('network',) class RedHatDhcp(Dhcp, RedHatPlugin): files = ('/etc/rc.d/init.d/dhcpd',) packages = ('dhcp',) def setup(self): super(RedHatDhcp, self).setup() self.add_copy_spec([ "/etc/dhcpd.conf", "/etc/dhcp" ]) class UbuntuDhcp(Dhcp, UbuntuPlugin): files = ('/etc/init.d/udhcpd',) packages = ('udhcpd',) def setup(self): super(UbuntuDhcp, self).setup() self.add_copy_spec([ "/etc/default/udhcpd", "/etc/udhcpd.conf" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/devicemapper.py0000644000175000017500000000231013203300002020531 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class DeviceMapper(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """device-mapper framework """ plugin_name = 'devicemapper' profiles = ('storage',) packages = ('device-mapper',) files = ('/dev/mapper',) def setup(self): self.add_cmd_output([ "dmsetup info -c", "dmsetup table", "dmsetup status", "dmsetup ls --tree" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/infiniband.py0000644000175000017500000000315113203300002020172 0ustar cariboucaribou# Copyright (C) 2011, 2012 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Infiniband(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Infiniband data """ plugin_name = 'infiniband' profiles = ('hardware',) packages = ('libibverbs-utils', 'opensm', 'rdma', 'infiniband-diags') def setup(self): self.add_copy_spec([ "/etc/ofed/openib.conf", "/etc/ofed/opensm.conf", "/etc/rdma" ]) self.add_copy_spec("/var/log/opensm*", sizelimit=self.get_option("log_size")) self.add_cmd_output([ "ibv_devices", "ibv_devinfo", "ibstat", "ibstatus", "ibhosts", "iblinkinfo", "sminfo", "perfquery" ]) return # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_aodh.py0000644000175000017500000000706413203300002021062 0ustar cariboucaribou# Copyright (C) 2017 Red Hat, Inc., Sachin Patil # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from sos.plugins import Plugin, RedHatPlugin class OpenStackAodh(Plugin, RedHatPlugin): """OpenStack Alarm service""" plugin_name = "openstack_aodh" profiles = ('openstack', 'openstack_controller') packages = ( 'openstack-aodh-api', 'openstack-aodh-listener', 'openstack-aodh-notifier', 'openstack-aodh-evaluator,' 'openstack-aodh-common' ) requires_root = False var_puppet_gen = "/var/lib/config-data/puppet-generated/aodh" def setup(self): self.add_copy_spec([ "/etc/aodh/", self.var_puppet_gen + "/etc/aodh/*", self.var_puppet_gen + "/etc/httpd/conf/*", self.var_puppet_gen + "/etc/httpd/conf.d/*", self.var_puppet_gen + "/etc/httpd/conf.modules.d/wsgi.conf", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf" ]) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/aodh/*", "/var/log/containers/aodh/*", "/var/log/containers/httpd/aodh-api/*" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/aodh/*.log", "/var/log/containers/aodh/*.log", "/var/log/containers/httpd/aodh-api/*log" ], sizelimit=self.limit) vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD', 'OS_AUTH_TYPE' ]] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME' ]] if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. Source " "the environment file for the user intended " "to connect to the OpenStack environment.") else: self.add_cmd_output([ "aodh --version", "aodh capabilities list", "aodh alarm list" ]) def postproc(self): self.do_file_sub( "/etc/aodh/aodh.conf", r"(password[\t\ ]*=[\t\ ]*)(.+)", r"\1********" ) self.do_file_sub( "/etc/aodh/aodh.conf", r"(rabbit_password[\t\ ]*=[\t\ ]*)(.+)", r"\1********", ) self.do_file_sub( self.var_puppet_gen + "/etc/aodh/aodh.conf", r"(password[\t\ ]*=[\t\ ]*)(.+)", r"\1********" ) self.do_file_sub( self.var_puppet_gen + "/etc/aodh/aodh.conf", r"(rabbit_password[\t\ ]*=[\t\ ]*)(.+)", r"\1********", ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/snappy.py0000644000175000017500000000244113203300002017404 0ustar cariboucaribou# Copyright (c) 2017 Bryan Quigley # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin, DebianPlugin, RedHatPlugin class Snappy(Plugin, UbuntuPlugin, DebianPlugin, RedHatPlugin): """Snap packages """ plugin_name = 'snappy' profiles = ('system', 'sysmgmt', 'packagemanager') files = ('/usr/bin/snap') def setup(self): self.add_cmd_output([ "systemctl status snapd.service", "snap list --all", "snap --version", "snap changes" ]) self.add_journal(units="snapd") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/lilo.py0000644000175000017500000000204513203300002017031 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin class Lilo(Plugin, RedHatPlugin, UbuntuPlugin): """Lilo bootloader """ plugin_name = 'lilo' profiles = ('system', 'boot') packages = ('lilo',) def setup(self): self.add_copy_spec("/etc/lilo.conf") self.add_cmd_output("lilo -q") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/sunrpc.py0000644000175000017500000000321413203300002017403 0ustar cariboucaribou# Copyright (C) 2012 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class SunRPC(Plugin): """Sun RPC service """ plugin_name = "sunrpc" profiles = ('system', 'storage', 'network', 'nfs') service = None def check_enabled(self): if self.policy().default_runlevel() in \ self.policy().runlevel_by_service(self.service): return True return False def setup(self): self.add_cmd_output("rpcinfo -p localhost") return class RedHatSunRPC(SunRPC, RedHatPlugin): service = 'rpcbind' # FIXME: depends on addition of runlevel_by_service (or similar) # in Debian/Ubuntu policy classes # class DebianSunRPC(SunRPC, DebianPlugin, UbuntuPlugin): # """Sun RPC related information # """ # # service = 'rpcbind-boot' # # def setup(self): # self.add_cmd_output("rpcinfo -p localhost") # return # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/nfsganesha.py0000644000175000017500000000300313203300002020202 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class NfsGanesha(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """NFS-Ganesha file server information """ plugin_name = 'nfsganesha' profiles = ('storage', 'network', 'nfs') packages = ('nfs-ganesha') def setup(self): self.add_copy_spec([ "/etc/ganesha", "/etc/sysconfig/ganesha", "/var/run/sysconfig/ganesha", "/var/log/ganesha.log", "/var/log/ganesha-gfapi.log" ]) self.add_cmd_output([ "dbus-send --type=method_call --print-reply" " --system --dest=org.ganesha.nfsd " "/org/ganesha/nfsd/ExportMgr " "org.ganesha.nfsd.exportmgr.ShowExports" ]) return # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/kubernetes.py0000644000175000017500000001277413203300002020253 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Neependra Khare # Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin from os import path class kubernetes(Plugin, RedHatPlugin): """Kubernetes plugin """ # Red Hat Atomic Platform and OpenShift Enterprise use the # atomic-openshift-master package to provide kubernetes packages = ('kubernetes', 'kubernetes-master', 'atomic-openshift-master') files = ("/etc/origin/master/master-config.yaml",) option_list = [ ("all", "also collect all namespaces output separately", 'slow', False), ("describe", "capture descriptions of all kube resources", 'fast', False), ("podlogs", "capture logs for pods", 'slow', False), ] def check_is_master(self): if any([ path.exists("/var/run/kubernetes/apiserver.key"), path.exists("/etc/origin/master/master-config.yaml") ]): return True return False def setup(self): self.add_copy_spec("/etc/kubernetes") self.add_copy_spec("/var/run/flannel") svcs = [ 'kubelet', 'kube-apiserver', 'kube-proxy', 'kube-scheduler', 'kube-controller-manager' ] for svc in svcs: self.add_journal(units=svc) # We can only grab kubectl output from the master if self.check_is_master(): kube_cmd = "kubectl " if path.exists('/etc/origin/master/admin.kubeconfig'): kube_cmd += "--config=/etc/origin/master/admin.kubeconfig" kube_get_cmd = "get -o json " for subcmd in ['version', 'config view']: self.add_cmd_output('%s %s' % (kube_cmd, subcmd)) # get all namespaces in use kn = self.get_command_output('%s get namespaces' % kube_cmd) knsps = [n.split()[0] for n in kn['output'].splitlines()[1:] if n] resources = [ 'limitrange', 'pods', 'pvc', 'rc', 'resourcequota', 'services' ] # nodes and pvs are not namespaced, must pull separately self.add_cmd_output([ "{} get -o json nodes".format(kube_cmd), "{} get -o json pv".format(kube_cmd) ]) if self.get_option('all'): for n in knsps: knsp = '--namespace=%s' % n k_cmd = '%s %s %s' % (kube_cmd, kube_get_cmd, knsp) self.add_cmd_output('%s events' % k_cmd) for res in resources: self.add_cmd_output('%s %s' % (k_cmd, res)) if self.get_option('describe'): # need to drop json formatting for this k_cmd = '%s get %s' % (kube_cmd, knsp) for res in resources: r = self.get_command_output( '%s %s' % (k_cmd, res)) if r['status'] == 0: k_list = [k.split()[0] for k in r['output'].splitlines()[1:]] for k in k_list: k_cmd = '%s %s' % (kube_cmd, knsp) self.add_cmd_output( '%s describe %s %s' % (k_cmd, res, k)) if self.get_option('podlogs'): k_cmd = '%s get %s' % (kube_cmd, knsp) r = self.get_command_output('%s get pods' % k_cmd) if r['status'] == 0: pods = [p.split()[0] for p in r['output'].splitlines()[1:]] for pod in pods: self.add_cmd_output('%s logs %s' % (k_cmd, pod)) k_cmd = '%s get --all-namespaces=true' % kube_cmd for res in resources: self.add_cmd_output('%s %s' % (k_cmd, res)) def postproc(self): # First, clear sensitive data from the json output collected. # This will mask values when the "name" looks susceptible of # values worth obfuscating, i.e. if the name contains strings # like "pass", "pwd", "key" or "token" env_regexp = r'(?P{\s*"name":\s*[^,]*' \ r'(pass|pwd|key|token|cred|PASS|PWD|KEY)[^,]*,\s*"value":)[^}]*' self.do_cmd_output_sub('kubectl', env_regexp, r'\g "********"') # Next, we need to handle the private keys and certs in some # output that is not hit by the previous iteration. self.do_cmd_private_sub('kubectl') # vim: et ts=5 sw=4 sosreport-3.5/sos/plugins/apt.py0000644000175000017500000000325713203300002016664 0ustar cariboucaribou# Copyright (C) 2013 Louis Bouchard # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin, DebianPlugin class Apt(Plugin, DebianPlugin, UbuntuPlugin): """ APT - advanced packaging tool """ plugin_name = 'apt' profiles = ('system', 'sysmgmt', 'packagemanager') def setup(self): self.add_copy_spec([ "/etc/apt", "/var/log/apt" ]) self.add_cmd_output([ "apt-get check", "apt-config dump", "apt-cache stats", "apt-cache policy" ]) dpkg_result = self.call_ext_prog( "dpkg-query -W -f='${binary:Package}\t${status}\n'") dpkg_output = dpkg_result['output'].splitlines() pkg_list = ' '.join( [v.split('\t')[0] for v in dpkg_output if 'ok installed' in v]) self.add_cmd_output( "apt-cache policy {}".format(pkg_list), suggest_filename="apt-cache_policy_details" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_trove.py0000644000175000017500000000520013203300002021274 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., Lee Yarwood # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenStackTrove(Plugin): """OpenStack Trove """ plugin_name = "openstack_trove" profiles = ('openstack', 'openstack_controller') option_list = [] var_puppet_gen = "/var/lib/config-data/puppet-generated/trove" def setup(self): self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/trove/", "/var/log/containers/trove/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/trove/*.log", "/var/log/containers/trove/*.log" ], sizelimit=self.limit) self.add_copy_spec([ '/etc/trove/', self.var_puppet_gen + '/etc/trove/' ]) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) def postproc(self): protect_keys = [ "default_password_length", "notifier_queue_password", "rabbit_password", "replication_password", "connection", "admin_password", "dns_passkey" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/trove/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/trove/*", regexp, r"\1*********" ) class DebianTrove(OpenStackTrove, DebianPlugin, UbuntuPlugin): packages = [ 'python-trove', 'trove-common', 'trove-api', 'trove-taskmanager' ] def setup(self): super(DebianTrove, self).setup() class RedHatTrove(OpenStackTrove, RedHatPlugin): packages = ['openstack-trove'] def setup(self): super(RedHatTrove, self).setup() # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/system.py0000644000175000017500000000237113203300002017420 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class System(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """core system information """ plugin_name = "system" profiles = ('system', 'kernel') verify_packages = ('glibc', 'initscripts', 'zlib') def setup(self): self.add_copy_spec("/proc/sys") self.add_forbidden_path( "/proc/sys/net/ipv6/neigh/*/retrans_time") self.add_forbidden_path( "/proc/sys/net/ipv6/neigh/*/base_reachable_time") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/smartcard.py0000644000175000017500000000260613203300002020055 0ustar cariboucaribou# Copyright (C) 2007 Sadique Puthen # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Smartcard(Plugin, RedHatPlugin): """PKCS#11 smart cards """ plugin_name = 'smartcard' profiles = ('security', 'identity', 'hardware') files = ('/etc/pam_pkcs11/pam_pkcs11.conf',) packages = ('pam_pkcs11',) def setup(self): self.add_copy_spec([ "/etc/reader.conf", "/etc/reader.conf.d/", "/etc/pam_pkcs11/"]) self.add_cmd_output([ "pklogin_finder debug", "ls -nl /usr/lib*/pam_pkcs11/" ]) self.add_forbidden_path("/etc/pam_pkcs11/nssdb/key[3-4].db") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/powerpc.py0000644000175000017500000000573313203300002017560 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # This plugin enables collection of logs for Power systems and more # specific logs for Pseries, PowerNV platforms. import os from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class PowerPC(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """IBM Power systems """ plugin_name = 'powerpc' profiles = ('system', 'hardware') def check_enabled(self): return "ppc64" in self.policy().get_arch() def setup(self): try: with open('/proc/cpuinfo', 'r') as fp: contents = fp.read() ispSeries = "pSeries" in contents isPowerNV = "PowerNV" in contents except: ispSeries = False isPowerNV = False if ispSeries or isPowerNV: self.add_copy_spec([ "/proc/device-tree/", "/proc/loadavg", "/proc/locks", "/proc/misc", "/proc/swaps", "/proc/version", "/dev/nvram", "/var/lib/lsvpd/" ]) self.add_cmd_output([ "ppc64_cpu --smt", "ppc64_cpu --cores-present", "ppc64_cpu --cores-on", "ppc64_cpu --run-mode", "ppc64_cpu --frequency", "ppc64_cpu --dscr", "diag_encl -v" ]) if ispSeries: self.add_copy_spec([ "/proc/ppc64/lparcfg", "/proc/ppc64/eeh", "/proc/ppc64/systemcfg", "/var/log/platform" ]) self.add_cmd_output([ "servicelog --dump", "servicelog_notify --list", "usysattn", "usysident", "serv_config -l", "bootlist -m both -r", "lparstat -i" ]) if isPowerNV: self.add_copy_spec([ "/proc/ppc64/eeh", "/proc/ppc64/systemcfg", "/proc/ppc64/topology_updates", "/sys/firmware/opal/msglog", "/var/log/opal-elog/" ]) if os.path.isdir("/var/log/dump"): self.add_cmd_output("ls -l /var/log/dump") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/services.py0000644000175000017500000000362013203300002017715 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Services(Plugin): """System services """ plugin_name = "services" profiles = ('system', 'boot') option_list = [("servicestatus", "get a status of all running services", "slow", False)] def setup(self): self.add_copy_spec([ "/etc/inittab", "/etc/rc.d" ]) if self.get_option('servicestatus'): self.add_cmd_output("/sbin/service --status-all") self.add_cmd_output([ "/sbin/runlevel", "ls /var/lock/subsys" ]) class RedHatServices(Services, RedHatPlugin): def setup(self): super(RedHatServices, self).setup() self.add_cmd_output("/sbin/chkconfig --list", root_symlink="chkconfig") class DebianServices(Services, DebianPlugin, UbuntuPlugin): def setup(self): super(DebianServices, self).setup() self.add_copy_spec("/etc/rc*.d") self.add_cmd_output("/sbin/initctl show-config", root_symlink="initctl") if self.get_option('servicestatus'): self.add_cmd_output("/sbin/initctl list") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ipvs.py0000644000175000017500000000220313203300002017047 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin class Ipvs(Plugin, RedHatPlugin, DebianPlugin): """Linux IP virtual server """ plugin_name = 'ipvs' profiles = ('cluster', 'network') packages = ('ipvsadm',) def setup(self): self.add_cmd_output([ "ipvsadm -Ln", "ipvsadm -Lc" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/dnf.py0000644000175000017500000000536113203300002016645 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc., Sachin Patil # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class DNFPlugin(Plugin, RedHatPlugin): """dnf package manager""" plugin_name = "dnf" profiles = ('system', 'packagemanager', 'sysmgmt') files = ('/etc/dnf/dnf.conf',) packages = ('dnf',) option_list = [ ("history", "captures transaction history", "fast", False), ("history-info", "detailed transaction history", "slow", False), ] def setup(self): self.add_copy_spec([ "/etc/dnf/dnf.conf", "/etc/dnf/plugins/*", "/etc/dnf/protected.d/*", ]) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec("/var/log/dnf.*", sizelimit=self.limit) else: self.add_copy_spec("/var/log/dnf.log", sizelimit=self.limit) self.add_copy_spec("/var/log/dnf.librepo.log", sizelimit=self.limit) self.add_copy_spec("/var/log/dnf.rpm.log", sizelimit=self.limit) self.add_cmd_output("dnf --version", suggest_filename="dnf_version") self.add_cmd_output("dnf list installed *dnf*", suggest_filename="dnf_installed_plugins") self.add_cmd_output("dnf list extras", suggest_filename="dnf_extra_packages") if self.get_option("history"): self.add_cmd_output("dnf history") if self.get_option("history-info"): history = self.call_ext_prog("dnf history") transactions = -1 if history['output']: for line in history['output'].splitlines(): try: transactions = int(line.split('|')[0].strip()) break except ValueError: pass for tr_id in range(1, transactions+1): self.add_cmd_output("dnf history info %d" % tr_id) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/boom.py0000755000175000017500000000250713203300002017034 0ustar cariboucaribou# Copyright (C) 2017 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. from sos.plugins import Plugin, RedHatPlugin class Boom(Plugin, RedHatPlugin): """Configuration data for the boom boot manager. """ plugin_name = 'boom' profiles = ('boot', 'system') packages = ('python-boom', 'python2-boom', 'python3-boom') def setup(self): self.add_copy_spec([ "/boot/boom/profiles", "/boot/loader/entries", "/etc/default/boom", "/etc/grub.d/42_boom" ]) self.add_cmd_output([ "boom list -VV", "boom profile list -VV" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/virsh.py0000644000175000017500000000542613203300002017233 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin import glob import os class LibvirtClient(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """client for libvirt virtualization API """ plugin_name = 'virsh' profiles = ('system', 'virt') packages = ('libvirt-client',) def setup(self): # virt-manager logs if not self.get_option("all_logs"): self.add_copy_spec("/root/.virt-manager/*", sizelimit=5) else: self.add_copy_spec("/root/.virt-manager/*") cmd = 'virsh -r' # get host information subcmds = [ 'list --all', 'domcapabilities', 'capabilities', 'nodeinfo', 'freecell', 'node-memory-tune', 'version' ] for subcmd in subcmds: self.add_cmd_output('%s %s' % (cmd, subcmd)) # get network, pool and nwfilter elements for k in ['net', 'nwfilter', 'pool']: self.add_cmd_output('%s %s-list' % (cmd, k)) k_list = self.get_command_output('%s %s-list' % (cmd, k)) if k_list and k_list['status'] == 0: k_lines = k_list['output'].splitlines() # the 'Name' column position changes between virsh cmds pos = k_lines[0].split().index('Name') for j in filter(lambda x: x, k_lines[2:]): n = j.split()[pos] self.add_cmd_output('%s %s-dumpxml %s' % (cmd, k, n)) # cycle through the VMs/domains list, ignore 2 header lines and latest # empty line, and dumpxml domain name in 2nd column domains_output = self.get_command_output('%s list --all' % cmd) if domains_output and domains_output['status'] == 0: domains_lines = domains_output['output'].splitlines()[2:] for domain in filter(lambda x: x, domains_lines): d = domain.split()[1] for x in ['dumpxml', 'dominfo', 'domblklist']: self.add_cmd_output('%s %s %s' % (cmd, x, d)) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/scsi.py0000644000175000017500000000247513203300002017042 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Scsi(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """SCSI devices """ plugin_name = 'scsi' profiles = ('storage', 'hardware') def setup(self): self.add_copy_spec([ "/proc/scsi", "/etc/stinit.def", "/sys/bus/scsi", "/sys/class/scsi_host", "/sys/class/scsi_disk", "/sys/class/scsi_device", "/sys/class/scsi_generic" ]) self.add_cmd_output([ "lsscsi", "sg_map" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/squid.py0000644000175000017500000000372013203300002017220 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Squid(Plugin): """Squid caching proxy """ plugin_name = 'squid' profiles = ('webserver', 'services', 'sysmgmt') class RedHatSquid(Squid, RedHatPlugin): files = ('/etc/squid/squid.conf',) packages = ('squid',) def setup(self): log_size = self.get_option('log_size') log_path = "/var/log/squid/" self.add_copy_spec("/etc/squid/squid.conf") self.add_copy_spec(log_path + "access.log", sizelimit=log_size) self.add_copy_spec(log_path + "cache.log", sizelimit=log_size) self.add_copy_spec(log_path + "squid.out", sizelimit=log_size) class DebianSquid(Squid, DebianPlugin, UbuntuPlugin): plugin_name = 'squid' files = ('/etc/squid3/squid.conf',) packages = ('squid3',) def setup(self): self.add_copy_spec("/etc/squid3/squid.conf", sizelimit=self.get_option('log_size')) self.add_copy_spec("/var/log/squid3/*", sizelimit=self.get_option('log_size')) self.add_copy_spec(['/etc/squid-deb-proxy']) self.add_copy_spec("/var/log/squid-deb-proxy/*", sizelimit=self.get_option('log_size')) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/quagga.py0000644000175000017500000000211413203300002017334 0ustar cariboucaribou# Copyright (C) 2007 Ranjith Rajaram # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Quagga(Plugin, RedHatPlugin): """Quagga routing service """ plugin_name = 'quagga' profiles = ('network',) files = ('/etc/quagga/zebra.conf',) packages = ('quagga',) def setup(self): self.add_copy_spec("/etc/quagga/") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/Makefile0000644000175000017500000000110413073155336017202 0ustar cariboucaribouPYTHON=python PACKAGE = $(shell basename `pwd`) PYFILES = $(wildcard *.py) PYVER := $(shell $(PYTHON) -c 'import sys; print("%.3s" %(sys.version))') PYSYSDIR := $(shell $(PYTHON) -c 'import sys; print(sys.prefix)') PYLIBDIR = $(PYSYSDIR)/lib/python$(PYVER) PKGDIR = $(PYLIBDIR)/site-packages/sos/$(PACKAGE) all: echo "nada" clean: rm -f *.pyc *.pyo *~ install: mkdir -p $(DESTDIR)/$(PKGDIR) for p in $(PYFILES) ; do \ install -m 644 $$p $(DESTDIR)/$(PKGDIR)/$$p; \ done $(PYTHON) -c "import compileall; compileall.compile_dir('$(DESTDIR)/$(PKGDIR)', 1, '$(PYDIR)', 1)" sosreport-3.5/sos/plugins/kvm.py0000644000175000017500000000407513203300002016674 0ustar cariboucaribou# Copyright (C) 2009 Red Hat, Inc., Joey Boggs # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class Kvm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Kernel virtual machine """ plugin_name = 'kvm' profiles = ('system', 'virt') debugfs_path = "/sys/kernel/debug" _debugfs_cleanup = False def check_enabled(self): return os.access("/sys/module/kvm", os.R_OK) def setup(self): self.add_copy_spec([ "/sys/module/kvm/srcversion", "/sys/module/kvm_intel/srcversion", "/sys/module/kvm_amd/srcversion", "/sys/module/ksm/srcversion" ]) if not os.path.ismount(self.debugfs_path): self._debugfs_cleanup = True r = self.call_ext_prog("mount -t debugfs debugfs %s" % self.debugfs_path) if r['status'] != 0: self._log_error("debugfs not mounted and mount attempt failed") self._debugfs_cleanup = False return self.add_cmd_output("kvm_stat --once") def postproc(self): if self._debugfs_cleanup and os.path.ismount(self.debugfs_path): self.call_ext_prog("umount %s" % self.debugfs_path) self._log_error("could not unmount %s" % self.debugfs_path) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/opencl.py0000644000175000017500000000207313203300002017353 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class OpenCL(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """OpenCL """ plugin_name = 'opencl' profiles = ('hardware', 'desktop', 'gpu') files = ('/usr/bin/clinfo',) def setup(self): self.add_cmd_output([ "clinfo", ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_glance.py0000644000175000017500000001005613203300002021373 0ustar cariboucaribou# Copyright (C) 2013 Red Hat, Inc., Flavio Percoco # Copyright (C) 2012 Rackspace US, Inc., # Justin Shepherd # Copyright (C) 2009 Red Hat, Inc., Joey Boggs # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class OpenStackGlance(Plugin): """OpenStack Glance""" plugin_name = "openstack_glance" profiles = ('openstack', 'openstack_controller') option_list = [] var_puppet_gen = "/var/lib/config-data/puppet-generated/glance_api" def setup(self): self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/glance/", "/var/log/containers/glance/", "/var/log/containers/httpd/glance-api/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/glance/*.log", "/var/log/containers/glance/*.log", "/var/log/containers/httpd/glance-api/*log" ], sizelimit=self.limit) self.add_copy_spec([ "/etc/glance/", self.var_puppet_gen + "/etc/glance/", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf" ]) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD']] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME']] # collect commands output only if the openstack-glance-api service # is running service_status = self.get_command_output( "systemctl status openstack-glance-api.service" ) if service_status['status'] == 0: self.add_cmd_output( "glance-manage db_version", suggest_filename="glance_db_version" ) if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. " "Source the environment file for the user " "intended to connect to the OpenStack " "environment.") else: self.add_cmd_output("openstack image list --long") def postproc(self): protect_keys = [ "admin_password", "password", "qpid_password", "rabbit_password", "s3_store_secret_key", "ssl_key_password", "connection", "vmware_server_password" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/glance/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/glance/*", regexp, r"\1*********" ) class DebianGlance(OpenStackGlance, DebianPlugin, UbuntuPlugin): packages = ( 'glance', 'glance-api', 'glance-client', 'glance-common', 'glance-registry', 'python-glance' ) class RedHatGlance(OpenStackGlance, RedHatPlugin): packages = ( 'openstack-glance', 'python-glanceclient' ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/sanlock.py0000644000175000017500000000254113203300002017525 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class SANLock(Plugin): """SANlock daemon """ plugin_name = "sanlock" profiles = ('cluster', 'virt') packages = ["sanlock"] def setup(self): self.add_copy_spec("/var/log/sanlock.log*") self.add_cmd_output([ "sanlock client status -D", "sanlock client host_status -D", "sanlock client log_dump" ]) return class RedHatSANLock(SANLock, RedHatPlugin): files = ["/etc/sysconfig/sanlock"] def setup(self): super(RedHatSANLock, self).setup() self.add_copy_spec("/etc/sysconfig/sanlock") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/apport.py0000644000175000017500000000334013203300002017376 0ustar cariboucaribou# Copyright (c) 2012 Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, DebianPlugin, UbuntuPlugin class Apport(Plugin, DebianPlugin, UbuntuPlugin): """Apport crash reporting tool """ plugin_name = 'apport' profiles = ('debug',) def setup(self): if not self.get_option("all_logs"): limit = self.get_option("log_size") self.add_copy_spec("/var/log/apport.log", sizelimit=limit) self.add_copy_spec("/var/log/apport.log.1", sizelimit=limit) else: self.add_copy_spec("/var/log/apport*") self.add_copy_spec("/etc/apport/*") self.add_copy_spec("/var/lib/whoopsie/whoopsie-id") self.add_cmd_output( "gdbus call -y -d com.ubuntu.WhoopsiePreferences \ -o /com/ubuntu/WhoopsiePreferences \ -m com.ubuntu.WhoopsiePreferences.GetIdentifier") self.add_cmd_output("ls -alh /var/crash/") self.add_cmd_output("bash -c 'grep -B 50 -m 1 ProcMaps /var/crash/*'") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_heat.py0000644000175000017500000001203313203300002021060 0ustar cariboucaribou# Copyright (C) 2013 Red Hat, Inc. # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class OpenStackHeat(Plugin): """OpenStack Heat """ plugin_name = "openstack_heat" profiles = ('openstack', 'openstack_controller') option_list = [] var_puppet_gen = "/var/lib/config-data/puppet-generated/heat" def setup(self): # collect commands output only if the openstack-heat-api service # is running service_status = self.get_command_output("systemctl status " "openstack-heat-api.service") if service_status['status'] == 0: self.add_cmd_output( "heat-manage db_version", suggest_filename="heat_db_version" ) vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD']] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME']] if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. " "Source the environment file for the user " "intended to connect to the OpenStack " "environment.") else: self.add_cmd_output("openstack stack list") self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/heat/", "/var/log/containers/heat/", "/var/log/containers/httpd/heat-api/", "/var/log/containers/httpd/heat-api-cfn" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/heat/*.log", "/var/log/containers/heat/*.log", "/var/log/containers/httpd/heat-api/*log", "/var/log/containers/httpd/heat-api-cfn/*log" ], sizelimit=self.limit) self.add_copy_spec([ "/etc/heat/", self.var_puppet_gen + "/etc/heat/", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf", self.var_puppet_gen + "_api/etc/heat/", self.var_puppet_gen + "_api/etc/httpd/conf/", self.var_puppet_gen + "_api/etc/httpd/conf.d/", self.var_puppet_gen + "_api/etc/httpd/conf.modules.d/*.conf", self.var_puppet_gen + "_api/var/spool/cron/heat", self.var_puppet_gen + "_api_cfn/etc/heat/", self.var_puppet_gen + "_api_cfn/etc/httpd/conf/", self.var_puppet_gen + "_api_cfn/etc/httpd/conf.d/", self.var_puppet_gen + "_api_cfn/etc/httpd/conf.modules.d/*.conf", self.var_puppet_gen + "_api_cfn/var/spool/cron/heat", ]) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) def postproc(self): protect_keys = [ "admin_password", "memcache_secret_key", "password", "connection", "qpid_password", "rabbit_password", "stack_domain_admin_password", ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub( "/etc/heat/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/heat/*", regexp, r"\1*********" ) self.do_path_regex_sub( self.var_puppet_gen + "_api/etc/heat/*", regexp, r"\1*********" ) self.do_path_regex_sub( self.var_puppet_gen + "_api_cfn/etc/heat/*", regexp, r"\1*********" ) class DebianHeat(OpenStackHeat, DebianPlugin, UbuntuPlugin): packages = ( 'heat-api', 'heat-api-cfn', 'heat-api-cloudwatch', 'heat-common', 'heat-engine', 'python-heat', 'python-heatclient' ) class RedHatHeat(OpenStackHeat, RedHatPlugin): packages = ( 'openstack-heat-api', 'openstack-heat-api-cfn', 'openstack-heat-api-cloudwatch', 'openstack-heat-cli', 'openstack-heat-common', 'openstack-heat-engine', 'python-heatclient' ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/qpid.py0000644000175000017500000000724113203300002017032 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Qpid(Plugin, RedHatPlugin): """Qpid messaging """ plugin_name = 'qpid' profiles = ('services',) packages = ('qpidd', 'qpid-cpp-server', 'qpid-tools') option_list = [("port", "listening port to connect to", '', ""), ("ssl-certificate", "Path to file containing client SSL certificate", '', ""), ("ssl-key", "Path to file containing client SSL private key", '', ""), ("ssl", "enforce SSL / amqps connection", '', False)] def setup(self): """ performs data collection for qpid broker """ options = "" amqps_prefix = "" # set amqps:// when SSL is used if self.get_option("ssl"): amqps_prefix = "amqps://" # for either present option, add --option=value to 'options' variable for option in ["ssl-certificate", "ssl-key"]: if self.get_option(option): amqps_prefix = "amqps://" options = (options + " --%s=" % (option) + self.get_option(option)) if self.get_option("port"): options = (options + " -b " + amqps_prefix + "localhost:%s" % (self.get_option("port"))) self.add_cmd_output([ "qpid-stat -g" + options, # applies since 0.18 version "qpid-stat -b" + options, # applies to pre-0.18 versions "qpid-stat -c" + options, "qpid-stat -e" + options, "qpid-stat -q" + options, "qpid-stat -u" + options, "qpid-stat -m" + options, # applies since 0.18 version "qpid-config exchanges" + options, "qpid-config queues" + options, "qpid-config exchanges -b" + options, # applies to pre-0.18 vers. "qpid-config queues -b" + options, # applies to pre-0.18 versions "qpid-config exchanges -r" + options, # applies since 0.18 version "qpid-config queues -r" + options, # applies since 0.18 version "qpid-route link list" + options, "qpid-route route list" + options, "qpid-cluster" + options, # applies to pre-0.22 versions "qpid-ha query" + options, # applies since 0.22 version "ls -lanR /var/lib/qpidd" ]) self.add_copy_spec([ "/etc/qpidd.conf", # applies to pre-0.22 versions "/etc/qpid/qpidd.conf", # applies since 0.22 version "/var/lib/qpid/syslog", "/etc/ais/openais.conf", "/var/log/cumin.log", "/var/log/mint.log", "/etc/sasl2/qpidd.conf", "/etc/qpid/qpidc.conf", "/etc/sesame/sesame.conf", "/etc/cumin/cumin.conf", "/etc/corosync/corosync.conf", "/var/lib/sesame", "/var/log/qpidd.log", "/var/log/sesame", "/var/log/cumin" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/upstart.py0000644000175000017500000000335513203300002017601 0ustar cariboucaribou# Copyright (C) 2012 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Upstart(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Upstart init system """ plugin_name = 'upstart' profiles = ('system', 'services', 'boot') packages = ('upstart',) def setup(self): self.add_cmd_output([ 'initctl --system list', 'initctl --system version', 'init --version', "ls -l /etc/init/" ]) # Job Configuration Files self.add_copy_spec([ '/etc/init.conf', '/etc/event.d/*', '/etc/init/*.conf' ]) # State file self.add_copy_spec('/var/log/upstart/upstart.state') # Log files self.add_copy_spec('/var/log/upstart/*', sizelimit=self.get_option('log_size')) # Session Jobs (running Upstart as a Session Init) self.add_copy_spec('/usr/share/upstart/') # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/subscription_manager.py0000644000175000017500000000315613203300002022314 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class SubscriptionManager(Plugin, RedHatPlugin): """subscription-manager information """ plugin_name = 'subscription_manager' profiles = ('system', 'packagemanager', 'sysmgmt') files = ('/etc/rhsm/rhsm.conf',) packages = ('subscription-manager',) def setup(self): # rhsm config and logs self.add_copy_spec([ "/etc/rhsm/", "/var/lib/rhsm/", "/var/log/rhsm/rhsm.log", "/var/log/rhsm/rhsmcertd.log"]) self.add_cmd_output([ "subscription-manager list --installed", "subscription-manager list --consumed", "subscription-manager identity" ]) self.add_cmd_output("rhsm-debug system --sos --no-archive " "--no-subscriptions --destination %s" % self.get_cmd_output_path()) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/mpt.py0000644000175000017500000000214413203300002016672 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Mpt(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """ LSI Message Passing Technology """ files = ('/proc/mpt',) profiles = ('storage', ) plugin_name = 'mpt' def setup(self): self.add_copy_spec("/proc/mpt") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_instack.py0000644000175000017500000001432013203300002021574 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., Lee Yarwood # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os class OpenStackInstack(Plugin): """OpenStack Instack """ plugin_name = "openstack_instack" profiles = ('openstack', 'openstack_undercloud') def setup(self): self.add_copy_spec("/home/stack/.instack/install-undercloud.log") self.add_copy_spec("/home/stack/instackenv.json") self.add_copy_spec("/home/stack/undercloud.conf") if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec(["/var/log/mistral/", "/var/log/containers/mistral/"], sizelimit=self.limit) self.add_copy_spec(["/var/log/zaqar/", "/var/log/containers/zaqar/"], sizelimit=self.limit) else: self.add_copy_spec(["/var/log/mistral/*.log", "/var/log/containers/mistral/*.log"], sizelimit=self.limit) self.add_copy_spec(["/var/log/zaqar/*.log", "/var/log/containers/zaqar/*.log"], sizelimit=self.limit) vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD']] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME']] if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. Source " "the environment file for the user intended " "to connect to the OpenStack environment.") else: # get status of overcloud stack and resources self.add_cmd_output("openstack stack show overcloud") self.add_cmd_output( "openstack stack resource list -n 10 overcloud", timeout=600) # get details on failed deployments cmd = "openstack stack resource list -f value -n 5 overcloud" deployments = self.call_ext_prog(cmd, timeout=600)['output'] for deployment in deployments.splitlines(): if 'FAILED' in deployment: check = [ "OS::Heat::StructuredDeployment", "OS::Heat::SoftwareDeployment"] if any(x in deployment for x in check): deployment = deployment.split()[1] cmd = "openstack software deployment show " \ "--long %s" % (deployment) self.add_cmd_output( cmd, suggest_filename="failed-deployment-" + deployment + ".log", timeout=600) self.add_cmd_output("openstack object save " "tripleo-ui-logs tripleo-ui.logs --file -") def postproc(self): protected_keys = [ "UNDERCLOUD_TUSKAR_PASSWORD", "UNDERCLOUD_ADMIN_PASSWORD", "UNDERCLOUD_CEILOMETER_METERING_SECRET", "UNDERCLOUD_CEILOMETER_PASSWORD", "UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD", "UNDERCLOUD_DB_PASSWORD", "UNDERCLOUD_GLANCE_PASSWORD", "UNDERCLOUD_HEAT_PASSWORD", "UNDERCLOUD_HEAT_STACK_DOMAIN_ADMIN_PASSWORD", "UNDERCLOUD_HORIZON_SECRET_KEY", "UNDERCLOUD_IRONIC_PASSWORD", "UNDERCLOUD_NEUTRON_PASSWORD", "UNDERCLOUD_NOVA_PASSWORD", "UNDERCLOUD_RABBIT_PASSWORD", "UNDERCLOUD_SWIFT_PASSWORD", "UNDERCLOUD_TUSKAR_PASSWORD", "OS_PASSWORD", "undercloud_db_password", "undercloud_admin_password", "undercloud_glance_password", "undercloud_heat_password", "undercloud_neutron_password", "undercloud_nova_password", "undercloud_ironic_password", "undercloud_tuskar_password", "undercloud_ceilometer_password", "undercloud_ceilometer_metering_secret", "undercloud_ceilometer_snmpd_password", "undercloud_swift_password", "undercloud_rabbit_password", "undercloud_heat_stack_domain_admin_password" ] regexp = r"((?m)(%s)=)(.*)" % "|".join(protected_keys) self.do_file_sub("/home/stack/.instack/install-undercloud.log", regexp, r"\1*********") self.do_file_sub("/home/stack/undercloud.conf", regexp, r"\1*********") protected_json_keys = ["pm_password", "ssh-key", "password"] json_regexp = r'((?m)"(%s)": )(".*?")' % "|".join(protected_json_keys) self.do_file_sub("/home/stack/instackenv.json", json_regexp, r"\1*********") class RedHatRDOManager(OpenStackInstack, RedHatPlugin): packages = [ 'instack', 'instack-undercloud', 'openstack-tripleo', 'openstack-tripleo-common', 'openstack-tripleo-heat-templates', 'openstack-tripleo-image-elements', 'openstack-tripleo-puppet-elements', 'openstack-tripleo-ui', 'openstack-tripleo-validations', 'puppet-tripleo', 'python-tripleoclient' ] def setup(self): super(RedHatRDOManager, self).setup() # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/targetcli.py0000644000175000017500000000257413203300002020057 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class TargetCli(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """TargetCLI TCM/LIO configuration """ packages = ('targetcli', 'python-rtslib') profiles = ('storage', ) plugin_name = 'targetcli' def setup(self): self.add_cmd_output([ "targetcli ls", "targetcli status", "systemctl status target.service" ]) self.add_journal(units="targetcli") self.add_copy_spec("/sys/kernel/config/target") self.add_copy_spec("/etc/target") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/oddjob.py0000644000175000017500000000230013203300002017325 0ustar cariboucaribou# Copyright (C) 2007 Sadique Puthen # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Oddjob(Plugin, RedHatPlugin): """OddJob task scheduler """ plugin_name = 'oddjob' profiles = ('services', 'sysmgmt') files = ('/etc/oddjobd.conf',) packages = ('oddjob',) def setup(self): self.add_copy_spec([ "/etc/oddjobd.conf", "/etc/oddjobd.conf.d", "/etc/dbus-1/system.d/oddjob.conf" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ds.py0000644000175000017500000000565213203300002016507 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Kent Lamb # Copyright (C) 2014 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os class DirectoryServer(Plugin, RedHatPlugin): """Directory Server """ plugin_name = 'ds' profiles = ('identity',) files = ('/etc/dirsrv', '/opt/redhat-ds') packages = ('redhat-ds-base', 'redhat-ds-7') def check_version(self): if self.is_installed("redhat-ds-base") or \ os.path.exists("/etc/dirsrv"): return "ds8" elif self.is_installed("redhat-ds-7") or \ os.path.exists("/opt/redhat-ds"): return "ds7" return False def setup(self): self.add_forbidden_path("/etc/dirsrv/slapd*/pin.txt") self.add_forbidden_path("/etc/dirsrv/slapd*/key3.db") self.add_forbidden_path("/etc/dirsrv/slapd*/pwfile.txt") self.add_forbidden_path("/etc/dirsrv/slapd*/*passw*") self.add_forbidden_path("/etc/dirsrv/admin-serv/key[3-4].db") self.add_forbidden_path("/etc/dirsrv/admin-serv/admpw") self.add_forbidden_path("/etc/dirsrv/admin-serv/password.conf") try: for d in os.listdir("/etc/dirsrv"): if d[0:5] == 'slapd': certpath = os.path.join("/etc/dirsrv", d) self.add_cmd_output("certutil -L -d %s" % certpath) except: self._log_warn("could not list /etc/dirsrv") if not self.check_version(): self.add_alert("Directory Server not found.") elif "ds8" in self.check_version(): self.add_copy_spec([ "/etc/dirsrv/slapd*/cert8.db", "/etc/dirsrv/slapd*/certmap.conf", "/etc/dirsrv/slapd*/dse.ldif", "/etc/dirsrv/slapd*/dse.ldif.startOK", "/etc/dirsrv/slapd*/secmod.db", "/etc/dirsrv/slapd*/schema/*.ldif", "/etc/dirsrv/admin-serv", "/var/log/dirsrv/*" ]) elif "ds7" in self.check_version(): self.add_copy_spec([ "/opt/redhat-ds/slapd-*/config", "/opt/redhat-ds/slapd-*/logs" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openswan.py0000644000175000017500000000321713203300002017726 0ustar cariboucaribou# Copyright (C) 2007 Sadique Puthen # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Openswan(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Openswan IPsec """ plugin_name = 'openswan' profiles = ('network', 'security') option_list = [("ipsec-barf", "collect the output of the ipsec barf command", "slow", False)] files = ('/etc/ipsec.conf',) packages = ('openswan', 'libreswan') def setup(self): self.add_copy_spec([ "/etc/ipsec.conf", "/etc/ipsec.d" ]) # although this is 'verification' it's normally a very quick # operation so is not conditional on --verify self.add_cmd_output("ipsec verify") if self.get_option("ipsec-barf"): self.add_cmd_output("ipsec barf") self.add_forbidden_path("/etc/ipsec.d/key[3-4].db") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/kernel.py0000644000175000017500000000616313203300002017357 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os import glob class Kernel(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Linux kernel """ plugin_name = 'kernel' profiles = ('system', 'hardware', 'kernel') verify_packages = ('kernel$',) sys_module = '/sys/module' def setup(self): # compat self.add_cmd_output("uname -a", root_symlink="uname") self.add_cmd_output("lsmod", root_symlink="lsmod") self.add_cmd_output("ls -lt /sys/kernel/slab") try: modules = os.listdir(self.sys_module) self.add_cmd_output("modinfo " + " ".join(modules)) except OSError: self._log_warn("could not list %s" % self.sys_module) # find /lib/modules/*/{extras,updates,weak-updates} -ls extra_mod_patterns = [ "/lib/modules/*/extra", "/lib/modules/*/updates", "/lib/modules/*/weak-updates", ] extra_mod_paths = [] for pattern in extra_mod_patterns: extra_mod_paths.extend(glob.glob(pattern)) self.add_cmd_output([ "dmesg", "sysctl -a", "dkms status", "find %s -ls" % " ".join(extra_mod_paths) ]) clocksource_path = "/sys/devices/system/clocksource/clocksource0/" self.add_copy_spec([ "/proc/modules", "/proc/sys/kernel/random/boot_id", "/sys/module/*/parameters", "/sys/module/*/initstate", "/sys/module/*/refcnt", "/sys/module/*/taint", "/sys/firmware/acpi/*", "/proc/kallsyms", "/proc/buddyinfo", "/proc/slabinfo", "/proc/zoneinfo", "/lib/modules/%s/modules.dep" % self.policy().kernel_version(), "/etc/conf.modules", "/etc/modules.conf", "/etc/modprobe.conf", "/etc/modprobe.d", "/etc/sysctl.conf", "/etc/sysctl.d", "/lib/sysctl.d", "/proc/cmdline", "/proc/driver", "/proc/sys/kernel/tainted", "/proc/softirqs", "/proc/timer*", "/proc/lock*", "/proc/misc", "/var/log/dmesg", "/sys/fs/pstore", clocksource_path + "available_clocksource", clocksource_path + "current_clocksource" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/grafana.py0000644000175000017500000000366613203300002017503 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc., Pratik Bandarkar # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Grafana(Plugin, RedHatPlugin): """Fetch Grafana configuration, logs and CLI output """ plugin_name = "grafana" profiles = ('services', 'openstack', 'openstack_controller') packages = ('graphana',) def setup(self): if self.get_option("all_logs"): self.add_copy_spec("/var/log/grafana/*.log", sizelimit=self.get_option("log_size")) else: self.add_copy_spec("/var/log/grafana/*.log", sizelimit=self.get_option("log_size")) self.add_cmd_output([ "grafana-cli plugins ls", "grafana-cli plugins list-remote", "grafana-cli -v", "grafana-server -v", ]) self.add_copy_spec([ "/etc/grafana/", "/etc/sysconfig/grafana-server", ]) def postproc(self): protect_keys = [ "admin_password", "secret_key" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/grafana/grafana.ini", regexp, r"\1*********") sosreport-3.5/sos/plugins/ctdb.py0000644000175000017500000000324413203300002017010 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Ctdb(Plugin, DebianPlugin, UbuntuPlugin): """Samba Clustered TDB """ packages = ('ctdb',) profiles = ('cluster', 'storage') plugin_name = "ctdb" def setup(self): self.add_copy_spec([ "/etc/ctdb/nodes", "/etc/ctdb/public_addresses", "/etc/ctdb/static-routes", "/etc/ctdb/multipathd", "/var/log/log.ctdb" ]) self.add_cmd_output([ "ctdb ip", "ctdb ping", "ctdb status", "ctdb ifaces", "ctdb listnodes", "ctdb listvars", "ctdb statistics", "ctdb getdbmap" ]) class RedHatCtdb(Ctdb, RedHatPlugin): def setup(self): super(RedHatCtdb, self).setup() self.add_copy_spec("/etc/sysconfig/ctdb") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/dlm.py0000644000175000017500000000534013203300002016647 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os.path import re class Dlm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """DLM (Distributed lock manager)""" plugin_name = "dlm" profiles = ("cluster", ) packages = ["cman", "dlm", "pacemaker"] option_list = [ ("lockdump", "capture lock dumps for DLM", "slow", False), ] debugfs_path = "/sys/kernel/debug" _debugfs_cleanup = False def setup(self): self.add_copy_spec([ "/etc/sysconfig/dlm" ]) self.add_cmd_output([ "dlm_tool log_plock", "dlm_tool dump", "dlm_tool ls -n" ]) if self.get_option("lockdump"): self.do_lockdump() def do_lockdump(self): if self._mount_debug(): dlm_tool = "dlm_tool ls" result = self.call_ext_prog(dlm_tool) if result["status"] != 0: return lock_exp = r'^name\s+([^\s]+)$' lock_re = re.compile(lock_exp, re.MULTILINE) for lockspace in lock_re.findall(result["output"]): self.add_cmd_output( "dlm_tool lockdebug -svw '%s'" % lockspace, suggest_filename="dlm_locks_%s" % lockspace ) def _mount_debug(self): if not os.path.ismount(self.debugfs_path): self._debugfs_cleanup = True r = self.call_ext_prog("mount -t debugfs debugfs %s" % self.debugfs_path) if r["status"] != 0: self._log_error("debugfs not mounted and mount attempt failed") self._debugfs_cleanup = False return os.path.ismount(self.debugfs_path) def postproc(self): if self._debugfs_cleanup and os.path.ismount(self.debugfs_path): r = self.call_ext_prog("umount %s" % self.debugfs_path) if r["status"] != 0: self._log_error("could not unmount %s" % self.debugfs_path) return # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/landscape.py0000644000175000017500000000601713203300002020027 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin class Landscape(Plugin, UbuntuPlugin): """Ubuntu Landscape client """ plugin_name = 'landscape' profiles = ('sysmgmt',) files = ('/etc/landscape/client.conf', '/etc/landscape/service.conf') packages = ('landscape-client', 'landscape-server') def setup(self): self.add_copy_spec("/etc/landscape/client.conf") self.add_copy_spec("/etc/default/landscape-client") self.add_copy_spec("/etc/landscape/service.conf") self.add_copy_spec("/etc/landscape/service.conf.old") self.add_copy_spec("/etc/default/landscape-server") if not self.get_option("all_logs"): limit = self.get_option("log_size") self.add_copy_spec("/var/log/landscape/*.log", sizelimit=limit) self.add_copy_spec("/var/log/landscape-server/*.log", sizelimit=limit) else: self.add_copy_spec("/var/log/landscape") self.add_copy_spec("/var/log/landscape-server") self.add_cmd_output("gpg --verify /etc/landscape/license.txt") self.add_cmd_output("head -n 5 /etc/landscape/license.txt") self.add_cmd_output("lsctl status") def postproc(self): self.do_file_sub( "/etc/landscape/client.conf", r"registration_password(.*)", r"registration_password[********]" ) self.do_file_sub( "/etc/landscape/service.conf", r"password = (.*)", r"password = [********]" ) self.do_file_sub( "/etc/landscape/service.conf", r"store_password = (.*)", r"store_password = [********]" ) self.do_file_sub( "/etc/landscape/service.conf", r"secret-token = (.*)", r"secret-token = [********]" ) self.do_file_sub( "/etc/landscape/service.conf.old", r"password = (.*)", r"password = [********]" ) self.do_file_sub( "/etc/landscape/service.conf.old", r"store_password = (.*)", r"store_password = [********]" ) self.do_file_sub( "/etc/landscape/service.conf.old", r"secret-token = (.*)", r"secret-token = [********]" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/nscd.py0000644000175000017500000000272513203300002017026 0ustar cariboucaribou# Copyright (C) 2007 Shijoe George # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Nscd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Name service caching daemon """ plugin_name = 'nscd' profiles = ('services', 'identity', 'system') files = ('/etc/nscd.conf',) packages = ('nscd',) def setup(self): self.add_copy_spec("/etc/nscd.conf") self.limit = (None if self.get_option("all_logs") else self.get_option("log_size")) opt = self.file_grep(r"^\s*logfile", "/etc/nscd.conf") if (len(opt) > 0): for o in opt: f = o.split() self.add_copy_spec(f[1], sizelimit=self.limit) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/mrggrid.py0000644000175000017500000000200513203300002017521 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class MrgGrid(Plugin, RedHatPlugin): """MRG GRID engine """ plugin_name = 'mrggrid' profiles = ('mrg',) def setup(self): self.add_copy_spec([ "/etc/condor/condor_config", "condor_status" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ntp.py0000644000175000017500000000301213203300002016666 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Ntp(Plugin): """Network time protocol """ plugin_name = "ntp" profiles = ('system', 'services') packages = ('ntp',) def setup(self): self.add_copy_spec([ "/etc/ntp.conf", "/etc/ntp/step-tickers", "/etc/ntp/ntpservers" ]) self.add_cmd_output([ "ntptime", "ntpq -p" ]) class RedHatNtp(Ntp, RedHatPlugin): def setup(self): super(RedHatNtp, self).setup() self.add_copy_spec("/etc/sysconfig/ntpd") self.add_cmd_output("ntpstat") class DebianNtp(Ntp, DebianPlugin, UbuntuPlugin): def setup(self): super(DebianNtp, self).setup() self.add_copy_spec('/etc/default/ntp') # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/navicli.py0000644000175000017500000000726213203300002017525 0ustar cariboucaribou# Copyright (C) 2008 EMC Corporation. Keith Kearnan # Copyright (C) 2014 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, os from sos.utilities import is_executable # Just for completeness sake. from six.moves import input class Navicli(Plugin, RedHatPlugin): """ EMC Navicli """ plugin_name = 'navicli' profiles = ('storage', 'hardware') def check_enabled(self): return is_executable("navicli") def get_navicli_config(self): """ EMC Navisphere Host Agent NAVICLI specific information - files """ self.add_copy_spec([ "/etc/Navisphere/agent.config", "/etc/Navisphere/Navimon.cfg", "/etc/Navisphere/Quietmode.cfg", "/etc/Navisphere/messages/[a-z]*", "/etc/Navisphere/log/[a-z]*" ]) def get_navicli_SP_info(self, SP_address): """ EMC Navisphere Host Agent NAVICLI specific information - CLARiiON - commands """ self.add_cmd_output([ "navicli -h %s getall" % SP_address, "navicli -h %s getsptime -spa" % SP_address, "navicli -h %s getsptime -spb" % SP_address, "navicli -h %s getlog" % SP_address, "navicli -h %s getdisk" % SP_address, "navicli -h %s getcache" % SP_address, "navicli -h %s getlun" % SP_address, "navicli -h %s getlun -rg -type -default -owner -crus " "-capacity" % SP_address, "navicli -h %s lunmapinfo" % SP_address, "navicli -h %s getcrus" % SP_address, "navicli -h %s port -list -all" % SP_address, "navicli -h %s storagegroup -list" % SP_address, "navicli -h %s spportspeed -get" % SP_address ]) def setup(self): self.get_navicli_config() CLARiiON_IP_address_list = [] CLARiiON_IP_loop = "stay_in" while CLARiiON_IP_loop == "stay_in": try: ans = input("CLARiiON SP IP Address or [Enter] to exit: ") except: return if self.check_ext_prog("navicli -h %s getsptime" % (ans,)): CLARiiON_IP_address_list.append(ans) else: if ans != "": print("The IP address you entered, %s, is not to an " "active CLARiiON SP." % ans) if ans == "": CLARiiON_IP_loop = "get_out" # Sort and dedup the list of CLARiiON IP Addresses CLARiiON_IP_address_list.sort() for SP_address in CLARiiON_IP_address_list: if CLARiiON_IP_address_list.count(SP_address) > 1: CLARiiON_IP_address_list.remove(SP_address) for SP_address in CLARiiON_IP_address_list: if SP_address != "": print(" Gathering NAVICLI information for %s..." % SP_address) self.get_navicli_SP_info(SP_address) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/procenv.py0000644000175000017500000000203713203300002017547 0ustar cariboucaribou# Copyright (c) 2012 Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, DebianPlugin, UbuntuPlugin class Procenv(Plugin, DebianPlugin, UbuntuPlugin): """Process environment """ plugin_name = 'procenv' profiles = ('system',) def setup(self): self.add_cmd_output('procenv') # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/process.py0000644000175000017500000000322213203300002017546 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Process(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """process information """ plugin_name = 'process' profiles = ('system',) def setup(self): ps_axo = "ps axo" # process group and thread options ps_group_opts = "pid,ppid,user,group,lwp,nlwp,start_time,comm,cgroup" ps_sched_opts = "flags,state,uid,pid,ppid,pgid,sid,cls,pri,addr,sz," ps_sched_opts += "wchan,stime,tty,time,cmd" self.add_copy_spec("/proc/sched_debug") self.add_cmd_output("ps auxwww", root_symlink="ps") self.add_cmd_output("pstree", root_symlink="pstree") self.add_cmd_output("lsof -b +M -n -l", root_symlink="lsof") self.add_cmd_output([ "ps auxwwwm", "ps alxwww", "%s %s" % (ps_axo, ps_group_opts), "%s %s" % (ps_axo, ps_sched_opts) ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/libvirt.py0000644000175000017500000000612313203300002017546 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin import glob import os class Libvirt(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """libvirt virtualization API """ plugin_name = 'libvirt' profiles = ('system', 'virt') def setup(self): libvirt_keytab = "/etc/libvirt/krb5.tab" # authentication databases used for libvirt SASL authentication self.add_forbidden_path("/etc/libvirt/passwd.db") self.add_forbidden_path("/etc/libvirt/krb5.tab") self.add_forbidden_path("/var/lib/libvirt/qemu/*/master-key.aes") self.add_forbidden_path("/etc/libvirt/secrets") self.add_copy_spec([ "/etc/libvirt/libvirt.conf", "/etc/libvirt/libvirtd.conf", "/etc/libvirt/lxc.conf", "/etc/libvirt/nwfilter/*.xml", "/etc/libvirt/qemu/*.xml", "/var/run/libvirt/", "/etc/libvirt/qemu/networks/*.xml", "/etc/libvirt/qemu/networks/autostart/*.xml", "/etc/libvirt/storage/*.xml", "/etc/libvirt/storage/autostart/*.xml", "/etc/libvirt/qemu-lockd.conf", "/etc/libvirt/virtlockd.conf" ]) if not self.get_option("all_logs"): self.add_copy_spec("/var/log/libvirt/libvirtd.log", sizelimit=5) self.add_copy_spec("/var/log/libvirt/qemu/*.log", sizelimit=5) self.add_copy_spec("/var/log/libvirt/lxc/*.log", sizelimit=5) self.add_copy_spec("/var/log/libvirt/uml/*.log", sizelimit=5) else: self.add_copy_spec("/var/log/libvirt") if os.path.exists(self.join_sysroot(libvirt_keytab)): self.add_cmd_output("klist -ket %s" % libvirt_keytab) self.add_cmd_output("ls -lR /var/lib/libvirt/qemu") # get details of processes of KVM hosts for pidfile in glob.glob("/var/run/libvirt/*/*.pid"): pid = open(pidfile).read().splitlines()[0] for pf in ["environ", "cgroup", "maps", "numa_maps", "limits"]: self.add_copy_spec("/proc/%s/%s" % (pid, pf)) def postproc(self): for loc in ["/etc/", "/var/run/"]: for xmlfile in glob.glob(loc + "libvirt/qemu/*.xml"): self.do_file_sub( xmlfile, r"(\s*passwd=\s*')([^']*)('.*)", r"\1******\3" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/numa.py0000644000175000017500000000341613203300002017035 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os.path class Numa(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """NUMA state and configuration """ plugin_name = 'numa' profiles = ('hardware', 'system', 'memory', 'performance') packages = ('numad', 'numactl') def setup(self): self.add_copy_spec([ "/etc/numad.conf", "/etc/logrotate.d/numad" ]) self.add_copy_spec( "/var/log/numad.log*", sizelimit=self.get_option("log_size") ) self.add_cmd_output([ "numastat", "numastat -m", "numastat -n", "numactl --show", "numactl --hardware", ]) numa_path = "/sys/devices/system/node" self.add_copy_spec([ os.path.join(numa_path, "node*/meminfo"), os.path.join(numa_path, "node*/cpulist"), os.path.join(numa_path, "node*/distance") ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/boot.py0000644000175000017500000000337113203300002017040 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin from glob import glob class Boot(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Bootloader information """ plugin_name = 'boot' profiles = ('system', 'boot') packages = ('grub', 'grub2', 'zipl') option_list = [ ("all-images", "collect lsinitrd for all images", "slow", False) ] def setup(self): self.add_copy_spec([ # legacy / special purpose bootloader configs "/etc/milo.conf", "/etc/silo.conf", "/boot/efi/efi/redhat/elilo.conf", "/etc/yaboot.conf", "/boot/yaboot.conf" ]) self.add_cmd_output([ "ls -lanR /boot", "lsinitrd" ]) self.add_cmd_output("efibootmgr") if self.get_option("all-images"): for image in glob('/boot/initr*.img'): if image[-9:] == "kdump.img": continue self.add_cmd_output("lsinitrd %s" % image) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/snmp.py0000644000175000017500000000253313203300002017051 0ustar cariboucaribou# Copyright (C) 2007 Sadique Puthen # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Snmp(Plugin): """Simple network management protocol """ plugin_name = "snmp" profiles = ('system', 'sysmgmt') files = ('/etc/snmp/snmpd.conf',) def setup(self): self.add_copy_spec("/etc/snmp") class RedHatSnmp(Snmp, RedHatPlugin): packages = ('net-snmp',) def setup(self): super(RedHatSnmp, self).setup() class DebianSnmp(Snmp, DebianPlugin, UbuntuPlugin): packages = ('snmp',) def setup(self): super(DebianSnmp, self).setup() # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/haproxy.py0000644000175000017500000000461113203300044017573 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin from re import match try: from urllib.parse import urlparse except ImportError: from urlparse import urlparse class HAProxy(Plugin, RedHatPlugin, DebianPlugin): """HAProxy load balancer """ plugin_name = 'haproxy' profiles = ('webserver',) packages = ('haproxy',) def setup(self): var_puppet_gen = "/var/lib/config-data/puppet-generated/haproxy" self.add_copy_spec([ "/etc/haproxy/haproxy.cfg", var_puppet_gen + "/etc/haproxy/haproxy.cfg" ]) self.add_copy_spec("/etc/haproxy/conf.d/*") self.add_cmd_output("haproxy -f /etc/haproxy/haproxy.cfg -c") self.add_copy_spec("/var/log/haproxy.log") # collect haproxy overview - curl to IP address taken from haproxy.cfg # as 2nd word on line below "haproxy.stats" # so parse haproxy.cfg until "haproxy.stats" read, and take 2nd word # from the next line matched = None provision_ip = None for line in open("/etc/haproxy/haproxy.cfg").read().splitlines(): if matched: provision_ip = line.split()[1] break matched = match(".*haproxy\.stats.*", line) if not provision_ip: return # check if provision_ip contains port - if not, add default ":1993" if urlparse("http://"+provision_ip).port is None: provision_ip = provision_ip + ":1993" self.add_cmd_output("curl http://"+provision_ip+"/\;csv", suggest_filename="haproxy_overview.txt") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/redis.py0000644000175000017500000000506413203300002017204 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., Abhijeet Kasurde # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Redis(Plugin, RedHatPlugin): """Redis, in-memory data structure store """ plugin_name = 'redis' profiles = ('services',) packages = ('redis',) var_puppet_gen = "/var/lib/config-data/puppet-generated/redis" files = ( '/etc/redis.conf', '/var/log/redis', var_puppet_gen + '/etc/redis.conf' ) def setup(self): self.add_copy_spec([ "/etc/redis.conf", self.var_puppet_gen + "/etc/redis*", self.var_puppet_gen + "/etc/redis/", self.var_puppet_gen + "/etc/security/limits.d/" ]) self.limit = self.get_option("log_size") self.add_cmd_output("redis-cli info") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/redis/redis.log*", "/var/log/containers/redis/redis.log*" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/redis/redis.log", "/var/log/containers/redis/redis.log" ], sizelimit=self.limit) def postproc(self): self.do_file_sub( "/etc/redis.conf", r"(masterauth\s).*", r"\1********" ) self.do_file_sub( "/etc/redis.conf", r"(requirepass\s).*", r"\1********" ) self.do_path_regex_sub( self.var_puppet_gen + "/etc/redis.conf*", r"(masterauth\s).*", r"\1*********" ) self.do_path_regex_sub( self.var_puppet_gen + "/etc/redis.conf*", r"(requirepass\s).*", r"\1*********" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/symcli.py0000644000175000017500000000747013203300002017401 0ustar cariboucaribou# Copyright (C) 2008 EMC Corporation. Keith Kearnan # Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, os from sos.utilities import is_executable class Symcli(Plugin, RedHatPlugin): """ EMC Symcli """ plugin_name = 'symcli' profiles = ('storage', 'hardware') def get_symcli_files(self): """ EMC Solutions Enabler SYMCLI specific information - files """ self.add_copy_spec([ "/var/symapi/db/symapi_db.bin", "/var/symapi/config/[a-z]*", "/var/symapi/log/[a-z]*" ]) def get_symcli_config(self): """ EMC Solutions Enabler SYMCLI specific information - Symmetrix/DMX - commands """ self.add_cmd_output([ "/usr/symcli/bin/symcli -def", "/usr/symcli/bin/symdg list", "/usr/symcli/bin/symdg -v list", "/usr/symcli/bin/symcg list", "/usr/symcli/bin/symcg -v list", "/usr/symcli/bin/symcfg list", "/usr/symcli/bin/symcfg -v list", "/usr/symcli/bin/symcfg -db", "/usr/symcli/bin/symcfg -semaphores list", "/usr/symcli/bin/symcfg -dir all -v list", "/usr/symcli/bin/symcfg -connections list", "/usr/symcli/bin/symcfg -app -v list", "/usr/symcli/bin/symcfg -fa all -port list", "/usr/symcli/bin/symcfg -ra all -port list", "/usr/symcli/bin/symcfg -sa all -port list", "/usr/symcli/bin/symcfg list -lock", "/usr/symcli/bin/symcfg list -lockn all", "/usr/symcli/bin/syminq", "/usr/symcli/bin/syminq -v", "/usr/symcli/bin/syminq -symmids", "/usr/symcli/bin/syminq hba -fibre", "/usr/symcli/bin/syminq hba -scsi", "/usr/symcli/bin/symhost show -config", "/usr/symcli/bin/stordaemon list", "/usr/symcli/bin/stordaemon -v list", "/usr/symcli/bin/sympd list", "/usr/symcli/bin/sympd list -vcm", "/usr/symcli/bin/symdev list", "/usr/symcli/bin/symdev -v list", "/usr/symcli/bin/symdev -rdfa list", "/usr/symcli/bin/symdev -rdfa -v list", "/usr/symcli/bin/symbcv list", "/usr/symcli/bin/symbcv -v list", "/usr/symcli/bin/symrdf list", "/usr/symcli/bin/symrdf -v list", "/usr/symcli/bin/symrdf -rdfa list", "/usr/symcli/bin/symrdf -rdfa -v list", "/usr/symcli/bin/symsnap list", "/usr/symcli/bin/symsnap list -savedevs", "/usr/symcli/bin/symclone list", "/usr/symcli/bin/symevent list", "/usr/symcli/bin/symmask list hba", "/usr/symcli/bin/symmask list logins", "/usr/symcli/bin/symmaskdb list database", "/usr/symcli/bin/symmaskdb -v list database" ]) def check_enabled(self): return is_executable("/usr/symcli/bin/symcli") def setup(self): self.get_symcli_files() self.get_symcli_config() # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/vmware.py0000644000175000017500000000221213203300002017367 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class VMWare(Plugin, RedHatPlugin): """VMWare client information """ plugin_name = 'vmware' profiles = ('virt',) files = ('vmware', '/usr/init.d/vmware-tools') def setup(self): self.add_cmd_output("vmware -v") self.add_copy_spec([ "/etc/vmware/locations", "/etc/vmware/config", "/proc/vmmemctl" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/satellite.py0000644000175000017500000000610413203300002020060 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Satellite(Plugin, RedHatPlugin): """RHN Satellite and Spacewalk """ plugin_name = 'satellite' profiles = ('sysmgmt',) verify_packages = ('spacewalk.*',) satellite = False proxy = False option_list = [("log", 'gathers all apache logs', 'slow', False)] def rhn_package_check(self): self.satellite = self.is_installed("rhns-satellite-tools") \ or self.is_installed("spacewalk-java") \ or self.is_installed("rhn-base") self.proxy = self.is_installed("rhns-proxy-tools") \ or self.is_installed("spacewalk-proxy-management") \ or self.is_installed("rhn-proxy-management") return self.satellite or self.proxy def check_enabled(self): # enable if any related package is installed return self.rhn_package_check() def setup(self): self.rhn_package_check() self.add_copy_spec([ "/etc/httpd/conf*", "/etc/rhn", "/var/log/rhn*" ]) if self.get_option("log"): self.add_copy_spec("/var/log/httpd") # all these used to go in $DIR/mon-logs/ self.add_copy_spec([ "/opt/notification/var/*.log*", "/var/tmp/ack_handler.log*", "/var/tmp/enqueue.log*" ]) # monitoring scout logs self.add_copy_spec([ "/home/nocpulse/var/*.log*", "/home/nocpulse/var/commands/*.log*", "/var/tmp/ack_handler.log*", "/var/tmp/enqueue.log*", "/var/log/nocpulse/*.log*", "/var/log/notification/*.log*", "/var/log/nocpulse/TSDBLocalQueue/TSDBLocalQueue.log" ]) self.add_copy_spec("/root/ssl-build") self.add_cmd_output("rhn-schema-version", root_symlink="database-schema-version") self.add_cmd_output("rhn-charsets", root_symlink="database-character-sets") if self.satellite: self.add_copy_spec([ "/etc/tnsnames.ora", "/etc/jabberd" ]) self.add_cmd_output( "spacewalk-debug --dir %s" % self.get_cmd_output_path(name="spacewalk-debug")) if self.proxy: self.add_copy_spec(["/etc/squid", "/var/log/squid"]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/rhui.py0000644000175000017500000000257213203300002017046 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Rhui(Plugin, RedHatPlugin): """Red Hat Update Infrastructure """ plugin_name = 'rhui' profiles = ('sysmgmt',) rhui_debug_path = "/usr/share/rh-rhua/rhui-debug.py" packages = ["rh-rhui-tools"] files = [rhui_debug_path] def setup(self): if self.is_installed("pulp-cds"): cds = "--cds" else: cds = "" rhui_debug_dst_path = self.get_cmd_output_path() self.add_cmd_output( "python %s %s --dir %s" % (self.rhui_debug_path, cds, rhui_debug_dst_path), suggest_filename="rhui-debug") return # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/psacct.py0000644000175000017500000000321613203300002017350 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Psacct(Plugin): """Process accounting information """ plugin_name = "psacct" profiles = ('system',) option_list = [("all", "collect all process accounting files", "slow", False)] packages = ["psacct"] class RedHatPsacct(Psacct, RedHatPlugin): packages = ["psacct"] def setup(self): super(RedHatPsacct, self).setup() self.add_copy_spec("/var/account/pacct") if self.get_option("all"): self.add_copy_spec("/var/account/pacct*.gz") class DebianPsacct(Psacct, DebianPlugin, UbuntuPlugin): plugin_name = "acct" packages = ["acct"] def setup(self): super(DebianPsacct, self).setup() self.add_copy_spec(["/var/log/account/pacct", "/etc/default/acct"]) if self.get_option("all"): self.add_copy_spec("/var/log/account/pacct*.gz") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_nova.py0000644000175000017500000001730713203300002021113 0ustar cariboucaribou# Copyright (C) 2009 Red Hat, Inc., Joey Boggs # Copyright (C) 2012 Rackspace US, Inc., # Justin Shepherd # Copyright (C) 2013 Red Hat, Inc., Jeremy Agee # Copyright (C) 2015 Red Hat, Inc., Abhijeet Kasurde # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class OpenStackNova(Plugin): """OpenStack Nova """ plugin_name = "openstack_nova" profiles = ('openstack', 'openstack_controller', 'openstack_compute') var_puppet_gen = "/var/lib/config-data/puppet-generated/nova" def setup(self): # commands we do not need to source the environment file self.add_cmd_output("nova-manage db version") self.add_cmd_output("nova-manage fixed list") self.add_cmd_output("nova-manage floating list") vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD']] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME']] if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. Source " "the environment file for the user intended " "to connect to the OpenStack environment.") else: self.add_cmd_output("nova service-list") self.add_cmd_output("openstack flavor list --long") self.add_cmd_output("nova network-list") self.add_cmd_output("nova list") self.add_cmd_output("nova agent-list") self.add_cmd_output("nova version-list") self.add_cmd_output("nova host-list") self.add_cmd_output("openstack quota show") self.add_cmd_output("openstack hypervisor stats show") # get details for each nova instance cmd = "openstack server list -f value" nova_instances = self.call_ext_prog(cmd)['output'] for instance in nova_instances.splitlines(): instance = instance.split()[0] cmd = "openstack server show %s" % (instance) self.add_cmd_output( cmd, suggest_filename="instance-" + instance + ".log") self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/nova/", "/var/log/containers/nova/", "/var/log/containers/httpd/nova-api/", "/var/log/containers/httpd/nova-placement/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/nova/*.log", "/var/log/containers/nova/*.log", "/var/log/containers/httpd/nova-api/*log", "/var/log/containers/httpd/nova-placement/*log" ], sizelimit=self.limit) self.add_copy_spec([ "/etc/nova/", self.var_puppet_gen + "/etc/nova/", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf", self.var_puppet_gen + "_placement/var/spool/cron/nova", self.var_puppet_gen + "_placement/etc/nova/", self.var_puppet_gen + "_placement/etc/httpd/conf/", self.var_puppet_gen + "_placement/etc/httpd/conf.d/", self.var_puppet_gen + "_placement/etc/httpd/conf.modules.d/*.conf", self.var_puppet_gen + "_placement/etc/my.cnf.d/tripleo.cnf", self.var_puppet_gen + "/../memcached/etc/sysconfig/memcached", self.var_puppet_gen + "_libvirt/etc/libvirt/", self.var_puppet_gen + "_libvirt/etc/my.cnf.d/tripleo.cnf", self.var_puppet_gen + "_libvirt/etc/nova/migration/" "authorized_keys", self.var_puppet_gen + "_libvirt/var/lib/nova/.ssh/config", ]) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) def postproc(self): protect_keys = [ "ldap_dns_password", "neutron_admin_password", "rabbit_password", "qpid_password", "powervm_mgr_passwd", "virtual_power_host_pass", "xenapi_connection_password", "password", "host_password", "vnc_password", "connection", "sql_connection", "admin_password", "connection_password", "memcache_secret_key", "s3_secret_key", "metadata_proxy_shared_secret" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/nova/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/nova/*", regexp, r"\1*********" ) self.do_path_regex_sub( self.var_puppet_gen + "_placement/etc/nova/*", regexp, r"\1*********" ) self.do_path_regex_sub( self.var_puppet_gen + "_libvirt/etc/nova/*", regexp, r"\1*********" ) class DebianNova(OpenStackNova, DebianPlugin, UbuntuPlugin): nova = False packages = ( 'nova-api-ec2', 'nova-api-metadata', 'nova-api-os-compute', 'nova-api-os-volume', 'nova-common', 'nova-compute', 'nova-compute-kvm', 'nova-compute-lxc', 'nova-compute-qemu', 'nova-compute-uml', 'nova-compute-xcp', 'nova-compute-xen', 'nova-xcp-plugins', 'nova-consoleauth', 'nova-network', 'nova-scheduler', 'nova-volume', 'novnc', 'python-nova', 'python-novaclient', 'python-novnc' ) def check_enabled(self): self.nova = self.is_installed("nova-common") return self.nova def setup(self): super(DebianNova, self).setup() self.add_copy_spec([ "/etc/sudoers.d/nova_sudoers", "/usr/share/polkit-1/rules.d/60-libvirt.rules", ]) class RedHatNova(OpenStackNova, RedHatPlugin): nova = False packages = ( 'openstack-nova-common', 'openstack-nova-network', 'openstack-nova-conductor', 'openstack-nova-conductor', 'openstack-nova-scheduler', 'openstack-nova-console', 'openstack-nova-novncproxy', 'openstack-nova-compute', 'openstack-nova-api', 'openstack-nova-cert', 'openstack-nova-cells', 'openstack-nova-objectstore', 'python-nova', 'python-novaclient', 'novnc' ) def check_enabled(self): self.nova = self.is_installed("openstack-nova-common") return self.nova def setup(self): super(RedHatNova, self).setup() self.add_copy_spec([ "/etc/logrotate.d/openstack-nova", "/etc/polkit-1/localauthority/50-local.d/50-nova.pkla", "/etc/sudoers.d/nova", "/etc/security/limits.d/91-nova.conf", "/etc/sysconfig/openstack-nova-novncproxy" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/grub.py0000644000175000017500000000254313203300002017034 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Grub(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """GRUB bootloader """ plugin_name = 'grub' profiles = ('boot',) packages = ('grub',) def setup(self): self.add_copy_spec([ "/boot/efi/EFI/*/grub.conf", "/boot/grub/grub.conf", "/boot/grub/device.map", "/etc/grub.conf", "/etc/grub.d" ]) def postproc(self): self.do_path_regex_sub( r".*\/grub.conf", r"(password\s*)(--md5\s*|\s*)(.*)", r"\1\2********" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/hts.py0000644000175000017500000000202513203300002016666 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class HardwareTestSuite(Plugin, RedHatPlugin): """Red Hat Hardware Test Suite """ plugin_name = 'hts' profiles = ('debug',) def setup(self): self.add_copy_spec([ "/etc/httpd/conf.d/hts.conf", "/var/hts" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/pacemaker.py0000644000175000017500000001015613203300002020024 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin from datetime import datetime, timedelta import re import os.path class Pacemaker(Plugin, DebianPlugin, UbuntuPlugin): """HA Cluster resource manager""" plugin_name = "pacemaker" profiles = ("cluster", ) packages = ["pacemaker"] defaults = "/etc/default/pacemaker" option_list = [ ("crm_from", "specify the start time for crm_report", "fast", False), ("crm_scrub", "enable password scrubbing for crm_report", "", True), ] def setup(self): self.add_copy_spec([ "/var/lib/pacemaker/cib/cib.xml", self.defaults, "/var/log/pacemaker.log", "/var/log/pcsd/pcsd.log", "/var/log/pacemaker/bundles/*/", ]) self.add_cmd_output([ "crm_mon -1 -A -n -r -t", "crm status", "crm configure show", "pcs config", "pcs status", "pcs property list --all" ]) # crm_report needs to be given a --from "YYYY-MM-DD HH:MM:SS" start # time in order to collect data. crm_from = (datetime.today() - timedelta(hours=72)).strftime("%Y-%m-%d %H:%m:%S") if self.get_option("crm_from") is not False: if re.match(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', str(self.get_option("crm_from"))): crm_from = self.get_option("crm_from") else: self._log_error( "crm_from parameter '%s' is not a valid date: using " "default" % self.get_option("crm_from")) crm_dest = self.get_cmd_output_path(name="crm_report", make=False) crm_scrub = '-p "passw.*"' if not self.get_option("crm_scrub"): crm_scrub = "" self._log_warn("scrubbing of crm passwords has been disabled:") self._log_warn("data collected by crm_report may contain" " sensitive values.") self.add_cmd_output('crm_report --sos-mode %s -S -d ' ' --dest %s --from "%s"' % (crm_scrub, crm_dest, crm_from), chroot=self.tmp_in_sysroot()) # collect user-defined logfiles, matching pattern: # PCMK_loggfile=filename # specified in the pacemaker defaults file. pattern = '^\s*PCMK_logfile=[\'\"]?(\S+)[\'\"]?\s*(\s#.*)?$' if os.path.isfile(self.defaults): with open(self.defaults) as f: for line in f: if re.match(pattern, line): # remove trailing and leading quote marks, in case the # line is e.g. PCMK_logfile="/var/log/pacemaker.log" logfile = re.search(pattern, line).group(1) for regexp in [r'^"', r'"$', r'^\'', r'\'$']: logfile = re.sub(regexp, '', logfile) self.add_copy_spec(logfile) def postproc(self): self.do_cmd_output_sub( "pcs config", r"(passwd=|incoming_password=)\S+", r"\1********" ) class RedHatPacemaker(Pacemaker, RedHatPlugin): """ Handle alternate location of pacemaker defaults file. """ def setup(self): self.defaults = "/etc/sysconfig/pacemaker" super(RedHatPacemaker, self).setup() # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/chrony.py0000644000175000017500000000242213203300002017373 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Chrony(Plugin, RedHatPlugin): """Chrony clock (for Network time protocol) """ plugin_name = "chrony" profiles = ('system', 'services') packages = ('chrony',) def setup(self): self.add_copy_spec([ "/etc/chrony.conf", "/var/lib/chrony/drift" ]) self.add_cmd_output([ "chronyc tracking", "chronyc sources", "chronyc sourcestats", "chronyc clients" ]) self.add_journal(units="chronyd") # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/sssd.py0000644000175000017500000000403513203300002017047 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Pierre Carrier # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Sssd(Plugin): """System security service daemon """ plugin_name = "sssd" profiles = ('services', 'security', 'identity') packages = ('sssd',) def setup(self): self.add_copy_spec([ "/etc/sssd/sssd.conf", "/var/log/sssd/*", "/var/lib/sss/pubconf/krb5.include.d/*", # SSSD 1.14 "/etc/sssd/conf.d/*.conf" ]) self.add_cmd_output("sssctl config-check") domain_file = self.get_cmd_output_now("sssctl domain-list") if domain_file: for domain_name in open(domain_file).read().splitlines(): self.add_cmd_output("sssctl domain-status -o "+domain_name) def postproc(self): regexp = r"(\s*ldap_default_authtok\s*=\s*)\S+" self.do_file_sub("/etc/sssd/sssd.conf", regexp, r"\1********") self.do_path_regex_sub("/etc/sssd/conf.d/*", regexp, r"\1********") class RedHatSssd(Sssd, RedHatPlugin): def setup(self): super(RedHatSssd, self).setup() class DebianSssd(Sssd, DebianPlugin, UbuntuPlugin): def setup(self): super(DebianSssd, self).setup() self.add_copy_spec("/etc/default/sssd") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/nfsserver.py0000644000175000017500000000350713203300002020113 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Eugene Teo # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os from stat import ST_SIZE class NfsServer(Plugin, RedHatPlugin): """NFS server information """ plugin_name = 'nfsserver' profiles = ('storage', 'network', 'services', 'nfs') def check_enabled(self): default_runlevel = self.policy().default_runlevel() nfs_runlevels = self.policy().runlevel_by_service("nfs") if default_runlevel in nfs_runlevels: return True try: exports = os.stat("/etc/exports")[ST_SIZE] xtab = os.stat("/var/lib/nfs/xtab")[ST_SIZE] if exports or xtab: return True except: pass return False def setup(self): self.add_copy_spec([ "/etc/exports", "/etc/exports.d", "/var/lib/nfs/etab", "/var/lib/nfs/xtab", "/var/lib/nfs/rmtab" ]) self.add_cmd_output([ "rpcinfo -p localhost", "nfsstat -o all", "exportfs -v" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/abrt.py0000644000175000017500000000313013203300002017016 0ustar cariboucaribou# Copyright (C) 2010 Red Hat, Inc., Tomas Smetana # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Abrt(Plugin, RedHatPlugin): """Automatic Bug Reporting Tool """ plugin_name = "abrt" profiles = ('system', 'debug') packages = ('abrt-cli', 'abrt-gui', 'abrt') files = ('/var/spool/abrt',) option_list = [ ("detailed", 'collect detailed info for every report', 'slow', False) ] def info_detailed(self, list_file): for line in open(list_file).read().splitlines(): if line.startswith("Directory:"): self.add_cmd_output("abrt-cli info -d '%s'" % line.split()[1]) def setup(self): self.add_cmd_output("abrt-cli status") list_file = self.get_cmd_output_now("abrt-cli list") if self.get_option('detailed') and list_file: self.info_detailed(list_file) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/virtwho.py0000644000175000017500000000224113203300002017572 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class VirtWho(Plugin, RedHatPlugin): """Virt-Who agent """ plugin_name = 'virtwho' profiles = ('virt', 'system') packages = ('virt-who',) def setup(self): self.add_copy_spec("/etc/virt-who.d/*") def postproc(self): self.do_path_regex_sub(r"\/etc\/virt-who\.d", r"(.*password=)(\S*)", r"\1********") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/selinux.py0000644000175000017500000000342613203300002017565 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class SELinux(Plugin, RedHatPlugin): """SELinux access control """ plugin_name = 'selinux' profiles = ('system', 'security', 'openshift') option_list = [("fixfiles", 'Print incorrect file context labels', 'slow', False), ("list", 'List objects and their context', 'slow', False)] packages = ('libselinux',) def setup(self): self.add_copy_spec("/etc/selinux") self.add_cmd_output([ "sestatus -b", "semodule -l", "selinuxdefcon root", "selinuxconlist root", "selinuxexeccon /bin/passwd", "semanage -o -", "ps axuZww" ]) if self.get_option('fixfiles'): self.add_cmd_output("restorecon -Rvn /", stderr=False) if self.get_option('list'): self.add_cmd_output([ "semanage fcontext -l", "semanage user -l", "semanage login -l", "semanage port -l" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/pxe.py0000644000175000017500000000330313203300002016664 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Pxe(Plugin): """PXE service """ plugin_name = "pxe" profiles = ('sysmgmt', 'network') option_list = [("tftpboot", 'gathers content from the tftpboot path', 'slow', False)] class RedHatPxe(Pxe, RedHatPlugin): files = ('/usr/sbin/pxeos',) packages = ('system-config-netboot-cmd',) def setup(self): super(RedHatPxe, self).setup() self.add_cmd_output("/usr/sbin/pxeos -l") self.add_copy_spec("/etc/dhcpd.conf") if self.get_option("tftpboot"): self.add_copy_spec("/tftpboot") class DebianPxe(Pxe, DebianPlugin, UbuntuPlugin): packages = ('tftpd-hpa',) def setup(self): super(DebianPxe, self).setup() self.add_copy_spec([ "/etc/dhcp/dhcpd.conf", "/etc/default/tftpd-hpa" ]) if self.get_option("tftpboot"): self.add_copy_spec("/var/lib/tftpboot") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/os_net_config.py0000644000175000017500000000206213203300002020705 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class OsNetConfig(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """OpenStack Net Config""" plugin_name = "os_net_config" profiles = ('openstack') packages = ('os-net-config') def setup(self): self.add_copy_spec("/etc/os-net-config") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/filesys.py0000644000175000017500000000424213203300002017551 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Filesys(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Local file systems """ plugin_name = 'filesys' profiles = ('storage',) option_list = [("lsof", 'gathers information on all open files', 'slow', False), ("dumpe2fs", 'dump filesystem information', 'slow', False)] def setup(self): self.add_copy_spec([ "/proc/filesystems", "/etc/fstab", "/proc/self/mounts", "/proc/self/mountinfo", "/proc/self/mountstats", "/proc/mounts" ]) self.add_cmd_output("mount -l", root_symlink="mount") self.add_cmd_output("df -al -x autofs", root_symlink="df") self.add_cmd_output([ "df -ali -x autofs", "findmnt" ]) if self.get_option('lsof'): self.add_cmd_output("lsof -b +M -n -l -P", root_symlink="lsof") dumpe2fs_opts = '-h' if self.get_option('dumpe2fs'): dumpe2fs_opts = '' mounts = '/proc/mounts' ext_fs_regex = r"^(/dev/.+).+ext[234]\s+" for dev in self.do_regex_find_all(ext_fs_regex, mounts): self.add_cmd_output("dumpe2fs %s %s" % (dumpe2fs_opts, dev)) def postproc(self): self.do_file_sub( "/etc/fstab", r"(password=)[^\s]*", r"\1********" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/usb.py0000644000175000017500000000214213203300002016661 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Usb(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """USB devices """ plugin_name = "usb" profiles = ('hardware',) def setup(self): self.add_copy_spec("/sys/bus/usb") self.add_cmd_output([ "lsusb", "lsusb -v", "lsusb -t" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_ironic.py0000644000175000017500000001204213203300002021422 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc., Lee Yarwood # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class OpenStackIronic(Plugin): """OpenStack Ironic """ plugin_name = "openstack_ironic" profiles = ('openstack', 'openstack_undercloud') var_puppet_gen = "/var/lib/config-data/puppet-generated/ironic" def setup(self): self.conf_list = [ "/etc/ironic/*", self.var_puppet_gen + "/etc/ironic/*", self.var_puppet_gen + "_api/etc/ironic/*" ] self.add_copy_spec([ "/etc/ironic/", self.var_puppet_gen + "/etc/xinetd.conf", self.var_puppet_gen + "/etc/xinetd.d/", self.var_puppet_gen + "/etc/ironic/", self.var_puppet_gen + "/etc/httpd/conf/", self.var_puppet_gen + "/etc/httpd/conf.d/", self.var_puppet_gen + "/etc/httpd/conf.modules.d/*.conf", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf", self.var_puppet_gen + "_api/etc/ironic/", self.var_puppet_gen + "_api/etc/httpd/conf/", self.var_puppet_gen + "_api/etc/httpd/conf.d/", self.var_puppet_gen + "_api/etc/httpd/conf.modules.d/*.conf", self.var_puppet_gen + "_api/etc/my.cnf.d/tripleo.cnf" ]) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/ironic/", "/var/log/containers/ironic/", "/var/log/containers/httpd/ironic-api/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/ironic/*.log", "/var/log/containers/ironic/*.log", "/var/log/containers/httpd/ironic-api/*log" ], sizelimit=self.limit) self.add_cmd_output('ls -laRt /var/lib/ironic/') self.add_cmd_output( 'ls -laRt ' + self.var_puppet_gen + '/var/lib/ironic/' ) if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD']] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME']] if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. Source " "the environment file for the user intended " "to connect to the OpenStack environment.") else: self.add_cmd_output("openstack baremetal node list --long") self.add_cmd_output("openstack baremetal port list") def postproc(self): protect_keys = [ "dns_passkey", "memcache_secret_key", "rabbit_password", "password", "qpid_password", "connection", "sql_connection", "admin_password", "ssl_key_password", "os_password" ] regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) for conf in self.conf_list: self.do_path_regex_sub(conf, regexp, r"\1*********") class DebianIronic(OpenStackIronic, DebianPlugin, UbuntuPlugin): packages = [ 'ironic-api', 'ironic-common', 'ironic-conductor', ] def setup(self): super(DebianIronic, self).setup() class RedHatIronic(OpenStackIronic, RedHatPlugin): packages = [ 'openstack-ironic-api', 'openstack-ironic-common', 'openstack-ironic-conductor', ] discoverd_packages = [ 'openstack-ironic-discoverd', 'openstack-ironic-discoverd-ramdisk' ] def setup(self): super(RedHatIronic, self).setup() # is the optional ironic-discoverd service installed? if any([self.is_installed(p) for p in self.discoverd_packages]): self.conf_list.append('/etc/ironic-discoverd/*') self.add_copy_spec('/etc/ironic-discoverd/') self.add_copy_spec('/var/lib/ironic-discoverd/') self.add_copy_spec('/var/log/ironic-discoverd/') self.add_journal(units="openstack-ironic-discoverd") self.add_journal(units="openstack-ironic-discoverd-dnsmasq") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/cron.py0000644000175000017500000000254313203300002017036 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Cron(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Cron job scheduler """ plugin_name = "cron" profiles = ('system',) packages = ('cron', 'anacron', 'chronie') files = ('/etc/crontab') def setup(self): self.add_copy_spec([ "/etc/cron*", "/var/log/cron", "/var/spool/cron" ]) if self.get_option("all_logs"): self.add_copy_spec("/var/log/cron*") self.add_cmd_output("crontab -l -u root", suggest_filename="root_crontab") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/memory.py0000644000175000017500000000274213203300002017406 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Memory(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Memory configuration and use """ plugin_name = 'memory' profiles = ('system', 'hardware', 'memory') def setup(self): self.add_copy_spec([ "/proc/pci", "/proc/meminfo", "/proc/vmstat", "/proc/swaps", "/proc/slabinfo", "/proc/pagetypeinfo", "/proc/vmallocinfo", "/sys/kernel/mm/ksm", "/sys/kernel/mm/transparent_hugepage/enabled" ]) self.add_cmd_output("free", root_symlink="free") self.add_cmd_output([ "free -m", "swapon --bytes --show" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/grub2.py0000644000175000017500000000465413203300002017123 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Grub2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """GRUB2 bootloader """ plugin_name = 'grub2' profiles = ('boot',) packages = ('grub2', 'grub2-efi') def setup(self): self.add_copy_spec([ "/boot/efi/EFI/*/grub.cfg", "/boot/grub2/grub.cfg", "/boot/grub2/grubenv", "/boot/grub/grub.cfg", "/etc/default/grub", "/etc/grub2.cfg", "/etc/grub.d" ]) self.add_cmd_output("ls -lanR /boot") # call grub2-mkconfig with GRUB_DISABLE_OS_PROBER=true to prevent # possible unwanted loading of some kernel modules env = {} env['GRUB_DISABLE_OS_PROBER'] = 'true' self.add_cmd_output("grub2-mkconfig", env=env) def postproc(self): # the trailing space is required; python treats '_' as whitespace # causing the passwd_exp to match pbkdf2 passwords and mangle them. passwd_exp = r"(password )\s*(\S*)\s*(\S*)" passwd_pbkdf2_exp = r"(password_pbkdf2)\s*(\S*)\s*(\S*)" passwd_sub = r"\1 \2 ********" passwd_pbkdf2_sub = r"\1 \2 grub.pbkdf2.********" self.do_cmd_output_sub( "grub2-mkconfig", passwd_pbkdf2_exp, passwd_pbkdf2_sub ) self.do_cmd_output_sub( "grub2-mkconfig", passwd_exp, passwd_sub ) self.do_path_regex_sub( r".*\/grub\.", passwd_exp, passwd_sub ) self.do_path_regex_sub( r".*\/grub\.", passwd_pbkdf2_exp, passwd_pbkdf2_sub ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/acpid.py0000644000175000017500000000235113203300002017152 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Acpid(Plugin): """ACPI daemon information""" plugin_name = "acpid" profiles = ('hardware',) packages = ('acpid',) class RedHatAcpid(Acpid, RedHatPlugin): def setup(self): self.add_copy_spec([ "/var/log/acpid*", "/etc/acpi/events/power.conf"]) class DebianAcpid(Acpid, DebianPlugin, UbuntuPlugin): def setup(self): self.add_copy_spec([ "/etc/acpi/events/powerbtn*"]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/activemq.py0000644000175000017500000000403713203300002017706 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class ActiveMq(Plugin, DebianPlugin): """ActiveMQ message broker """ plugin_name = 'activemq' profiles = ('openshift',) packages = ('activemq', 'activemq-core') files = ('/var/log/activemq',) def setup(self): if self.get_option("all_logs"): self.add_copy_spec(list(self.files)) else: self.add_copy_spec([ "/var/log/activemq/activemq.log", "/var/log/activemq/wrapper.log" ]) def postproc(self): # activemq.xml contains credentials in this form: # self.do_file_sub( '/etc/activemq/activemq.xml', r'(\s*password=")[^"]*(".*)', r"\1******\2" ) class RedHatActiveMq(ActiveMq, RedHatPlugin): def setup(self): super(RedHatActiveMq, self).setup() self.add_copy_spec([ '/etc/sysconfig/activemq', '/etc/activemq/activemq.xml' ]) class UbuntuActiveMq(ActiveMq, UbuntuPlugin): def setup(self): super(UbuntuActiveMq, self).setup() self.add_copy_spec([ '/etc/activemq', '/etc/default/activemq' ]) sosreport-3.5/sos/plugins/ldap.py0000644000175000017500000000655213203300002017021 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Ldap(Plugin): """LDAP configuration """ plugin_name = "ldap" profiles = ('identity', 'sysmgmt', 'system') ldap_conf = "/etc/openldap/ldap.conf" def setup(self): super(Ldap, self).setup() self.add_copy_spec("/etc/ldap.conf") def postproc(self): self.do_file_sub("/etc/ldap.conf", r"(\s*bindpw\s*)\S+", r"\1******") class RedHatLdap(Ldap, RedHatPlugin): packages = ('openldap', 'nss-pam-ldapd') files = ('/etc/ldap.conf', '/etc/pam_ldap.conf') def setup(self): super(RedHatLdap, self).setup() self.add_forbidden_path("/etc/openldap/certs/password") self.add_forbidden_path("/etc/openldap/certs/pwfile.txt") self.add_forbidden_path("/etc/openldap/certs/pin.txt") self.add_forbidden_path("/etc/openldap/certs/*passw*") self.add_forbidden_path("/etc/openldap/certs/key3.db") self.add_copy_spec([ self.ldap_conf, "/etc/openldap/certs/cert8.db", "/etc/openldap/certs/secmod.db", "/etc/nslcd.conf", "/etc/pam_ldap.conf" ]) self.add_cmd_output("certutil -L -d /etc/openldap") def postproc(self): super(RedHatLdap, self).postproc() self.do_file_sub( "/etc/nslcd.conf", r"(\s*bindpw\s*)\S+", r"\1********" ) self.do_file_sub( "/etc/pam_ldap.conf", r"(\s*bindpw\s*)\S+", r"\1********" ) class DebianLdap(Ldap, DebianPlugin, UbuntuPlugin): ldap_conf = "/etc/ldap/ldap.conf" packages = ('slapd', 'ldap-utils') def setup(self): super(DebianLdap, self).setup() ldap_search = "ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// " self.add_copy_spec([ self.ldap_conf, "/etc/slapd.conf", "/etc/ldap/slapd.d" ]) self.add_cmd_output("ldapsearch -x -b '' -s base 'objectclass=*'") self.add_cmd_output( ldap_search + "-b cn=config '(!(objectClass=olcSchemaConfig))'", suggest_filename="configuration_minus_schemas") self.add_cmd_output( ldap_search + "-b cn=schema,cn=config dn", suggest_filename="loaded_schemas") self.add_cmd_output( ldap_search + "-b cn=config '(olcAccess=*)' olcAccess olcSuffix", suggest_filename="access_control_lists") def postproc(self): super(DebianLdap, self).postproc() self.do_cmd_output_sub( "ldapsearch", r"(olcRootPW\: \s*)\S+", r"\1********" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/kimchi.py0000644000175000017500000000300613203300002017334 0ustar cariboucaribou# Copyright IBM, Corp. 2014, Christy Perez # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Kimchi(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """kimchi-related information """ plugin_name = 'kimchi' packages = ('kimchi',) def setup(self): log_limit = self.get_option('log_size') self.add_copy_spec('/etc/kimchi/') if not self.get_option('all_logs'): self.add_copy_spec('/var/log/kimchi/*.log', sizelimit=log_limit) self.add_copy_spec('/etc/kimchi/kimchi*', sizelimit=log_limit) self.add_copy_spec('/etc/kimchi/distros.d/*.json', sizelimit=log_limit) else: self.add_copy_spec('/var/log/kimchi/') # vim: expandtab tabstop=4 shiftwidth=4 sosreport-3.5/sos/plugins/ovirt_hosted_engine.py0000644000175000017500000000620413203300002022131 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., Sandro Bonazzola # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import glob from sos.plugins import Plugin, RedHatPlugin class OvirtHostedEngine(Plugin, RedHatPlugin): """oVirt Hosted Engine""" packages = ( 'ovirt-hosted-engine-setup', 'ovirt-hosted-engine-ha', ) plugin_name = 'ovirt_hosted_engine' profiles = ('virt',) SETUP_LOG_GLOB = '/var/log/ovirt-hosted-engine-setup/*.log' HA_LOG_GLOB = '/var/log/ovirt-hosted-engine-ha/*.log' def setup(self): self.limit = self.get_option('log_size') # Add configuration files # Collecting the whole directory since it may contain branding # configuration files or third party plugins configuration files self.add_copy_spec(['/etc/ovirt-hosted-engine-setup.env.d/']) self.add_copy_spec([ '/etc/ovirt-hosted-engine/answers.conf', '/etc/ovirt-hosted-engine/hosted-engine.conf', '/etc/ovirt-hosted-engine/vm.conf', '/etc/ovirt-hosted-engine-ha/agent.conf', '/etc/ovirt-hosted-engine-ha/agent-log.conf', '/etc/ovirt-hosted-engine-ha/broker.conf', '/etc/ovirt-hosted-engine-ha/broker-log.conf', '/etc/ovirt-hosted-engine-ha/notifications/state_transition.txt', '/var/run/ovirt-hosted-engine-ha/vm.conf', '/var/lib/ovirt-hosted-engine-ha/broker.conf', ]) all_setup_logs = glob.glob(self.SETUP_LOG_GLOB) all_setup_logs.sort(reverse=True) if len(all_setup_logs): # Add latest ovirt-hosted-engine-setup log file self.add_copy_spec(all_setup_logs[0]) # Add older ovirt-hosted-engine-setup log files only if requested if self.get_option('all_logs'): self.add_copy_spec( self.SETUP_LOG_GLOB, sizelimit=self.limit ) self.add_copy_spec([ '/var/log/ovirt-hosted-engine-ha/agent.log', '/var/log/ovirt-hosted-engine-ha/broker.log', ]) # Add older ovirt-hosted-engine-ha log files only if requested if self.get_option('all_logs'): self.add_copy_spec( self.HA_LOG_GLOB, sizelimit=self.limit, ) # Add run-time status self.add_cmd_output([ 'hosted-engine --vm-status', 'hosted-engine --check-liveliness', ]) # vim: expandtab tabstop=4 shiftwidth=4 sosreport-3.5/sos/plugins/cman.py0000644000175000017500000000437513203300002017020 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import re from glob import glob class Cman(Plugin, RedHatPlugin): """cman based Red Hat Cluster High Availability """ plugin_name = "cman" profiles = ("cluster",) packages = [ "luci", "cman", "clusterlib", ] files = ["/etc/cluster/cluster.conf"] debugfs_path = "/sys/kernel/debug" _debugfs_cleanup = False def setup(self): self.add_copy_spec([ "/etc/cluster.conf", "/etc/cluster", "/etc/sysconfig/cluster", "/etc/sysconfig/cman", "/var/log/cluster", "/etc/fence_virt.conf", "/var/lib/luci/data/luci.db", "/var/lib/luci/etc", "/var/log/luci" ]) self.add_cmd_output([ "cman_tool services", "cman_tool nodes", "cman_tool status", "ccs_tool lsnode", "mkqdisk -L", "group_tool dump", "fence_tool dump", "fence_tool ls -n", "clustat", "rg_test test /etc/cluster/cluster.conf" ]) def postproc(self): for cluster_conf in glob("/etc/cluster/cluster.conf*"): self.do_file_sub( cluster_conf, r"(\s*\ # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Hpasm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """HP Advanced Server Management """ plugin_name = 'hpasm' profiles = ('system', 'hardware') packages = ('hp-health',) def setup(self): self.add_copy_spec("/var/log/hp-health/hpasmd.log") self.add_cmd_output([ "hpasmcli -s 'show asr'", "hpasmcli -s 'show server'" ], timeout=0) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/rpm.py0000644000175000017500000000470513203300002016675 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class Rpm(Plugin, RedHatPlugin): """RPM Package Manager """ plugin_name = 'rpm' profiles = ('system', 'packagemanager') option_list = [("rpmq", "queries for package information via rpm -q", "fast", True), ("rpmva", "runs a verify on all packages", "slow", False)] verify_packages = ('rpm',) def setup(self): self.add_copy_spec("/var/log/rpmpkgs") def add_rpm_cmd(query_fmt, filter_cmd, symlink, suggest): rpmq_cmd = 'rpm --nodigest -qa --qf=%s' % query_fmt shell_cmd = rpmq_cmd if filter_cmd: shell_cmd = "sh -c '%s'" % (rpmq_cmd + "|" + filter_cmd) self.add_cmd_output(shell_cmd, root_symlink=symlink, suggest_filename=suggest) if self.get_option("rpmq"): # basic installed-rpms query_fmt = '"%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}~~' query_fmt = query_fmt + '%{INSTALLTIME:date}\n"' filter_cmd = 'awk -F "~~" ' \ '"{printf \\"%-59s %s\\n\\",\$1,\$2}"|sort -f' add_rpm_cmd(query_fmt, filter_cmd, "installed-rpms", None) # extended package data query_fmt = '"%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\\t' query_fmt = query_fmt + '%{INSTALLTIME:date}\\t%{INSTALLTIME}\\t' query_fmt = query_fmt + '%{VENDOR}\\t%{BUILDHOST}\\t' query_fmt = query_fmt + '%{SIGPGP}\\t%{SIGPGP:pgpsig}\\n"' add_rpm_cmd(query_fmt, None, None, "package-data") if self.get_option("rpmva"): self.add_cmd_output("rpm -Va", root_symlink="rpm-Va", timeout=180) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/postfix.py0000644000175000017500000000303513203300002017566 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Postfix(Plugin): """Postfix smtp server """ plugin_name = "postfix" profiles = ('mail', 'services') packages = ('postfix',) def setup(self): self.add_copy_spec([ "/etc/postfix/main.cf", "/etc/postfix/master.cf" ]) self.add_cmd_output("postconf") class RedHatPostfix(Postfix, RedHatPlugin): files = ('/etc/rc.d/init.d/postfix',) packages = ('postfix',) def setup(self): super(RedHatPostfix, self).setup() self.add_copy_spec("/etc/mail") class DebianPostfix(Postfix, DebianPlugin, UbuntuPlugin): packages = ('postfix',) def setup(self): super(DebianPostfix, self).setup() self.add_copy_spec("/etc/postfix/dynamicmaps.cf") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/cs.py0000644000175000017500000001133213203300002016476 0ustar cariboucaribou# Copyright (C) 2007-2010 Red Hat, Inc., Kent Lamb # Marc Sauton # Pierre Carrier # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin from os.path import exists from glob import glob class CertificateSystem(Plugin, RedHatPlugin): """Certificate System and Dogtag """ plugin_name = 'cs' profiles = ('identity', 'security') packages = ( "redhat-cs", "rhpki-common", "pki-common", "redhat-pki", "dogtag-pki", "pki-base" ) files = ( "/opt/redhat-cs", "/usr/share/java/rhpki", "/usr/share/java/pki" ) def checkversion(self): if self.is_installed("redhat-cs") or exists("/opt/redhat-cs"): return 71 elif self.is_installed("rhpki-common") or \ len(glob("/var/lib/rhpki-*")): return 73 # 8 should cover dogtag elif self.is_installed("pki-common"): return 8 elif self.is_installed("redhat-pki") or \ self.is_installed("dogtag-pki") or \ self.is_installed("pki-base"): return 9 return False def setup(self): csversion = self.checkversion() if not csversion: self.add_alert("Red Hat Certificate System not found.") return if csversion == 71: self.add_copy_spec([ "/opt/redhat-cs/slapd-*/logs/access", "/opt/redhat-cs/slapd-*/logs/errors", "/opt/redhat-cs/slapd-*/config/dse.ldif", "/opt/redhat-cs/cert-*/errors", "/opt/redhat-cs/cert-*/config/CS.cfg", "/opt/redhat-cs/cert-*/access", "/opt/redhat-cs/cert-*/errors", "/opt/redhat-cs/cert-*/system", "/opt/redhat-cs/cert-*/transactions", "/opt/redhat-cs/cert-*/debug", "/opt/redhat-cs/cert-*/tps-debug.log" ]) if csversion == 73: self.add_copy_spec([ "/var/lib/rhpki-*/conf/*cfg*", "/var/lib/rhpki-*/conf/*.ldif", "/var/lib/rhpki-*/logs/debug", "/var/lib/rhpki-*/logs/catalina.*", "/var/lib/rhpki-*/logs/ra-debug.log", "/var/lib/rhpki-*/logs/transactions", "/var/lib/rhpki-*/logs/system" ]) if csversion in (73, 8): self.add_copy_spec([ "/etc/dirsrv/slapd-*/dse.ldif", "/var/log/dirsrv/slapd-*/access", "/var/log/dirsrv/slapd-*/errors" ]) if csversion == 8: self.add_copy_spec([ "/etc/pki-*/CS.cfg", "/var/lib/pki-*/conf/*cfg*", "/var/log/pki-*/debug", "/var/log/pki-*/catalina.*", "/var/log/pki-*/ra-debug.log", "/var/log/pki-*/transactions", "/var/log/pki-*/system" ]) if csversion == 9: # Get logs and configs for each subsystem if installed for subsystem in ('ca', 'kra', 'ocsp', 'tks', 'tps'): self.add_copy_spec([ "/var/lib/pki/*/" + subsystem + "/conf/CS.cfg", "/var/lib/pki/*/logs/" + subsystem + "/system", "/var/lib/pki/*/logs/" + subsystem + "/transactions", "/var/lib/pki/*/logs/" + subsystem + "/debug", "/var/lib/pki/*/logs/" + subsystem + "/selftests.log" ]) # Common log files self.add_copy_spec([ "/var/lib/pki/*/logs/catalina.*", "/var/lib/pki/*/logs/localhost*.log", "/var/lib/pki/*/logs/localhost*.txt", "/var/lib/pki/*/logs/manager*.log", "/var/lib/pki/*/logs/host-manager*.log", "/var/lib/pki/*/logs/tps/tokendb-audit.log" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/mysql.py0000644000175000017500000000677113203300002017251 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class Mysql(Plugin): """MySQL and MariaDB RDBMS """ plugin_name = "mysql" profiles = ('services',) mysql_cnf = "/etc/my.cnf" pw_warn_text = " (password visible in process listings)" option_list = [ ("dbuser", "username for database dumps", "", "mysql"), ("dbpass", "password for database dumps" + pw_warn_text, "", False), ("dbdump", "collect a database dump", "", False) ] def setup(self): super(Mysql, self).setup() self.add_copy_spec([ self.mysql_cnf, # Required for MariaDB under pacemaker (MariaDB-Galera) "/var/log/mysqld.log", "/var/log/mysql/mysqld.log", "/var/log/containers/mysql/mysqld.log", "/var/log/mariadb/mariadb.log", ]) if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/mysql*", "/var/log/containers/mysql*", "/var/log/mariadb*" ]) if self.get_option("dbdump"): msg = "database user name and password must be supplied" dbdump_err = "mysql.dbdump: %s" % msg dbuser = self.get_option("dbuser") dbpass = self.get_option("dbpass") if 'MYSQL_PWD' in os.environ: dbpass = os.environ['MYSQL_PWD'] if dbuser is True or dbpass is True: # sosreport -a or -k mysql.{dbuser,dbpass} self.soslog.warning(dbdump_err) return if not dbpass or dbpass is False: # no MySQL password self.soslog.warning(dbdump_err) return # no need to save/restore as this variable is private to # the mysql plugin. os.environ['MYSQL_PWD'] = dbpass opts = "--user=%s --all-databases" % dbuser name = "mysqldump_--all-databases" self.add_cmd_output("mysqldump %s" % opts, suggest_filename=name) class RedHatMysql(Mysql, RedHatPlugin): packages = ( 'mysql-server', 'mysql', 'mariadb-server', 'mariadb' ) def setup(self): super(RedHatMysql, self).setup() self.add_copy_spec([ "/etc/ld.so.conf.d/mysql-*.conf", "/etc/ld.so.conf.d/mariadb-*.conf", "/etc/my.cnf.d/*", "/var/lib/config-data/puppet-generated/mysql/etc/my.cnf.d/*" ]) class DebianMysql(Mysql, DebianPlugin, UbuntuPlugin): packages = ( 'mysql-server', 'mysql-common', 'mariadb-server', 'mariadb-common' ) def setup(self): super(DebianMysql, self).setup() self.add_copy_spec("/etc/mysql/conf.d/mysql*") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/canonical_livepatch.py0000644000175000017500000000243713203300002022065 0ustar cariboucaribou# Copyright (c) 2016 Bryan Quigley # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, UbuntuPlugin class CanonicaLivepatch(Plugin, UbuntuPlugin): """Canonical Livepatch Service """ plugin_name = 'canonical_livepatch' profiles = ('system', 'kernel') files = ('/snap/bin/canonical-livepatch') def setup(self): self.add_cmd_output([ "systemctl status snap.canonical-livepatch.canonical-livepatchd", "snap run canonical-livepatch status --verbose", "snap run canonical-livepatch --version" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/manageiq.py0000644000175000017500000000647313203300002017665 0ustar cariboucaribou# -*- python -*- # -*- coding: utf-8 -*- # Copyright (C) 2015 Red Hat, Inc., Pep Turró Mauri # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os.path class ManageIQ(Plugin, RedHatPlugin): """ManageIQ/CloudForms related information """ plugin_name = 'manageiq' miq_dir = '/var/www/miq/vmdb' packages = ('cfme',) files = ( os.path.join(miq_dir, 'BUILD'), os.path.join(miq_dir, 'GUID'), os.path.join(miq_dir, 'VERSION') ) # Config files to collect from miq_dir/config/ miq_conf_dir = os.path.join(miq_dir, "config") miq_conf_files = [ 'application.rb', 'boot.rb', 'environment.rb', 'preinitializer.rb', 'routes.rb', 'environments/metric_fu.rb', 'environments/production.rb', 'api.yml', 'broker_notify_properties.tmpl.yml', 'capacity.tmpl.yml', 'dashboard.yml', 'event_handling.tmpl.yml', 'hostdefaults.tmpl.yml', 'mongrel_cluster.yml', 'mongrel_win.yml', 'storage.tmpl.yml', 'vmdb.tmpl.yml', 'vmdb.yml.db', 'event_handling.yml.db', 'lighttpd.conf', 'replication.conf' ] # Log files to collect from miq_dir/log/ miq_log_dir = os.path.join(miq_dir, "log") miq_log_files = [ 'appliance_console.log', 'api.log', 'audit.log', 'automation.log', 'aws.log', 'evm.log', 'fog.log', 'miq_ntpdate.log', 'mongrel.log', 'policy.log', 'prince.log', 'production.log', 'rhevm.log', 'scvmm.log', 'top_output.log', 'vim.log', 'vmdb_restart.log', 'vmstat_output.log', 'vmstat_output.log', 'apache/miq_apache.log', 'apache/ssl_access.log', 'apache/ssl_error.log', 'apache/ssl_request.log', 'apache/ssl_mirror_request.log', 'apache/ssl_mirror_error.log', 'apache/ssl_mirror_access_error.log', 'gem_list.txt', 'last_startup.txt', 'package_list_rpm.txt', 'vendor_gems.txt' ] def setup(self): if self.get_option("all_logs"): # turn all log files to a glob to include logrotated ones self.miq_log_files = map(lambda x: x + '*', self.miq_log_files) self.add_copy_spec(list(self.files)) self.add_copy_spec([ os.path.join(self.miq_conf_dir, x) for x in self.miq_conf_files ]) self.add_copy_spec([ os.path.join(self.miq_log_dir, x) for x in self.miq_log_files ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/distupgrade.py0000644000175000017500000000355613203300002020415 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class DistUpgrade(Plugin): """ Distribution upgrade data """ plugin_name = "distupgrade" profiles = ('system', 'sysmgmt') files = None class RedHatDistUpgrade(DistUpgrade, RedHatPlugin): packages = ( 'preupgrade-assistant', 'preupgrade-assistant-ui', 'preupgrade-assistant-el6toel7', 'redhat-upgrade-tool' ) files = ( "/var/log/upgrade.log", "/var/log/redhat_update_tool.log", "/root/preupgrade/all-xccdf*", "/root/preupgrade/kickstart" ) def postproc(self): self.do_file_sub( "/root/preupgrade/kickstart/anaconda-ks.cfg", r"(useradd --password) (.*)", r"\1 ********" ) self.do_file_sub( "/root/preupgrade/kickstart/anaconda-ks.cfg", r"(\s*rootpw\s*).*", r"\1********" ) self.do_file_sub( "/root/preupgrade/kickstart/untrackeduser", r"\/home\/.*", r"/home/******** path redacted ********" ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/auditd.py0000644000175000017500000000273513203300002017352 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Auditd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Audit daemon information """ plugin_name = 'auditd' profiles = ('system', 'security') packages = ('audit',) def setup(self): self.add_copy_spec([ "/etc/audit/auditd.conf", "/etc/audit/audit.rules" ]) self.add_cmd_output([ "ausearch --input-logs -m avc,user_avc -ts today", "auditctl -s" ]) if not self.get_option("all_logs"): limit = self.get_option("log_size") self.add_copy_spec("/var/log/audit/audit.log", sizelimit=limit) else: self.add_copy_spec("/var/log/audit") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/crypto.py0000644000175000017500000000223713203300002017415 0ustar cariboucaribou# Copyright (C) 2017 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Crypto(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """ System crypto services information """ plugin_name = 'crypto' profiles = ('system', 'hardware') def setup(self): self.add_copy_spec([ "/proc/crypto", "/proc/sys/crypto/fips_enabled" ]) # vim: et ts=4 sw=4 sosreport-3.5/sos/plugins/python.py0000644000175000017500000000221113203300002017406 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc.,Poornima M. Kshirsagar # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Python(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Python runtime """ plugin_name = 'python' profiles = ('system',) packages = ('python',) def setup(self): self.add_cmd_output("python -V", suggest_filename="python-version") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/krb5.py0000644000175000017500000000226713203300002016743 0ustar cariboucaribou# Copyright (C) 2013 Red Hat, Inc., Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Krb5(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Kerberos authentication """ plugin_name = 'krb5' profiles = ('identity', 'system') packages = ('krb5-libs', 'krb5-user') def setup(self): self.add_copy_spec("/etc/krb5.conf") self.add_cmd_output("klist -ket /etc/krb5.keytab") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/named.py0000644000175000017500000000556613203300002017171 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin from os.path import exists, join, normpath class Named(Plugin): """BIND named server """ plugin_name = "named" profiles = ('system', 'services', 'network') named_conf = "/etc/named.conf" config_files = named_conf def setup(self): for cfg in self.config_files: if exists(cfg): self.add_copy_spec([ cfg, self.get_dns_dir(cfg) ]) self.add_forbidden_path(join(self.get_dns_dir(cfg), "chroot/dev")) self.add_forbidden_path(join(self.get_dns_dir(cfg), "chroot/proc")) def get_dns_dir(self, config_file): """ grab directory path from named{conf,boot} """ directory_list = self.do_regex_find_all("directory\s+\"(.*)\"", config_file) if directory_list: return normpath(directory_list[0]) else: return "" def postproc(self): match = r"(\s*arg \"password )[^\"]*" subst = r"\1******" self.do_file_sub(self.named_conf, match, subst) class RedHatNamed(Named, RedHatPlugin): named_conf = "/etc/named.conf" config_files = ("/etc/named.conf", "/etc/named.boot") files = (named_conf, '/etc/sysconfig/named') packages = ('bind',) def setup(self): super(RedHatNamed, self).setup() self.add_copy_spec("/etc/named/") self.add_copy_spec("/etc/sysconfig/named") self.add_cmd_output("klist -ket /etc/named.keytab") self.add_forbidden_path("/etc/named.keytab") return class DebianNamed(Named, DebianPlugin, UbuntuPlugin): files = ('/etc/bind/named.conf') packages = ('bind9',) named_conf = "/etc/bind/named.conf" config_files = (named_conf, "/etc/bind/named.conf.options", "/etc/bind/named.conf.local") def setup(self): super(DebianNamed, self).setup() self.add_copy_spec("/etc/bind/") return # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/cups.py0000644000175000017500000000321613203300002017045 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Cups(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """CUPS IPP print service """ plugin_name = 'cups' profiles = ('hardware',) packages = ('cups',) def setup(self): if not self.get_option("all_logs"): limit = self.get_option("log_size") self.add_copy_spec("/var/log/cups/access_log", sizelimit=limit) self.add_copy_spec("/var/log/cups/error_log", sizelimit=limit) self.add_copy_spec("/var/log/cups/page_log", sizelimit=limit) else: self.add_copy_spec("/var/log/cups") self.add_copy_spec([ "/etc/cups/*.conf", "/etc/cups/*.types", "/etc/cups/lpoptions", "/etc/cups/ppd/*.ppd" ]) self.add_cmd_output([ "lpstat -t", "lpstat -s", "lpstat -d" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/iscsitarget.py0000644000175000017500000000320213203300002020407 0ustar cariboucaribou# Copyright (C) 2007-2012 Red Hat, Inc., Ben Turner # Copyright (C) 2012 Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class IscsiTarget(Plugin): """iSCSI target """ plugin_name = "iscsitarget" profiles = ('storage',) class RedHatIscsiTarget(IscsiTarget, RedHatPlugin): packages = ('scsi-target-utils',) def setup(self): super(RedHatIscsiTarget, self).setup() self.add_copy_spec("/etc/tgt/targets.conf") self.add_cmd_output("tgtadm --lld iscsi --op show --mode target") class DebianIscsiTarget(IscsiTarget, DebianPlugin, UbuntuPlugin): packages = ('iscsitarget',) def setup(self): super(DebianIscsiTarget, self).setup() self.add_copy_spec([ "/etc/iet", "/etc/sysctl.d/30-iscsitarget.conf", "/etc/default/iscsitarget" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/nfs.py0000644000175000017500000000231613203300002016661 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Nfs(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Network file system information """ plugin_name = 'nfs' profiles = ('storage', 'network', 'nfs') packages = ['nfs-utils'] def setup(self): self.add_copy_spec([ "/etc/nfsmount.conf", "/etc/idmapd.conf", "/proc/fs/nfsfs/servers", "/proc/fs/nfsfs/volumes" ]) return # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/dpkg.py0000644000175000017500000000304613203300002017021 0ustar cariboucaribou# Copyright (c) 2012 Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, DebianPlugin, UbuntuPlugin class Dpkg(Plugin, DebianPlugin, UbuntuPlugin): """Debian Package Management """ plugin_name = 'dpkg' profiles = ('sysmgmt', 'packagemanager') def setup(self): self.add_cmd_output("dpkg -l", root_symlink="installed-debs") if self.get_option("verify"): self.add_cmd_output("dpkg -V") self.add_cmd_output("dpkg -C") self.add_copy_spec([ "/var/cache/debconf/config.dat", "/etc/debconf.conf" ]) if not self.get_option("all_logs"): limit = self.get_option("log_size") self.add_copy_spec("/var/log/dpkg.log", sizelimit=limit) else: self.add_copy_spec("/var/log/dpkg.log*") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/multipath.py0000644000175000017500000000236013203300002020101 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Multipath(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Device-mapper multipath tools """ plugin_name = 'multipath' profiles = ('system', 'storage', 'hardware') def setup(self): self.add_copy_spec([ "/etc/multipath/", "/etc/multipath.conf" ]) self.add_cmd_output([ "multipath -l", "multipath -v4 -ll", "multipathd show config" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/xfs.py0000644000175000017500000000311413203300002016670 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin from six.moves import zip class Xfs(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """XFS filesystem """ plugin_name = 'xfs' profiles = ('storage',) option_list = [("logprint", 'gathers the log information', 'slow', False)] def setup(self): mounts = '/proc/mounts' ext_fs_regex = r"^(/dev/.+).+xfs\s+" for dev in zip(self.do_regex_find_all(ext_fs_regex, mounts)): for e in dev: parts = e.split(' ') self.add_cmd_output("xfs_info %s" % (parts[1])) if self.get_option('logprint'): for dev in zip(self.do_regex_find_all(ext_fs_regex, mounts)): for e in dev: parts = e.split(' ') self.add_cmd_output("xfs_logprint -c %s" % (parts[0])) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/postgresql.py0000644000175000017500000001367613203300002020311 0ustar cariboucaribou# Copyright (C) 2017 Red Hat, Inc., Pavel Moravec # Copyright (C) 2014 Red Hat, Inc., Sandro Bonazzola # Copyright (C) 2013 Chris J Arges # Copyright (C) 2012-2013 Red Hat, Inc., Bryn M. Reeves # Copyright (C) 2011 Red Hat, Inc., Jesse Jaggars # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import tempfile from sos.plugins import (Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin, SCLPlugin) from sos.utilities import find class PostgreSQL(Plugin): """PostgreSQL RDBMS""" plugin_name = "postgresql" profiles = ('services',) packages = ('postgresql',) tmp_dir = None password_warn_text = " (password visible in process listings)" option_list = [ ('pghome', 'PostgreSQL server home directory.', '', '/var/lib/pgsql'), ('username', 'username for pg_dump', '', 'postgres'), ('password', 'password for pg_dump' + password_warn_text, '', False), ('dbname', 'database name to dump for pg_dump', '', ''), ('dbhost', 'database hostname/IP (do not use unix socket)', '', ''), ('dbport', 'database server port number', '', '5432') ] def pg_dump(self, pg_dump_command="pg_dump", filename="sos_pgdump.tar"): if self.get_option("dbname"): if self.get_option("password") or "PGPASSWORD" in os.environ: self.tmp_dir = tempfile.mkdtemp() dest_file = os.path.join(self.tmp_dir, filename) # We're only modifying this for ourself and our children so # there is no need to save and restore environment variables if # the user decided to pass the password on the command line. if self.get_option("password") is not False: os.environ["PGPASSWORD"] = str(self.get_option("password")) if self.get_option("dbhost"): cmd = "%s -U %s -h %s -p %s -w -f %s -F t %s" % ( pg_dump_command, self.get_option("username"), self.get_option("dbhost"), self.get_option("dbport"), dest_file, self.get_option("dbname") ) else: cmd = "%s -C -U %s -w -f %s -F t %s " % ( pg_dump_command, self.get_option("username"), dest_file, self.get_option("dbname") ) result = self.call_ext_prog(cmd) if (result['status'] == 0): self.add_copy_spec(dest_file) else: self._log_info( "Unable to execute pg_dump. Error(%s)" % (result['output']) ) else: # no password in env or options self.soslog.warning( "password must be supplied to dump a database." ) self.add_alert( "WARN: password must be supplied to dump a database." ) def setup(self): self.pg_dump() def postproc(self): import shutil if self.tmp_dir: try: shutil.rmtree(self.tmp_dir) except shutil.Error: self.soslog.exception( "Unable to remove %s." % (self.tmp_dir) ) self.add_alert("ERROR: Unable to remove %s." % (self.tmp_dir)) class RedHatPostgreSQL(PostgreSQL, SCLPlugin): packages = ('postgresql', 'rh-postgresql95-postgresql-server', ) def setup(self): super(RedHatPostgreSQL, self).setup() scl = "rh-postgresql95" pghome = self.get_option("pghome") # Copy PostgreSQL log files. for filename in find("*.log", pghome): self.add_copy_spec(filename) for filename in find("*.log", self.convert_copyspec_scl(scl, pghome)): self.add_copy_spec(filename) # Copy PostgreSQL config files. for filename in find("*.conf", pghome): self.add_copy_spec(filename) for filename in find("*.conf", self.convert_copyspec_scl(scl, pghome)): self.add_copy_spec(filename) self.add_copy_spec(os.path.join(pghome, "data", "PG_VERSION")) self.add_copy_spec(os.path.join(pghome, "data", "postmaster.opts")) self.add_copy_spec_scl(scl, os.path.join(pghome, "data", "PG_VERSION")) self.add_copy_spec_scl(scl, os.path.join( pghome, "data", "postmaster.opts" ) ) if scl in self.scls_matched: self.pg_dump( pg_dump_command="scl enable rh-postgresql95 -- pg_dump", filename="sos_scl_pgdump.tar" ) class DebianPostgreSQL(PostgreSQL, DebianPlugin, UbuntuPlugin): def setup(self): super(DebianPostgreSQL, self).setup() self.add_copy_spec([ "/var/log/postgresql/*.log", "/etc/postgresql/*/main/*.conf", "/var/lib/postgresql/*/main/PG_VERSION", "/var/lib/postgresql/*/main/postmaster.opts" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/x11.py0000644000175000017500000000245313203300002016506 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class X11(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """X windowing system """ plugin_name = 'x11' profiles = ('hardware', 'desktop') files = ('/etc/X11',) def setup(self): self.add_copy_spec([ "/etc/X11", "/var/log/Xorg.*.log", "/var/log/XFree86.*.log", ]) self.add_forbidden_path("/etc/X11/X") self.add_forbidden_path("/etc/X11/fontpath.d") self.add_cmd_output([ "xrandr --verbose" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/openstack_keystone.py0000644000175000017500000001143313203300002022003 0ustar cariboucaribou# Copyright (C) 2013 Red Hat, Inc., Jeremy Agee # Copyright (C) 2017 Red Hat, Inc., Martin Schuppert # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import os class OpenStackKeystone(Plugin): """OpenStack Keystone """ plugin_name = "openstack_keystone" profiles = ('openstack', 'openstack_controller') option_list = [("nopw", "dont gathers keystone passwords", "slow", True)] var_puppet_gen = "/var/lib/config-data/puppet-generated/keystone" def setup(self): self.add_copy_spec([ "/etc/keystone/default_catalog.templates", "/etc/keystone/keystone.conf", "/etc/keystone/logging.conf", "/etc/keystone/policy.json", "/etc/keystone/domains", self.var_puppet_gen + "/etc/keystone/*.conf", self.var_puppet_gen + "/etc/keystone/*.json", self.var_puppet_gen + "/etc/httpd/conf/", self.var_puppet_gen + "/etc/httpd/conf.d/", self.var_puppet_gen + "/etc/httpd/conf.modules.d/*.conf", self.var_puppet_gen + "/var/spool/cron/", self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf" ]) self.limit = self.get_option("log_size") if self.get_option("all_logs"): self.add_copy_spec([ "/var/log/keystone/", "/var/log/containers/keystone/", "/var/log/containers/httpd/keystone/" ], sizelimit=self.limit) else: self.add_copy_spec([ "/var/log/keystone/*.log", "/var/log/containers/keystone/*.log", "/var/log/containers/httpd/keystone/*log" ], sizelimit=self.limit) # collect domain config directory, if exists self.domain_config_dir_added = False self.domain_config_dir = self.get_cmd_output_now( "openstack-config --get /etc/keystone/keystone.conf " "identity domain_config_dir") if self.domain_config_dir and os.path.isdir(self.domain_config_dir): self.add_copy_spec(self.domain_config_dir) self.domain_config_dir_added = True if self.get_option("verify"): self.add_cmd_output("rpm -V %s" % ' '.join(self.packages)) vars_all = [p in os.environ for p in [ 'OS_USERNAME', 'OS_PASSWORD']] vars_any = [p in os.environ for p in [ 'OS_TENANT_NAME', 'OS_PROJECT_NAME']] if not (all(vars_all) and any(vars_any)): self.soslog.warning("Not all environment variables set. Source " "the environment file for the user intended " "to connect to the OpenStack environment.") else: self.add_cmd_output("openstack endpoint list") self.add_cmd_output("openstack catalog list") def postproc(self): protect_keys = [ "password", "qpid_password", "rabbit_password", "ssl_key_password", "ldap_dns_password", "neutron_admin_password", "host_password", "connection", "admin_password", "admin_token", "ca_password" ] regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) self.do_path_regex_sub("/etc/keystone/*", regexp, r"\1*********") self.do_path_regex_sub( self.var_puppet_gen + "/etc/keystone/*", regexp, r"\1*********" ) # obfuscate LDAP plaintext passwords in domain config dir, if collected if self.domain_config_dir_added: self.do_path_regex_sub(self.domain_config_dir, r"((?m)^\s*(%s)\s*=\s*)(.*)", r"\1********") class DebianKeystone(OpenStackKeystone, DebianPlugin, UbuntuPlugin): packages = ( 'keystone', 'python-keystone', 'python-keystoneclient' ) class RedHatKeystone(OpenStackKeystone, RedHatPlugin): packages = ( 'openstack-keystone', 'python-keystone', 'python-django-openstack-auth', 'python-keystoneclient' ) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/mrgmessg.py0000644000175000017500000000204513203300002017716 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin class MrgMessg(Plugin, RedHatPlugin): """MRG Messaging subsystem """ plugin_name = 'mrgmessg' profiles = ('mrg',) def setup(self): self.add_copy_spec([ "/etc/qpidd.conf", "/etc/sasl2/qpidd.conf", "/var/rhm" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/perl.py0000644000175000017500000000203013203300002017026 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Perl(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): """Perl runtime""" plugin_name = "perl" profiles = ('webserver', 'perl') verify_packages = ('perl.*',) def setup(self): self.add_cmd_output("perl -V") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/anacron.py0000644000175000017500000000222013203300002017506 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Anacron(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): """Anacron job scheduling service""" plugin_name = 'anacron' profiles = ('system',) packages = ('anacron', 'chronie-anacron') # anacron may be provided by anacron, cronie-anacron etc. # just look for the configuration file which is common files = ('/etc/anacrontab',) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/origin.py0000644000175000017500000002063213203300002017363 0ustar cariboucaribou# Copyright (C) 2016 Red Hat, Inc., Pep Turro Mauri # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import os.path # This plugin collects static configuration and runtime information # about OpenShift Origin based environments, like OpenShift Enterprise 3 # Some clarification on naming: # OpenShift Origin is the upstream project for OpenShift Enterprise, # OpenShift Container Platflorm, and Atomic Platform. # # However, the name "OpenShift Origin" refers to two different code bases: # * Origin M5 and later (https://github.com/openshift/origin) # which is upstream for OpenShift 3.x and later. # This is what this plugin handles # * Origin M4 and earlier (https://github.com/openshift/origin-server) # which is upstream for OpenShift 1.x and 2.x. # This is handled by the plugin in openshift.py # Note that this plugin should be used in conjunction with other plugins # in order to capture relevant data: the Kubernetes plugin for the # masters, the Docker plugin for the nodes, and also generic # plugins (e.g. for /etc/sysconfig entries, network setup etc) class OpenShiftOrigin(Plugin): ''' OpenShift Origin ''' plugin_name = "origin" files = None # file lists assigned after path setup below profiles = ('openshift',) option_list = [ ("diag", "run 'oc adm diagnostics' to collect its output", 'fast', True), ("diag-prevent", "set --prevent-modifications on 'oc adm diagnostics'", 'fast', False), ] master_base_dir = "/etc/origin/master" node_base_dir = "/etc/origin/node" master_cfg = os.path.join(master_base_dir, "master-config.yaml") node_cfg_file = "node-config.yaml" node_cfg = os.path.join(node_base_dir, node_cfg_file) admin_cfg = os.path.join(master_base_dir, "admin.kubeconfig") oc_cmd = "oc" oc_cmd_admin = "%s --config=%s" % (oc_cmd, admin_cfg) files = (master_cfg, node_cfg) # Master vs. node # # OpenShift Origin/3.x cluster members can be a master, a node, or both at # the same time: in most deployments masters are also nodes in order to get # access to the pod network, which some functionality (e.g. the API proxy) # requires. Therefore the following methods may all evaluate True on a # single instance (at least one must evaluate True if this is an OpenShift # installation) def is_master(self): '''Determine if we are on a master''' return os.path.exists(self.master_cfg) def is_node(self): '''Determine if we are on a node''' return os.path.exists(self.node_cfg) def get_node_kubecfg(self): '''Get the full path to the node's kubeconfig file from the node's configuration''' # If we fail to find a specific kubeconfig we will # just point to the general node configuration kubeconfig = self.node_cfg_file # This should ideally use PyYAML to parse the node's # configuration file, but PyYAML is currently not a # dependency of sos and we can't guarantee it will # be available, so this is a quick&dirty "grep" for # the parameter we're looking for cfgfile = open(self.node_cfg, 'r') for line in cfgfile: parts = line.split() if len(parts) > 1 and parts[0] == 'masterKubeConfig:': kubeconfig = parts[1] break cfgfile.close() return os.path.join(self.node_base_dir, kubeconfig) def setup(self): # Note that a system can run both a master and a node. # See "Master vs. node" above. if self.is_master(): self.add_copy_spec([ self.master_cfg, os.path.join(self.master_base_dir, "*.crt"), ]) # TODO: some thoughts about information that might also be useful # to collect. However, these are maybe not needed in general # and/or present some challenges (scale, sensitive, ...) and need # some more thought. For now just leaving this comment here until # we decide if it's worth collecting: # # General project status: # oc status --all-namespaces (introduced in OSE 3.2) # -> deemed as not worthy in BZ#1394527 # Metrics deployment configurations # oc get -o json dc -n openshift-infra # Logging stack deployment configurations # oc get -o json dc -n logging # # Note: Information about nodes, events, pods, and services # is already collected by the Kubernetes plugin self.add_cmd_output([ "%s describe projects" % self.oc_cmd_admin, "%s get -o json hostsubnet" % self.oc_cmd_admin, "%s get -o json clusternetwork" % self.oc_cmd_admin, "%s get -o json netnamespaces" % self.oc_cmd_admin, # Registry and router configs are typically here "%s get -o json dc -n default" % self.oc_cmd_admin, ]) if self.get_option('diag'): diag_cmd = "%s adm diagnostics -l 0" % self.oc_cmd_admin if self.get_option('diag-prevent'): diag_cmd += " --prevent-modifications=true" self.add_cmd_output(diag_cmd) self.add_journal(units=["atomic-openshift-master", "atomic-openshift-master-api", "atomic-openshift-master-controllers"]) # get logs from the infrastruture pods running in the default ns pods = self.get_command_output("%s get pod -o name -n default" % self.oc_cmd_admin) for pod in pods['output'].splitlines(): self.add_cmd_output("%s logs -n default %s" % (self.oc_cmd_admin, pod)) # Note that a system can run both a master and a node. # See "Master vs. node" above. if self.is_node(): self.add_copy_spec([ self.node_cfg, os.path.join(self.node_base_dir, "*.crt"), ]) node_kubecfg = self.get_node_kubecfg() self.add_cmd_output([ "%s config view --config=%s" % (self.oc_cmd, node_kubecfg), "%s adm diagnostics NodeConfigCheck --node-config=%s" % (self.oc_cmd, self.node_cfg) ]) self.add_journal(units="atomic-openshift-node") def postproc(self): # Clear env values from objects that can contain sensitive data # Sample JSON content: # { # "name": "MYSQL_PASSWORD", # "value": "mypassword" # }, # This will mask values when the "name" looks susceptible of # values worth obfuscating, i.e. if the name contains strings # like "pass", "pwd", "key" or "token". env_regexp = r'(?P{\s*"name":\s*[^,]*' \ r'(pass|pwd|key|token|cred|secret' \ r'|PASS|PWD|KEY|TOKEN|CRED|SECRET)[^,]*,' \ r'\s*"value":)[^}]*' self.do_cmd_output_sub('oc*json', env_regexp, r'\g "********"') # LDAP identity provider self.do_file_sub(self.master_cfg, r"(bindPassword:\s*)(.*)", r'\1"********"') # github/google/OpenID identity providers self.do_file_sub(self.master_cfg, r"(clientSecret:\s*)(.*)", r'\1"********"') class AtomicOpenShift(OpenShiftOrigin, RedHatPlugin): ''' OpenShift Enterprise / OpenShift Container Platform ''' packages = ('atomic-openshift',) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/ovirt_imageio.py0000644000175000017500000000341613203300002020732 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc., Sandro Bonazzola # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import glob from sos.plugins import Plugin, RedHatPlugin class OvirtImageIO(Plugin, RedHatPlugin): """oVirt Image I/O Daemon / Proxy""" packages = ( 'ovirt-imageio-daemon', 'ovirt-imageio-proxy', ) plugin_name = 'ovirt_imageio' profiles = ('virt',) def setup(self): self.limit = self.get_option('log_size') all_logs = self.get_option('all_logs') # Add configuration files self.add_copy_spec([ '/etc/ovirt-imageio-daemon/logger.conf', '/etc/ovirt-imageio-proxy/ovirt-imageio-proxy.conf', ]) if all_logs: logs = ['/var/log/ovirt-imageio-proxy/image-proxy.log*', '/var/log/ovirt-imageio-daemon/daemon.log*'] else: logs = ['/var/log/ovirt-imageio-proxy/image-proxy.log', '/var/log/ovirt-imageio-daemon/daemon.log'] # Add log files self.add_copy_spec(logs, sizelimit=self.limit) # vim: expandtab tabstop=4 shiftwidth=4 sosreport-3.5/sos/plugins/kpatch.py0000644000175000017500000000255513203300002017352 0ustar cariboucaribou# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin import re class Kpatch(Plugin, RedHatPlugin): """Kpatch information """ plugin_name = 'kpatch' packages = ('kpatch',) def setup(self): kpatch_list = self.get_cmd_output_now("kpatch list") if not kpatch_list: return kpatches = open(kpatch_list, "r").read().splitlines() for patch in kpatches: if not re.match("^kpatch-.*\(.*\)", patch): continue (module, version) = patch.split() self.add_cmd_output("kpatch info " + module) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/powerpath.py0000644000175000017500000000415313203300002020105 0ustar cariboucaribou# Copyright (C) 2008 EMC Corporation. Keith Kearnan # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, os class PowerPath(Plugin, RedHatPlugin): """ EMC PowerPath """ plugin_name = 'powerpath' profiles = ('storage', 'hardware') packages = ('EMCpower',) def get_pp_files(self): """ EMC PowerPath specific information - files """ self.add_cmd_output("powermt version") self.add_copy_spec([ "/etc/init.d/PowerPath", "/etc/powermt.custom", "/etc/emcp_registration", "/etc/emc/mpaa.excluded", "/etc/emc/mpaa.lams", "/etc/emcp_devicesDB.dat", "/etc/emcp_devicesDB.idx", "/etc/emc/powerkmd.custom", "/etc/modprobe.conf.pp" ]) def get_pp_config(self): """ EMC PowerPath specific information - commands """ self.add_cmd_output([ "powermt display", "powermt display dev=all", "powermt check_registration", "powermt display options", "powermt display ports", "powermt display paths", "powermt dump" ]) def setup(self): self.get_pp_files() # If PowerPath is running collect additional PowerPath specific # information if os.path.isdir("/proc/emcp"): self.get_pp_config() # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/cobbler.py0000644000175000017500000000273713203300002017512 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Cobbler(Plugin): plugin_name = "cobbler" class RedHatCobbler(Cobbler, RedHatPlugin): """Cobbler installation server """ packages = ('cobbler',) profiles = ('cluster', 'sysmgmt') def setup(self): self.add_copy_spec([ "/etc/cobbler", "/var/log/cobbler", "/var/lib/rhn/kickstarts", "/var/lib/cobbler" ]) class DebianCobbler(Cobbler, DebianPlugin, UbuntuPlugin): packages = ('cobbler',) def setup(self): self.add_copy_spec([ "/etc/cobbler", "/var/log/cobbler", "/var/lib/cobbler" ]) self.add_forbidden_path("/var/lib/cobbler/isos") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/juju.py0000644000175000017500000001110313203300002017042 0ustar cariboucaribou# Copyright (C) 2013 Adam Stokes # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from sos.plugins import Plugin, UbuntuPlugin from json import loads as json_loads def ensure_service_is_running(service): def wrapper(callback): def wrapped_f(self, *args, **kwargs): try: result = self.call_ext_prog("service {0} stop".format(service)) if result["status"] != 0: raise Exception("Cannot stop {0} service".format(service)) callback(self, *args, **kwargs) except Exception as ex: self._log_error("Cannot stop {0}, exception: {1}".format( service, ex.message)) finally: self.call_ext_prog("service {0} start".format(service)) return wrapped_f return wrapper class Juju(Plugin, UbuntuPlugin): """ Juju orchestration tool """ plugin_name = 'juju' profiles = ('virt', 'sysmgmt') files = ('/usr/bin/juju', '/usr/bin/juju-run') option_list = [ ('export-mongodb', 'Export mongodb collections as json files', '', False), ('generate-bundle', """Generate a YAML bundle of the current environment (requires juju-deployerizer)""", '', False), ] def get_deployed_services(self): cmd = "juju status --format json" status_json = self.call_ext_prog(cmd)['output'] self.add_string_as_file(status_json, "juju_status_json") return json_loads(status_json)['services'].keys() @ensure_service_is_running("juju-db") def export_mongodb(self): collections = ( "relations", "environments", "linkednetworks", "system", "settings", ) for collection in collections: self.add_cmd_output( "/usr/lib/juju/bin/mongoexport --ssl \ --dbpath=/var/lib/juju/db --db juju --collection {0} \ --jsonArray".format(collection), suggest_filename="{}.json".format(collection)) def setup(self): limit = self.get_option("log_size") self.add_copy_spec("/var/log/upstart/juju-db.log", sizelimit=limit) self.add_copy_spec("/var/log/upstart/juju-db.log.1", sizelimit=limit) if not self.get_option("all_logs"): # We need this because we want to collect to the limit of all # *.logs in the directory. if(os.path.isdir("/var/log/juju/")): for filename in os.listdir("/var/log/juju/"): if filename.endswith(".log"): fullname = os.path.join("/var/log/juju/" + filename) self.add_copy_spec(fullname, sizelimit=limit) self.add_cmd_output('ls -alRh /var/log/juju*') self.add_cmd_output('ls -alRh /var/lib/juju/*') else: self.add_copy_spec([ "/var/log/juju", "/var/log/juju-*", "/var/lib/juju" # /var/lib/juju used to be in the default capture moving here # because it usually was way to big. However, in most cases # you want all logs you want this too. ]) self.add_cmd_output([ "juju --version", "juju -v status --format=tabular", ]) for service in self.get_deployed_services(): self.add_cmd_output([ "juju get {}".format(service), "juju get-config {}".format(service), "juju get-constraints {}".format(service) ]) if self.get_option("export-mongodb"): self.export_mongodb() if self.get_option("generate-bundle"): self.add_cmd_output("juju deployerizer --include-charm-versions", suggest_filename="juju-env-bundle.yaml") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/sendmail.py0000644000175000017500000000310113203300002017660 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Eugene Teo # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin class Sendmail(Plugin): """sendmail service """ plugin_name = "sendmail" profiles = ('services', 'mail') packages = ('sendmail',) class RedHatSendmail(Sendmail, RedHatPlugin): files = ('/etc/rc.d/init.d/sendmail',) packages = ('sendmail',) def setup(self): super(RedHatSendmail, self).setup() self.add_copy_spec([ "/etc/mail/*", "/var/log/maillog" ]) class DebianSendmail(Sendmail, DebianPlugin, UbuntuPlugin): files = ('/etc/init.d/sendmail',) packages = ('sendmail',) def setup(self): super(DebianSendmail, self).setup() self.add_copy_spec([ "/etc/mail/*", "/var/log/mail.*" ]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/plugins/autofs.py0000644000175000017500000000450113203300002017372 0ustar cariboucaribou# Copyright (C) 2007 Red Hat, Inc., Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin class Autofs(Plugin): """Autofs on-demand automounter """ plugin_name = "autofs" profiles = ('storage', 'nfs') files = ('/etc/sysconfig/autofs', '/etc/default/autofs') packages = ('autofs',) def checkdebug(self): """ testing if autofs debug has been enabled anywhere """ # Global debugging opt = self.file_grep(r"^(DEFAULT_LOGGING|DAEMONOPTIONS)=(.*)", *self.files) for opt1 in opt: for opt2 in opt1.split(" "): if opt2 in ("--debug", "debug"): return True return False def getdaemondebug(self): """ capture daemon debug output """ debugout = self.file_grep(r"^(daemon.*)\s+(\/var\/log\/.*)", *self.files) for i in debugout: return i[1] def setup(self): self.add_copy_spec("/etc/auto*") self.add_cmd_output("/etc/init.d/autofs status") self.add_cmd_output("automount -m") if self.checkdebug(): self.add_copy_spec(self.getdaemondebug()) class RedHatAutofs(Autofs, RedHatPlugin): def setup(self): super(RedHatAutofs, self).setup() if self.get_option("verify"): self.add_cmd_output("rpm -qV autofs") class DebianAutofs(Autofs, DebianPlugin, UbuntuPlugin): def setup(self): super(DebianAutofs, self).setup() self.add_cmd_output("dpkg-query -s autofs") # vim: set et ts=4 sw=4 : sosreport-3.5/sos/Makefile0000644000175000017500000000105313073155336015524 0ustar cariboucaribouPYTHON=python PACKAGE = $(shell basename `pwd`) PYVER := $(shell $(PYTHON) -c 'import sys; print("%.3s" %(sys.version))') PYSYSDIR := $(shell $(PYTHON) -c 'import sys; print(sys.prefix)') PYLIBDIR = $(PYSYSDIR)/lib/python$(PYVER) PKGDIR = $(PYLIBDIR)/site-packages/$(PACKAGE) all: echo "nada" clean: rm -f *.pyc *.pyo *~ install: mkdir -p $(DESTDIR)/$(PKGDIR) for p in $(wildcard *.py) ; do \ install -m 644 $$p $(DESTDIR)/$(PKGDIR)/$$p; \ done $(PYTHON) -c "import compileall; compileall.compile_dir('$(DESTDIR)/$(PKGDIR)', 1, '$(PYDIR)', 1)" sosreport-3.5/sos/sosreport.py0000644000175000017500000016321213203300002016455 0ustar cariboucaribou""" Gather information about a system and report it using plugins supplied for application-specific information """ # sosreport.py # gather information about a system and report it # Copyright (C) 2006 Steve Conklin # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sys import traceback import os import errno import logging from optparse import OptionParser, Option from sos.plugins import import_plugin from sos.utilities import ImporterHelper from stat import ST_UID, ST_GID, ST_MODE, ST_CTIME, ST_ATIME, ST_MTIME, S_IMODE from time import strftime, localtime from collections import deque from shutil import rmtree import tempfile import hashlib from sos import _sos as _ from sos import __version__ import sos.policies from sos.archive import TarFileArchive from sos.reporting import (Report, Section, Command, CopiedFile, CreatedFile, Alert, Note, PlainTextReport) # PYCOMPAT import six from six.moves import zip, input from six import print_ if six.PY3: from configparser import ConfigParser, ParsingError, Error else: from ConfigParser import ConfigParser, ParsingError, Error # file system errors that should terminate a run fatal_fs_errors = (errno.ENOSPC, errno.EROFS) def _format_list(first_line, items, indent=False): lines = [] line = first_line if indent: newline = len(first_line) * ' ' else: newline = "" for item in items: if len(line) + len(item) + 2 > 72: lines.append(line) line = newline line = line + item + ', ' if line[-2:] == ', ': line = line[:-2] lines.append(line) return lines class TempFileUtil(object): def __init__(self, tmp_dir): self.tmp_dir = tmp_dir self.files = [] def new(self): fd, fname = tempfile.mkstemp(dir=self.tmp_dir) # avoid TOCTOU race by using os.fdopen() fobj = os.fdopen(fd, 'w+') self.files.append((fname, fobj)) return fobj def clean(self): for fname, f in self.files: try: f.flush() f.close() except Exception: pass try: os.unlink(fname) except Exception: pass self.files = [] class OptionParserExtended(OptionParser): """ Show examples """ def print_help(self, out=sys.stdout): """ Prints help content including examples """ OptionParser.print_help(self, out) print_() print_("Some examples:") print_() print_(" enable dlm plugin only and collect dlm lockdumps:") print_(" # sosreport -o dlm -k dlm.lockdump") print_() print_(" disable memory and samba plugins, turn off rpm -Va " "collection:") print_(" # sosreport -n memory,samba -k rpm.rpmva=off") print_() class SosOption(Option): """Allow to specify comma delimited list of plugins""" ACTIONS = Option.ACTIONS + ("extend",) STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",) TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",) def take_action(self, action, dest, opt, value, values, parser): """ Performs list extension on plugins """ if action == "extend": try: lvalue = value.split(",") except: pass else: values.ensure_value(dest, deque()).extend(lvalue) else: Option.take_action(self, action, dest, opt, value, values, parser) class XmlReport(object): """ Report build class """ def __init__(self): try: import libxml2 except ImportError: self.enabled = False return else: self.enabled = False return self.doc = libxml2.newDoc("1.0") self.root = self.doc.newChild(None, "sos", None) self.commands = self.root.newChild(None, "commands", None) self.files = self.root.newChild(None, "files", None) def add_command(self, cmdline, exitcode, stdout=None, stderr=None, f_stdout=None, f_stderr=None, runtime=None): """ Appends command run into report """ if not self.enabled: return cmd = self.commands.newChild(None, "cmd", None) cmd.setNsProp(None, "cmdline", cmdline) cmdchild = cmd.newChild(None, "exitcode", str(exitcode)) if runtime: cmd.newChild(None, "runtime", str(runtime)) if stdout or f_stdout: cmdchild = cmd.newChild(None, "stdout", stdout) if f_stdout: cmdchild.setNsProp(None, "file", f_stdout) if stderr or f_stderr: cmdchild = cmd.newChild(None, "stderr", stderr) if f_stderr: cmdchild.setNsProp(None, "file", f_stderr) def add_file(self, fname, stats): """ Appends file(s) added to report """ if not self.enabled: return cfile = self.files.newChild(None, "file", None) cfile.setNsProp(None, "fname", fname) cchild = cfile.newChild(None, "uid", str(stats[ST_UID])) cchild = cfile.newChild(None, "gid", str(stats[ST_GID])) cfile.newChild(None, "mode", str(oct(S_IMODE(stats[ST_MODE])))) cchild = cfile.newChild(None, "ctime", strftime('%a %b %d %H:%M:%S %Y', localtime(stats[ST_CTIME]))) cchild.setNsProp(None, "tstamp", str(stats[ST_CTIME])) cchild = cfile.newChild(None, "atime", strftime('%a %b %d %H:%M:%S %Y', localtime(stats[ST_ATIME]))) cchild.setNsProp(None, "tstamp", str(stats[ST_ATIME])) cchild = cfile.newChild(None, "mtime", strftime('%a %b %d %H:%M:%S %Y', localtime(stats[ST_MTIME]))) cchild.setNsProp(None, "tstamp", str(stats[ST_MTIME])) def serialize(self): """ Serializes xml """ if not self.enabled: return self.ui_log.info(self.doc.serialize(None, 1)) def serialize_to_file(self, fname): """ Serializes to file """ if not self.enabled: return outf = tempfile.NamedTemporaryFile() outf.write(self.doc.serialize(None, 1)) outf.flush() self.archive.add_file(outf.name, dest=fname) outf.close() # valid modes for --chroot chroot_modes = ["auto", "always", "never"] class SoSOptions(object): _list_plugins = False _noplugins = [] _enableplugins = [] _onlyplugins = [] _plugopts = [] _usealloptions = False _all_logs = False _log_size = 10 _batch = False _build = False _verbosity = 0 _verify = False _quiet = False _debug = False _case_id = "" _customer_name = "" _profiles = deque() _list_profiles = False _config_file = "" _tmp_dir = "" _noreport = False _sysroot = None _chroot = 'auto' _compression_type = 'auto' _options = None def __init__(self, args=None): if args: self._options = self._parse_args(args) else: self._options = None def _check_options_initialized(self): if self._options is not None: raise ValueError("SoSOptions object already initialized " "from command line") @property def list_plugins(self): if self._options is not None: return self._options.list_plugins return self._list_plugins @list_plugins.setter def list_plugins(self, value): self._check_options_initialized() if not isinstance(value, bool): raise TypeError("SoSOptions.list_plugins expects a boolean") self._list_plugins = value @property def noplugins(self): if self._options is not None: return self._options.noplugins return self._noplugins @noplugins.setter def noplugins(self, value): self._check_options_initialized() self._noplugins = value @property def experimental(self): if self._options is not None: return self._options.experimental @experimental.setter def experimental(self, value): self._check_options_initialized() self._experimental = value @property def enableplugins(self): if self._options is not None: return self._options.enableplugins return self._enableplugins @enableplugins.setter def enableplugins(self, value): self._check_options_initialized() self._enableplugins = value @property def onlyplugins(self): if self._options is not None: return self._options.onlyplugins return self._onlyplugins @onlyplugins.setter def onlyplugins(self, value): self._check_options_initialized() self._onlyplugins = value @property def plugopts(self): if self._options is not None: return self._options.plugopts return self._plugopts @plugopts.setter def plugopts(self, value): # If we check for anything it should be itterability. # if not isinstance(value, list): # raise TypeError("SoSOptions.plugopts expects a list") self._plugopts = value @property def usealloptions(self): if self._options is not None: return self._options.usealloptions return self._usealloptions @usealloptions.setter def usealloptions(self, value): self._check_options_initialized() if not isinstance(value, bool): raise TypeError("SoSOptions.usealloptions expects a boolean") self._usealloptions = value @property def all_logs(self): if self._options is not None: return self._options.all_logs return self._all_logs @all_logs.setter def all_logs(self, value): self._check_options_initialized() if not isinstance(value, bool): raise TypeError("SoSOptions.all_logs expects a boolean") self._all_logs = value @property def log_size(self): if self._options is not None: return self._options.log_size return self._log_size @log_size.setter def log_size(self, value): self._check_options_initialized() if value < 0: raise ValueError("SoSOptions.log_size expects a value greater " "than zero") self._log_size = value @property def batch(self): if self._options is not None: return self._options.batch return self._batch @batch.setter def batch(self, value): self._check_options_initialized() if not isinstance(value, bool): raise TypeError("SoSOptions.batch expects a boolean") self._batch = value @property def build(self): if self._options is not None: return self._options.build return self._build @build.setter def build(self, value): self._check_options_initialized() if not isinstance(value, bool): raise TypeError("SoSOptions.build expects a boolean") self._build = value @property def verbosity(self): if self._options is not None: return self._options.verbosity return self._verbosity @verbosity.setter def verbosity(self, value): self._check_options_initialized() if value < 0 or value > 3: raise ValueError("SoSOptions.verbosity expects a value [0..3]") self._verbosity = value @property def verify(self): if self._options is not None: return self._options.verify return self._verify @verify.setter def verify(self, value): self._check_options_initialized() if value < 0 or value > 3: raise ValueError("SoSOptions.verify expects a value [0..3]") self._verify = value @property def quiet(self): if self._options is not None: return self._options.quiet return self._quiet @quiet.setter def quiet(self, value): self._check_options_initialized() if not isinstance(value, bool): raise TypeError("SoSOptions.quiet expects a boolean") self._quiet = value @property def debug(self): if self._options is not None: return self._options.debug return self._debug @debug.setter def debug(self, value): self._check_options_initialized() if not isinstance(value, bool): raise TypeError("SoSOptions.debug expects a boolean") self._debug = value @property def case_id(self): if self._options is not None: return self._options.case_id return self._case_id @case_id.setter def case_id(self, value): self._check_options_initialized() self._case_id = value @property def customer_name(self): if self._options is not None: return self._options.customer_name return self._customer_name @customer_name.setter def customer_name(self, value): self._check_options_initialized() self._customer_name = value @property def profiles(self): if self._options is not None: return self._options.profiles return self._profiles @profiles.setter def profiles(self, value): self._check_options_initialized() self._profiles = value @property def list_profiles(self): if self._options is not None: return self._options.list_profiles return self._list_profiles @list_profiles.setter def list_profiles(self, value): self._check_options_initialized() self._list_profiles = value @property def config_file(self): if self._options is not None: return self._options.config_file return self._config_file @config_file.setter def config_file(self, value): self._check_options_initialized() self._config_file = value @property def tmp_dir(self): if self._options is not None: return self._options.tmp_dir return self._tmp_dir @tmp_dir.setter def tmp_dir(self, value): self._check_options_initialized() self._tmp_dir = value @property def noreport(self): if self._options is not None: return self._options.noreport return self._noreport @noreport.setter def noreport(self, value): self._check_options_initialized() if not isinstance(value, bool): raise TypeError("SoSOptions.noreport expects a boolean") self._noreport = value @property def sysroot(self): if self._options is not None: return self._options.sysroot return self._sysroot @sysroot.setter def sysroot(self, value): self._check_options_initialized() self._sysroot = value @property def chroot(self): if self._options is not None: return self._options.chroot return self._chroot @chroot.setter def chroot(self, value): self._check_options_initialized() if value not in chroot_modes: msg = "SoSOptions.chroot '%s' is not a valid chroot mode: " msg += "('auto', 'always', 'never')" raise ValueError(msg % value) self._chroot = value @property def compression_type(self): if self._options is not None: return self._options.compression_type return self._compression_type @compression_type.setter def compression_type(self, value): self._check_options_initialized() self._compression_type = value def _parse_args(self, args): """ Parse command line options and arguments""" self.parser = parser = OptionParserExtended(option_class=SosOption) parser.add_option("-l", "--list-plugins", action="store_true", dest="list_plugins", default=False, help="list plugins and available plugin options") parser.add_option("-n", "--skip-plugins", action="extend", dest="noplugins", type="string", help="disable these plugins", default=deque()) parser.add_option("--experimental", action="store_true", dest="experimental", default=False, help="enable experimental plugins") parser.add_option("-e", "--enable-plugins", action="extend", dest="enableplugins", type="string", help="enable these plugins", default=deque()) parser.add_option("-o", "--only-plugins", action="extend", dest="onlyplugins", type="string", help="enable these plugins only", default=deque()) parser.add_option("-k", "--plugin-option", action="extend", dest="plugopts", type="string", help="plugin options in plugname.option=value " "format (see -l)", default=deque()) parser.add_option("--log-size", action="store", dest="log_size", default=10, type="int", help="set a limit on the size of collected logs " "(in MiB)") parser.add_option("-a", "--alloptions", action="store_true", dest="usealloptions", default=False, help="enable all options for loaded plugins") parser.add_option("--all-logs", action="store_true", dest="all_logs", default=False, help="collect all available logs regardless of size") parser.add_option("--batch", action="store_true", dest="batch", default=False, help="batch mode - do not prompt interactively") parser.add_option("--build", action="store_true", dest="build", default=False, help="preserve the temporary directory and do not " "package results") parser.add_option("-v", "--verbose", action="count", dest="verbosity", help="increase verbosity") parser.add_option("", "--verify", action="store_true", dest="verify", default=False, help="perform data verification during collection") parser.add_option("", "--quiet", action="store_true", dest="quiet", default=False, help="only print fatal errors") parser.add_option("--debug", action="count", dest="debug", help="enable interactive debugging using the python " "debugger") parser.add_option("--ticket-number", action="store", dest="case_id", help="specify ticket number") parser.add_option("--case-id", action="store", dest="case_id", help="specify case identifier") parser.add_option("-p", "--profile", action="extend", dest="profiles", type="string", default=deque(), help="enable plugins selected by the given profiles") parser.add_option("--list-profiles", action="store_true", dest="list_profiles", default=False, help="display a list of available profiles and " "plugins that they include") parser.add_option("--name", action="store", dest="customer_name", help="specify report name") parser.add_option("--config-file", action="store", dest="config_file", help="specify alternate configuration file") parser.add_option("--tmp-dir", action="store", dest="tmp_dir", help="specify alternate temporary directory", default=None) parser.add_option("--no-report", action="store_true", dest="noreport", help="disable HTML/XML reporting", default=False) parser.add_option("-s", "--sysroot", action="store", dest="sysroot", help="system root directory path (default='/')", default=None) parser.add_option("-c", "--chroot", action="store", dest="chroot", help="chroot executed commands to SYSROOT " "[auto, always, never] (default=auto)", default="auto") parser.add_option("-z", "--compression-type", dest="compression_type", help="compression technology to use [auto, " "gzip, bzip2, xz] (default=auto)", default="auto") return parser.parse_args(args)[0] class SoSReport(object): """The main sosreport class""" def __init__(self, args): self.loaded_plugins = deque() self.skipped_plugins = deque() self.all_options = deque() self.xml_report = XmlReport() self.global_plugin_options = {} self.archive = None self.tempfile_util = None self._args = args self.sysroot = "/" self.sys_tmp = None self.exit_process = False try: import signal signal.signal(signal.SIGTERM, self.get_exit_handler()) except Exception: pass # not available in java, but we don't care self.opts = SoSOptions(args) self._set_debug() self._read_config() try: self.policy = sos.policies.load(sysroot=self.opts.sysroot) except KeyboardInterrupt: self._exit(0) self._is_root = self.policy.is_root() # system temporary directory to use tmp = os.path.abspath(self.policy.get_tmp_dir(self.opts.tmp_dir)) if not os.path.isdir(tmp) \ or not os.access(tmp, os.W_OK): msg = "temporary directory %s " % tmp msg += "does not exist or is not writable\n" # write directly to stderr as logging is not initialised yet sys.stderr.write(msg) self._exit(1) self.sys_tmp = tmp # our (private) temporary directory self.tmpdir = tempfile.mkdtemp(prefix="sos.", dir=self.sys_tmp) self.tempfile_util = TempFileUtil(self.tmpdir) self._set_directories() self._setup_logging() msg = "default" host_sysroot = self.policy.host_sysroot() # set alternate system root directory if self.opts.sysroot: msg = "cmdline" self.sysroot = self.opts.sysroot elif self.policy.in_container() and host_sysroot != os.sep: msg = "policy" self.sysroot = host_sysroot self.soslog.debug("set sysroot to '%s' (%s)" % (self.sysroot, msg)) if self.opts.chroot not in chroot_modes: self.soslog.error("invalid chroot mode: %s" % self.opts.chroot) logging.shutdown() self.tempfile_util.clean() self._exit(1) def print_header(self): self.ui_log.info("\n%s\n" % _("sosreport (version %s)" % (__version__,))) def get_commons(self): return { 'cmddir': self.cmddir, 'logdir': self.logdir, 'rptdir': self.rptdir, 'tmpdir': self.tmpdir, 'soslog': self.soslog, 'policy': self.policy, 'sysroot': self.sysroot, 'verbosity': self.opts.verbosity, 'xmlreport': self.xml_report, 'cmdlineopts': self.opts, 'config': self.config, 'global_plugin_options': self.global_plugin_options, } def get_temp_file(self): return self.tempfile_util.new() def _set_archive(self): archive_name = os.path.join(self.tmpdir, self.policy.get_archive_name()) if self.opts.compression_type == 'auto': auto_archive = self.policy.get_preferred_archive() self.archive = auto_archive(archive_name, self.tmpdir) else: self.archive = TarFileArchive(archive_name, self.tmpdir) self.archive.set_debug(True if self.opts.debug else False) def _make_archive_paths(self): self.archive.makedirs(self.cmddir, 0o755) self.archive.makedirs(self.logdir, 0o755) self.archive.makedirs(self.rptdir, 0o755) def _set_directories(self): self.cmddir = 'sos_commands' self.logdir = 'sos_logs' self.rptdir = 'sos_reports' def _set_debug(self): if self.opts.debug: sys.excepthook = self._exception self.raise_plugins = True else: self.raise_plugins = False @staticmethod def _exception(etype, eval_, etrace): """ Wrap exception in debugger if not in tty """ if hasattr(sys, 'ps1') or not sys.stderr.isatty(): # we are in interactive mode or we don't have a tty-like # device, so we call the default hook sys.__excepthook__(etype, eval_, etrace) else: import pdb # we are NOT in interactive mode, print the exception... traceback.print_exception(etype, eval_, etrace, limit=2, file=sys.stdout) print_() # ...then start the debugger in post-mortem mode. pdb.pm() def _exit(self, error=0): raise SystemExit() # sys.exit(error) def get_exit_handler(self): def exit_handler(signum, frame): self.exit_process = True self._exit() return exit_handler def handle_exception(self, plugname=None, func=None): if self.raise_plugins or self.exit_process: raise if plugname and func: self._log_plugin_exception(plugname, func) def _read_config(self): self.config = ConfigParser() if self.opts.config_file: config_file = self.opts.config_file else: config_file = '/etc/sos.conf' try: try: with open(config_file) as f: self.config.readfp(f) except (ParsingError, Error) as e: raise exit('Failed to parse configuration ' 'file %s' % config_file) except (OSError, IOError) as e: raise exit('Unable to read configuration file %s ' ': %s' % (config_file, e.args[1])) def _setup_logging(self): # main soslog self.soslog = logging.getLogger('sos') self.soslog.setLevel(logging.DEBUG) self.sos_log_file = self.get_temp_file() flog = logging.StreamHandler(self.sos_log_file) flog.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s')) flog.setLevel(logging.INFO) self.soslog.addHandler(flog) if not self.opts.quiet: console = logging.StreamHandler(sys.stderr) console.setFormatter(logging.Formatter('%(message)s')) if self.opts.verbosity and self.opts.verbosity > 1: console.setLevel(logging.DEBUG) flog.setLevel(logging.DEBUG) elif self.opts.verbosity and self.opts.verbosity > 0: console.setLevel(logging.INFO) flog.setLevel(logging.DEBUG) else: console.setLevel(logging.WARNING) self.soslog.addHandler(console) # ui log self.ui_log = logging.getLogger('sos_ui') self.ui_log.setLevel(logging.INFO) self.sos_ui_log_file = self.get_temp_file() ui_fhandler = logging.StreamHandler(self.sos_ui_log_file) ui_fhandler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s')) self.ui_log.addHandler(ui_fhandler) if not self.opts.quiet: ui_console = logging.StreamHandler(sys.stdout) ui_console.setFormatter(logging.Formatter('%(message)s')) ui_console.setLevel(logging.INFO) self.ui_log.addHandler(ui_console) def _add_sos_logs(self): # Make sure the log files are added before we remove the log # handlers. This prevents "No handlers could be found.." messages # from leaking to the console when running in --quiet mode when # Archive classes attempt to acess the log API. if getattr(self, "sos_log_file", None): self.archive.add_file(self.sos_log_file, dest=os.path.join('sos_logs', 'sos.log')) if getattr(self, "sos_ui_log_file", None): self.archive.add_file(self.sos_ui_log_file, dest=os.path.join('sos_logs', 'ui.log')) def _get_disabled_plugins(self): disabled = [] if self.config.has_option("plugins", "disable"): disabled = [plugin.strip() for plugin in self.config.get("plugins", "disable").split(',')] return disabled def _is_in_profile(self, plugin_class): onlyplugins = self.opts.onlyplugins if not len(self.opts.profiles): return True if not hasattr(plugin_class, "profiles"): return False if onlyplugins and not self._is_not_specified(plugin_class.name()): return True return any([p in self.opts.profiles for p in plugin_class.profiles]) def _is_skipped(self, plugin_name): return (plugin_name in self.opts.noplugins or plugin_name in self._get_disabled_plugins()) def _is_inactive(self, plugin_name, pluginClass): return (not pluginClass(self.get_commons()).check_enabled() and plugin_name not in self.opts.enableplugins and plugin_name not in self.opts.onlyplugins) def _is_not_default(self, plugin_name, pluginClass): return (not pluginClass(self.get_commons()).default_enabled() and plugin_name not in self.opts.enableplugins and plugin_name not in self.opts.onlyplugins) def _is_not_specified(self, plugin_name): return (self.opts.onlyplugins and plugin_name not in self.opts.onlyplugins) def _skip(self, plugin_class, reason="unknown"): self.skipped_plugins.append(( plugin_class.name(), plugin_class(self.get_commons()), reason )) def _load(self, plugin_class): self.loaded_plugins.append(( plugin_class.name(), plugin_class(self.get_commons()) )) def load_plugins(self): import sos.plugins helper = ImporterHelper(sos.plugins) plugins = helper.get_modules() self.plugin_names = deque() self.profiles = set() using_profiles = len(self.opts.profiles) policy_classes = self.policy.valid_subclasses extra_classes = [] if self.opts.experimental: extra_classes.append(sos.plugins.ExperimentalPlugin) valid_plugin_classes = tuple(policy_classes + extra_classes) validate_plugin = self.policy.validate_plugin remaining_profiles = list(self.opts.profiles) # validate and load plugins for plug in plugins: plugbase, ext = os.path.splitext(plug) try: plugin_classes = import_plugin(plugbase, valid_plugin_classes) if not len(plugin_classes): # no valid plugin classes for this policy continue plugin_class = self.policy.match_plugin(plugin_classes) if not validate_plugin(plugin_class, experimental=self.opts.experimental): self.soslog.warning( _("plugin %s does not validate, skipping") % plug) if self.opts.verbosity > 0: self._skip(plugin_class, _("does not validate")) continue if plugin_class.requires_root and not self._is_root: self.soslog.info(_("plugin %s requires root permissions" "to execute, skipping") % plug) self._skip(plugin_class, _("requires root")) continue # plug-in is valid, let's decide whether run it or not self.plugin_names.append(plugbase) in_profile = self._is_in_profile(plugin_class) if not in_profile: self._skip(plugin_class, _("excluded")) continue if self._is_skipped(plugbase): self._skip(plugin_class, _("skipped")) continue if self._is_inactive(plugbase, plugin_class): self._skip(plugin_class, _("inactive")) continue if self._is_not_default(plugbase, plugin_class): self._skip(plugin_class, _("optional")) continue # only add the plugin's profiles once we know it is usable if hasattr(plugin_class, "profiles"): self.profiles.update(plugin_class.profiles) # true when the null (empty) profile is active default_profile = not using_profiles and in_profile if self._is_not_specified(plugbase) and default_profile: self._skip(plugin_class, _("not specified")) continue for i in plugin_class.profiles: if i in remaining_profiles: remaining_profiles.remove(i) self._load(plugin_class) except Exception as e: self.soslog.warning(_("plugin %s does not install, " "skipping: %s") % (plug, e)) self.handle_exception() if len(remaining_profiles) > 0: self.soslog.error(_("Unknown or inactive profile(s) provided:" " %s") % ", ".join(remaining_profiles)) self.list_profiles() self._exit(1) def _set_all_options(self): if self.opts.usealloptions: for plugname, plug in self.loaded_plugins: for name, parms in zip(plug.opt_names, plug.opt_parms): if type(parms["enabled"]) == bool: parms["enabled"] = True def _set_tunables(self): if self.config.has_section("tunables"): if not self.opts.plugopts: self.opts.plugopts = deque() for opt, val in self.config.items("tunables"): if not opt.split('.')[0] in self._get_disabled_plugins(): self.opts.plugopts.append(opt + "=" + val) if self.opts.plugopts: opts = {} for opt in self.opts.plugopts: # split up "general.syslogsize=5" try: opt, val = opt.split("=") except: val = True else: if val.lower() in ["off", "disable", "disabled", "false"]: val = False else: # try to convert string "val" to int() try: val = int(val) except: pass # split up "general.syslogsize" try: plug, opt = opt.split(".") except: plug = opt opt = True try: opts[plug] except KeyError: opts[plug] = deque() opts[plug].append((opt, val)) for plugname, plug in self.loaded_plugins: if plugname in opts: for opt, val in opts[plugname]: if not plug.set_option(opt, val): self.soslog.error('no such option "%s" for plugin ' '(%s)' % (opt, plugname)) self._exit(1) del opts[plugname] for plugname in opts.keys(): self.soslog.error('unable to set option for disabled or ' 'non-existing plugin (%s)' % (plugname)) def _check_for_unknown_plugins(self): import itertools for plugin in itertools.chain(self.opts.onlyplugins, self.opts.noplugins, self.opts.enableplugins): plugin_name = plugin.split(".")[0] if plugin_name not in self.plugin_names: self.soslog.fatal('a non-existing plugin (%s) was specified ' 'in the command line' % (plugin_name)) self._exit(1) def _set_plugin_options(self): for plugin_name, plugin in self.loaded_plugins: names, parms = plugin.get_all_options() for optname, optparm in zip(names, parms): self.all_options.append((plugin, plugin_name, optname, optparm)) def _report_profiles_and_plugins(self): self.ui_log.info("") if len(self.loaded_plugins): self.ui_log.info(" %d profiles, %d plugins" % (len(self.profiles), len(self.loaded_plugins))) else: # no valid plugins for this profile self.ui_log.info(" %d profiles" % len(self.profiles)) self.ui_log.info("") def list_plugins(self): if not self.loaded_plugins and not self.skipped_plugins: self.soslog.fatal(_("no valid plugins found")) return if self.loaded_plugins: self.ui_log.info(_("The following plugins are currently enabled:")) self.ui_log.info("") for (plugname, plug) in self.loaded_plugins: self.ui_log.info(" %-20s %s" % (plugname, plug.get_description())) else: self.ui_log.info(_("No plugin enabled.")) self.ui_log.info("") if self.skipped_plugins: self.ui_log.info(_("The following plugins are currently " "disabled:")) self.ui_log.info("") for (plugname, plugclass, reason) in self.skipped_plugins: self.ui_log.info(" %-20s %-14s %s" % ( plugname, reason, plugclass.get_description())) self.ui_log.info("") if self.all_options: self.ui_log.info(_("The following plugin options are available:")) self.ui_log.info("") for (plug, plugname, optname, optparm) in self.all_options: # format option value based on its type (int or bool) if type(optparm["enabled"]) == bool: if optparm["enabled"] is True: tmpopt = "on" else: tmpopt = "off" else: tmpopt = optparm["enabled"] self.ui_log.info(" %-25s %-15s %s" % ( plugname + "." + optname, tmpopt, optparm["desc"])) else: self.ui_log.info(_("No plugin options available.")) self.ui_log.info("") profiles = list(self.profiles) profiles.sort() lines = _format_list("Profiles: ", profiles, indent=True) for line in lines: self.ui_log.info(" %s" % line) self._report_profiles_and_plugins() def list_profiles(self): if not self.profiles: self.soslog.fatal(_("no valid profiles found")) return self.ui_log.info(_("The following profiles are available:")) self.ui_log.info("") def _has_prof(c): return hasattr(c, "profiles") profiles = list(self.profiles) profiles.sort() for profile in profiles: plugins = [] for name, plugin in self.loaded_plugins: if _has_prof(plugin) and profile in plugin.profiles: plugins.append(name) lines = _format_list("%-15s " % profile, plugins, indent=True) for line in lines: self.ui_log.info(" %s" % line) self._report_profiles_and_plugins() def batch(self): if self.opts.batch: self.ui_log.info(self.policy.get_msg()) else: msg = self.policy.get_msg() msg += _("Press ENTER to continue, or CTRL-C to quit.\n") try: input(msg) except: self.ui_log.info("") self._exit() def _log_plugin_exception(self, plugin, method): trace = traceback.format_exc() msg = "caught exception in plugin method" plugin_err_log = "%s-plugin-errors.txt" % plugin logpath = os.path.join(self.logdir, plugin_err_log) self.soslog.error('%s "%s.%s()"' % (msg, plugin, method)) self.soslog.error('writing traceback to %s' % logpath) self.archive.add_string("%s\n" % trace, logpath) def prework(self): self.policy.pre_work() try: self.ui_log.info(_(" Setting up archive ...")) compression_methods = ('auto', 'bzip2', 'gzip', 'xz') method = self.opts.compression_type if method not in compression_methods: compression_list = ', '.join(compression_methods) self.ui_log.error("") self.ui_log.error("Invalid compression specified: " + method) self.ui_log.error("Valid types are: " + compression_list) self.ui_log.error("") self._exit(1) self._set_archive() self._make_archive_paths() return except (OSError, IOError) as e: # we must not use the logging subsystem here as it is potentially # in an inconsistent or unreliable state (e.g. an EROFS for the # file system containing our temporary log files). if e.errno in fatal_fs_errors: print("") print(" %s while setting up archive" % e.strerror) print("") else: raise e except Exception as e: import traceback self.ui_log.error("") self.ui_log.error(" Unexpected exception setting up archive:") traceback.print_exc(e) self.ui_log.error(e) self._exit(1) def setup(self): msg = "[%s:%s] executing 'sosreport %s'" self.soslog.info(msg % (__name__, "setup", " ".join(self._args))) self.ui_log.info(_(" Setting up plugins ...")) for plugname, plug in self.loaded_plugins: try: plug.archive = self.archive plug.setup() if self.opts.verify: plug.setup_verify() except KeyboardInterrupt: raise except (OSError, IOError) as e: if e.errno in fatal_fs_errors: self.ui_log.error("") self.ui_log.error(" %s while setting up plugins" % e.strerror) self.ui_log.error("") self._exit(1) self.handle_exception(plugname, "setup") except: self.handle_exception(plugname, "setup") def version(self): """Fetch version information from all plugins and store in the report version file""" versions = [] versions.append("sosreport: %s" % __version__) for plugname, plug in self.loaded_plugins: versions.append("%s: %s" % (plugname, plug.version)) self.archive.add_string(content="\n".join(versions), dest='version.txt') def collect(self): self.ui_log.info(_(" Running plugins. Please wait ...")) self.ui_log.info("") plugruncount = 0 for i in zip(self.loaded_plugins): plugruncount += 1 plugname, plug = i[0] status_line = (" Running %d/%d: %s... " % (plugruncount, len(self.loaded_plugins), plugname)) if self.opts.verbosity == 0: status_line = "\r%s" % status_line else: status_line = "%s\n" % status_line if not self.opts.quiet: sys.stdout.write(status_line) sys.stdout.flush() try: plug.collect() except KeyboardInterrupt: raise except (OSError, IOError) as e: if e.errno in fatal_fs_errors: self.ui_log.error("") self.ui_log.error(" %s while collecting plugin data" % e.strerror) self.ui_log.error("") self._exit(1) self.handle_exception(plugname, "collect") except: self.handle_exception(plugname, "collect") self.ui_log.info("") def report(self): for plugname, plug in self.loaded_plugins: for oneFile in plug.copied_files: try: self.xml_report.add_file(oneFile["srcpath"], os.stat(oneFile["srcpath"])) except: pass try: self.xml_report.serialize_to_file(os.path.join(self.rptdir, "sosreport.xml")) except (OSError, IOError) as e: if e.errno in fatal_fs_errors: self.ui_log.error("") self.ui_log.error(" %s while writing report data" % e.strerror) self.ui_log.error("") self._exit(1) def plain_report(self): report = Report() for plugname, plug in self.loaded_plugins: section = Section(name=plugname) for alert in plug.alerts: section.add(Alert(alert)) if plug.custom_text: section.add(Note(plug.custom_text)) for f in plug.copied_files: section.add(CopiedFile(name=f['srcpath'], href=".." + f['dstpath'])) for cmd in plug.executed_commands: section.add(Command(name=cmd['exe'], return_code=0, href="../" + cmd['file'])) for content, f in plug.copy_strings: section.add(CreatedFile(name=f)) report.add(section) try: fd = self.get_temp_file() output = PlainTextReport(report).unicode() fd.write(output) fd.flush() self.archive.add_file(fd, dest=os.path.join('sos_reports', 'sos.txt')) except (OSError, IOError) as e: if e.errno in fatal_fs_errors: self.ui_log.error("") self.ui_log.error(" %s while writing text report" % e.strerror) self.ui_log.error("") self._exit(1) def html_report(self): try: self._html_report() except (OSError, IOError) as e: if e.errno in fatal_fs_errors: self.ui_log.error("") self.ui_log.error(" %s while writing HTML report" % e.strerror) self.ui_log.error("") self._exit(1) def _html_report(self): # Generate the header for the html output file rfd = self.get_temp_file() rfd.write(""" Sos System Report """) # Make a pass to gather Alerts and a list of module names allAlerts = deque() plugNames = deque() for plugname, plug in self.loaded_plugins: for alert in plug.alerts: allAlerts.append('%s: %s' % (plugname, plugname, alert)) plugNames.append(plugname) # Create a table of links to the module info rfd.write("

Loaded Plugins:

") rfd.write("\n") rr = 0 for i in range(len(plugNames)): rfd.write('\n' % (plugNames[i], plugNames[i])) rr = divmod(i, 4)[1] if (rr == 3): rfd.write('') if not (rr == 3): rfd.write('') rfd.write('
%s
\n') rfd.write('

Alerts:

') rfd.write('
    ') for alert in allAlerts: rfd.write('
  • %s
  • ' % alert) rfd.write('
') # Call the report method for each plugin for plugname, plug in self.loaded_plugins: try: html = plug.report() except: self.handle_exception() else: rfd.write(html) rfd.write("") rfd.flush() self.archive.add_file(rfd, dest=os.path.join('sos_reports', 'sos.html')) def postproc(self): for plugname, plug in self.loaded_plugins: try: plug.postproc() except (OSError, IOError) as e: if e.errno in fatal_fs_errors: self.ui_log.error("") self.ui_log.error(" %s while post-processing plugin data" % e.strerror) self.ui_log.error("") self._exit(1) self.handle_exception(plugname, "postproc") except: self.handle_exception(plugname, "postproc") def _create_checksum(self, archive, hash_name): if not archive: return False archive_fp = open(archive, 'rb') digest = hashlib.new(hash_name) digest.update(archive_fp.read()) archive_fp.close() return digest.hexdigest() def _write_checksum(self, archive, hash_name, checksum): # store checksum into file fp = open(archive + "." + hash_name, "w") if checksum: fp.write(checksum + "\n") fp.close() def final_work(self): # This must come before archive creation to ensure that log # files are closed and cleaned up at exit. # # All subsequent terminal output must use print(). self._add_sos_logs() archive = None # archive path directory = None # report directory path (--build) # package up and compress the results if not self.opts.build: old_umask = os.umask(0o077) if not self.opts.quiet: print(_("Creating compressed archive...")) # compression could fail for a number of reasons try: archive = self.archive.finalize( self.opts.compression_type) except (OSError, IOError) as e: if e.errno in fatal_fs_errors: print("") print(_(" %s while finalizing archive" % e.strerror)) print("") self._exit(1) except: if self.opts.debug: raise else: return False finally: os.umask(old_umask) else: # move the archive root out of the private tmp directory. directory = self.archive.get_archive_path() dir_name = os.path.basename(directory) try: final_dir = os.path.join(self.sys_tmp, dir_name) os.rename(directory, final_dir) directory = final_dir except (OSError, IOError): print(_("Error moving directory: %s" % directory)) return False checksum = None if not self.opts.build: # compute and store the archive checksum hash_name = self.policy.get_preferred_hash_name() checksum = self._create_checksum(archive, hash_name) self._write_checksum(archive, hash_name, checksum) # output filename is in the private tmpdir - move it to the # containing directory. final_name = os.path.join(self.sys_tmp, os.path.basename(archive)) archive_hash = archive + "." + hash_name final_hash = final_name + "." + hash_name # move the archive and checksum file try: os.rename(archive, final_name) archive = final_name except (OSError, IOError): print(_("Error moving archive file: %s" % archive)) return False # There is a race in the creation of the final checksum file: # since the archive has already been published and the checksum # file name is predictable once the archive name is known a # malicious user could attempt to create a symbolic link in order # to misdirect writes to a file of the attacker's choosing. # # To mitigate this we write the checksum inside the private tmp # directory and use an atomic rename that is guaranteed to either # succeed or fail: at worst the move will fail and be reported to # the user. The correct checksum value is still written to the # terminal and nothing is written to a location under the control # of the user creating the link. try: os.rename(archive_hash, final_hash) except (OSError, IOError): print(_("Error moving checksum file: %s" % archive_hash)) return False self.policy.display_results(archive, directory, checksum) # clean up logging.shutdown() if self.tempfile_util: self.tempfile_util.clean() if self.tmpdir: rmtree(self.tmpdir) return True def verify_plugins(self): if not self.loaded_plugins: self.soslog.error(_("no valid plugins were enabled")) return False return True def set_global_plugin_option(self, key, value): self.global_plugin_options[key] = value def execute(self): try: self.policy.set_commons(self.get_commons()) self.print_header() self.load_plugins() self._set_all_options() self._set_tunables() self._check_for_unknown_plugins() self._set_plugin_options() if self.opts.list_plugins: self.list_plugins() return True if self.opts.list_profiles: self.list_profiles() return True # verify that at least one plug-in is enabled if not self.verify_plugins(): return False self.batch() self.prework() self.setup() self.collect() if not self.opts.noreport: self.report() self.html_report() self.plain_report() self.postproc() self.version() return self.final_work() except (OSError, SystemExit, KeyboardInterrupt): try: # archive and tempfile cleanup may fail due to a fatal # OSError exception (ENOSPC, EROFS etc.). if self.archive: self.archive.cleanup() if self.tempfile_util: self.tempfile_util.clean() if self.tmpdir: rmtree(self.tmpdir) except: raise return False def main(args): """The main entry point""" sos = SoSReport(args) sos.execute() # vim: set et ts=4 sw=4 : sosreport-3.5/sos/archive.py0000644000175000017500000003640513203300002016041 0ustar cariboucaribou# Copyright (C) 2012 Red Hat, Inc., # Jesse Jaggars # Bryn M. Reeves # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import time import tarfile import shutil import logging import shlex import re import codecs import sys import errno # required for compression callout (FIXME: move to policy?) from subprocess import Popen, PIPE from sos.utilities import sos_get_command_output, is_executable try: import selinux except ImportError: pass # PYCOMPAT import six if six.PY3: long = int class Archive(object): """Abstract base class for archives.""" @classmethod def archive_type(cls): """Returns the archive class's name as a string. """ return cls.__name__ log = logging.getLogger("sos") _name = "unset" _debug = False def _format_msg(self, msg): return "[archive:%s] %s" % (self.archive_type(), msg) def set_debug(self, debug): self._debug = debug def log_error(self, msg): self.log.error(self._format_msg(msg)) def log_warn(self, msg): self.log.warning(self._format_msg(msg)) def log_info(self, msg): self.log.info(self._format_msg(msg)) def log_debug(self, msg): if not self._debug: return self.log.debug(self._format_msg(msg)) # this is our contract to clients of the Archive class hierarchy. # All sub-classes need to implement these methods (or inherit concrete # implementations from a parent class. def add_file(self, src, dest=None): raise NotImplementedError def add_string(self, content, dest): raise NotImplementedError def add_link(self, source, link_name): raise NotImplementedError def add_dir(self, path): raise NotImplementedError def add_node(self, path, mode, device): raise NotImplementedError def get_tmp_dir(self): """Return a temporary directory that clients of the archive may use to write content to. The content of the path is guaranteed to be included in the generated archive.""" raise NotImplementedError def name_max(self): """Return the maximum file name length this archive can support. This is the lesser of the name length limit of the archive format and any temporary file system based cache.""" raise NotImplementedError def get_archive_path(self): """Return a string representing the path to the temporary archive. For archive classes that implement in-line handling this will be the archive file itself. Archives that use a directory based cache prior to packaging should return the path to the temporary directory where the report content is located""" pass def cleanup(self): """Clean up any temporary resources used by an Archive class.""" pass def finalize(self, method): """Finalize an archive object via method. This may involve creating An archive that is subsequently compressed or simply closing an archive that supports in-line handling. If method is automatic then the following methods are tried in order: xz, bz2 and gzip""" self.close() class FileCacheArchive(Archive): """ Abstract superclass for archive types that use a temporary cache directory in the file system. """ _tmp_dir = "" _archive_root = "" _archive_name = "" def __init__(self, name, tmpdir): self._name = name self._tmp_dir = tmpdir self._archive_root = os.path.join(tmpdir, name) os.makedirs(self._archive_root, 0o700) self.log_info("initialised empty FileCacheArchive at '%s'" % (self._archive_root,)) def dest_path(self, name): if os.path.isabs(name): name = name.lstrip(os.sep) return (os.path.join(self._archive_root, name)) def _check_path(self, dest): dest_dir = os.path.split(dest)[0] if not dest_dir: return if not os.path.isdir(dest_dir): self._makedirs(dest_dir) def add_file(self, src, dest=None): if not dest: dest = src dest = self.dest_path(dest) self._check_path(dest) # Handle adding a file from either a string respresenting # a path, or a File object open for reading. if not getattr(src, "read", None): # path case try: shutil.copy(src, dest) except IOError as e: # Filter out IO errors on virtual file systems. if src.startswith("/sys/") or src.startswith("/proc/"): pass else: self.log_info("caught '%s' copying '%s'" % (e, src)) try: shutil.copystat(src, dest) except OSError: # SELinux xattrs in /proc and /sys throw this pass try: stat = os.stat(src) os.chown(dest, stat.st_uid, stat.st_gid) except Exception as e: self.log_debug("caught '%s' setting ownership of '%s'" % (e, dest)) file_name = "'%s'" % src else: # Open file case: first rewind the file to obtain # everything written to it. src.seek(0) with open(dest, "w") as f: for line in src: f.write(line) file_name = "open file" self.log_debug("added %s to FileCacheArchive '%s'" % (file_name, self._archive_root)) def add_string(self, content, dest): src = dest dest = self.dest_path(dest) self._check_path(dest) f = codecs.open(dest, 'w', encoding='utf-8') if isinstance(content, bytes): content = content.decode('utf8', 'ignore') f.write(content) if os.path.exists(src): try: shutil.copystat(src, dest) except OSError as e: self.log_error( "Unable to add '%s' to FileCacheArchive: %s" % (dest, e)) self.log_debug("added string at '%s' to FileCacheArchive '%s'" % (src, self._archive_root)) def add_link(self, source, link_name): dest = self.dest_path(link_name) self._check_path(dest) if not os.path.lexists(dest): os.symlink(source, dest) self.log_debug("added symlink at '%s' to '%s' in FileCacheArchive '%s'" % (dest, source, self._archive_root)) def add_dir(self, path): self.makedirs(path) def add_node(self, path, mode, device): dest = self.dest_path(path) self._check_path(dest) if not os.path.exists(dest): try: os.mknod(dest, mode, device) except OSError as e: if e.errno == errno.EPERM: msg = "Operation not permitted" self.log_info("add_node: %s - mknod '%s'" % (msg, dest)) return raise e shutil.copystat(path, dest) def _makedirs(self, path, mode=0o700): os.makedirs(path, mode) def name_max(self): if 'PC_NAME_MAX' in os.pathconf_names: pc_name_max = os.pathconf_names['PC_NAME_MAX'] return os.pathconf(self._archive_root, pc_name_max) else: return 255 def get_tmp_dir(self): return self._archive_root def get_archive_path(self): return self._archive_root def makedirs(self, path, mode=0o700): self._makedirs(self.dest_path(path)) self.log_debug("created directory at '%s' in FileCacheArchive '%s'" % (path, self._archive_root)) def open_file(self, path): path = self.dest_path(path) return codecs.open(path, "r", encoding='utf-8') def cleanup(self): shutil.rmtree(self._archive_root) def finalize(self, method): self.log_info("finalizing archive '%s' using method '%s'" % (self._archive_root, method)) self._build_archive() self.cleanup() self.log_info("built archive at '%s' (size=%d)" % (self._archive_name, os.stat(self._archive_name).st_size)) self.method = method try: return self._compress() except Exception as e: exp_msg = "An error occurred compressing the archive: " self.log_error("%s %s" % (exp_msg, e)) return self.name() # Compatibility version of the tarfile.TarFile class. This exists to allow # compatibility with PY2 runtimes that lack the 'filter' parameter to the # TarFile.add() method. The wrapper class is used on python2.6 and earlier # only; all later versions include 'filter' and the native TarFile class is # used directly. class _TarFile(tarfile.TarFile): # Taken from the python 2.7.5 tarfile.py def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): """Add the file `name' to the archive. `name' may be any type of file (directory, fifo, symbolic link, etc.). If given, `arcname' specifies an alternative name for the file in the archive. Directories are added recursively by default. This can be avoided by setting `recursive' to False. `exclude' is a function that should return True for each filename to be excluded. `filter' is a function that expects a TarInfo object argument and returns the changed TarInfo object, if it returns None the TarInfo object will be excluded from the archive. """ self._check("aw") if arcname is None: arcname = name # Exclude pathnames. if exclude is not None: import warnings warnings.warn("use the filter argument instead", DeprecationWarning, 2) if exclude(name): self._dbg(2, "tarfile: Excluded %r" % name) return # Skip if somebody tries to archive the archive... if self.name is not None and os.path.abspath(name) == self.name: self._dbg(2, "tarfile: Skipped %r" % name) return self._dbg(1, name) # Create a TarInfo object from the file. tarinfo = self.gettarinfo(name, arcname) if tarinfo is None: self._dbg(1, "tarfile: Unsupported type %r" % name) return # Change or exclude the TarInfo object. if filter is not None: tarinfo = filter(tarinfo) if tarinfo is None: self._dbg(2, "tarfile: Excluded %r" % name) return # Append the tar header and data to the archive. if tarinfo.isreg(): with tarfile.bltn_open(name, "rb") as f: self.addfile(tarinfo, f) elif tarinfo.isdir(): self.addfile(tarinfo) if recursive: for f in os.listdir(name): self.add(os.path.join(name, f), os.path.join(arcname, f), recursive, exclude, filter) else: self.addfile(tarinfo) class TarFileArchive(FileCacheArchive): """ archive class using python TarFile to create tar archives""" method = None _with_selinux_context = False def __init__(self, name, tmpdir): super(TarFileArchive, self).__init__(name, tmpdir) self._suffix = "tar" self._archive_name = os.path.join(tmpdir, self.name()) def set_tarinfo_from_stat(self, tar_info, fstat, mode=None): tar_info.mtime = fstat.st_mtime tar_info.pax_headers['atime'] = "%.9f" % fstat.st_atime tar_info.pax_headers['ctime'] = "%.9f" % fstat.st_ctime if mode: tar_info.mode = mode else: tar_info.mode = fstat.st_mode tar_info.uid = fstat.st_uid tar_info.gid = fstat.st_gid # this can be used to set permissions if using the # tarfile.add() interface to add directory trees. def copy_permissions_filter(self, tarinfo): orig_path = tarinfo.name[len(os.path.split(self._name)[-1]):] if not orig_path: orig_path = self._archive_root try: fstat = os.stat(orig_path) except OSError: return tarinfo if self._with_selinux_context: context = self.get_selinux_context(orig_path) if(context): tarinfo.pax_headers['RHT.security.selinux'] = context self.set_tarinfo_from_stat(tarinfo, fstat) return tarinfo def get_selinux_context(self, path): try: (rc, c) = selinux.getfilecon(path) return c except: return None def name(self): return "%s.%s" % (self._name, self._suffix) def name_max(self): # GNU Tar format supports unlimited file name length. Just return # the limit of the underlying FileCacheArchive. return super(TarFileArchive, self).name_max() def _build_archive(self): # python2.6 TarFile lacks the filter parameter if not six.PY3 and sys.version_info[1] < 7: tar = _TarFile.open(self._archive_name, mode="w") else: tar = tarfile.open(self._archive_name, mode="w") # we need to pass the absolute path to the archive root but we # want the names used in the archive to be relative. tar.add(self._archive_root, arcname=os.path.split(self._name)[1], filter=self.copy_permissions_filter) tar.close() def _compress(self): methods = [] # Make sure that valid compression commands exist. for method in ['xz', 'bzip2', 'gzip']: if is_executable(method): methods.append(method) else: self.log_error("\"%s\" command not found." % method) if self.method in methods: methods = [self.method] exp_msg = "No compression utilities found." last_error = Exception(exp_msg) for cmd in methods: suffix = "." + cmd.replace('ip', '') # use fast compression if using xz or bz2 if cmd != "gzip": cmd = "%s -1" % cmd try: r = sos_get_command_output("%s %s" % (cmd, self.name()), timeout=0) if r['status']: self.log_info(r['output']) self._suffix += suffix return self.name() except Exception as e: last_error = e raise last_error # vim: set et ts=4 sw=4 : sosreport-3.5/sos/__init__.py.in0000644000175000017500000000217013203300002016554 0ustar cariboucaribou# Copyright 2010 Red Hat, Inc. # Author: Adam Stokes # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ This module houses the i18n setup and message function. The default is to use gettext to internationalize messages. """ __version__ = "@SOSVERSION@" import gettext gettext_dir = "/usr/share/locale" gettext_app = "sos" gettext.bindtextdomain(gettext_app, gettext_dir) def _default(msg): return gettext.dgettext(gettext_app, msg) _sos = _default sosreport-3.5/sos/policies/0000755000175000017500000000000013203300002015645 5ustar cariboucaribousosreport-3.5/sos/policies/redhat.py0000644000175000017500000002141213203300002017466 0ustar cariboucaribou# Copyright (C) Steve Conklin # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # This enables the use of with syntax in python 2.5 (e.g. jython) from __future__ import print_function import os import sys from sos.plugins import RedHatPlugin from sos.policies import LinuxPolicy, PackageManager from sos import _sos as _ sys.path.insert(0, "/usr/share/rhn/") try: from up2date_client import up2dateAuth from up2date_client import config from rhn import rpclib except: # might fail if non-RHEL pass class RedHatPolicy(LinuxPolicy): distro = "Red Hat" vendor = "Red Hat" vendor_url = "http://www.redhat.com/" _redhat_release = '/etc/redhat-release' _tmp_dir = "/var/tmp" _rpmq_cmd = 'rpm -qa --queryformat "%{NAME}|%{VERSION}\\n"' _rpmv_cmd = 'rpm -V' _rpmv_filter = ["debuginfo", "-devel"] _in_container = False _host_sysroot = '/' def __init__(self, sysroot=None): super(RedHatPolicy, self).__init__(sysroot=sysroot) self.report_name = "" self.ticket_number = "" # need to set _host_sysroot before PackageManager() if sysroot: self._container_init() self._host_sysroot = sysroot else: sysroot = self._container_init() self.package_manager = PackageManager(query_command=self._rpmq_cmd, verify_command=self._rpmv_cmd, verify_filter=self._rpmv_filter, chroot=sysroot) self.valid_subclasses = [RedHatPlugin] pkgs = self.package_manager.all_pkgs() # If rpm query failed, exit if not pkgs: print("Could not obtain installed package list", file=sys.stderr) sys.exit(1) # handle PATH for UsrMove if 'filesystem' not in pkgs: print("Could not find 'filesystem' package: " "assuming PATH settings") usrmove = True else: filesys_version = pkgs['filesystem']['version'] usrmove = True if filesys_version[0] == '3' else False if usrmove: self.PATH = "/usr/sbin:/usr/bin:/root/bin" else: self.PATH = "/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" self.PATH += os.pathsep + "/usr/local/bin" self.PATH += os.pathsep + "/usr/local/sbin" self.set_exec_path() @classmethod def check(cls): """This method checks to see if we are running on Red Hat. It must be overriden by concrete subclasses to return True when running on a Fedora, RHEL or other Red Hat distribution or False otherwise.""" return False def _container_init(self): """Check if sos is running in a container and perform container specific initialisation based on ENV_HOST_SYSROOT. """ if ENV_CONTAINER in os.environ: if os.environ[ENV_CONTAINER] in ['docker', 'oci']: self._in_container = True if ENV_HOST_SYSROOT in os.environ: self._host_sysroot = os.environ[ENV_HOST_SYSROOT] use_sysroot = self._in_container and self._host_sysroot != '/' if use_sysroot: host_tmp_dir = os.path.abspath(self._host_sysroot + self._tmp_dir) self._tmp_dir = host_tmp_dir return self._host_sysroot if use_sysroot else None def runlevel_by_service(self, name): from subprocess import Popen, PIPE ret = [] p = Popen("LC_ALL=C /sbin/chkconfig --list %s" % name, shell=True, stdout=PIPE, stderr=PIPE, bufsize=-1, close_fds=True) out, err = p.communicate() if err: return ret for tabs in out.split()[1:]: try: (runlevel, onoff) = tabs.split(":", 1) except: pass else: if onoff == "on": ret.append(int(runlevel)) return ret def get_tmp_dir(self, opt_tmp_dir): if not opt_tmp_dir: return self._tmp_dir return opt_tmp_dir def get_local_name(self): return self.host_name() # Container environment variables on Red Hat systems. ENV_CONTAINER = 'container' ENV_HOST_SYSROOT = 'HOST' class RHELPolicy(RedHatPolicy): distro = "Red Hat Enterprise Linux" vendor = "Red Hat" vendor_url = "https://access.redhat.com/support/" msg = _("""\ This command will collect diagnostic and configuration \ information from this %(distro)s system and installed \ applications. An archive containing the collected information will be \ generated in %(tmpdir)s and may be provided to a %(vendor)s \ support representative. Any information provided to %(vendor)s will be treated in \ accordance with the published support policies at:\n %(vendor_url)s The generated archive may contain data considered sensitive \ and its content should be reviewed by the originating \ organization before being passed to any third party. No changes will be made to system configuration. %(vendor_text)s """) def __init__(self, sysroot=None): super(RHELPolicy, self).__init__(sysroot=sysroot) @classmethod def check(cls): """This method checks to see if we are running on RHEL. It returns True or False.""" return (os.path.isfile(cls._redhat_release) and not os.path.isfile('/etc/fedora-release')) def dist_version(self): try: pkg = self.pkg_by_name("redhat-release") or \ self.all_pkgs_by_name_regex("redhat-release-.*")[-1] pkgname = pkg["version"] if pkgname[0] == "4": return 4 elif pkgname[0] in ["5Server", "5Client"]: return 5 elif pkgname[0] == "6": return 6 elif pkgname[0] == "7": return 7 except: pass return False def rhn_username(self): try: # cfg = config.initUp2dateConfig() rhn_username = rpclib.xmlrpclib.loads( up2dateAuth.getSystemId())[0][0]['username'] return rhn_username.encode('utf-8', 'ignore') except: # ignore any exception and return an empty username return "" def get_local_name(self): return self.rhn_username() or self.host_name() class RedHatAtomicPolicy(RHELPolicy): distro = "Red Hat Atomic Host" msg = _("""\ This command will collect diagnostic and configuration \ information from this %(distro)s system. An archive containing the collected information will be \ generated in %(tmpdir)s and may be provided to a %(vendor)s \ support representative. Any information provided to %(vendor)s will be treated in \ accordance with the published support policies at:\n %(vendor_url)s The generated archive may contain data considered sensitive \ and its content should be reviewed by the originating \ organization before being passed to any third party. %(vendor_text)s """) @classmethod def check(cls): atomic = False if ENV_HOST_SYSROOT not in os.environ: return atomic host_release = os.environ[ENV_HOST_SYSROOT] + cls._redhat_release if not os.path.exists(host_release): return False try: for line in open(host_release, "r").read().splitlines(): atomic |= 'Atomic' in line except: pass return atomic class FedoraPolicy(RedHatPolicy): distro = "Fedora" vendor = "the Fedora Project" vendor_url = "https://fedoraproject.org/" def __init__(self, sysroot=None): super(FedoraPolicy, self).__init__(sysroot=sysroot) @classmethod def check(cls): """This method checks to see if we are running on Fedora. It returns True or False.""" return os.path.isfile('/etc/fedora-release') def fedora_version(self): pkg = self.pkg_by_name("fedora-release") or \ self.all_pkgs_by_name_regex("fedora-release-.*")[-1] return int(pkg["version"]) # vim: set et ts=4 sw=4 : sosreport-3.5/sos/policies/__init__.py0000644000175000017500000003624713203300002017772 0ustar cariboucariboufrom __future__ import with_statement import os import re import platform import time import fnmatch import tempfile from os import environ from sos.utilities import (ImporterHelper, import_module, shell_out) from sos.plugins import IndependentPlugin, ExperimentalPlugin from sos import _sos as _ from textwrap import fill from six import print_ from six.moves import input def import_policy(name): policy_fqname = "sos.policies.%s" % name try: return import_module(policy_fqname, Policy) except ImportError: return None def load(cache={}, sysroot=None): if 'policy' in cache: return cache.get('policy') import sos.policies helper = ImporterHelper(sos.policies) for module in helper.get_modules(): for policy in import_policy(module): if policy.check(): cache['policy'] = policy(sysroot=sysroot) if 'policy' not in cache: cache['policy'] = GenericPolicy() return cache['policy'] class PackageManager(object): """Encapsulates a package manager. If you provide a query_command to the constructor it should print each package on the system in the following format:: package name|package.version You may also subclass this class and provide a get_pkg_list method to build the list of packages and versions. """ query_command = None verify_command = None verify_filter = None chroot = None def __init__(self, chroot=None, query_command=None, verify_command=None, verify_filter=None): self.packages = {} self.query_command = query_command if query_command else None self.verify_command = verify_command if verify_command else None self.verify_filter = verify_filter if verify_filter else None if chroot: self.chroot = chroot def all_pkgs_by_name(self, name): """ Return a list of packages that match name. """ return fnmatch.filter(self.all_pkgs().keys(), name) def all_pkgs_by_name_regex(self, regex_name, flags=0): """ Return a list of packages that match regex_name. """ reg = re.compile(regex_name, flags) return [pkg for pkg in self.all_pkgs().keys() if reg.match(pkg)] def pkg_by_name(self, name): """ Return a single package that matches name. """ pkgmatches = self.all_pkgs_by_name(name) if (len(pkgmatches) != 0): return self.all_pkgs_by_name(name)[-1] else: return None def get_pkg_list(self): """Returns a dictionary of packages in the following format:: {'package_name': {'name': 'package_name', 'version': 'major.minor.version'}} """ if self.query_command: cmd = self.query_command pkg_list = shell_out( cmd, timeout=0, chroot=self.chroot ).splitlines() for pkg in pkg_list: if '|' not in pkg: continue name, version = pkg.split("|") self.packages[name] = { 'name': name, 'version': version.split(".") } return self.packages def all_pkgs(self): """ Return a list of all packages. """ if not self.packages: self.packages = self.get_pkg_list() return self.packages def pkg_nvra(self, pkg): fields = pkg.split("-") version, release, arch = fields[-3:] name = "-".join(fields[:-3]) return (name, version, release, arch) def build_verify_command(self, packages): """build_verify_command(self, packages) -> str Generate a command to verify the list of packages given in ``packages`` using the native package manager's verification tool. The command to be executed is returned as a string that may be passed to a command execution routine (for e.g. ``sos_get_command_output()``. :param packages: a string, or a list of strings giving package names to be verified. :returns: a string containing an executable command that will perform verification of the given packages. :returntype: str or ``NoneType`` """ if not self.verify_command: return None by_regex = self.all_pkgs_by_name_regex verify_list = map(by_regex, packages) # No packages after regex match? if not verify_list: return None verify_packages = "" for package_list in verify_list: for package in package_list: if any([f in package for f in self.verify_filter]): continue if len(verify_packages): verify_packages += " " verify_packages += package return self.verify_command + " " + verify_packages class Policy(object): msg = _("""\ This command will collect system configuration and diagnostic information \ from this %(distro)s system. An archive containing the collected information \ will be generated in %(tmpdir)s. For more information on %(vendor)s visit: %(vendor_url)s The generated archive may contain data considered sensitive and its content \ should be reviewed by the originating organization before being passed to \ any third party. No changes will be made to system configuration. %(vendor_text)s """) distro = "Unknown" vendor = "Unknown" vendor_url = "http://www.example.com/" vendor_text = "" PATH = "" _in_container = False _host_sysroot = '/' def __init__(self, sysroot=None): """Subclasses that choose to override this initializer should call super() to ensure that they get the required platform bits attached. super(SubClass, self).__init__(). Policies that require runtime tests to construct PATH must call self.set_exec_path() after modifying PATH in their own initializer.""" self._parse_uname() self.report_name = self.hostname self.case_id = None self.package_manager = PackageManager() self._valid_subclasses = [] self.set_exec_path() self._host_sysroot = sysroot def get_valid_subclasses(self): return [IndependentPlugin] + self._valid_subclasses def set_valid_subclasses(self, subclasses): self._valid_subclasses = subclasses def del_valid_subclasses(self): del self._valid_subclasses valid_subclasses = property(get_valid_subclasses, set_valid_subclasses, del_valid_subclasses, "list of subclasses that this policy can " "process") def check(self): """ This function is responsible for determining if the underlying system is supported by this policy. """ return False def in_container(self): """ Returns True if sos is running inside a container environment. """ return self._in_container def host_sysroot(self): return self._host_sysroot def dist_version(self): """ Return the OS version """ pass def get_preferred_archive(self): """ Return the class object of the prefered archive format for this platform """ from sos.archive import TarFileArchive return TarFileArchive def get_archive_name(self): """ This function should return the filename of the archive without the extension. """ if self.case_id: self.report_name += "." + self.case_id return "sosreport-%s-%s" % (self.report_name, time.strftime("%Y%m%d%H%M%S")) def get_tmp_dir(self, opt_tmp_dir): if not opt_tmp_dir: return tempfile.gettempdir() return opt_tmp_dir def match_plugin(self, plugin_classes): if len(plugin_classes) > 1: for p in plugin_classes: # Give preference to the first listed tagging class # so that e.g. UbuntuPlugin is chosen over DebianPlugin # on an Ubuntu installation. if issubclass(p, self.valid_subclasses[0]): return p return plugin_classes[0] def validate_plugin(self, plugin_class, experimental=False): """ Verifies that the plugin_class should execute under this policy """ valid_subclasses = [IndependentPlugin] + self.valid_subclasses if experimental: valid_subclasses += [ExperimentalPlugin] return any(issubclass(plugin_class, class_) for class_ in valid_subclasses) def pre_work(self): """ This function is called prior to collection. """ pass def post_work(self): """ This function is called after the sosreport has been generated. """ pass def pkg_by_name(self, pkg): return self.package_manager.pkg_by_name(pkg) def _parse_uname(self): (system, node, release, version, machine, processor) = platform.uname() self.system = system self.hostname = node self.release = release self.smp = version.split()[1] == "SMP" self.machine = machine def set_commons(self, commons): self.commons = commons def _set_PATH(self, path): environ['PATH'] = path def set_exec_path(self): self._set_PATH(self.PATH) def is_root(self): """This method should return true if the user calling the script is considered to be a superuser""" return (os.getuid() == 0) def get_preferred_hash_name(self): """Returns the string name of the hashlib-supported checksum algorithm to use""" return "md5" def display_results(self, archive, directory, checksum): # Display results is called from the tail of SoSReport.final_work() # # Logging is already shutdown and all terminal output must use the # print() call. # make sure a report exists if not archive and not directory: return False self._print() if archive: self._print(_("Your sosreport has been generated and saved " "in:\n %s") % archive) else: self._print(_("sosreport build tree is located at : %s" % directory)) self._print() if checksum: self._print(_("The checksum is: ") + checksum) self._print() self._print(_("Please send this file to your support " "representative.")) self._print() def _print(self, msg=None): """A wrapper around print that only prints if we are not running in quiet mode""" if not self.commons['cmdlineopts'].quiet: if msg: print_(msg) else: print_() def get_msg(self): """This method is used to prepare the preamble text to display to the user in non-batch mode. If your policy sets self.distro that text will be substituted accordingly. You can also override this method to do something more complicated.""" width = 72 _msg = self.msg % {'distro': self.distro, 'vendor': self.vendor, 'vendor_url': self.vendor_url, 'vendor_text': self.vendor_text, 'tmpdir': self.commons['tmpdir']} _fmt = "" for line in _msg.splitlines(): _fmt = _fmt + fill(line, width, replace_whitespace=False) + '\n' return _fmt class GenericPolicy(Policy): """This Policy will be returned if no other policy can be loaded. This should allow for IndependentPlugins to be executed on any system""" def get_msg(self): return self.msg % {'distro': self.system} class LinuxPolicy(Policy): """This policy is meant to be an abc class that provides common implementations used in Linux distros""" distro = "Linux" vendor = "None" PATH = "/bin:/sbin:/usr/bin:/usr/sbin" _preferred_hash_name = None def __init__(self, sysroot=None): super(LinuxPolicy, self).__init__(sysroot=sysroot) def get_preferred_hash_name(self): if self._preferred_hash_name: return self._preferred_hash_name checksum = "md5" try: fp = open("/proc/sys/crypto/fips_enabled", "r") except: self._preferred_hash_name = checksum return checksum fips_enabled = fp.read() if fips_enabled.find("1") >= 0: checksum = "sha256" fp.close() self._preferred_hash_name = checksum return checksum def default_runlevel(self): try: with open("/etc/inittab") as fp: pattern = r"id:(\d{1}):initdefault:" text = fp.read() return int(re.findall(pattern, text)[0]) except: return 3 def kernel_version(self): return self.release def host_name(self): return self.hostname def is_kernel_smp(self): return self.smp def get_arch(self): return self.machine def get_local_name(self): """Returns the name usd in the pre_work step""" return self.host_name() def sanitize_report_name(self, report_name): return re.sub(r"[^-a-zA-Z.0-9]", "", report_name) def sanitize_case_id(self, case_id): return re.sub(r"[^-a-z,A-Z.0-9]", "", case_id) def pre_work(self): # this method will be called before the gathering begins cmdline_opts = self.commons['cmdlineopts'] customer_name = cmdline_opts.customer_name localname = customer_name if customer_name else self.get_local_name() caseid = cmdline_opts.case_id if cmdline_opts.case_id else "" if not cmdline_opts.batch and not \ cmdline_opts.quiet: try: self.report_name = input(_("Please enter your first initial " "and last name [%s]: ") % localname) self.case_id = input(_("Please enter the case id " "that you are generating this " "report for [%s]: ") % caseid) self._print() except KeyboardInterrupt: self._print() raise if len(self.report_name) == 0: self.report_name = localname if customer_name: self.report_name = customer_name if cmdline_opts.case_id: self.case_id = cmdline_opts.case_id self.report_name = self.sanitize_report_name(self.report_name) if self.case_id: self.case_id = self.sanitize_case_id(self.case_id) if (self.report_name == ""): self.report_name = "default" return # vim: set et ts=4 sw=4 : sosreport-3.5/sos/policies/__pycache__/0000755000175000017500000000000013203254630020074 5ustar cariboucaribousosreport-3.5/sos/policies/ubuntu.py0000644000175000017500000000220313200603014017544 0ustar cariboucariboufrom __future__ import with_statement from sos.plugins import UbuntuPlugin, DebianPlugin from sos.policies.debian import DebianPolicy class UbuntuPolicy(DebianPolicy): distro = "Ubuntu" vendor = "Ubuntu" vendor_url = "http://www.ubuntu.com/" def __init__(self, sysroot=None): super(UbuntuPolicy, self).__init__(sysroot=sysroot) self.valid_subclasses = [UbuntuPlugin, DebianPlugin] @classmethod def check(cls): """This method checks to see if we are running on Ubuntu. It returns True or False.""" try: with open('/etc/lsb-release', 'r') as fp: return "Ubuntu" in fp.read() except: return False def dist_version(self): """ Returns the version stated in DISTRIB_RELEASE """ try: with open('/etc/lsb-release', 'r') as fp: lines = fp.readlines() for line in lines: if "DISTRIB_RELEASE" in line: return line.split("=")[1].strip() return False except: return False # vim: set et ts=4 sw=4 : sosreport-3.5/sos/policies/debian.py0000644000175000017500000000261613200603014017454 0ustar cariboucariboufrom sos.plugins import DebianPlugin from sos.policies import PackageManager, LinuxPolicy import os class DebianPolicy(LinuxPolicy): distro = "Debian" vendor = "the Debian project" vendor_url = "http://www.debian.org/" report_name = "" ticket_number = "" package_manager = PackageManager( "dpkg-query -W -f='${Package}|${Version}\\n'") valid_subclasses = [DebianPlugin] PATH = "/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games" \ + ":/usr/local/sbin:/usr/local/bin" def __init__(self, sysroot=None): super(DebianPolicy, self).__init__(sysroot=sysroot) self.report_name = "" self.ticket_number = "" self.package_manager = PackageManager( "dpkg-query -W -f='${Package}|${Version}\\n'") self.valid_subclasses = [DebianPlugin] @classmethod def check(cls): """This method checks to see if we are running on Debian. It returns True or False.""" return os.path.isfile('/etc/debian_version') def dist_version(self): try: with open('/etc/lsb-release', 'r') as fp: rel_string = fp.read() if "wheezy/sid" in rel_string: return 6 elif "jessie/sid" in rel_string: return 7 return False except: return False # vim: set et ts=4 sw=4 : sosreport-3.5/sos/policies/osx.py0000644000175000017500000000045713200603014017044 0ustar cariboucariboufrom sos.policies import Policy from sos.utilities import shell_out class OSXPolicy(Policy): distro = "Mac OS X" @classmethod def check(cls): try: return "Mac OS X" in shell_out("sw_vers") except Exception: return False # vim: set et ts=4 sw=4 : sosreport-3.5/sos/policies/Makefile0000644000175000017500000000110413073155336017330 0ustar cariboucaribouPYTHON=python PACKAGE = $(shell basename `pwd`) PYFILES = $(wildcard *.py) PYVER := $(shell $(PYTHON) -c 'import sys; print("%.3s" %(sys.version))') PYSYSDIR := $(shell $(PYTHON) -c 'import sys; print(sys.prefix)') PYLIBDIR = $(PYSYSDIR)/lib/python$(PYVER) PKGDIR = $(PYLIBDIR)/site-packages/sos/$(PACKAGE) all: echo "nada" clean: rm -f *.pyc *.pyo *~ install: mkdir -p $(DESTDIR)/$(PKGDIR) for p in $(PYFILES) ; do \ install -m 644 $$p $(DESTDIR)/$(PKGDIR)/$$p; \ done $(PYTHON) -c "import compileall; compileall.compile_dir('$(DESTDIR)/$(PKGDIR)', 1, '$(PYDIR)', 1)" sosreport-3.5/sos/policies/ibmkvm.py0000644000175000017500000000477613200603014017530 0ustar cariboucaribou# Copyright (C) IBM Corporation, 2015 # # Authors: Kamalesh Babulal # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # from __future__ import print_function from sos.plugins import PowerKVMPlugin, ZKVMPlugin, RedHatPlugin from sos.policies.redhat import RedHatPolicy import os class PowerKVMPolicy(RedHatPolicy): distro = "PowerKVM" vendor = "IBM" vendor_url = "http://www-03.ibm.com/systems/power/software/linux/powerkvm" def __init__(self, sysroot=None): super(PowerKVMPolicy, self).__init__(sysroot=sysroot) self.valid_subclasses = [PowerKVMPlugin, RedHatPlugin] @classmethod def check(cls): """This method checks to see if we are running on PowerKVM. It returns True or False.""" return os.path.isfile('/etc/ibm_powerkvm-release') def dist_version(self): try: with open('/etc/ibm_powerkvm-release', 'r') as fp: version_string = fp.read() return version_string[2][0] return False except: return False class ZKVMPolicy(RedHatPolicy): distro = "IBM Hypervisor" vendor = "IBM Hypervisor" vendor_url = "http://www.ibm.com/systems/z/linux/IBMHypervisor/support/" def __init__(self, sysroot=None): super(ZKVMPolicy, self).__init__(sysroot=sysroot) self.valid_subclasses = [ZKVMPlugin, RedHatPlugin] @classmethod def check(cls): """This method checks to see if we are running on IBM Z KVM. It returns True or False.""" return os.path.isfile('/etc/base-release') def dist_version(self): try: with open('/etc/base-release', 'r') as fp: version_string = fp.read() return version_string.split(' ', 4)[3][0] return False except: return False # vim: set ts=4 sw=4 sosreport-3.5/sos/policies/suse.py0000644000175000017500000000730613203300002017204 0ustar cariboucaribou# Copyright (C) 2015 Red Hat, Inc. Bryn M. Reeves # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # This enables the use of with syntax in python 2.5 (e.g. jython) from __future__ import print_function import os import sys from sos.plugins import RedHatPlugin, SuSEPlugin from sos.policies import LinuxPolicy, PackageManager from sos import _sos as _ class SuSEPolicy(LinuxPolicy): distro = "SuSE" vendor = "SuSE" vendor_url = "https://www.suse.com/" _tmp_dir = "/var/tmp" def __init__(self, sysroot=None): super(SuSEPolicy, self).__init__() self.report_name = "" self.ticket_number = "" self.package_manager = PackageManager( 'rpm -qa --queryformat "%{NAME}|%{VERSION}\\n"') self.valid_subclasses = [SuSEPlugin, RedHatPlugin] pkgs = self.package_manager.all_pkgs() # If rpm query timed out after timeout duration exit if not pkgs: print("Could not obtain installed package list", file=sys.stderr) sys.exit(1) self.PATH = "/usr/sbin:/usr/bin:/root/bin" self.PATH += os.pathsep + "/usr/local/bin" self.PATH += os.pathsep + "/usr/local/sbin" self.set_exec_path() @classmethod def check(cls): """This method checks to see if we are running on SuSE. It must be overriden by concrete subclasses to return True when running on an OpenSuSE, SLES or other Suse distribution and False otherwise.""" return False def runlevel_by_service(self, name): from subprocess import Popen, PIPE ret = [] p = Popen("LC_ALL=C /sbin/chkconfig --list %s" % name, shell=True, stdout=PIPE, stderr=PIPE, bufsize=-1, close_fds=True) out, err = p.communicate() if err: return ret for tabs in out.split()[1:]: try: (runlevel, onoff) = tabs.split(":", 1) except: pass else: if onoff == "on": ret.append(int(runlevel)) return ret def get_tmp_dir(self, opt_tmp_dir): if not opt_tmp_dir: return self._tmp_dir return opt_tmp_dir def get_local_name(self): return self.host_name() class OpenSuSEPolicy(SuSEPolicy): distro = "OpenSuSE" vendor = "SuSE" vendor_url = "https://www.opensuse.org/" msg = _("""\ This command will collect diagnostic and configuration \ information from this %(distro)s system and installed \ applications. An archive containing the collected information will be \ generated in %(tmpdir)s and may be provided to a %(vendor)s \ support representative. No changes will be made to system configuration. %(vendor_text)s """) def __init__(self, sysroot=None): super(OpenSuSEPolicy, self).__init__(sysroot=sysroot) @classmethod def check(cls): """This method checks to see if we are running on SuSE. """ return (os.path.isfile('/etc/SuSE-release')) sosreport-3.5/sosreport0000755000175000017500000000162613203300002015225 0ustar cariboucaribou#!/usr/bin/python # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ sos entry point. """ import sys try: from sos.sosreport import main except KeyboardInterrupt: raise SystemExit() if __name__ == '__main__': main(sys.argv[1:]) # vim:ts=4 et sw=4 sosreport-3.5/.github/0000755000175000017500000000000013203300002014572 5ustar cariboucaribousosreport-3.5/.github/PULL_REQUEST_TEMPLATE.md0000644000175000017500000000101413203300002020367 0ustar cariboucaribou--- Please place an 'X' inside each '[]' to confirm you adhere to our [Contributor Guidelines](https://github.com/sosreport/sos/wiki/Contribution-Guidelines) - [] Is the commit message split over multiple lines and hard-wrapped at 72 characters? - [] Is the subject and message clear and concise? - [] Does the subject start with **[plugin_name]** if submitting a plugin patch or a **[section_name]** if part of the core sosreport code? - [] Does the commit contain a **Signed-off-by: First Lastname **? sosreport-3.5/LICENSE0000644000175000017500000004311413073155336014271 0ustar cariboucaribou GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. sosreport-3.5/example_plugins/0000755000175000017500000000000013073155336016455 5ustar cariboucaribousosreport-3.5/example_plugins/example.py0000755000175000017500000000522413073155336020470 0ustar cariboucaribou### This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. from sos.plugins import Plugin, RedHatPlugin # the class name determines the plugin name # if you want to override it simply provide a @classmethod name() # that returns the name you want class example(Plugin, RedHatPlugin): '''This is the description for the example plugin''' # Plugin developers want to override setup() from which they will call # add_copy_spec() to collect files and collectExtOutput() to collect programs # output. # Add your options here, indicate whether they are slow to run, and set # whether they are enabled by default # each option is a tuple of the following format: # (name, description, fast or slow, default value) # each option will be addressable like -k name=value option_list = [("init.d", 'Gathers the init.d directory', 'slow', 0), ('follicles', 'Gathers information about each follicle on every toe', 'slow', 0), ('color', 'Gathers toenail polish color', 'fast', 0)] def setup(self): ''' First phase - Collect all the information we need. Directories are copied recursively. arbitrary commands may be executed using the collectExtOutput() method. Information is automatically saved, and links are presented in the report to each file or directory which has been copied to the saved tree. Also, links are provided to the output from each command. ''' # Here's how to copy files and directory trees self.add_copy_spec("/etc/hosts") with open("/proc/cpuinfo") as f: for line in f: if "vendor_id" in line: self.add_alert("Vendor ID string is: %s
\n" % line) # Here's how to test your options and execute if enabled if self.option_enabled("init.d"): self.add_copy_spec("/etc/init.d") # copies a whole directory tree # Here's how to execute a command self.collectExtOutput("/bin/ps -ef") # vim: set et ts=4 sw=4 : sosreport-3.5/setup.py0000644000175000017500000000437513073155336015004 0ustar cariboucaribou#!/usr/bin/env python from distutils.core import setup from distutils.command.build import build from distutils.command.install_data import install_data from distutils.dep_util import newer from distutils.log import warn, info, error import glob import os import re import subprocess import sys from sos import __version__ as VERSION PO_DIR = 'po' MO_DIR = os.path.join('build', 'mo') class BuildData(build): def run(self): build.run(self) for po in glob.glob(os.path.join(PO_DIR, '*.po')): lang = os.path.basename(po[:-3]) mo = os.path.join(MO_DIR, lang, 'sos.mo') directory = os.path.dirname(mo) if not os.path.exists(directory): os.makedirs(directory) if newer(po, mo): try: rc = subprocess.call(['msgfmt', '-o', mo, po]) if rc != 0: raise Warning("msgfmt returned %d" % (rc,)) except Exception as e: error("Failed gettext.") sys.exit(1) class InstallData(install_data): def run(self): self.data_files.extend(self._find_mo_files()) install_data.run(self) def _find_mo_files(self): data_files = [] for mo in glob.glob(os.path.join(MO_DIR, '*', 'sos.mo')): lang = os.path.basename(os.path.dirname(mo)) dest = os.path.join('share', 'locale', lang, 'LC_MESSAGES') data_files.append((dest, [mo])) return data_files # Workaround https://bugs.python.org/issue644744 def copy_file (self, filename, dirname): (out, _) = install_data.copy_file(self, filename, dirname) # match for man pages if re.search(r'/man/man\d/.+\.\d$', out): return (out+".gz", _) return (out, _) setup(name='sos', version=VERSION, description=("""A set of tools to gather troubleshooting""" """ information from a system."""), author='Bryn M. Reeves', author_email='bmr@redhat.com', url='https://github.com/sosreport/sos', license="GPLv2+", scripts=['sosreport'], data_files=[ ('share/man/man1', ['man/en/sosreport.1']), ('share/man/man5', ['man/en/sos.conf.5']), ], packages=['sos', 'sos.plugins', 'sos.policies'], cmdclass={'build': BuildData, 'install_data': InstallData}, requires=['six'], ) # vim: set et ts=4 sw=4 : sosreport-3.5/tests/0000755000175000017500000000000013203300002014374 5ustar cariboucaribousosreport-3.5/tests/ziptest0000644000175000017500000000000013073155336016036 0ustar cariboucaribousosreport-3.5/tests/importer_tests.py0000644000175000017500000000050013073155336020053 0ustar cariboucaribouimport unittest from sos.utilities import ImporterHelper class ImporterHelperTests(unittest.TestCase): def test_runs(self): h = ImporterHelper(unittest) modules = h.get_modules() self.assertTrue('main' in modules) if __name__ == "__main__": unittest.main() # vim: set et ts=4 sw=4 : sosreport-3.5/tests/test.txt0000644000175000017500000000001013200603014016111 0ustar cariboucariboucontent sosreport-3.5/tests/__pycache__/0000755000175000017500000000000013203267111016621 5ustar cariboucaribousosreport-3.5/tests/utilities_tests.py0000644000175000017500000000616713073155336020244 0ustar cariboucaribouimport os.path import unittest # PYCOMPAT import six from six import StringIO from sos.utilities import grep, is_executable, sos_get_command_output, find, tail, shell_out import sos TEST_DIR = os.path.dirname(__file__) class GrepTest(unittest.TestCase): def test_file_obj(self): test_s = "\n".join(['this is only a test', 'there are only two lines']) test_fo = StringIO(test_s) matches = grep(".*test$", test_fo) self.assertEquals(matches, ['this is only a test\n']) def test_real_file(self): matches = grep(".*unittest$", __file__.replace(".pyc", ".py")) self.assertEquals(matches, ['import unittest\n']) def test_open_file(self): matches = grep(".*unittest$", open(__file__.replace(".pyc", ".py"))) self.assertEquals(matches, ['import unittest\n']) def test_grep_multiple_files(self): matches = grep(".*unittest$", __file__.replace(".pyc", ".py"), "does_not_exist.txt") self.assertEquals(matches, ['import unittest\n']) class TailTest(unittest.TestCase): def test_tail(self): t = tail("tests/tail_test.txt", 10) self.assertEquals(t, six.b("last line\n")) def test_tail_too_many(self): t = tail("tests/tail_test.txt", 200) expected = open("tests/tail_test.txt", "r").read() self.assertEquals(t, six.b(expected)) class ExecutableTest(unittest.TestCase): def test_nonexe_file(self): path = os.path.join(TEST_DIR, 'utility_tests.py') self.assertFalse(is_executable(path)) def test_exe_file(self): path = os.path.join(TEST_DIR, 'test_exe.py') self.assertTrue(is_executable(path)) def test_exe_file_abs_path(self): self.assertTrue(is_executable("/usr/bin/timeout")) def test_output(self): path = os.path.join(TEST_DIR, 'test_exe.py') result = sos_get_command_output(path) self.assertEquals(result['status'], 0) self.assertEquals(result['output'], "executed\n") def test_output_non_exe(self): path = os.path.join(TEST_DIR, 'utility_tests.py') result = sos_get_command_output(path) self.assertEquals(result['status'], 127) self.assertEquals(result['output'], "") def test_output_chdir(self): cmd = "/bin/bash -c 'echo $PWD'" result = sos_get_command_output(cmd, chdir=TEST_DIR) print(result) self.assertEquals(result['status'], 0) self.assertEquals(result['output'].strip(), TEST_DIR) def test_shell_out(self): path = os.path.join(TEST_DIR, 'test_exe.py') self.assertEquals("executed\n", shell_out(path)) class FindTest(unittest.TestCase): def test_find_leaf(self): leaves = find("leaf", TEST_DIR) self.assertTrue(any(name.endswith("leaf") for name in leaves)) def test_too_shallow(self): leaves = find("leaf", TEST_DIR, max_depth=1) self.assertFalse(any(name.endswith("leaf") for name in leaves)) def test_not_in_pattern(self): leaves = find("leaf", TEST_DIR, path_pattern="tests/path") self.assertFalse(any(name.endswith("leaf") for name in leaves)) # vim: set et ts=4 sw=4 : sosreport-3.5/tests/ziptest_link0000777000175000017500000000000013073155336020507 2ziptestustar cariboucaribousosreport-3.5/tests/tail_test.txt0000644000175000017500000000017213073155336017154 0ustar cariboucaribouthis is a file to test tail with I have a few lines in here I just need enough text to mess with it this is the last line sosreport-3.5/tests/policy_tests.py0000644000175000017500000000344713073155336017526 0ustar cariboucaribouimport unittest from sos.policies import Policy, PackageManager, import_policy from sos.plugins import Plugin, IndependentPlugin, RedHatPlugin, DebianPlugin class FauxPolicy(Policy): distro = "Faux" class FauxPlugin(Plugin, IndependentPlugin): pass class FauxRedHatPlugin(Plugin, RedHatPlugin): pass class FauxDebianPlugin(Plugin, DebianPlugin): pass class PolicyTests(unittest.TestCase): def test_independent_only(self): p = FauxPolicy() p.valid_subclasses = [] self.assertTrue(p.validate_plugin(FauxPlugin)) def test_redhat(self): p = FauxPolicy() p.valid_subclasses = [RedHatPlugin] self.assertTrue(p.validate_plugin(FauxRedHatPlugin)) def test_debian(self): p = FauxPolicy() p.valid_subclasses = [DebianPlugin] self.assertTrue(p.validate_plugin(FauxDebianPlugin)) def test_fails(self): p = FauxPolicy() p.valid_subclasses = [] self.assertFalse(p.validate_plugin(FauxDebianPlugin)) def test_can_import(self): self.assertTrue(import_policy('redhat') is not None) def test_cant_import(self): self.assertTrue(import_policy('notreal') is None) class PackageManagerTests(unittest.TestCase): def setUp(self): self.pm = PackageManager() def test_default_all_pkgs(self): self.assertEquals(self.pm.all_pkgs(), {}) def test_default_all_pkgs_by_name(self): self.assertEquals(self.pm.all_pkgs_by_name('doesntmatter'), []) def test_default_all_pkgs_by_name_regex(self): self.assertEquals(self.pm.all_pkgs_by_name_regex('.*doesntmatter$'), []) def test_default_pkg_by_name(self): self.assertEquals(self.pm.pkg_by_name('foo'), None) if __name__ == "__main__": unittest.main() # vim: set et ts=4 sw=4 : sosreport-3.5/tests/option_tests.py0000644000175000017500000000203513073155336017527 0ustar cariboucaribou#!/usr/bin/env python import unittest from sos.plugins import Plugin class GlobalOptionTest(unittest.TestCase): def setUp(self): self.commons = { 'sysroot': '/', 'global_plugin_options': { 'test_option': 'foobar', 'baz': None, 'empty_global': True }, } self.plugin = Plugin(self.commons) self.plugin.opt_names = ['baz', 'empty'] self.plugin.opt_parms = [{'enabled': False}, {'enabled': None}] def test_simple_lookup(self): self.assertEquals(self.plugin.get_option('test_option'), 'foobar') def test_multi_lookup(self): self.assertEquals(self.plugin.get_option(('not_there', 'test_option')), 'foobar') def test_cascade(self): self.assertEquals(self.plugin.get_option(('baz')), False) def test_none_should_cascade(self): self.assertEquals(self.plugin.get_option(('empty', 'empty_global')), True) if __name__ == "__main__": unittest.main() # vim: set et ts=4 sw=4 : sosreport-3.5/tests/report_tests.py0000644000175000017500000000706113200603014017515 0ustar cariboucaribou#!/usr/bin/env python import unittest import os try: import json except ImportError: import simplejson as json from sos.reporting import Report, Section, Command, CopiedFile, CreatedFile, Alert from sos.reporting import PlainTextReport class ReportTest(unittest.TestCase): def test_empty(self): report = Report() expected = json.dumps({}) self.assertEquals(expected, str(report)) def test_nested_section(self): report = Report() section = Section(name="section") report.add(section) expected = json.dumps({"section": {}}) self.assertEquals(expected, str(report)) def test_multiple_sections(self): report = Report() section = Section(name="section") report.add(section) section2 = Section(name="section2") report.add(section2) expected = json.dumps({"section": {}, "section2": {},}) self.assertEquals(expected, str(report)) def test_deeply_nested(self): report = Report() section = Section(name="section") command = Command(name="a command", return_code=0, href="does/not/matter") section.add(command) report.add(section) expected = json.dumps({"section": {"commands": [{"name": "a command", "return_code": 0, "href": "does/not/matter"}]}}) self.assertEquals(expected, str(report)) class TestPlainReport(unittest.TestCase): def setUp(self): self.report = Report() self.section = Section(name="plugin") self.div = PlainTextReport.DIVIDER def test_basic(self): self.assertEquals("", PlainTextReport(self.report).unicode()) def test_one_section(self): self.report.add(self.section) self.assertEquals("plugin\n" + self.div, PlainTextReport(self.report).unicode()) def test_two_sections(self): section1 = Section(name="first") section2 = Section(name="second") self.report.add(section1, section2) self.assertEquals("first\n" + self.div + "\nsecond\n" + self.div, PlainTextReport(self.report).unicode()) def test_command(self): cmd = Command(name="ls -al /foo/bar/baz", return_code=0, href="sos_commands/plugin/ls_-al_foo.bar.baz") self.section.add(cmd) self.report.add(self.section) self.assertEquals("plugin\n" + self.div + "\n- commands executed:\n * ls -al /foo/bar/baz", PlainTextReport(self.report).unicode()) def test_copied_file(self): cf = CopiedFile(name="/etc/hosts", href="etc/hosts") self.section.add(cf) self.report.add(self.section) self.assertEquals("plugin\n" + self.div + "\n- files copied:\n * /etc/hosts", PlainTextReport(self.report).unicode()) def test_created_file(self): crf = CreatedFile(name="sample.txt") self.section.add(crf) self.report.add(self.section) self.assertEquals("plugin\n" + self.div + "\n- files created:\n * sample.txt", PlainTextReport(self.report).unicode()) def test_alert(self): alrt = Alert("this is an alert") self.section.add(alrt) self.report.add(self.section) self.assertEquals("plugin\n" + self.div + "\n- alerts:\n ! this is an alert", PlainTextReport(self.report).unicode()) if __name__ == "__main__": unittest.main() # vim: set et ts=4 sw=4 : sosreport-3.5/tests/test_exe.py0000755000175000017500000000007713203300002016575 0ustar cariboucaribou#!/usr/bin/python print("executed") # vim: set et ts=4 sw=4 : sosreport-3.5/tests/archive_tests.py0000644000175000017500000000660013200603014017621 0ustar cariboucaribou#!/usr/bin/env python import unittest import os import tarfile import zipfile import tempfile import shutil from sos.archive import TarFileArchive from sos.utilities import tail # PYCOMPAT import six class TarFileArchiveTest(unittest.TestCase): def setUp(self): self.tmpdir = tempfile.mkdtemp() self.tf = TarFileArchive('test', self.tmpdir) def tearDown(self): shutil.rmtree(self.tmpdir) def check_for_file(self, filename): rtf = tarfile.open(os.path.join(self.tmpdir, 'test.tar')) rtf.getmember(filename) rtf.close() def test_create(self): self.tf.finalize('auto') self.assertTrue(os.path.exists(os.path.join(self.tmpdir, 'test.tar'))) def test_add_file(self): self.tf.add_file('tests/ziptest') self.tf.finalize('auto') self.check_for_file('test/tests/ziptest') def test_add_node_dev_null(self): st = os.lstat('/dev/null') dev_maj = os.major(st.st_rdev) dev_min = os.minor(st.st_rdev) self.tf.add_node('/dev/null', st.st_mode, os.makedev(dev_maj, dev_min)) # when the string comes from tail() output def test_add_string_from_file(self): self.copy_strings = [] testfile = tempfile.NamedTemporaryFile(dir=self.tmpdir, delete=False) testfile.write(six.b("*" * 1000)) testfile.flush() testfile.close() self.copy_strings.append((tail(testfile.name, 100), 'string_test.txt')) self.tf.add_string(self.copy_strings[0][0], 'tests/string_test.txt') self.tf.finalize('auto') # Since commit 179d9bb add_file does not support recursive directory # addition. Disable this test for now. # def test_add_dir(self): # self.tf.add_file('tests/') # self.tf.close() # # self.check_for_file('test/tests/ziptest') def test_add_renamed(self): self.tf.add_file('tests/ziptest', dest='tests/ziptest_renamed') self.tf.finalize('auto') self.check_for_file('test/tests/ziptest_renamed') # Since commit 179d9bb add_file does not support recursive directory # addition. Disable this test for now. # def test_add_renamed_dir(self): # self.tf.add_file('tests/', 'tests_renamed/') # self.tf.close() # # self.check_for_file('test/tests_renamed/ziptest') def test_add_string(self): self.tf.add_string('this is content', 'tests/string_test.txt') self.tf.finalize('auto') self.check_for_file('test/tests/string_test.txt') def test_get_file(self): self.tf.add_string('this is my content', 'tests/string_test.txt') afp = self.tf.open_file('tests/string_test.txt') self.assertEquals('this is my content', afp.read()) def test_overwrite_file(self): self.tf.add_string('this is my content', 'tests/string_test.txt') self.tf.add_string('this is my new content', 'tests/string_test.txt') afp = self.tf.open_file('tests/string_test.txt') self.assertEquals('this is my new content', afp.read()) def test_make_link(self): self.tf.add_file('tests/ziptest') self.tf.add_link('tests/ziptest', 'link_name') self.tf.finalize('auto') self.check_for_file('test/link_name') def test_compress(self): self.tf.finalize("auto") if __name__ == "__main__": unittest.main() # vim: set et ts=4 sw=4 : sosreport-3.5/tests/.run_nonroot_tests.py.swp0000644000175000017500000003000013203275466021462 0ustar cariboucariboub0VIM 8.0z Z xP1cariboumarvin~caribou/git/sosreport/tests/run_nonroot_tests.py 3210#"! Utp-ad -~}WF,L \ F   { 6 n $ # "  # vim: et ts=4 sw=4 unittest.main(verbosity=0)if __name__ == "__main__": gettext.dgettext('sos', 'no valid plugins were enabled')) soserr.getLogger().error.assert_called_once_with( # gettext call required to avoid error when $LANGUAGE is localised '--config-file', './sos.conf', '--quiet']) sosreport.main(['--batch', '--tmp-dir', '%s' % self.workdir, # Use --quiet so the sosreport run doesn't botch test output def test_run_sosreport_nonroot(self, soserr): @patch('sos.sosreport.logging') return line.strip('Version: ').strip() break if line.startswith('Version:'): for line in lines: lines = spec.readlines() with open('sos.spec') as spec: ''' in sos/__init__.py This is how make updateversion sets the value Get the main sosreport version from sos.spec. ''' def _get_sos_version(self): shutil.rmtree(self.workdir) def tearDownClass(self): @classmethod self.workdir = tempfile.mkdtemp() def setUpClass(self): @classmethodclass SosRunTests(unittest.TestCase):from mock import patchfrom sos import sosreportimport gettextimport shutilimport tempfileimport unittest#!/usr/bin/python3sosreport-3.5/tests/plugin_tests.py0000644000175000017500000002566013203300002017477 0ustar cariboucaribouimport unittest import os import tempfile import shutil # PYCOMPAT import six try: from StringIO import StringIO except: from io import StringIO from sos.plugins import Plugin, regex_findall, _mangle_command from sos.archive import TarFileArchive import sos.policies PATH = os.path.dirname(__file__) def j(filename): return os.path.join(PATH, filename) def create_file(size, dir=None): f = tempfile.NamedTemporaryFile(delete=False, dir=dir) f.write(six.b("*" * size * 1024 * 1024)) f.flush() f.close() return f.name class MockArchive(TarFileArchive): def __init__(self): self.m = {} self.strings = {} def name(self): return "mock.archive" def add_file(self, src, dest=None): if not dest: dest = src self.m[src] = dest def add_string(self, content, dest): self.m[dest] = content def add_link(self, dest, link_name): pass def open_file(self, name): return open(self.m.get(name), 'r') def close(self): pass def compress(self, method): pass class MockPlugin(Plugin): option_list = [("opt", 'an option', 'fast', None), ("opt2", 'another option', 'fast', False)] def setup(self): pass class NamedMockPlugin(Plugin): """This plugin has a description.""" plugin_name = "testing" def setup(self): pass class ForbiddenMockPlugin(Plugin): """This plugin has a description.""" plugin_name = "forbidden" def setup(self): self.add_forbidden_path("tests") class EnablerPlugin(Plugin): def is_installed(self, pkg): return self.is_installed class MockOptions(object): all_logs = False class PluginToolTests(unittest.TestCase): def test_regex_findall(self): test_s = "\n".join(['this is only a test', 'there are only two lines']) test_fo = StringIO(test_s) matches = regex_findall(r".*lines$", test_fo) self.assertEquals(matches, ['there are only two lines']) def test_regex_findall_miss(self): test_s = "\n".join(['this is only a test', 'there are only two lines']) test_fo = StringIO(test_s) matches = regex_findall(r".*not_there$", test_fo) self.assertEquals(matches, []) def test_regex_findall_bad_input(self): matches = regex_findall(r".*", None) self.assertEquals(matches, []) matches = regex_findall(r".*", []) self.assertEquals(matches, []) matches = regex_findall(r".*", 1) self.assertEquals(matches, []) def test_mangle_command(self): name_max = 255 self.assertEquals("foo", _mangle_command("/usr/bin/foo", name_max)) self.assertEquals("foo_-x", _mangle_command("/usr/bin/foo -x", name_max)) self.assertEquals("foo_--verbose", _mangle_command("/usr/bin/foo --verbose", name_max)) self.assertEquals("foo_.path.to.stuff", _mangle_command("/usr/bin/foo /path/to/stuff", name_max)) longcmd ="foo is " + "a" * 256 + " long_command" expected = longcmd[0:name_max].replace(' ', '_') self.assertEquals(expected, _mangle_command(longcmd, name_max)) class PluginTests(unittest.TestCase): sysroot = os.getcwd() def setUp(self): self.mp = MockPlugin({ 'cmdlineopts': MockOptions(), 'sysroot': self.sysroot }) self.mp.archive = MockArchive() def test_plugin_default_name(self): p = MockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.name(), "mockplugin") def test_plugin_set_name(self): p = NamedMockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.name(), "testing") def test_plugin_no_descrip(self): p = MockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.get_description(), "") def test_plugin_no_descrip(self): p = NamedMockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.get_description(), "This plugin has a description.") def test_set_plugin_option(self): p = MockPlugin({'sysroot': self.sysroot}) p.set_option("opt", "testing") self.assertEquals(p.get_option("opt"), "testing") def test_set_nonexistant_plugin_option(self): p = MockPlugin({'sysroot': self.sysroot}) self.assertFalse(p.set_option("badopt", "testing")) def test_get_nonexistant_plugin_option(self): p = MockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.get_option("badopt"), 0) def test_get_unset_plugin_option(self): p = MockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.get_option("opt"), 0) def test_get_unset_plugin_option_with_default(self): # this shows that even when we pass in a default to get, # we'll get the option's default as set in the plugin # this might not be what we really want p = MockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.get_option("opt", True), True) def test_get_unset_plugin_option_with_default_not_none(self): # this shows that even when we pass in a default to get, # if the plugin default is not None # we'll get the option's default as set in the plugin # this might not be what we really want p = MockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.get_option("opt2", True), False) def test_get_option_as_list_plugin_option(self): p = MockPlugin({'sysroot': self.sysroot}) p.set_option("opt", "one,two,three") self.assertEquals(p.get_option_as_list("opt"), ['one', 'two', 'three']) def test_get_option_as_list_plugin_option_default(self): p = MockPlugin({'sysroot': self.sysroot}) self.assertEquals(p.get_option_as_list("opt", default=[]), []) def test_get_option_as_list_plugin_option_not_list(self): p = MockPlugin({'sysroot': self.sysroot}) p.set_option("opt", "testing") self.assertEquals(p.get_option_as_list("opt"), ['testing']) def test_copy_dir(self): self.mp._do_copy_path("tests") self.assertEquals(self.mp.archive.m["tests/plugin_tests.py"], 'tests/plugin_tests.py') def test_copy_dir_bad_path(self): self.mp._do_copy_path("not_here_tests") self.assertEquals(self.mp.archive.m, {}) def test_copy_dir_forbidden_path(self): p = ForbiddenMockPlugin({ 'cmdlineopts': MockOptions(), 'sysroot': self.sysroot }) p.archive = MockArchive() p.setup() p._do_copy_path("tests") self.assertEquals(p.archive.m, {}) class AddCopySpecTests(unittest.TestCase): expect_paths = set(['tests/tail_test.txt']) def setUp(self): self.mp = MockPlugin({ 'cmdlineopts': MockOptions(), 'sysroot': os.getcwd() }) self.mp.archive = MockArchive() def assert_expect_paths(self): def pathmunge(path): if path[0] == '/': path = path[1:] return os.path.join(self.mp.sysroot, path) expected_paths = set(map(pathmunge, self.expect_paths)) self.assertEquals(self.mp.copy_paths, expected_paths) def test_single_file_no_limit(self): self.mp.add_copy_spec("tests/tail_test.txt") self.assert_expect_paths() def test_single_file_under_limit(self): self.mp.add_copy_spec("tests/tail_test.txt", 1) self.assert_expect_paths() def test_single_file_over_limit(self): self.mp.sysroot = '/' fn = create_file(2) # create 2MB file, consider a context manager self.mp.add_copy_spec(fn, 1) content, fname = self.mp.copy_strings[0] self.assertTrue("tailed" in fname) self.assertTrue("tmp" in fname) self.assertTrue("/" not in fname) self.assertEquals(1024 * 1024, len(content)) os.unlink(fn) def test_bad_filename(self): self.mp.sysroot = '/' self.assertFalse(self.mp.add_copy_spec('', 1)) self.assertFalse(self.mp.add_copy_spec(None, 1)) def test_glob_file(self): self.mp.add_copy_spec('tests/tail_test.*') self.assert_expect_paths() def test_glob_file_limit_no_limit(self): self.mp.sysroot = '/' tmpdir = tempfile.mkdtemp() fn = create_file(2, dir=tmpdir) fn2 = create_file(2, dir=tmpdir) self.mp.add_copy_spec(tmpdir + "/*") self.assertEquals(len(self.mp.copy_paths), 2) shutil.rmtree(tmpdir) def test_glob_file_over_limit(self): self.mp.sysroot = '/' tmpdir = tempfile.mkdtemp() fn = create_file(2, dir=tmpdir) fn2 = create_file(2, dir=tmpdir) self.mp.add_copy_spec(tmpdir + "/*", 1) self.assertEquals(len(self.mp.copy_strings), 1) content, fname = self.mp.copy_strings[0] self.assertTrue("tailed" in fname) self.assertEquals(1024 * 1024, len(content)) shutil.rmtree(tmpdir) def test_multiple_files_no_limit(self): self.mp.add_copy_spec(['tests/tail_test.txt', 'tests/test.txt']) self.assertEquals(len(self.mp.copy_paths), 2) def test_multiple_files_under_limit(self): self.mp.add_copy_spec(['tests/tail_test.txt', 'tests/test.txt'], 1) self.assertEquals(len(self.mp.copy_paths), 2) class CheckEnabledTests(unittest.TestCase): def setUp(self): self.mp = EnablerPlugin({ 'policy': sos.policies.load(), 'sysroot': os.getcwd() }) def test_checks_for_file(self): f = j("tail_test.txt") self.mp.files = (f,) self.assertTrue(self.mp.check_enabled()) def test_checks_for_package(self): self.mp.packages = ('foo',) self.assertTrue(self.mp.check_enabled()) def test_allows_bad_tuple(self): f = j("tail_test.txt") self.mp.files = (f) self.mp.packages = ('foo') self.assertTrue(self.mp.check_enabled()) def test_enabled_by_default(self): self.assertTrue(self.mp.check_enabled()) class RegexSubTests(unittest.TestCase): def setUp(self): self.mp = MockPlugin({ 'cmdlineopts': MockOptions(), 'sysroot': os.getcwd() }) self.mp.archive = MockArchive() def test_file_never_copied(self): self.assertEquals(0, self.mp.do_file_sub("never_copied", r"^(.*)$", "foobar")) def test_no_replacements(self): self.mp.add_copy_spec(j("tail_test.txt")) self.mp.collect() replacements = self.mp.do_file_sub(j("tail_test.txt"), r"wont_match", "foobar") self.assertEquals(0, replacements) def test_replacements(self): # test uses absolute paths self.mp.sysroot = '/' self.mp.add_copy_spec(j("tail_test.txt")) self.mp.collect() replacements = self.mp.do_file_sub(j("tail_test.txt"), r"(tail)", "foobar") self.assertEquals(1, replacements) self.assertTrue("foobar" in self.mp.archive.m.get(j('tail_test.txt'))) if __name__ == "__main__": unittest.main() # vim: set et ts=4 sw=4 : sosreport-3.5/tests/sosreport_pexpect.py0000644000175000017500000000147113073155336020570 0ustar cariboucaribou#!/usr/bin/env python import unittest import pexpect from re import search, escape from os import kill from signal import SIGINT class PexpectTest(unittest.TestCase): def test_plugins_install(self): sos = pexpect.spawn('/usr/sbin/sosreport -l') try: sos.expect('plugin.*does not install, skipping') except pexpect.EOF: pass else: self.fail("a plugin does not install or sosreport is too slow") kill(sos.pid, SIGINT) def test_batchmode_removes_questions(self): sos = pexpect.spawn('/usr/sbin/sosreport --batch') grp = sos.expect('send this file to your support representative.', 15) self.assertEquals(grp, 0) kill(sos.pid, SIGINT) if __name__ == '__main__': unittest.main() # vim: set et ts=4 sw=4 : sosreport-3.5/tests/path/0000755000175000017500000000000013073155336015357 5ustar cariboucaribousosreport-3.5/tests/path/to/0000755000175000017500000000000013073155336016001 5ustar cariboucaribousosreport-3.5/tests/path/to/leaf0000644000175000017500000000000013073155336016621 0ustar cariboucaribousosreport-3.5/Makefile0000644000175000017500000000654713201043463014723 0ustar cariboucaribou# # Makefile for sos system support tools # NAME = sos VERSION := $(shell echo `awk '/^Version:/ {print $$2}' sos.spec`) MAJOR := $(shell echo $(VERSION) | cut -f 1 -d '.') MINOR := $(shell echo $(VERSION) | cut -f 2 -d '.') RELEASE := $(shell echo `awk '/^Release:/ {gsub(/\%.*/,""); print $2}' sos.spec`) REPO = https://github.com/sosreport/sos SUBDIRS = po sos sos/plugins sos/policies docs PYFILES = $(wildcard *.py) # OS X via brew # MSGCAT = /usr/local/Cellar/gettext/0.18.1.1/bin/msgcat MSGCAT = msgcat DIST_BUILD_DIR = dist-build RPM_DEFINES = --define "_topdir %(pwd)/$(DIST_BUILD_DIR)" \ --define "_builddir %{_topdir}" \ --define "_rpmdir %{_topdir}" \ --define "_srcrpmdir %{_topdir}" \ --define "_specdir %{_topdir}" \ --define "_sourcedir %{_topdir}" RPM = rpmbuild RPM_WITH_DIRS = $(RPM) $(RPM_DEFINES) ARCHIVE_DIR = $(DIST_BUILD_DIR)/$(NAME)-$(VERSION) DEB_ARCHIVE_DIR = $(DIST_BUILD_DIR)/$(NAME)report-$(VERSION) SRC_BUILD = $(DIST_BUILD_DIR)/sdist PO_DIR = $(SRC_BUILD)/sos/po .PHONY: docs docs: make -C docs html man build: for d in $(SUBDIRS); do make -C $$d; [ $$? = 0 ] || exit 1 ; done install: updateversion mkdir -p $(DESTDIR)/usr/sbin mkdir -p $(DESTDIR)/usr/share/man/man1 mkdir -p $(DESTDIR)/usr/share/man/man5 mkdir -p $(DESTDIR)/usr/share/$(NAME)/extras @gzip -c man/en/sosreport.1 > sosreport.1.gz @gzip -c man/en/sos.conf.5 > sos.conf.5.gz mkdir -p $(DESTDIR)/etc install -m755 sosreport $(DESTDIR)/usr/sbin/sosreport install -m644 sosreport.1.gz $(DESTDIR)/usr/share/man/man1/. install -m644 sos.conf.5.gz $(DESTDIR)/usr/share/man/man5/. install -m644 AUTHORS README.md $(DESTDIR)/usr/share/$(NAME)/. install -m644 $(NAME).conf $(DESTDIR)/etc/$(NAME).conf for d in $(SUBDIRS); do make DESTDIR=`cd $(DESTDIR); pwd` -C $$d install; [ $$? = 0 ] || exit 1; done updateversion: sed 's/@SOSVERSION@/$(VERSION)/g' sos/__init__.py.in > sos/__init__.py $(NAME)-$(VERSION).tar.gz: clean @mkdir -p $(ARCHIVE_DIR) @tar -cv sosreport sos docs man po sos.conf AUTHORS LICENSE README.md sos.spec Makefile | tar -x -C $(ARCHIVE_DIR) @tar Ccvzf $(DIST_BUILD_DIR) $(DIST_BUILD_DIR)/$(NAME)-$(VERSION).tar.gz $(NAME)-$(VERSION) --exclude-vcs $(NAME)report_$(VERSION).orig.tar.gz: clean @mkdir -p $(DEB_ARCHIVE_DIR) @tar --exclude-vcs \ --exclude=.travis.yml \ --exclude=debian \ --exclude=$(DIST_BUILD_DIR) -cv . | tar -x -C $(DEB_ARCHIVE_DIR) @tar Ccvzf $(DIST_BUILD_DIR) $(DIST_BUILD_DIR)/$(NAME)report_$(VERSION).orig.tar.gz $(NAME)report-$(VERSION) @mv $(DIST_BUILD_DIR)/$(NAME)report_$(VERSION).orig.tar.gz . @rm -Rf $(DIST_BUILD_DIR) clean: @rm -fv *~ .*~ changenew ChangeLog.old $(NAME)-$(VERSION).tar.gz sosreport.1.gz sos.conf.5.gz @rm -rf rpm-build @for i in `find . -iname *.pyc`; do \ rm -f $$i; \ done; \ for d in $(SUBDIRS); do make -C $$d clean ; done srpm: clean $(NAME)-$(VERSION).tar.gz $(RPM_WITH_DIRS) -ts $(DIST_BUILD_DIR)/$(NAME)-$(VERSION).tar.gz rpm: clean $(NAME)-$(VERSION).tar.gz $(RPM_WITH_DIRS) -tb $(DIST_BUILD_DIR)/$(NAME)-$(VERSION).tar.gz po: clean mkdir -p $(PO_DIR) for po in `ls po/*.po`; do \ $(MSGCAT) -p -o $(PO_DIR)/sos_$$(basename $$po | awk -F. '{print $$1}').properties $$po; \ done; \ cp $(PO_DIR)/sos_en.properties $(PO_DIR)/sos_en_US.properties cp $(PO_DIR)/sos_en.properties $(PO_DIR)/sos.properties test: nosetests -v --with-cover --cover-package=sos --cover-html sosreport-3.5/__run__.py0000755000175000017500000000140313073155336015234 0ustar cariboucaribou# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. from sos.sosreport import main import sys main(sys.argv[1:]) # vim: set et ts=4 sw=4 : sosreport-3.5/pylintrc0000644000175000017500000002337313073155336015060 0ustar cariboucaribou# lint Python modules using external checkers. # # This is the main checker controling the other ones and the reports # generation. It is itself both a raw checker and an astng checker in order # to: # * handle message activation / deactivation at the module level # * handle some basic but necessary stats'data (number of classes, methods...) # # This checker also defines the following reports: # * R0001: Total errors / warnings # * R0002: % errors / warnings by module # * R0003: Messages # * R0004: Global evaluation [MASTER] # Profiled execution. profile=no # Add to the black list. It should be a base name, not a # path. You may set this option multiple times. ignore=CVS # Pickle collected data for later comparisons. persistent=yes # Set the cache size for astng objects. cache-size=500 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= [REPORTS] # Tells wether to display a full report or only the messages reports=yes # Use HTML as output format instead of text html=no # Use a parseable text output format, so your favorite text editor will be able # to jump to the line corresponding to a message. parseable=yes # Colorizes text output using ansi escape codes color=no # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". files-output=no # Python expression which should return a note less than 10 (10 is the highest # note).You have access to the variables errors warning, statement which # respectivly contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (R0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Add a comment according to your evaluation note. This is used by the global # evaluation report (R0004). comment=no # Include message's id in output include-ids=yes # checks for # * unused variables / imports # * undefined variables # * redefinition of variable from builtins or from an outer scope # * use of variable before assigment # [VARIABLES] # Enable / disable this checker enable-variables=yes # Tells wether we should check for unused import in __init__ files. init-import=no # A regular expression matching names used for dummy variables (i.e. not used). dummy-variables-rgx=_|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins=_ # try to find bugs in the code using type inference # [TYPECHECK] # Enable / disable this checker enable-typecheck=yes # Tells wether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # When zope mode is activated, consider the acquired-members option to ignore # access to some undefined attributes. zope=no # List of members which are usually get through zope's acquisition mecanism and # so shouldn't trigger E0201 when accessed (need zope=yes to be considered. acquired-members=REQUEST,acl_users,aq_parent # checks for : # * doc strings # * modules / classes / functions / methods / arguments / variables name # * number of arguments, local variables, branchs, returns and statements in # functions, methods # * required module attributes # * dangerous default values as arguments # * redefinition of function / method / class # * uses of the global statement # # This checker also defines the following reports: # * R0101: Statistics by type [BASIC] # Enable / disable this checker enable-basic=yes #disable-msg=C0121 # Required attributes for module, separated by a comma required-attributes= # Regular expression which should only match functions or classes name which do # not require a docstring no-docstring-rgx=__.*__ # Regular expression which should only match correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression which should only match correct module level names const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$ # Regular expression which should only match correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Regular expression which should only match correct function names function-rgx=[a-z_][A-Za-z0-9_]{2,30}$ # Regular expression which should only match correct method names method-rgx=[a-z_][A-Za-z0-9_]{2,30}$ # Regular expression which should only match correct instance attribute names attr-rgx=[a-z_][A-Za-z0-9_]{2,30}$ # Regular expression which should only match correct argument names argument-rgx=[a-z_][A-Za-z0-9_]{2,30}$ # Regular expression which should only match correct variable names variable-rgx=[a-z_][A-Za-z0-9_]{0,30}$ # Regular expression which should only match correct list comprehension / # generator expression variable names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # List of builtins function names that should not be used, separated by a comma bad-functions=map,filter,apply,input # checks for sign of poor/misdesign: # * number of methods, attributes, local variables... # * size, complexity of functions, methods # [DESIGN] # Enable / disable this checker enable-design=yes # Maximum number of arguments for function / method max-args=5 # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branchs=12 # Maximum number of statements in function / method body max-statements=50 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # checks for : # * methods without self as first argument # * overriden methods signature # * access only to existant members via self # * attributes not defined in the __init__ method # * supported interfaces implementation # * unreachable code # [CLASSES] # Enable / disable this checker enable-classes=yes # List of interface methods to ignore, separated by a comma. This is used for # instance to not check methods defines in Zope's Interface base class. ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # checks for # * external modules dependencies # * relative / wildcard imports # * cyclic imports # * uses of deprecated modules # # This checker also defines the following reports: # * R0401: External dependencies # * R0402: Modules dependencies graph [IMPORTS] # Enable / disable this checker enable-imports=no # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,string,TERMIOS,Bastion,rexec # Create a graph of every (i.e. internal and external) dependencies in the # given file (report R0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report R0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report R0402 must # not be disabled) int-import-graph= # checks for usage of new style capabilities on old style classes and # other new/old styles conflicts problems # * use of property, __slots__, super # * "super" usage # * raising a new style class as exception # [NEWSTYLE] # Enable / disable this checker enable-newstyle=yes # checks for # * excepts without exception filter # * string exceptions # [EXCEPTIONS] # Enable / disable this checker enable-exceptions=yes # checks for : # * unauthorized constructions # * strict indentation # * line length # * use of <> instead of != # [FORMAT] # Enable / disable this checker enable-format=yes # Maximum number of characters on a single line. max-line-length=132 # Maximum number of lines in a module max-module-lines=1000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # checks for similarities and duplicated code. This computation may be # memory / CPU intensive, so you should disable it if you experiments some # problems. # # This checker also defines the following reports: # * R0801: Duplication [SIMILARITIES] # Enable / disable this checker enable-similarities=yes # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # checks for: # * warning notes in the code like FIXME, XXX # * PEP 263: source code with non ascii character but no encoding declaration # [MISCELLANEOUS] # Enable / disable this checker enable-miscellaneous=yes # List of note tags to take in consideration, separated by a comma. Default to # FIXME, XXX, TODO notes=FIXME,XXX,TODO # does not check anything but gives some raw metrics : # * total number of lines # * total number of code lines # * total number of docstring lines # * total number of comments lines # * total number of empty lines # # This checker also defines the following reports: # * R0701: Raw metrics [METRICS] # Enable / disable this checker enable-metrics=no sosreport-3.5/docs/0000755000175000017500000000000013201055202014171 5ustar cariboucaribousosreport-3.5/docs/reporting.rst0000644000175000017500000000027213073155336016755 0ustar cariboucaribou``sos.reporting`` --- Reporting Interface ========================================= .. automodule:: sos.reporting :noindex: :members: :undoc-members: :show-inheritance: sosreport-3.5/docs/Makefile0000644000175000017500000002344313073155336015657 0ustar cariboucaribou# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build DOCDESTDIR = ${DESTDIR}/usr/share/doc/sos # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext install-dir install-html install-dirhtml install-singlehtml install-pickle install-json install-htmlhelp install-qthelp install-epub install-latex install-text install-man install-texinfo install-info install-gettext install-changes install-linkcheck install-doctest install-xml install-pseudoxml install help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* install-dir: install -d -m 0755 ${DOCDESTDIR} html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." install-html: install-dir if test -d ${BUILDDIR}/html; then \ cp -r ${BUILDDIR}/html ${DOCDESTDIR}; \ else \ exit 0; \ fi dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." install-dirhtml: install-dir if test -d ${BUILDDIR}/dirhtml; then \ cp -r ${BUILDDIR}/dirhtml ${DOCDESTDIR}; \ else \ exit 0; \ fi singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." install-singlehtml: install-dir if test -d ${BUILDDIR}/singlehtml; then \ cp -r ${BUILDDIR}/singlehtml ${DOCDESTDIR}; \ else \ exit 0; \ fi pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." install-pickle: install-dir if test -d ${BUILDDIR}/pickle; then \ cp -r ${BUILDDIR}/pickle ${DOCDESTDIR}; \ else \ exit 0; \ fi json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." install-json: install-dir if test -d ${BUILDDIR}/json; then \ cp -r ${BUILDDIR}/json ${DOCDESTDIR}; \ else \ exit 0; \ fi htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." install-htmlhelp: install-dir if test -d ${BUILDDIR}/htmlhelp; then \ cp -r ${BUILDDIR}/htmlhelp ${DOCDESTDIR}; \ else \ exit 0; \ fi qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/SoS.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/SoS.qhc" install-qthelp: install-dir if test -d ${BUILDDIR}/qthelp; then \ cp -r ${BUILDDIR}/qthelp ${DOCDESTDIR}; \ else \ exit 0; \ fi devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/SoS" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/SoS" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." install-epub: install-dir if test -d ${BUILDDIR}/epub; then \ cp -r ${BUILDDIR}/epub ${DOCDESTDIR}; \ else \ exit 0; \ fi latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." install-latex: install-dir if test -d ${BUILDDIR}/latex; then \ cp -r ${BUILDDIR}/latex ${DOCDESTDIR}; \ else \ exit 0; \ fi latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." install-text: install-dir if test -d ${BUILDDIR}/text; then \ cp -r ${BUILDDIR}/text ${DOCDESTDIR}; \ else \ exit 0; \ fi man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." install-man: if test -d ${BUILDDIR}/man; then \ gzip -c ${BUILDDIR}/man/sos.1 > ${BUILDDIR}/man/sos.1.gz; \ install -m644 ${BUILDDIR}/man/sos.1.gz $(DESTDIR)/usr/share/man/man1; \ else \ exit 0; \ fi texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." install-texinfo: install-dir if test -d ${BUILDDIR}/texinfo; then \ cp -r ${BUILDDIR}/texinfo ${DOCDESTDIR}; \ else \ exit 0; \ fi info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." install-info: install-dir install-texinfo gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." install-gettext: install-dir if test -d ${BUILDDIR}/locale; then \ cp -r ${BUILDDIR}/locale ${DOCDESTDIR}; \ else \ exit 0; \ fi changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." install-changes: install-dir if test -d ${BUILDDIR}/changes; then \ cp -r ${BUILDDIR}/changes ${DOCDESTDIR}; \ else \ exit 0; \ fi linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." install-linkcheck: install-dir if test -d ${BUILDDIR}/linkcheck; then \ cp -r ${BUILDDIR}/linkcheck ${DOCDESTDIR}; \ else \ exit 0; \ fi doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." install-doctest: install-dir if test -d ${BUILDDIR}/doctest; then \ cp -r ${BUILDDIR}/doctest ${DOCDESTDIR}; \ else \ exit 0; \ fi xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." install-xml: install-dir if test -d ${BUILDDIR}/xml; then \ cp -r ${BUILDDIR}/xml ${DOCDESTDIR}; \ else \ exit 0; \ fi pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." install-pseudoxml: install-dir if test -d ${BUILDDIR}/pseudoxml; then \ cp -r ${BUILDDIR}/pseudoxml ${DOCDESTDIR}; \ else \ exit 0; \ fi install: install-html install-dirhtml install-singlehtml install-pickle install-json install-htmlhelp install-qthelp install-epub install-latex install-text install-man install-texinfo install-info install-gettext install-changes install-linkcheck install-doctest install-xml install-pseudoxml sosreport-3.5/docs/policies.rst0000644000175000017500000000026113200603014016530 0ustar cariboucaribou``sos.policies`` --- Policy Interface ===================================== .. automodule:: sos.policies :noindex: :members: :undoc-members: :show-inheritance: sosreport-3.5/docs/_build/0000755000175000017500000000000013203254525015442 5ustar cariboucaribousosreport-3.5/docs/_build/html/0000755000175000017500000000000013203254524016405 5ustar cariboucaribousosreport-3.5/docs/_build/doctrees/0000755000175000017500000000000013203254525017252 5ustar cariboucaribousosreport-3.5/docs/plugins.rst0000644000175000017500000000025613073155336016427 0ustar cariboucaribou``sos.plugins`` --- Plugin Interface ==================================== .. automodule:: sos.plugins :noindex: :members: :undoc-members: :show-inheritance: sosreport-3.5/docs/index.rst0000644000175000017500000000507113073155336016055 0ustar cariboucaribouSoS === Sos is an extensible, portable, support data collection tool primarily aimed at Linux distributions and other UNIX-like operating systems. This is the SoS developer documentation, for user documentation refer to: https://github.com/sosreport/sos/wiki This project is hosted at: http://github.com/sosreport/sos For the latest version, to contribute, and for more information, please visit the project pages or join the mailing list. To clone the current master (development) branch run: .. code:: git clone git://github.com/sosreport/sos.git Reporting bugs ^^^^^^^^^^^^^^ Please report bugs via the mailing list or by opening an issue in the GitHub Issue Tracker Mailing list ^^^^^^^^^^^^^ `sos-devel `_ is the mailing list for any sos-related questions and discussion. Patch submissions and reviews are welcome too. Patches and pull requests ^^^^^^^^^^^^^^^^^^^^^^^^^ Patches can be submitted via the mailing list or as GitHub pull requests. If using GitHub please make sure your branch applies to the current master as a 'fast forward' merge (i.e. without creating a merge commit). Use the git rebase command to update your branch to the current master if necessary. Documentation ============= User and API `documentation `_ is automatically generated using `Sphinx `_ and `Read the Docs `_. Wiki ^^^^ `How to write a plugin `_ `How to write a policy `_ `Plugin options `_ To help get your changes merged quickly with as few revisions as possible please refer to the `Contributor Guidelines `_ when submitting patches or pull requests. Installation ============ Manual Installation ^^^^^^^^^^^^^^^^^^^ .. code:: to install locally (as root) ==> make install to build an rpm ==> make rpm to build a deb ==> make deb Pre-built Packaging ^^^^^^^^^^^^^^^^^^^ Fedora/RHEL users install via yum: ``yum install sos`` Debian(Sid) users install via apt: ``apt-get install sosreport`` Ubuntu(Saucy 13.10 and above) users install via apt: ``sudo apt-get install sosreport`` API === Plugin Reference ^^^^^^^^^^^^^^^^ .. toctree:: :maxdepth: 2 plugins Core Reference ^^^^^^^^^^^^^^ .. toctree:: :maxdepth: 2 archive policies reporting utilities sosreport-3.5/docs/archive.rst0000644000175000017500000000026013073155336016362 0ustar cariboucaribou``sos.archive`` --- Archive Interface ===================================== .. automodule:: sos.archive :noindex: :members: :undoc-members: :show-inheritance: sosreport-3.5/docs/utilities.rst0000644000175000017500000000027013073155336016755 0ustar cariboucaribou``sos.utilities`` --- Utilites Interface ======================================== .. automodule:: sos.utilities :noindex: :members: :undoc-members: :show-inheritance: sosreport-3.5/docs/conf.py0000644000175000017500000002005413200603014015470 0ustar cariboucaribou#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # SoS documentation build configuration file, created by # sphinx-quickstart on Fri Aug 1 11:43:30 2014. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) sys.path.insert(0, os.path.abspath('..')) import sos # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = 'SoS' copyright = '2014, Bryn Reeves' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '3.2' # The full version, including alpha/beta/rc tags. release = '3.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = [] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'SoSdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'SoS.tex', 'SoS Documentation', 'Bryn Reeves', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'sos', 'SoS Documentation', ['Bryn Reeves'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'SoS', 'SoS Documentation', 'Bryn Reeves', 'SoS', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False sosreport-3.5/sos.conf0000644000175000017500000000014413073155336014733 0ustar cariboucaribou[plugins] #disable = rpm, selinux, dovecot [tunables] #rpm.rpmva = off #general.syslogsize = 15 sosreport-3.5/sos.spec0000644000175000017500000006133513203300002014722 0ustar cariboucaribou%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} Summary: A set of tools to gather troubleshooting information from a system Name: sos Version: 3.5 Release: 1%{?dist} Group: Applications/System Source0: http://people.redhat.com/breeves/sos/releases/sos-%{version}.tar.gz License: GPLv2+ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot BuildArch: noarch Url: http://fedorahosted.org/sos BuildRequires: python-devel BuildRequires: gettext BuildRequires: python-six Requires: libxml2-python Requires: rpm-python Requires: tar Requires: bzip2 Requires: xz Requires: python-six %description Sos is a set of tools that gathers information about system hardware and configuration. The information can then be used for diagnostic purposes and debugging. Sos is commonly used to help support technicians and developers. %prep %setup -q %build make %install rm -rf ${RPM_BUILD_ROOT} make DESTDIR=${RPM_BUILD_ROOT} install %find_lang %{name} || echo 0 %clean rm -rf ${RPM_BUILD_ROOT} %files -f %{name}.lang %defattr(-,root,root,-) %{_sbindir}/sosreport %{_datadir}/%{name} %{python_sitelib}/* %{_mandir}/man1/* %{_mandir}/man5/* %doc AUTHORS README.md LICENSE %doc /usr/share/doc/sos/html %config(noreplace) %{_sysconfdir}/sos.conf %changelog * Thu Nov 02 2017 Bryn M. Reeves = 3.5 - New upstream release * Tue Mar 28 2017 Bryn M. Reeves = 3.4 - New upstream release * Wed Jun 29 2016 Bryn M. Reeves = 3.3 - New upstream release * Tue Sep 30 2014 Bryn M. Reeves = 3.2 - New upstream release * Wed Sep 17 2014 Bryn M. Reeves = 3.2-beta1 - New upstream beta release * Thu Jun 12 2014 Bryn M. Reeves = 3.2-alpha1 - New upstream alpha release * Mon Jan 27 2014 Bryn M. Reeves = 3.1-1 - New upstream release * Mon Jun 10 2013 Bryn M. Reeves = 3.0-1 - New upstream release * Thu May 23 2013 Bryn M. Reeves = 2.2-39 - Always invoke tar with '-f-' option Resolves: bz966602 * Mon Jan 21 2013 Bryn M. Reeves = 2.2-38 - Fix interactive mode regression when --ticket unspecified Resolves: bz822113 * Fri Jan 18 2013 Bryn M. Reeves = 2.2-37 - Fix propagation of --ticket parameter in interactive mode Resolves: bz822113 * Thu Jan 17 2013 Bryn M. Reeves = 2.2-36 - Revert OpenStack patch Resolves: bz840057 * Wed Jan 9 2013 Bryn M. Reeves = 2.2-35 - Report --name and --ticket values as defaults Resolves: bz822113 - Fix device-mapper command execution logging Resolves: bz824378 - Fix data collection and rename PostreSQL module to pgsql Resolves: bz852049 * Fri Oct 19 2012 Bryn M. Reeves = 2.2-34 - Add support for content delivery hosts to RHUI module Resolves: bz821323 * Thu Oct 18 2012 Bryn M. Reeves = 2.2-33 - Add Red Hat Update Infrastructure module Resolves: bz821323 - Collect /proc/iomem in hardware module Resolves: bz840975 - Collect subscription-manager output in general module Resolves: bz825968 - Collect rhsm log files in general module Resolves: bz826312 - Fix exception in gluster module on non-gluster systems Resolves: bz849546 - Fix exception in psql module when dbname is not given Resolves: bz852049 * Wed Oct 17 2012 Bryn M. Reeves = 2.2-32 - Collect /proc/pagetypeinfo in memory module Resolves: bz809727 - Strip trailing newline from command output Resolves: bz850433 - Add sanlock module Resolves: bz850779 - Do not collect archived accounting files in psacct module Resolves: bz850542 - Call spacewalk-debug from rhn module to collect satellite data Resolves: bz859142 * Mon Oct 15 2012 Bryn M. Reeves = 2.2-31 - Avoid calling volume status when collecting gluster statedumps Resolves: bz849546 - Use a default report name if --name is empty Resolves: bz822113 - Quote tilde characters passed to shell in RPM module Resolves: bz821005 - Collect KDC and named configuration in ipa module Resolves: bz825149 - Sanitize hostname characters before using as report path Resolves: bz822174 - Collect /etc/multipath in device-mapper module Resolves: bz817093 - New plug-in for PostgreSQL Resolves: bz852049 - Add OpenStack module Resolves: bz840057 - Avoid deprecated sysctls in /proc/sys/net Resolves: bz834594 - Fix error logging when calling external programs Resolves: bz824378 - Use ip instead of ifconfig to generate network interface lists Resolves: bz833170 * Wed May 23 2012 Bryn M. Reeves = 2.2-29 - Collect the swift configuration directory in gluster module Resolves: bz822442 - Update IPA module and related plug-ins Resolves: bz812395 * Fri May 18 2012 Bryn M. Reeves = 2.2-28 - Collect mcelog files in the hardware module Resolves: bz810702 * Wed May 02 2012 Bryn M. Reeves = 2.2-27 - Add nfs statedump collection to gluster module Resolves: bz752549 * Tue May 01 2012 Bryn M. Reeves = 2.2-26 - Use wildcard to match possible libvirt log paths Resolves: bz814474 * Mon Apr 23 2012 Bryn M. Reeves = 2.2-25 - Add forbidden paths for new location of gluster private keys Resolves: bz752549 * Fri Mar 9 2012 Bryn M. Reeves = 2.2-24 - Fix katello and aeolus command string syntax Resolves: bz752666 - Remove stray hunk from gluster module patch Resolves: bz784061 * Thu Mar 8 2012 Bryn M. Reeves = 2.2-22 - Correct aeolus debug invocation in CloudForms module Resolves: bz752666 - Update gluster module for gluster-3.3 Resolves: bz784061 - Add additional command output to gluster module Resolves: bz768641 - Add support for collecting gluster configuration and logs Resolves: bz752549 * Wed Mar 7 2012 Bryn M. Reeves = 2.2-19 - Collect additional diagnostic information for realtime systems Resolves: bz789096 - Improve sanitization of RHN user and case number in report name Resolves: bz771393 - Fix verbose output and debug logging Resolves: bz782339 - Add basic support for CloudForms data collection Resolves: bz752666 - Add support for Subscription Asset Manager diagnostics Resolves: bz752670 * Tue Mar 6 2012 Bryn M. Reeves = 2.2-18 - Collect fence_virt.conf in cluster module Resolves: bz760995 - Fix collection of /proc/net directory tree Resolves: bz730641 - Gather output of cpufreq-info when present Resolves: bz760424 - Fix brctl showstp output when bridges contain multiple interfaces Resolves: bz751273 - Add /etc/modprobe.d to kernel module Resolves: bz749919 - Ensure relative symlink targets are correctly handled when copying Resolves: bz782589 - Fix satellite and proxy package detection in rhn plugin Resolves: bz749262 - Collect stderr output from external commands Resolves: bz739080 - Collect /proc/cgroups in the cgroups module Resolve: bz784874 - Collect /proc/irq in the kernel module Resolves: bz784862 - Fix installed-rpms formatting for long package names Resolves: bz767827 - Add symbolic links for truncated log files Resolves: bz766583 - Collect non-standard syslog and rsyslog log files Resolves: bz771501 - Use correct paths for tomcat6 in RHN module Resolves: bz749279 - Obscure root password if present in anacond-ks.cfg Resolves: bz790402 - Do not accept embedded forward slashes in RHN usernames Resolves: bz771393 - Add new sunrpc module to collect rpcinfo for gluster systems Resolves: bz784061 * Tue Nov 1 2011 Bryn M. Reeves = 2.2-17 - Do not collect subscription manager keys in general plugin Resolves: bz750607 * Fri Sep 23 2011 Bryn M. Reeves = 2.2-16 - Fix execution of RHN hardware.py from hardware plugin Resolves: bz736718 - Fix hardware plugin to support new lsusb path Resolves: bz691477 * Fri Sep 09 2011 Bryn M. Reeves = 2.2-15 - Fix brctl collection when a bridge contains no interfaces Resolves: bz697899 - Fix up2dateclient path in hardware plugin Resolves: bz736718 * Mon Aug 15 2011 Bryn M. Reeves = 2.2-14 - Collect brctl show and showstp output Resolves: bz697899 - Collect nslcd.conf in ldap plugin Resolves: bz682124 * Sun Aug 14 2011 Bryn M. Reeves = 2.2-11 - Truncate files that exceed specified size limit Resolves: bz683219 - Add support for collecting Red Hat Subscrition Manager configuration Resolves: bz714293 - Collect /etc/init on systems using upstart Resolves: bz694813 - Don't strip whitespace from output of external programs Resolves: bz713449 - Collect ipv6 neighbour table in network module Resolves: bz721163 - Collect basic cgroups configuration data Resolves: bz729455 * Sat Aug 13 2011 Bryn M. Reeves = 2.2-10 - Fix collection of data from LVM2 reporting tools in devicemapper plugin Resolves: bz704383 - Add /proc/vmmemctl collection to vmware plugin Resolves: bz709491 * Fri Aug 12 2011 Bryn M. Reeves = 2.2-9 - Collect yum repository list by default Resolves: bz600813 - Add basic Infiniband plugin Resolves: bz673244 - Add plugin for scsi-target-utils iSCSI target Resolves: bz677124 - Fix autofs plugin LC_ALL usage Resolves: bz683404 - Fix collection of lsusb and add collection of -t and -v outputs Resolves: bz691477 - Extend data collection by qpidd plugin Resolves: bz726360 - Add ethtool pause, coalesce and ring (-a, -c, -g) options to network plugin Resolves: bz726427 * Thu Apr 07 2011 Bryn M. Reeves = 2.2-8 - Use sha256 for report digest when operating in FIPS mode Resolves: bz689387 * Tue Apr 05 2011 Bryn M. Reeves = 2.2-7 - Fix parted and dumpe2fs output on s390 Resolves: bz622784 * Fri Feb 25 2011 Bryn M. Reeves = 2.2-6 - Fix collection of chkconfig output in startup.py Resolves: bz659467 - Collect /etc/dhcp in dhcp.py plugin Resolves: bz676522 - Collect dmsetup ls --tree output in devicemapper.py Resolves: bz675559 - Collect lsblk output in filesys.py Resolves: bz679433 * Thu Feb 24 2011 Bryn M. Reeves = 2.2-4 - Fix collection of logs and config files in sssd.py Resolves: bz624162 - Add support for collecting entitlement certificates in rhn.py Resolves: bz678665 * Thu Feb 03 2011 Bryn M. Reeves = 2.2-3 - Fix cluster plugin dlm lockdump for el6 Resolves: bz622407 - Add sssd plugin to collect configuration and logs Resolves: bz624162 - Collect /etc/anacrontab in system plugin Resolves: bz622527 - Correct handling of redhat-release for el6 Resolves: bz622528 * Thu Jul 29 2010 Adam Stokes = 2.2-2 - Resolves: bz582259 - Resolves: bz585942 - Resolves: bz584253 - Resolves: bz581817 * Thu Jun 10 2010 Adam Stokes = 2.2-0 - Resolves: bz581921 - Resolves: bz584253 - Resolves: bz562651 - Resolves: bz566170 - Resolves: bz586450 - Resolves: bz588223 - Resolves: bz559737 - Resolves: bz586405 - Resolves: bz598978 - Resolves: bz584763 * Wed Apr 28 2010 Adam Stokes = 2.1-0 - Resolves: bz585923 - Resolves: bz585942 - Resolves: bz586409 - Resolves: bz586389 - Resolves: bz548096 - Resolves: bz557828 - Resolves: bz563637 - Resolves: bz584253 - Resolves: bz462823 - Resolves: bz528881 - Resolves: bz566170 - Resolves: bz578787 - Resolves: bz581817 - Resolves: bz581826 - Resolves: bz584695 - Resolves: bz568637 - Resolves: bz584767 - Resolves: bz586370 * Mon Apr 12 2010 Adam Stokes = 2.0-0 - Resolves: bz580015 * Tue Mar 30 2010 Adam Stokes = 1.9-3 - fix setup.py to autocompile translations and man pages - rebase 1.9 * Fri Mar 19 2010 Adam Stokes = 1.9-2 - updated translations * Thu Mar 04 2010 Adam Stokes = 1.9-1 - version bump 1.9 - replaced compression utility with xz - strip threading/multiprocessing - simplified progress indicator - pylint update - put global vars in class container - unittests - simple profiling - make use of xgettext as pygettext is deprecated * Mon Jan 18 2010 Adam Stokes = 1.8-21 - more sanitizing options for log files - rhbz fixes from RHEL version merged into trunk - progressbar update * Tue Nov 19 2009 Adam Stokes = 1.8-20 - dont copy unwanted files due to symlinks - More plugin enhancements * Tue Nov 5 2009 Adam Stokes = 1.8-18 - Option to enable selinux fixfiles check - Start of replacing Thread module with multiprocessing - Update translations - More checks against conf file versus command line opts * Tue Sep 9 2009 Adam Stokes = 1.8-16 - Update rh-upload-core to rh-upload and allows general files - Fix cluster plugin with pwd mangling invalidating xml - Cluster support detecting invalid fence_id and fence states - Read variables from conf file * Thu Jul 23 2009 Adam Stokes = 1.8-14 - resolves: rhbz512536 wrong group in spec file - resolves: rhbz498398 A series of refactoring patches to sos - resolves: rhbz501149 A series of refactoring patches to sos (2) - resolves: rhbz503804 remove obsolete translation - resolves: rhbz502455 tricking sosreport into rm -rf / - resolves: rhbz501146 branding in fedora * Mon Jul 20 2009 Adam Stokes = 1.8-13 - Add requirements for tar,bzip2 during minimal installs - More merges from reports against RHEL version of plugins - Remove unecessary definition of localdir in spec * Wed May 05 2009 Adam Stokes - 1.8-11 - Remove all instances of sysrq - Consistent macro usage in spec * Wed Feb 25 2009 Fedora Release Engineering - 1.8-10 - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild * Mon Dec 29 2008 Adam Stokes - 1.8-5 - removed source defines as python manifest handles this * Fri Dec 19 2008 Adam Stokes - 1.8-4 - spec cleanup, fixed license, source - reworked Makefile to build properly * Thu Oct 23 2008 Adam Stokes - 1.8-1 - Resolves: bz459845 collect krb5.conf - Resolves: bz457880 include output of xm list and xm list --long - Resolves: bz457919 add support for openswan and ipsec-tools - Resolves: bz456378 capture elilo configuration - Resolves: bz445007 s390 support - Resolves: bz371251 hangs when running with a xen kernel where xend has not been started - Resolves: bz452705 Add /root/anaconda-ks-cfg to sosreport archive - Resolves: bz445510 Do not rely on env to execute python - Resolves: bz446868 add support for emc devices - Resolves: bz453797 fails to generate fdisk -l - Resolves: bz433183 does not collect ext3 information - Resolves: bz444838 systool is passed deprecated arguments - Resolves: bz455096 add %{INSTALLTIME:date} to rpm --qf collection - Resolves: bz332211 avoid hazardous filenames * Wed Nov 21 2007 Navid Sheikhol-Eslami - 1.8-0 - Resolves: bz368261 sosGetCommandOutput() does not block on hung processes - Resolves: bz361861 work-around missing traceback.format_exc() in RHEL4 - Resolves: bz394781 device-mapper: use /sbin/lvm_dump to collect dm related info - Resolves: bz386691 unattended --batch option - Resolves: bz371251 sos could hang when accessing /sys/hypervisor/uuid - selinux: always collect sestatus - added many languages - added --debug option which causes exceptions not to be trapped - updated to sysreport-1.4.3-13.el5 - ftp upload to dropbox with --upload - cluster: major rewrite to support different versions of RHEL - cluster: check rg_test for errors - minor changes in various plug-ins (yum, networking, process, kernel) - fixed some exceptions in threads which were not properly trapped - veritas: don't run rpm -qa every time - using rpm's python bindings instead of external binary - corrected autofs and ldap plugin that were failing when debug option was not found in config file. - implemented built-in checkdebug() that uses self.files and self.packages to make the decision - missing binaries are properly detected now. - better doExitCode handling - fixed problem with rpm module intercepting SIGINT - error when user specifies an invalid plugin or plugin option - named: fixed indentation - replaced isOptionEnabled() with getOption() - tune2fs and fdisk were not always run against the correct devices/mountpoint - added gpg key to package - updated README with new svn repo and contributors - updated manpage - better signal handling - caching of rpm -q outputs - report filename includes rhnUsername if available - report encryption via gpg and support pubkey - autofs: removed redundant files - filesys: better handling of removable devices - added sosReadFile() returns a file's contents - return after looping inside a directory - collect udevinfo for each block device - simply collect output of fdisk -l in one go - handle sysreport invocation properly (warn if shell is interactive, otherwise spawn sysreport.legacy) - progress bar don't show 100% until finished() is called - Resolves: bz238778 added lspci -t - now runs on RHEL3 as well (python 2.2) - replaced commonPrefix() with faster code - filesys: one fdisk -l for all - selinux: collect fixfilex check output - devicemapper: collect udevinfo for all block devices - cluster: validate node names according to RFC 2181 - systemtap: cleaned up and added checkenabled() method - added kdump plugin - added collection of /etc/inittab - Resolves: bz332151 apply regex to case number in sysreport for RHEL4 - Resolves: bz332211 apply regex to case number in sysreport for RHEL5 - Resolves: bz400111 sos incorrectly reports cluster data in SMP machine * Wed Aug 13 2007 Navid Sheikhol-Eslami - 1.7-8 - added README.rh-upload-core * Mon Aug 13 2007 Navid Sheikhol-Eslami - 1.7-7 - Resolves: bz251927 SOS errata needs to be respin to match 4.6 code base - added extras/rh-upload-core script from David Mair * Mon Aug 9 2007 Navid Sheikhol-Eslami - 1.7-6 - more language fixes - added arabic, italian and french - package prepared for release - included sysreport as sysreport.legacy * Mon Aug 9 2007 Navid Sheikhol-Eslami - 1.7-5 - package obsoletes sysreport and creates a link pointing to sosreport - added some commands in cluster and process plugins - fixed html output (wrong links to cmds, thanks streeter) - process: back down sleep if D state doesn't change - Resolves: bz241277 Yum Plugin for sos - Resolves: bz247520 Spelling mistake in sosreport output - Resolves: bz247531 Feature: plugin to gather initial ramdisk scripts - Resolves: bz248252 sos to support language localization - Resolves: bz241282 Make SOS for RHEL 4 * Mon Aug 1 2007 Navid Sheikhol-Eslami - 1.7-4 - catch KeyboardInterrupt when entering sosreport name - added color output for increased readability - list was sorted twice, removing latter .sort() * Mon Jul 31 2007 Navid Sheikhol-Eslami - 1.7-3 - added preliminary problem diagnosis support - better i18n initialization - better user messages - more progressbar fixes - catch and log python exceptions in report - use python native commands to create symlinks - limit concurrent running threads * Mon Jul 28 2007 Navid Sheikhol-Eslami - 1.7-2 - initial language localization support - added italian translation * Mon Jul 16 2007 Navid Sheikhol-Eslami - 1.7-1 - split up command outputs in sub-directories (sos_command/plugin/command instead of sos_command/plugin.command) - fixed doExitCode() calling thread.wait() instead of join() - curses menu is disabled by default - multithreading is enabled by default - major progressbar changes (now has ETA) - multithreading fixes - plugins class descriptions shortened to fix better in --list-plugins - rpm -Va in plugins/rpm.py sets eta_weight to 200 (plugin 200 longer than other plugins, for ETA calculation) - beautified command output filenames in makeCommandFilename() * Mon Jul 12 2007 Navid Sheikhol-Eslami - 1.7-0 - curses menu disabled by default (enable with -c) - sosreport output friendlier to the user (and similar to sysreport) - smarter plugin listing which also shows options and disable/enabled plugins - require root permissions only for actual sosreport generation - fix in -k where option value was treated as string instead of int - made progressbar wider (60 chars) - selinux plugin is enabled only if selinux is also enabled on the system - made some errors less verbose to the user - made sosreport not copy files pointed by symbolic links (same as sysreport, we don't need /usr/bin/X or /sbin/ifup) - copy links as links (cp -P) - added plugin get_description() that returns a short decription for the plugin - guess sosreport name from system's name * Mon Jul 5 2007 Navid Sheikhol-Eslami - 1.6-5 - Yet more fixes to make package Fedora compliant. * Mon Jul 5 2007 Navid Sheikhol-Eslami - 1.6-4 - More fixes to make package Fedora compliant. * Mon Jul 2 2007 Navid Sheikhol-Eslami - 1.6-3 - Other fixes to make package Fedora compliant. * Mon Jul 2 2007 Navid Sheikhol-Eslami - 1.6-2 - Minor fixes. * Mon Jul 2 2007 Navid Sheikhol-Eslami - 1.6-1 - Beautified output of --list-plugins. - GPL licence is now included in the package. - added python-devel requirement for building package - Resolves: bz241282 fixed incompatibility with python from RHEL4 * Fri May 25 2007 Steve Conklin - 1.5-1 - Bumped version * Fri May 25 2007 Steve Conklin - 1.4-2 - Fixed a backtrace on nonexistent file in kernel plugin (thanks, David Robinson) * Mon Apr 30 2007 Steve Conklin - 1.4-1 - Fixed an error in option handling - Forced the file generated by traceroute to not end in .com - Fixed a problem with manpage - Added optional traceroute collection to networking plugin - Added clalance's patch to gather iptables info. - Fixes to the device-mapper plugin - Fixed a problem with installation of man page * Mon Apr 16 2007 Steve Conklin - 1.3-3 - including patches to fix the following: - Resolves: bz219745 sosreport needs a man page - Resolves: bz219667 sosreport does not terminate cleanly on ^C - Resolves: bz233375 Make SOS flag the situation when running on a fully virtu... - Resolves: bz234873 rhel5 sos needs to include rpm-va by default - Resolves: bz219669 sosreport multi-threaded option sometimes fails - Resolves: bz219671 RFE for sosreport - allow specification of plugins to be run - Resolves: bz219672 RFE - show progress while sosreport is running - Resolves: bz219673 Add xen information gathering to sosreport - Resolves: bz219675 Collect information related to the new driver update model - Resolves: bz219877 'Cancel' button during option selection only cancels sele... * Tue Feb 20 2007 John Berninger - 1.3-2 - Add man page * Fri Dec 15 2006 Steve Conklin - 1.3-1 - really fixed bz_219654 * Fri Dec 15 2006 Steve Conklin - 1.2-1 - fixed a build problem * Fri Dec 15 2006 Steve Conklin - 1.1-1 - Tighten permissions of tmp directory so only readable by creator bz_219657 - Don't print message 'Problem at path ...' bz_219654 - Removed useless message bz_219670 - Preserve file modification times bz_219674 - Removed unneeded message about files on copyProhibitedList bz_219712 * Wed Aug 30 2006 Steve Conklin - 1.0-1 - Seperated upstream and RPM versioning * Mon Aug 21 2006 Steve Conklin - 0.1-11 - Code cleanup, fixed a regression in threading * Mon Aug 14 2006 Steve Conklin - 0.1-10 - minor bugfixes, added miltithreading option, setup now quiet * Mon Jul 17 2006 Steve Conklin - 0.1-9 - migrated to svn on 108.redhat.com, fixed a problem with command output linking in report * Mon Jun 19 2006 Steve Conklin - 0.1-6 - Added LICENSE file containing GPL * Wed May 31 2006 Steve Conklin - 0.1-5 - Added fixes to network plugin and prepped for Fedora submission * Wed May 31 2006 John Berninger - 0.1-4 - Reconsolidated subpackages into one package per discussion with sconklin * Mon May 22 2006 John Berninger - 0.1-3 - Added ftp, ldap, mail, named, samba, squid SOS plugins - Fixed various errors in kernel and hardware plugins * Mon May 22 2006 John Benringer - 0.1-2 - split off cluster plugin into subpackage - correct file payload lists * Mon May 22 2006 John Berninger - 0.1-1 - initial package build sosreport-3.5/AUTHORS0000644000175000017500000001200413203300002014277 0ustar cariboucaribouIndividuals ----------- Aaron Conole Abhijeet Kasurde Adam Stokes Adrien Kunysz Alan Pevec Alexandru Juncu Ante Karamatic Archit Sharma Aruna Balakrishnaiah Assaf Muller Ben Turner Bharani C.V. Bill Yodlowsky Brent Eagles Bryan Quigley Bryn M. Reeves Chris J Arges Chris Johnston Chris Newcomer Christy Perez Coty Sutherland Dimitri John Ledkov Eduardo Damato Edward Hope-Morley Eoghan Glynn Eric Desrochers Eric Rich Eric Williams Eugene Teo Felipe Reyes Flaper Fesp Flavio Leitner Flavio Percoco Frank Ch. Eigler Gary Kotton Gaël Chamoulaud Germano Veit Michel Guy Streeter Günther Deschner Harald Klein Hisanobu Okuda Jacob Wen Jake Hunsaker James Hunt Jan Grant Jan Pokorný Jeff Dutton Jeff Peeler Jeff Welch Jeremy Agee Jeremy Crafts Jeremy Eder Jesse Jaggars Jian Wen Jiri Popelka Jirka Hladky Joel Stanley Joey Boggs John Berninger John Haxby Jon Magrini Jon Stanley Jorge Niedbalski Jose Castillo Justin Payne Justin Stephenson Kamalesh Babulal Keigo Noha Keith Kearnan Keith Robertson Kenneth Koski Kent Lamb Kevin Traynor Lee Yarwood Leno Hou Louis Bouchard Luca Miccini Luigi Toscano Lukas Herbolt Lukas Zapletal Major Hayden Marc Sauton Martin Frodl Martin Schuppert Michael Adam Michael Kerrin Michal Srb Michele Baldessari Mukesh Ojha Navid Sheikhol-Eslami Neependra Khare Nijin Ashok Pablo Iranzo Gómez Patrick Talbert Pavel Moravec Pep Turro Mauri Peter Portante Pierguido Lambri Pierre Amadio Pierre Carrier Piotr Drąg Poornima Pratik Bandarkar Ranjith Rajaram Raphael Badin Richard Brantley Robb Manes Rohan Kanade Sachin Sadique Puthen Samuel Mendoza-Jonas Sandro Bonazzola Shane Bradley Shijoe George Soumya Koduri Steve Conklin Tim Speetjens Tomas Petr Tomas Smetana Tomas Tomecek Vasant Hegde Xavier Queralt Yedidyah Bar David amitg.b14@gmail.com galstrom21 hari gowtham jbainbri jhjaggars mulhern ncoghlan qsn spandey tanaka_733 tiwillia@redhat.com Companies --------- Red Hat, Inc. Rackspace US, Inc. EMC Corporation Canonical, Ltd. IBM Corporation Hewlett-Packard Development Company, L.P. Oracle Corporation Organizations ------------- The Linux Foundation Sambasosreport-3.5/po/0000755000175000017500000000000013203300002013650 5ustar cariboucaribousosreport-3.5/po/nn.po0000644000175000017500000000563613200603014014643 0ustar cariboucaribou# Norwegian Nynorsk translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/fr.po0000644000175000017500000000754313200603014014636 0ustar cariboucaribou# translation of fr.po to French # French translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Decroux Fabien , 2007. # Thomas Canniot , 2010. msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-20 21:28+0100\n" "Last-Translator: Thomas Canniot \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Lokalize 1.0\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (version %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "le plugin %s n'a pas été validé, ignoré" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "le plugin %s n'a pas été validé, ignoré" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "le plugin %s ne s'installe pas, ignoré" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "le plugin %s ne s'installe pas, ignoré" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "aucun plugin valide n'a été trouvé" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Les plugins suivants sont activés :" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Aucun plugin n'est activé." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Les plugins suivants sont désactivés :" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Les options du plugin suivant sont disponibles :" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Aucune option n'est disponible pour ce plugin." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "aucun plugin valide n'a été trouvé" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Les options du plugin suivant sont disponibles :" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Appuyez sur Entrée pour continuer ou CTRL-C pour quitter.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Cryptage de l'archive..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Lancement des extensions. Veuillez patienter..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Création d'une archive compressée..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "aucun plugin valide n'a été activé" sosreport-3.5/po/bn_IN.po0000644000175000017500000001210313200603014015200 0ustar cariboucaribou# translation of sos.trunk.po to Bengali INDIA # Bengali translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Runa Bhattacharjee , 2007, 2010. msgid "" msgstr "" "Project-Id-Version: sos.trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-08-05 13:46+0530\n" "Last-Translator: Runa Bhattacharjee \n" "Language-Team: Bengali INDIA \n" "Language: bn_IN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (সংস্করণ %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "প্লাগ-ইন %s অনুমোদন করা যায়নি, উপেক্ষা করা হচ্ছে" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "প্লাগ-ইন %s অনুমোদন করা যায়নি, উপেক্ষা করা হচ্ছে" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "প্লাগ-ইন %s ইনস্টল করা যায়নি, উপেক্ষা করা হচ্ছে " #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "প্লাগ-ইন %s ইনস্টল করা যায়নি, উপেক্ষা করা হচ্ছে " #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "কোনো বৈধ প্লাগ-ইন পাওয়া যায়নি" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "নিম্নলিখিত প্লাগ-ইনগুলি বর্তমানে সক্রিয় করা হয়েছে:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "কোনো প্লাগ-ইন সক্রিয় নেই।" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "নিম্নলিখিত প্লাগ-ইনগুলি বর্তমানে নিষ্ক্রিয় অবস্থায় রয়েছে:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "প্লাগ-ইন সংক্রান্ত নিম্নলিখিত বিকল্পগুলি উপলব্ধ রয়েছে:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "প্লাগ-ইন সংক্রান্ত কোনো বিকল্প উপলব্ধ নয়।" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "কোনো বৈধ প্লাগ-ইন পাওয়া যায়নি" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "প্লাগ-ইন সংক্রান্ত নিম্নলিখিত বিকল্পগুলি উপলব্ধ রয়েছে:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "এগিয়ে চলার জন্য ENTER টিপুন অথবা প্রস্থান করতে CTRL-C টিপুন।\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "আর্কাইভ এনক্রিপ্ট করা হচ্ছে..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " প্লাগ-ইন সঞ্চালিত হচ্ছে। অনুগ্রহ করে অপেক্ষা করুন ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "কমপ্রেস করা আর্কাইভ নির্মাণ করুন..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "কোনো বৈধ প্লাগ-ইন সক্রিয় করা হয়নি" sosreport-3.5/po/it.po0000644000175000017500000000715113200603014014636 0ustar cariboucaribou# translation of it.po to # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: it\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-11-06 15:02+1000\n" "Last-Translator: \n" "Language-Team: \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (versione %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "il plugin %s non é valido e verrà ignorato" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "il plugin %s non é valido e verrà ignorato" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "il plugin %s non si installa, ignorato" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "il plugin %s non si installa, ignorato" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "non é stato trovato nessun plugin valido " #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "I seguenti plugin sono attivi:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Nessun plugin abilitato." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "I seguenti plugin sono disattivati:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Sono disponibili le seguenti opzioni per il plugin:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Nessuna opzione disponibile per il plugin." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "non é stato trovato nessun plugin valido " #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Sono disponibili le seguenti opzioni per il plugin:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Premere INVIO per continuare, o CTRL-C per usicre.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Cifratura dell'archivio, in corso ..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Plugin in esecuzione. Attendere prego ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Creazione di un archivio compresso, in corso ..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "non é stato attivato nessun plugin" sosreport-3.5/po/fi.po0000644000175000017500000000737413200603014014627 0ustar cariboucaribou# Finnish translations for sos package. # Ville-Pekka Vainio , 2009, 2010. msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-28 01:03+0200\n" "Last-Translator: Ville-Pekka Vainio \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (versio %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "liitännäinen %s on virheellinen, ohitetaan" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "liitännäinen %s on virheellinen, ohitetaan" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "liitännäinen %s ei asennu, ohitetaan" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "liitännäinen %s ei asennu, ohitetaan" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "kelvollisia liitännäisiä ei löytynyt" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Seuraavat liitännäiset ovat tällä hetkellä käytössä:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Yhtään liitännäistä ei ole käytössä." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Seuraavat liitännäiset ovat tällä hetkellä poissa käytöstä:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Seuraavat liitännäisen asetukset ovat käytettävissä:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Liitännäisellä ei ole asetuksia." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "kelvollisia liitännäisiä ei löytynyt" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Seuraavat liitännäisen asetukset ovat käytettävissä:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Paina ENTER jatkaaksesi, CTRL-C lopettaaksesi.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Salataan arkistoa..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Suoritetaan liitännäisiä. Odota..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Luodaan pakattua arkistoa..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "yhtään kelvollista liitännäistä ei ole otettu käyttöön" sosreport-3.5/po/sq.po0000644000175000017500000000554613200603014014653 0ustar cariboucaribou# Albanian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/my.po0000644000175000017500000000554513200603014014654 0ustar cariboucaribou# Burmese translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/pa.po0000644000175000017500000001074013200603014014620 0ustar cariboucaribou# translation of pa.po to Punjabi # Punjabi translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # Jaswinder Singh , 2007. # Jaswinder Singh , 2011. msgid "" msgstr "" "Project-Id-Version: pa\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-01-11 15:33+0530\n" "Last-Translator: Jaswinder Singh \n" "Language-Team: PLTG\n" "Language: pa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.6.1\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (ਵਰਜਨ %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "ਪਲੱਗਇਨ %s ਪ੍ਰਮਾਣਿਤ ਨਹੀਂ ਹੈ, ਛੱਡ ਰਿਹਾ ਹੈ" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "ਪਲੱਗਇਨ %s ਪ੍ਰਮਾਣਿਤ ਨਹੀਂ ਹੈ, ਛੱਡ ਰਿਹਾ ਹੈ" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "ਪਲੱਗਇਨ %s ਇੰਸਟਾਲ ਨਹੀਂ ਹੋਇਆ, ਛੱਡ ਰਿਹਾ ਹੈ" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "ਪਲੱਗਇਨ %s ਇੰਸਟਾਲ ਨਹੀਂ ਹੋਇਆ, ਛੱਡ ਰਿਹਾ ਹੈ" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "ਕੋਈ ਯੋਗ ਪਲੱਗਿਨ ਨਹੀਂ ਲੱਭਿਆ" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "ਹੇਠਲੇ ਪਲੱਗਇਨ ਯੋਗ ਕੀਤੇ ਹਨ:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "ਕੋਈ ਪਲੱਗਇਨ ਯੋਗ ਨਹੀਂ ਹੈ।" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "ਹੇਠਲੇ ਪਲੱਗਇਨ ਅਯੋਗ ਹਨ।" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "ਹੇਠਲੀਆਂ ਪਲੱਗਇਨ ਚੋਣਾਂ ਉਪਲੱਬਧ ਹਨ:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "ਕੋਈ ਪਲੱਗਇਨ ਚੋਣ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "ਕੋਈ ਯੋਗ ਪਲੱਗਿਨ ਨਹੀਂ ਲੱਭਿਆ" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "ਹੇਠਲੀਆਂ ਪਲੱਗਇਨ ਚੋਣਾਂ ਉਪਲੱਬਧ ਹਨ:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "ਜਾਰੀ ਰੱਖਣ ਲਈ ENTER ਦਬਾਓ, ਜਾਂ ਬੰਦ ਕਰਨ ਲਈ CTRL-C ਦਬਾਓ।\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "ਆਰਚੀਵ ਇਨਕ੍ਰਿਪਟ ਹੋ ਰਿਹਾ ਹੈ..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " ਪਲੱਗਇਨ ਚਲਾ ਰਿਹਾ। ਉਡੀਕ ਕਰੋ ਜੀ ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "ਸੰਕੁਚਿਤ ਆਰਚੀਵ ਬਣਾ ਰਿਹਾ ਹੈ..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "ਕੋਈ ਸਹੀ ਪਲੱਗਇਨ ਯੋਗ ਨਹੀਂ ਕੀਤਾ" sosreport-3.5/po/sv.po0000644000175000017500000000755113200603014014656 0ustar cariboucaribou# Swedish translations for the sos package. # This file is distributed under the same license as the sos package. # Copyright © 2009-2010 Free Software Foundation, Inc. # Göran Uddeborg , 2009-2010. # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-08-11 22:07+0200\n" "Last-Translator: Göran Uddeborg \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (version %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "insticksmodul %s validerar inte, hoppar över" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "insticksmodul %s validerar inte, hoppar över" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "insticksmodul %s installerar inte, hoppar över" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "insticksmodul %s installerar inte, hoppar över" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "inga giltiga insticksmoduler funna" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Följande insticksmoduler är för närvarande aktiva:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Inga insticksmoduler aktiverade." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Följande insticksmoduler är för närvarande inaktiva:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Följande flaggor för insticksmoduler är tillgängliga:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Inga flaggor för insticksmoduler finns tillgängliga." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "inga giltiga insticksmoduler funna" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Följande flaggor för insticksmoduler är tillgängliga:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Tryck RETUR för att fortsätta, eller CTRL-C för att avbryta.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Krypterar arkiv ..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Kör insticksmoduler. Var god dröj ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Skapar komprimerat arkiv ..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "inga giltiga insticksmoduler var aktiva" sosreport-3.5/po/cy.po0000644000175000017500000000554313200603014014640 0ustar cariboucaribou# Welsh translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/te.po0000644000175000017500000001230013200603014014622 0ustar cariboucaribou# translation of sos.trunk.te.po to Telugu # Telugu translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Krishna Babu K , 2009. # Krishnababu Krothapalli , 2011. msgid "" msgstr "" "Project-Id-Version: sos.trunk.te\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-01-07 17:21+0530\n" "Last-Translator: Krishnababu Krothapalli \n" "Language-Team: Telugu \n" "Language: te\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (వర్షన్ %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "ప్లగ్‌యిన్ %s నిర్ధారించబడలేదు, వదిలివేయుచున్నది" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "ప్లగ్‌యిన్ %s నిర్ధారించబడలేదు, వదిలివేయుచున్నది" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "ప్లగిన్ %s సంస్థాపించబడలేదు, వదిలివేయుచున్నది" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "ప్లగిన్ %s సంస్థాపించబడలేదు, వదిలివేయుచున్నది" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "చెల్లునటువంటి ప్లగిన్సు కనబడలేదు" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "ఈ క్రింది ప్లగిన్సు ప్రస్తుతం చేతనం చేయబడివున్నాయి:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "ఏ ప్లగిన్ చేతనం చేయబడిలేదు." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "క్రింది ప్లగిన్సు ప్రస్తుతం అచేతనం చేయబడివున్నాయి:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "ఈ క్రింది ప్లగిన్ ఐచ్చికాలు అందుబాటులో వున్నాయి:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "ఎటువంటి ప్లగిన్ ఐచ్చికాలు అందుబాటులో లేవు." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "చెల్లునటువంటి ప్లగిన్సు కనబడలేదు" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "ఈ క్రింది ప్లగిన్ ఐచ్చికాలు అందుబాటులో వున్నాయి:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "కొనసాగించుటకు దయచేసి ENTER వత్తండి, లేదా నిష్క్రమించుటకు CTRL-C వత్తండి.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "ఆర్చివ్‌ను ఎన్క్రిప్టు చేయుచున్నది..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " ప్లగిన్స్ నడుపుచున్నది. దయచేసి వేచివుండండి ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "కుదించిన ఆర్చీవ్‌ను సృష్టిస్తోంది..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "చెల్లునటువంటి ప్లగిన్సు చేతనము చేయబడిలేవు" sosreport-3.5/po/zh_CN.po0000644000175000017500000000706113200603014015223 0ustar cariboucaribou# translation of sos.trunk.po to Wei Liu # Chinese translations for PACKAGE package # PACKAGE �ļ���ķ�. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Leah Liu , 2007, 2010. msgid "" msgstr "" "Project-Id-Version: sos.trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-05-28 12:38+1000\n" "Last-Translator: Leah Liu \n" "Language-Team: Wei Liu\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (version %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "插件 %s 无效,跳过" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "插件 %s 无效,跳过" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "未安装插件 %s,跳过" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "未安装插件 %s,跳过" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "未发现可用插件" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "目前已启用了以下插件:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "没有启用插件。" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "目前禁用了以下插件:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "以下插件选项可用:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "没有可用的插件选项。" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "未发现可用插件" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "以下插件选项可用:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "按 ENTER 键继续,或者 CTRL-C 组合键退出。\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "为归档加密......" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " 正在运行插件,请等候 ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "生成压缩归档......" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "没有启用任何可用插件" sosreport-3.5/po/tr.po0000644000175000017500000000747013200603014014653 0ustar cariboucaribou# Turkish translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Hasan Alp iNAN , 2010. # Hasan Alp İNAN , 2010. msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-10-19 21:49+0300\n" "Last-Translator: Hasan Alp İNAN \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Lokalize 1.0\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (sürüm %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "%s eklentisi doğrulanamadı, atlanıyor" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "%s eklentisi doğrulanamadı, atlanıyor" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "%s eklentisi kurulamıyor, atlanıyor" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "%s eklentisi kurulamıyor, atlanıyor" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "hiç geçerli eklenti bulunamadı" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Aşağıdaki eklentiler şu an etkin:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Hiçbir eklenti etkin değil." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Aşağıdaki eklentiler şu an devre dışı:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Aşağıdaki eklenti seçenekleri kullanılabilir:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Hiç eklenti seçeneği mevcut değil." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "hiç geçerli eklenti bulunamadı" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Aşağıdaki eklenti seçenekleri kullanılabilir:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" "Devam etmek için ENTER'a basınız veya çıkmak için CTRL-C 'ye basınız.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Arşiv şifreleniyor..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Eklentiler çalışıyor. Lütfen bekleyiniz ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Sıkıştırılmış arşiv oluşturuluyor..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "hiç geçerli eklenti etkinleştirilmedi" sosreport-3.5/po/ast.po0000644000175000017500000000733613200603014015016 0ustar cariboucaribou# translation of ast.po to Asturian # Asturian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Astur , 2007. msgid "" msgstr "" "Project-Id-Version: ast\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2009-10-24 20:58+0100\n" "Last-Translator: Xandru Martino Ruz \n" "Language-Team: Asturian \n" "Language: ast\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: KBabel 1.11.4\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (versión %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "nun se validó'l plugin %s, inorándolu" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "nun se validó'l plugin %s, inorándolu" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "nun s'instaló'l plugin %s, inorándolu" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "nun s'instaló'l plugin %s, inorándolu" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "nun s'atopó un plugin válidu" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Los siguientes plugins tán activaos anguaño:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Dengún plugin ta activáu." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Los siguientes plugins nun tán activaos:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Les siguientes opciones del plugin tán disponibles:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Nun hai opciones de plugin disponibles." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "nun s'atopó un plugin válidu" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Les siguientes opciones del plugin tán disponibles:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Calca INTRO pa siguir o CTRL-C pa colar.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Encriptando'l ficheru..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Criando un ficheru comprimíu..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "nun s'activó dengún plugin válidu" sosreport-3.5/po/bs.po0000644000175000017500000000707013200603014014626 0ustar cariboucaribou# Bosnian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosizjestaj (verzija %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "plugin %s se nije mogao potvrditi, preskace se" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "plugin %s se nije mogao potvrditi, preskace se" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "plugin %s se nije instalirao, preskace se " #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "plugin %s se nije instalirao, preskace se " #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "ispravan plugin nije nadjen" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Sljedeci plugin-i su trenutno osposobljeni:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Nema osposobljenih plugin-a." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Sljedeci su plugin-i onesposobljeni:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Sjedeci su plugini-i na raspolaganju:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Nema plugin-a na raspolaganju." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "ispravan plugin nije nadjen" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Sjedeci su plugini-i na raspolaganju:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Pritisnite ENTER da nastavite, ili CTRL-C da odustanete.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Sifrira se arhiva ..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Pokrecu se plugin-i. Molim vas pricekajte ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Kreira se komprimirana arhiva ..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "Nema ispravnih plugin-a na raspolaganju." sosreport-3.5/po/pt.po0000644000175000017500000000741613200603014014651 0ustar cariboucaribou# Portuguese translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2009-09-05 04:14+0100\n" "Last-Translator: Rui Gouveia \n" "Language-Team: PT \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: Portuguese\n" "Generated-By: pygettext.py 1.5\n" "X-Poedit-Country: PORTUGAL\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (versão %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "plugin %s não valida. A passar ao seguinte" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "plugin %s não valida. A passar ao seguinte" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "plugin %s não instala. A passar ao seguinte" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "plugin %s não instala. A passar ao seguinte" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "Não foram encontrados plugins válidos" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Os seguintes plugins estão actualmente activos:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Nenhum plugin activo." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Os seguintes plugins estão actualmente desactivados:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "As seguintes opções de plugins estão disponíveis:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Nenhumas opções do plugin disponíveis." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "Não foram encontrados plugins válidos" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "As seguintes opções de plugins estão disponíveis:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Carregue em ENTER para continuar, ou CTRL-C para sair.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "A cifrar arquivo..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "A executar plugins. Por favor, aguarde ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "A criar arquivo comprimido..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "Não foram activados plugins válidos" sosreport-3.5/po/or.po0000644000175000017500000001161513200603014014642 0ustar cariboucaribou# translation of sos.trunk.or.po to Oriya # Oriya translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Manoj Kumar Giri , 2009, 2011. msgid "" msgstr "" "Project-Id-Version: sos.trunk.or\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-01-04 18:25+0530\n" "Last-Translator: Manoj Kumar Giri \n" "Language-Team: Oriya \n" "Language: or\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (ସସ୍କରଣ %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "ପ୍ଲଗଇନ %s କୁ ବୈଧିକୃତ କରେ ନାହିଁ, ଏଡ଼ାଇଦେଉଅଛି" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "ପ୍ଲଗଇନ %s କୁ ବୈଧିକୃତ କରେ ନାହିଁ, ଏଡ଼ାଇଦେଉଅଛି" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "ପ୍ଲଗଇନ %s ସ୍ଥାପନ କରେନାହିଁ, ଏଡ଼ାଇ ଦେଉଛି" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "ପ୍ଲଗଇନ %s ସ୍ଥାପନ କରେନାହିଁ, ଏଡ଼ାଇ ଦେଉଛି" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "କୌଣସି ବୈଧ ପ୍ଲଗଇନ ମିଳୁନାହିଁ" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "ନିମ୍ନଲିଖିତ ପ୍ଲଗଇନଗୁଡ଼ିକ ବର୍ତ୍ତମାନ ସକ୍ରିୟ ହୋଇଛି:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "କୌଣସି ପ୍ଲଗଇନ ସକ୍ରିୟ ହୋଇନାହିଁ।" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "ନିମ୍ନଲିଖିତ ପ୍ଲଗଇନଗୁଡ଼ିକ ବର୍ତ୍ତମାନ ନିଷ୍କ୍ରିୟ ହୋଇଛି:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "ନିମ୍ନଲିଖିତ ପ୍ଲଗଇନ ବିକଳ୍ପଗୁଡ଼ିକ ଉପଲବ୍ଧ ଅଛି:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "କୌଣସି ପ୍ଲଗଇନ ବିକଳ୍ପ ଉପଲବ୍ଧ ନାହିଁ।" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "କୌଣସି ବୈଧ ପ୍ଲଗଇନ ମିଳୁନାହିଁ" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "ନିମ୍ନଲିଖିତ ପ୍ଲଗଇନ ବିକଳ୍ପଗୁଡ଼ିକ ଉପଲବ୍ଧ ଅଛି:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "ଅଗ୍ରସର ହେବା ପାଇଁ ENTER ଦବାନ୍ତୁ, ଅଥବା ବିଦାୟ ନେବା ପାଇଁ CTRL-C ଦବାନ୍ତୁ।\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "ଅଭିଲେଖକୁ ସଂଗୁପ୍ତ ରଖୁଅଛି..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " ପ୍ଲଗଇନଗୁଡ଼ିକ ଚାଲୁଅଛି। ଦୟାକରି ଅପେକ୍ଷାକରନ୍ତୁ ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "ସଙ୍କୁଚିତ ଅଭିଲେଖ ନିର୍ମାଣ କରୁଅଛି..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "କୌଣସି ବୈଧ ପ୍ଲଗଇନକୁ ସକ୍ରିୟ କରାହୋଇନାହିଁ" sosreport-3.5/po/ms.po0000644000175000017500000000554313200603014014644 0ustar cariboucaribou# Malay translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/hr.po0000644000175000017500000000574213200603014014637 0ustar cariboucaribou# Croatian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/et.po0000644000175000017500000000562513200603014014636 0ustar cariboucaribou# Estonian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/gu.po0000644000175000017500000001153013200603014014631 0ustar cariboucaribou# translation of sos.trunk.gu.po to Gujarati # Gujarati translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Ankit Patel , 2007. # Sweta Kothari , 2011. msgid "" msgstr "" "Project-Id-Version: sos.trunk.gu\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-01-04 17:39+0530\n" "Last-Translator: Sweta Kothari \n" "Language-Team: Gujarati\n" "Language: gu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (આવૃત્તિ %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "પ્લગઈન %s માન્ય થઈ શક્યું નહિં, અવગણી રહ્યા છીએ" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "પ્લગઈન %s માન્ય થઈ શક્યું નહિં, અવગણી રહ્યા છીએ" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "પ્લગઈન %s સ્થાપિત થતું નથી, અવગણી રહ્યા છીએ" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "પ્લગઈન %s સ્થાપિત થતું નથી, અવગણી રહ્યા છીએ" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "કોઈ માન્ય પ્લગઈનો મળ્યા નહિં" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "નીચેના પ્લગઈનો વર્તમાનમાં સક્રિય કરવામાં આવેલ છે:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "કોઈ પ્લગઈન સક્રિય કરેલ નથી." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "નીચેના પ્લગઈનો વર્તમાનમાં નિષ્ક્રિય કરેલ છે:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "નીચેના પ્લગઈન વિકલ્પો ઉપલબ્ધ છે:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "કોઈ પ્લગઈન વિકલ્પો ઉપલબ્ધ નથી." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "કોઈ માન્ય પ્લગઈનો મળ્યા નહિં" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "નીચેના પ્લગઈન વિકલ્પો ઉપલબ્ધ છે:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "ચાલુ રાખવા માટે ENTER દબાવો, અથવા બંધ કરવા માટે CTRL-C દબાવો.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "પેટી એનક્રિપ્ટ કરી રહ્યા છીએ..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " પ્લગઇનોને ચલાવી રહ્યા છીએ. મહેરબાની કરીને થોભો ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "સંકુચિત પેટી બનાવી રહ્યા છીએ..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "કોઈ માન્ય પ્લગઈનો સક્રિય કરેલ હતા નહિં" sosreport-3.5/po/es.po0000644000175000017500000001041413203300002014617 0ustar cariboucaribou# Fedora Spanish translation of sos.trunk. # This file is distributed under the same license as the sos.trunk package. # # Manuel Ospina , 2007. # Héctor Daniel Cabrera , 2010. # Adolfo Jayme Barrientos , 2017. # msgid "" msgstr "" "Project-Id-Version: sos.trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2017-05-15 15:13-0500\n" "Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: Español \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 2.0.1\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (versión %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "el complemento %s no se puede validar; se ha omitido" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "no se puede validar" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "el complemento %s necesita privilegios administrativos para ejecutarse; se ha omitido" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "requiere privilegios administrativos" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "excluidos" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "omitidos" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "inactivos" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "opcionales" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "sin especificar" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "el complemento %s no se puede instalar; se ha omitido: %s" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "Se proveyeron perfiles desconocidos o inactivos: %s" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "no se encontró ningún complemento válido" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Los complementos siguientes están activados actualmente:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "No se ha activado ningún complemento." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Los complementos siguientes están desactivados actualmente:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Las opciones del complemento siguientes están disponibles:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "No hay opciones de complemento disponibles." #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "no se encontró ningún perfil válido" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "Los siguientes perfiles están disponibles:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Presione INTRO para continuar o CTRL-C para salir.\n" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr " Preparando el archivador…" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr " Preparando los complementos…" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr " Ejecutando los complementos. Espere un momento…" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Creando el archivador comprimido…" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr " %s al finalizar el archivador" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "Error al desplazar el directorio: %s" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "Error al desplazar el archivador: %s" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "Error al desplazar la suma de comprobación: %s" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "no se ha activado ningún complemento válido" sosreport-3.5/po/pl.po0000644000175000017500000000774013200603014014641 0ustar cariboucaribou# Polish translation for sos. # Copyright © 2007-2010, 2017 the sos authors. # This file is distributed under the same license as the sos package. # Piotr Drąg , 2007-2010, 2017. # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2017-02-23 19:29+0100\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (wersja %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "nieprawidłowa wtyczka %s, pomijanie" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "nieprawidłowa" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "wtyczka %s do wykonania wymaga uprawnień roota, pomijanie" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "wymaga roota" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "wykluczona" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "pominięta" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "nieaktywna" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "opcjonalna" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "niepodana" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "nie można zainstalować wtyczki %s, pomijanie: %s" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "Podano nieznane lub nieaktywne profile: %s" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "nie odnaleziono żadnych prawidłowych wtyczek" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Obecnie włączone wtyczki:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Brak włączonych wtyczek." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Obecnie wyłączone wtyczki:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Dostępne opcje wtyczek:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Brak dostępnych opcji wtyczek." #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "nie odnaleziono żadnych prawidłowych profili" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "Dostępne profile:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Naciśnięcie klawisza Enter kontynuuje, a Ctrl-C zakończy.\n" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr " Przygotowywanie archiwum…" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr " Przygotowywanie wtyczek…" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr " Wykonywanie wtyczek. Proszę czekać…" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Tworzenie skompresowanego archiwum…" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr " %s podczas finalizowania archiwum" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "Błąd podczas przenoszenia katalogu: %s" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "Błąd podczas przenoszenia pliku archiwum: %s" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "Błąd podczas przenoszenia pliku sumy kontrolnej: %s" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "nie włączono żadnych prawidłowych wtyczek" sosreport-3.5/po/en_GB.po0000644000175000017500000000677113200603014015203 0ustar cariboucaribou# English translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (version %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "plugin %s does not validate, skipping" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "plugin %s does not validate, skipping" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "plugin %s does not install, skipping" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "plugin %s does not install, skipping" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "no valid plugins found" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "The following plugins are currently enabled:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "No plugin enabled." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "The following plugins are currently disabled:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "The following plugin options are available:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "No plugin options available." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "no valid plugins found" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "The following plugin options are available:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Press ENTER to continue, or CTRL-C to quit.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Encrypting archive..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Creating compressed archive..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "no valid plugins were enabled" sosreport-3.5/po/eu.po0000644000175000017500000000554413200603014014637 0ustar cariboucaribou# Basque translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/sl.po0000644000175000017500000000571513200603014014644 0ustar cariboucaribou# Slovenian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/is.po0000644000175000017500000000554713200603014014644 0ustar cariboucaribou# Icelandic translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/mk.po0000644000175000017500000000555013200603014014632 0ustar cariboucaribou# Macedonian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/hi.po0000644000175000017500000001127413200603014014623 0ustar cariboucaribou# translation of sos.trunk.hi.po to Hindi # Hindi translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Rajesh Ranjan , 2007. # Rajesh Ranjan , 2011. msgid "" msgstr "" "Project-Id-Version: sos.trunk.hi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-01-17 15:06+0530\n" "Last-Translator: Rajesh Ranjan \n" "Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (संस्करण %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "प्लगिन %s वैध नहीं कर सकता है, छोड़ रहा है" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "प्लगिन %s वैध नहीं कर सकता है, छोड़ रहा है" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "प्लगिन %s अधिष्ठापित नहीं कर रहा है, छोड़ रहा है" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "प्लगिन %s अधिष्ठापित नहीं कर रहा है, छोड़ रहा है" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "कोई वैध प्लगिन नहीं मिला" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "निम्नलिखित प्लगिन अभी सक्रिय है:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "कोई प्लगिन सक्रिय नहीं है." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "निम्न प्लगिन अभी निष्क्रिय है:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "निम्नलिखित प्लगिन विकल्प उपलब्ध है:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "कोई प्लगिन विकल्प उपलब्ध नहीं." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "कोई वैध प्लगिन नहीं मिला" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "निम्नलिखित प्लगिन विकल्प उपलब्ध है:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "ENTER को जारी रखने के लिए दबाएं, या CTRL-C छोड़ने के लिए.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "अभिलेख गोपित कर रहा है..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " प्लगिन चला रहा है. कृपया प्रतीक्षा करें ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "संकुचित अभिलेख बना रहा है..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "कोई वैध प्लगिन सक्रिय नहीं था" sosreport-3.5/po/mr.po0000644000175000017500000001125313200603014014636 0ustar cariboucaribou# translation of sos.trunk.po to Marathi # Marathi translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Sandeep Shedmake , 2009, 2011. msgid "" msgstr "" "Project-Id-Version: sos.trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-01-11 14:15+0530\n" "Last-Translator: Sandeep Shedmake \n" "Language-Team: Marathi \n" "Language: mr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (आवृत्ती %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "प्लगइन %s तपासले गेले नाही, वगळत आहे" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "प्लगइन %s तपासले गेले नाही, वगळत आहे" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "प्लगइन %s चे प्रतिष्ठापान अशक्य, वगळत आहे" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "प्लगइन %s चे प्रतिष्ठापान अशक्य, वगळत आहे" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "वैध प्लगइनस् आढळले नाही" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "खालील प्लगइनस् सध्या कार्यक्षम केले आहेत:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "प्लगइन कार्यक्षम केले नाही." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "खालील प्लगइनस् सध्या अकार्यक्षम केले आहे:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "खालील प्लगइन पर्याय उपलब्ध आहे:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "प्लगइन पर्याय उपलब्ध नाही." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "वैध प्लगइनस् आढळले नाही" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "खालील प्लगइन पर्याय उपलब्ध आहे:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "पुढे जाण्यासाठी ENTER दाबा, किंवा बाहेर पडण्यासाठी CTRL-C दाबा.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "आर्काइव्ह एनक्रिप्ट करत आहे..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " प्लगईन्स् चालवत आहे. कृपया थांबा ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "आकुंचीत आर्काइव्ह निर्माण करत आहे..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "वैध प्लगइनस् कार्यक्षम केले नाही" sosreport-3.5/po/he.po0000644000175000017500000000562313200603014014620 0ustar cariboucaribou# Hebrew translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/ro.po0000644000175000017500000000554613200603014014650 0ustar cariboucaribou# Romanian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/ilo.po0000644000175000017500000000555213200603014015010 0ustar cariboucaribou# Language ilo translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/lv.po0000644000175000017500000000567213200603014014651 0ustar cariboucaribou# Latvian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/sk.po0000644000175000017500000000741713200603014014644 0ustar cariboucaribou# Slovak translations for sos package. # Copyright (C) 2007 ORGANIZATION # # Ondrej Šulek , 2009, 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-04-15 17:38+0200\n" "Last-Translator: Ondrej Šulek \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Lokalize 1.0\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (verzia %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "nie je možné overiť modul %s, preskakujem" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "nie je možné overiť modul %s, preskakujem" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "nie je možné nainštalovať modul %s, preskakujem" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "nie je možné nainštalovať modul %s, preskakujem" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "nenájdené žiadne platné moduly" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Nasledujúce moduly sú aktuálne povolené:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Žiadny modul nie je povolený." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Nasledujúce moduly sú aktuálne zakázané:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Nasledujúce možnosti modulov sú dostupné:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Nie sú dostupné žiadne možnosti modulov." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "nenájdené žiadne platné moduly" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Nasledujúce možnosti modulov sú dostupné:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Stlačte ENTER na pokračovanie, alebo CTRL-C na ukončenie.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Šifrovanie archívu..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Moduly bežia. Prosím čakajte ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Vytváranie komprimovaného archívu..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "neboli povolené žiadne platné moduly" sosreport-3.5/po/bg.po0000644000175000017500000000763013200603014014614 0ustar cariboucaribou# Bulgarian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-08-05 15:37+0100\n" "Last-Translator: Ivelin \n" "Language-Team: none\n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (версия %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "плъгин %s не се валидира, прескачане" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "плъгин %s не се валидира, прескачане" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "плъгин %s не се инсталира, прескачане" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "плъгин %s не се инсталира, прескачане" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "не са открити валидни плъгин-и." #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Следните плъгин-и са включени:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Няма включен плъгин." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Следните plugin-и са изключени:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Следните plugin опции са налични:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Няма налични plugin опции." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "не са открити валидни плъгин-и." #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Следните plugin опции са налични:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Натиснете ENTER за да продължите или CTRL-C за изход.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Кодиране на архива..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Стартирване на plugin-и. Моля изчакайте ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Създаване на компресиран архив..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "няма включени валидни plugin-и" sosreport-3.5/po/vi.po0000644000175000017500000000562013200603014014637 0ustar cariboucaribou# Vietnamese translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/pt_BR.po0000644000175000017500000000737013200603014015233 0ustar cariboucaribou# Brazilian Portuguese translations for sos package. # Igor Pires Soares , 2007. # Taylon Silmer , 2010. msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-12 15:19-0300\n" "Last-Translator: Taylon Silmer \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (versão %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "o plugin %s não validou, ignorando" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "o plugin %s não validou, ignorando" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "o plugin %s não instala, ignorando" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "o plugin %s não instala, ignorando" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "nenhum plugin válido encontrado" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Os seguintes plugins estão habilitados no momento:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Nenhum plugin está habilitado." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Os seguintes plugins estão desabilitados no momento:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "As seguintes opções de plugins estão disponíveis:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Nenhuma opção de plugins está disponível." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "nenhum plugin válido encontrado" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "As seguintes opções de plugins estão disponíveis:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Pressione ENTER para continuar ou CTRL-C para encerrar.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Criptografando o pacote..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Executando os plugins. Por favor aguarde..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Criando pacote compactado..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "nenhum plugin válido estava habilitado" sosreport-3.5/po/si.po0000644000175000017500000001100613200603014014627 0ustar cariboucaribou# translation of si.po to Sinhala # Sinhalese translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Danishka Navin , 2007. msgid "" msgstr "" "Project-Id-Version: si\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-11-07 19:03+0530\n" "Last-Translator: Danishka Navin \n" "Language-Team: Sinhala \n" "Language: si\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (%s වෙළුම)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "%s ප්ලගීනය සත්‍යාපනය වන්නේ නැත, මගහරිමින්" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "%s ප්ලගීනය සත්‍යාපනය වන්නේ නැත, මගහරිමින්" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "%s ප්ලගීනය ස්ථාපනය වන්නේ නැත, මගහරි" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "%s ප්ලගීනය ස්ථාපනය වන්නේ නැත, මගහරි" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "නිරවද්‍ය පල්ගීන හමුවුයේ නැත" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "පහත දැක්වෙන ප්ලගීන දැනට සක්‍රීයව ඇත:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "ප්ලගීන කිසිවක් සක්‍රීය නැත." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "පහත පල්ගීන විකල්ප දැනට අක්‍රීයව ඇත:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "පහත පල්ගීන විකල්ප භාවිතයට ඇත:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "කිසිදු පල්ගීන විකල්පයක් භාවිතයට නැත." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "නිරවද්‍ය පල්ගීන හමුවුයේ නැත" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "පහත පල්ගීන විකල්ප භාවිතයට ඇත:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "දිගටම කරගෙන යාමට ENTER හෝ පිට වීමට CTRL-C ඔබන්න.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "සංරක්‍ෂණ සංකේතාංකනය කරමින්..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "හැකිලු සංරක්‍ෂක නිර්මාණය කරමින්..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "කිසිදු නිරවද්‍ය පල්ගිනයක් සක්‍රිය කර නැත" sosreport-3.5/po/ml.po0000644000175000017500000001243213200603014014630 0ustar cariboucaribou# translation of sos.trunk.ml.po to # Malayalam translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Ani Peter , 2007. msgid "" msgstr "" "Project-Id-Version: sos.trunk.ml\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-01-05 21:23+0530\n" "Last-Translator: \n" "Language-Team: \n" "Language: ml\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (%s ലക്കം)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "%s എന്നത് ശരിയായ പ്ളഗ്ഗിന്‍ അല്ല, വേണ്ടെന്ന് വയ്ക്കുന്നു" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "%s എന്നത് ശരിയായ പ്ളഗ്ഗിന്‍ അല്ല, വേണ്ടെന്ന് വയ്ക്കുന്നു" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "%s എന്ന പ്ളഗ്ഗിന്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ സാധ്യമല്ല, ഉപേക്ഷിക്കുന്നു" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "%s എന്ന പ്ളഗ്ഗിന്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ സാധ്യമല്ല, ഉപേക്ഷിക്കുന്നു" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "ശരിയായ പ്ളഗ്ഗിനുകള്‍ ലഭ്യമല്ല" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "താഴെ പറഞ്ഞിരിക്കുന്ന പ്ളഗ്ഗിനുകള്‍ നിലവില്‍ സജീവമാണ്:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "ഒരു പ്ളഗ്ഗിനും സജ്ജമല്ല." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "താഴെ പറഞ്ഞിരിക്കുന്ന പ്ളഗ്ഗിനുകള്‍ നിലവില്‍ നിറ്‍ജ്ജീവമാണ്:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "താഴെ പറഞ്ഞിരിക്കുന്ന പ്ളഗ്ഗിന്‍ ഉപാധികള്‍ ലഭ്യമാണ്:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "പ്ളഗ്ഗിന്‍ ഉപാധികള്‍ ലഭ്യമല്ല." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "ശരിയായ പ്ളഗ്ഗിനുകള്‍ ലഭ്യമല്ല" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "താഴെ പറഞ്ഞിരിക്കുന്ന പ്ളഗ്ഗിന്‍ ഉപാധികള്‍ ലഭ്യമാണ്:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "മുമ്പോട്ട് തുടരുന്നതിനായി ENTER അല്ലെങ്കില്‍ പുറത്ത് കടക്കുന്നതിനായി CTRL-C അമറ്‍ത്തുക.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "ആറ്‍ക്കൈവ് എന്‍ക്രിപ്റ്റ് ചെയ്യുന്നു..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " പ്ലഗിനുകള്‍ പ്രവര്‍ത്തിയ്ക്കുന്നു. ദയവായി കാത്തിരിയ്ക്കുക ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "കംപ്രസ്സ്ഡ് ആറ്‍ക്കൈവ് ഉണ്ടാക്കുന്നു..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "ശരിയായ പ്ളഗ്ഗിനുകള്‍ സജ്ജമല്ല" sosreport-3.5/po/zu.po0000644000175000017500000000554213200603014014662 0ustar cariboucaribou# Zulu translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/ru.po0000644000175000017500000001015013200603014014641 0ustar cariboucaribou# translation of ru.po to # Russian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Yulia , 2010. msgid "" msgstr "" "Project-Id-Version: ru\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-30 08:47\n" "Last-Translator: Yulia \n" "Language-Team: Russian\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: KBabel 1.11.4\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (версия %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "модуль %s не прошёл проверку. Пропускается." #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "модуль %s не прошёл проверку. Пропускается." #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "модуль %s не устанавливается. Пропускается." #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "модуль %s не устанавливается. Пропускается." #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "верные модули не найдены" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "В настоящее время включены модули:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Нет активных модулей." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "В настоящее время отключены модули:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Доступные опции модулей:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Нет опций." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "верные модули не найдены" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Доступные опции модулей:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Нажмите ENTER для продолжения или CTRL-C для выхода.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Выполняется шифрование архива..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Выполняются модули. Пожалуйста, подождите..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Создаётся архив..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "не включены верные модули" sosreport-3.5/po/zh_TW.po0000644000175000017500000000733613200603014015262 0ustar cariboucaribou# Traditional Chinese Messages for sos. # Copyright (C) 2010 The sos Project (msgids) # This file is distributed under the same license as the sos package. # Chester Cheng , 2007. # Wei-Lun Chao , 2010. # msgid "" msgstr "" "Project-Id-Version: sos 2.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-09-19 00:10+1000\n" "Last-Translator: Wei-Lun Chao \n" "Language-Team: Chinese (traditional) \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport(版本 %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "外掛程式 %s 無法驗證,因此跳過" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "外掛程式 %s 無法驗證,因此跳過" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "未安裝外掛程式 %s,故而跳過" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "未安裝外掛程式 %s,故而跳過" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "找不到正確的外掛程式" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "目前以下外掛程式已經啟用:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "並未啟用任何外掛程式。" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "目前以下外掛程式已經停用:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "外掛程式有以下選項可用:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "沒有可用的外掛程式選項。" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "找不到正確的外掛程式" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "外掛程式有以下選項可用:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "請按下「Enter」繼續,或按下「CTRL-C」離開。\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "加密壓縮檔…" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " 正在執行外掛程式,請稍待…" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "建立壓縮檔…" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "並未啟用合用的外掛程式" sosreport-3.5/po/ko.po0000644000175000017500000000774013200603014014637 0ustar cariboucaribou# translation of ko.po to # Korean translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: ko\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-11-07 09:56+1000\n" "Last-Translator: \n" "Language-Team: \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sos 리포트 (버전 %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "%s 플러그인이 유효하지 않아 생략합니다." #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "%s 플러그인이 유효하지 않아 생략합니다." #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "%s 플러그인이 설치되지 않아 생략합니다." #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "%s 플러그인이 설치되지 않아 생략합니다." #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "사용 가능한 플러그인이 없습니다." #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "현재 다음과 같은 플러그인이 활성화되어 있습니다:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "활성화된 플러그인이 없습니다:" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "현재 다음과 같은 플러그인이 비활성화되어 있습니다:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "다음과 같은 플러그인 옵션을 사용할 수 있습니다:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "사용 가능한 플러그인 옵션이 없습니다:" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "사용 가능한 플러그인이 없습니다." #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "다음과 같은 플러그인 옵션을 사용할 수 있습니다:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "계속하려면 ENTER를 입력하고, 종료하려면 CTRL-C를 입력하십시오.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "아카이브를 암호화하고 있습니다..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "플러그인을 실행중입니다. 잠시만 기다려주십시오..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "압축 아카이브를 생성 중입니다..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "활성화된 사용 가능한 플러그인이 없습니다." sosreport-3.5/po/ku.po0000644000175000017500000000554513200603014014646 0ustar cariboucaribou# Kurdish translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/ur.po0000644000175000017500000000554213200603014014652 0ustar cariboucaribou# Urdu translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/Makefile0000644000175000017500000000270713073155336015345 0ustar cariboucaribou# What is this package? NLSPACKAGE = sos POTFILE = $(NLSPACKAGE).pot INSTALL = /usr/bin/install -c INSTALL_DATA = $(INSTALL) -m 644 INSTALL_DIR = /usr/bin/install -d # destination directory INSTALL_NLS_DIR = $(DESTDIR)/usr/share/locale # PO catalog handling MSGMERGE = msgmerge -v XGETTEXT = xgettext --default-domain=$(NLSPACKAGE) \ --add-comments --language=python MSGFMT = msgfmt --statistics --verbose # What do we need to do POFILES = $(wildcard *.po) MOFILES = $(patsubst %.po,%.mo,$(POFILES)) PYSRC = $(wildcard ../sos/*.py) SRCFILES = $(PYSRC) all:: update-po $(MOFILES) $(POTFILE): $(XGETTEXT) --keyword=_ --keyword=N_ $(SRCFILES) @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \ rm -f $(NLSPACKAGE).po; \ else \ mv -f $(NLSPACKAGE).po $(POTFILE); \ fi; \ update-po: Makefile $(POTFILE) refresh-po refresh-po: Makefile for cat in $(POFILES); do \ lang=`basename $$cat .po`; \ if $(MSGMERGE) $$lang.po $(POTFILE) > $$lang.pot ; then \ mv -f $$lang.pot $$lang.po ; \ echo "$(MSGMERGE) of $$lang succeeded" ; \ else \ echo "$(MSGMERGE) of $$lang failed" ; \ rm -f $$lang.pot ; \ fi \ done clean: @rm -fv *mo *~ .depend install: $(MOFILES) @for n in $(MOFILES); do \ l=`basename $$n .mo`; \ $(INSTALL_DIR) $(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \ $(INSTALL_DATA) --verbose $$n $(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/$(NLSPACKAGE).mo; \ done %.mo: %.po $(MSGFMT) -o $@ $< .PHONY: missing depend $(POTFILE) sosreport-3.5/po/hy.po0000644000175000017500000000554613200603014014650 0ustar cariboucaribou# Armenian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/nds.po0000644000175000017500000000652213200603014015007 0ustar cariboucaribou# translation of sos.trunk.po to # Low German translation of sos # This file is distributed under the same license as the sos package. # Copyright (C) 2007 Red hat, Inc. # # # Nils-Christoph Fiedler , 2010. msgid "" msgstr "" "Project-Id-Version: sos.trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-12-05 10:16+0100\n" "Last-Translator: Nils-Christoph Fiedler \n" "Language-Team: Fedora Low German \n" "Language: nds\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: Low German\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (Verschoon %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Keen Plugin aktivert." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Keene Pluginoptschoonen verfögbar." #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Entslötel Archiv..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Plugins lööpen. Bidde töven ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Erstelle komprimertes Archiv..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/nb.po0000644000175000017500000000634113200603014014621 0ustar cariboucaribou# Norwegian bokmål translations for the sos package. # Copyright (C) 2007 Red Hat, Inc. # Kjartan Maraas , 2010. # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-10-31 19:50+0100\n" "Last-Translator: Kjartan Maraas \n" "Language-Team: Norwegian bokmål \n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (versjon %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "ingen gyldige tillegg funnet" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Ingen tillegg slått på." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "ingen gyldige tillegg funnet" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Trykk LINJESKIFT for å fortsette, eller CTRL-C for å avslutte.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Krypterer arkiv..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Lager komprimert arkiv..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/th.po0000644000175000017500000001043713200603014014636 0ustar cariboucaribou# Thai translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007, 2009. msgid "" msgstr "" "Project-Id-Version: sos.th\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2009-05-13 12:12+0000\n" "Last-Translator: \n" "Language-Team: Thai \n" "Language: th\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Lokalize 0.3\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (รุ่น %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "ส่วนขยาย %s ไม่ถูกต้อง จะข้ามไป" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "ส่วนขยาย %s ไม่ถูกต้อง จะข้ามไป" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "ส่วนขยาย %s ติดตั้งไม่ได้ จะข้ามไป" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "ส่วนขยาย %s ติดตั้งไม่ได้ จะข้ามไป" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "ไม่พบส่วนขยายที่ถูกต้อง" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "ส่วนขยายต่อไปนี้เปิดใช้งานอยู่" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "ไม่มีส่วนขยายเปิดใช้งาน" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "ส่วนขยายต่อไปนี้ปิดการใช้งานอยู่:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "มีตัวเลือกเหล่านี้จากส่วนขยาย:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "ไม่มีตัวเลือกจากส่วนขยาย" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "ไม่พบส่วนขยายที่ถูกต้อง" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "มีตัวเลือกเหล่านี้จากส่วนขยาย:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "กด ENTER เพื่อทำงานต่อ หรือ CTRL+C เพื่อออก\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "กำลังเข้ารหัสไฟล์..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "กำลังสร้างไฟล์บีบอัด..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "ไม่มีส่วนขยายที่ถูกต้องเปิดใช้งาน" sosreport-3.5/po/id.po0000644000175000017500000000647513200603014014626 0ustar cariboucaribou# Indonesian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "laporan sos membutuhkan hak akses root untuk berjalan." #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "Tidak ada plugin yang valid ditemukan" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Opsi plugin ini memungkinkan:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Tidak ada plugin yang memungkinkan." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Opsi plugin ini sedang tidak mungkin:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Opsi plugin ini tersedia:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "Tidak ada plugin yang valid ditemukan" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Opsi plugin ini tersedia:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Tekan ENTER untuk melanjutkan, atau CTRL+C untuk keluar.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Mengekripsi arsip..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Membuat arsip yang dikompresi..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "Tidak ada plugin yang valid yang dimungkinkan." sosreport-3.5/po/ta.po0000644000175000017500000001253613200603014014631 0ustar cariboucaribou# translation of ta.po to # Tamil translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # I Felix , 2011. msgid "" msgstr "" "Project-Id-Version: ta\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-02-02 15:23+0530\n" "Last-Translator: I Felix \n" "Language-Team: Tamil \n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (version %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "கூடுதல் இணைப்பு %s தவறாக உள்ளது, எனவே தவிர்க்கிறது" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "கூடுதல் இணைப்பு %s தவறாக உள்ளது, எனவே தவிர்க்கிறது" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "கூடுதல் இணைப்பு %s நிறுவப்படவில்லை, தவிர்க்கப்படுகிறது" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "கூடுதல் இணைப்பு %s நிறுவப்படவில்லை, தவிர்க்கப்படுகிறது" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "சரியான கூடுதல் இணைப்புகள் இல்லை" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "பின்வரும் கூடுதல் இணைப்புகள் தற்போது செயல்படுத்தப்படுகிறது:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "கூடுதல் இணைப்புகள் எதுவும் செயல்படுத்தப்படவில்லை." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "பின்வரும் கூடுதல் இணைப்புகள் தற்போது செயல்நீக்கப்பட்டுள்ளது:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "பின்வரும் கூடுதல் இணைப்பு விருப்பங்கள் உள்ளன:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "கூடுதல் இணைப்பு விருப்பங்கள் எதுவும் இல்லை." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "சரியான கூடுதல் இணைப்புகள் இல்லை" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "பின்வரும் கூடுதல் இணைப்பு விருப்பங்கள் உள்ளன:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "ENTER ஐ அழுத்தவும் அல்லது CTRL-C ஐ அழுத்தி வெளியேறவும்.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "காப்பினை மறைகுறியாக்குகிறது..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "" " கூடுதல் இணைப்புகள் இயங்குகிறது. காத்திருக்கவும் ... கூடுதல் இணைப்புகள் இயங்குகிறது. " "பகாத்தஇஉ" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "குறுக்கப்பட்ட காப்பினை உருவாக்குகிறது..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "சரியான கூடுதல் இணைப்புகள் எதுவும் செயல்படுத்தப்படவில்லை" sosreport-3.5/po/cs.po0000644000175000017500000000741213200603014014627 0ustar cariboucaribou# Czech translations for sos package. # Copyright (C) 2007 Free Software Foundation. # # Milan Keršláger , 2010. # msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-08-22 10:38+0100\n" "Last-Translator: Milan Keršláger \n" "Language-Team: Czech >\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (verze %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "plugin %s není validní, přeskakuji" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "plugin %s není validní, přeskakuji" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "plugin %s nejde nainstalovat, přeskakuji" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "plugin %s nejde nainstalovat, přeskakuji" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "žádné validní pluginy" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Právě jsou povoleny tyto pluginy:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Žádné pluginy nejsou povoleny." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Následující pluginy jsou právě zakázány:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "K dispozici jsou tato nastavení pluginů:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Žádné nastavení pro pluginy." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "žádné validní pluginy" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "K dispozici jsou tato nastavení pluginů:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Pro pokračování stiskněte ENTER, pro přerušení CTRL+c.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Šifrování archivu..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Spouštění pluginů. Čekejte prosím..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Vytváření komprimovaného archivu..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "Žádné validní pluginy nejsou povoleny." sosreport-3.5/po/de.po0000644000175000017500000000770613200603014014620 0ustar cariboucaribou# translation of sos.trunk.po to # German translation of sos # This file is distributed under the same license as the sos package. # Copyright (C) 2007 Red hat, Inc. # # # Timo Trinks , 2007. # Fabian Affolter , 2009. # sknirT omiT , 2010. msgid "" msgstr "" "Project-Id-Version: sos.trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-31 14:19+1000\n" "Last-Translator: sknirT omiT \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: KBabel 1.11.4\n" "X-Poedit-Language: German\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (version %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "Plugin %s validiert nicht, wird ausgelassen" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "Plugin %s validiert nicht, wird ausgelassen" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "Plugin %s installiert sich nicht, wird ausgelassen" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "Plugin %s installiert sich nicht, wird ausgelassen" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "keine gültigen Plugins gefunden" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Die folgenden Plugins sind derzeit aktiviert:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Kein Plugin aktiviert." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Die folgenden Plugins sind derzeit deaktiviert:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Die folgenden Plugin-Optionen stehen zur Verfügung:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Keine Plugin-Optionen verfügbar." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "keine gültigen Plugins gefunden" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Die folgenden Plugin-Optionen stehen zur Verfügung:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" "Drücken Sie die EINGABETASTE, um fortzufahren, oder STRG-C, um abzubrechen.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Verschlüssele Archiv..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Plugins werden ausgeführt. Bitte warten ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Erstelle komprimiertes Archiv..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "keine gültigen Plugins wurden aktiviert" sosreport-3.5/po/bn.po0000644000175000017500000000554513200603014014626 0ustar cariboucaribou# Bengali translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/am.po0000644000175000017500000000554513200603014014624 0ustar cariboucaribou# Amharic translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/gl.po0000644000175000017500000000554613200603014014632 0ustar cariboucaribou# Galician translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/el.po0000644000175000017500000001105313200603014014616 0ustar cariboucaribou# Greek translation for sos.trunk package. # Copyright (C) 2010 Fedora Project Greek Translation Team # Giannis Konstantinidis , 2010. # msgid "" msgstr "" "Project-Id-Version: trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-10 16:21-0500\n" "Last-Translator: Giannis Konstantinidis \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (έκδοση %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "το πρόσθετο %s δεν είναι έγκυρο,η διαδικασία προσπερνάται." #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "το πρόσθετο %s δεν είναι έγκυρο,η διαδικασία προσπερνάται." #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "το πρόσθετο %s δεν μπορεί να εγκατασταθεί,η διαδικασία προσπερνάται" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "το πρόσθετο %s δεν μπορεί να εγκατασταθεί,η διαδικασία προσπερνάται" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "δεν βρέθηκαν έγκυρα πρόσθετα" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Τα παρακάτω πρόσθετα είναι αυτη τη στιγμή ενεργοποιημένα:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Δεν ενεργοποιήθηκε κάποιο πρόσθετο." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Τα παρακάτω πρόσθετα είναι αυτη τη στιγμή απενεργοποιημένα:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Οι παρακάτω ρυθμίσεις για τα πρόσθετα είναι διαθέσιμες:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Δεν υπάρχουν διαθέσιμες ρυθμίσεις για τα πρόσθετα." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "δεν βρέθηκαν έγκυρα πρόσθετα" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Οι παρακάτω ρυθμίσεις για τα πρόσθετα είναι διαθέσιμες:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Πατήστε ENTER για να συνεχίσετε ή CTRL-C για έξοδο.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Το αρχείο κρυπτογραφείται..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Εκτέλεση πρόσθετων. Παρακαλώ περιμένετε ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Δημιουργία συμπιεσμένου αρχείου..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "δεν ενεργοποιήθηκε κάποιο έγκυρο πρόσθετο" sosreport-3.5/po/ka.po0000644000175000017500000000554613200603014014623 0ustar cariboucaribou# Georgian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/lo.po0000644000175000017500000000554513200603014014641 0ustar cariboucaribou# Laotian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/ca.po0000644000175000017500000001046513200603014014607 0ustar cariboucaribou# Catalan translation of iok by Softcatalà # Copyright (C) 2009 Free Software Foundation # This file is distributed under the same license as the iok package. # Xavier Conde Rueda , 2009. # # This file is translated according to the glossary and style guide of # Softcatalà. If you plan to modify this file, please read first the page # of the Catalan translation team for the Fedora project at: # http://www.softcatala.org/projectes/fedora/ # and contact the previous translator. # # Aquest fitxer s'ha de traduir d'acord amb el recull de termes i la guia # d'estil de Softcatalà. Si voleu modificar aquest fitxer, llegiu si # us plau la pàgina de catalanització del projecte Fedora a: # http://www.softcatala.org/projectes/fedora/ # i contacteu l'anterior traductor/a. # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2009-05-17 08:45\n" "Last-Translator: Xavier Faus i Torà \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "informe d'ajuda (versió %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "el connector %s no es valida, ometent" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "el connector %s no es valida, ometent" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "el connector %s no s'instal·la, ometent" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "el connector %s no s'instal·la, ometent" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "cap connector vàlid trobat" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Els següents connectors estan actualment activats:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Cap connector activat." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Els següents connectors estan desactivats:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Les següents opcions dels connectors són disponibles:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "No hi ha cap opció disponible dels connectors." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "cap connector vàlid trobat" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Les següents opcions dels connectors són disponibles:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Premeu Entrar per continuar, o Control-C per sortir.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "S'està xifrant l'arxiu..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Executant complements. Espereu ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "S'està creant l'arxiu comprimit..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "cap connector vàlid està activat" sosreport-3.5/po/af.po0000644000175000017500000000554713200603014014617 0ustar cariboucaribou# Afrikaans translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/kn.po0000644000175000017500000001217313200603014014632 0ustar cariboucaribou# translation of sos.trunk.kn.po to Kannada # Kannada translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Shankar Prasad , 2009, 2011. msgid "" msgstr "" "Project-Id-Version: sos.trunk.kn\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2011-01-05 11:56+0530\n" "Last-Translator: Shankar Prasad \n" "Language-Team: Kannada \n" "Language: kn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (ಆವೃತ್ತಿ %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "ಪ್ಲಗ್‌ಇನ್ %s ಮಾನ್ಯಗೊಂಡಿಲ್ಲ, ಉಪೇಕ್ಷಿಸಲಾಗುತ್ತಿದೆ" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "ಪ್ಲಗ್‌ಇನ್ %s ಮಾನ್ಯಗೊಂಡಿಲ್ಲ, ಉಪೇಕ್ಷಿಸಲಾಗುತ್ತಿದೆ" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "ಪ್ಲಗ್‌ಇನ್ %s ಅನುಸ್ಥಾಪನೆಗೊಂಡಿಲ್ಲ, ಉಪೇಕ್ಷಿಸಲಾಗುತ್ತಿದೆ" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "ಪ್ಲಗ್‌ಇನ್ %s ಅನುಸ್ಥಾಪನೆಗೊಂಡಿಲ್ಲ, ಉಪೇಕ್ಷಿಸಲಾಗುತ್ತಿದೆ" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "ಮಾನ್ಯವಾದ ಯಾವುದೆ ಪ್ಲಗ್‌ಇನ್‌ಗಳಿಲ್ಲ" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "ಈ ಕೆಳಗಿನ ಪ್ಲಗ್‌ಇನ್‌ಗಳನ್ನು ಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "ಯಾವುದೆ ಪ್ಲಗ್‌ಇನ್ ಅನ್ನು ಶಕ್ತಗೊಳಿಸಲಾಗಿಲ್ಲ." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "ಈ ಕೆಳಗಿನ ಪ್ಲಗ್‌ಇನ್‌ಗಳನ್ನು ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "ಈ ಕೆಳಗಿನ ಪ್ಲಗ್‌ಇನ್‌ ಆಯ್ಕೆಗಳು ಲಭ್ಯವಿವೆ:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "ಯಾವುದೆ ಪ್ಲಗ್‌ಇನ್‌ ಆಯ್ಕೆಗಳು ಲಭ್ಯವಿಲ್ಲ." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "ಮಾನ್ಯವಾದ ಯಾವುದೆ ಪ್ಲಗ್‌ಇನ್‌ಗಳಿಲ್ಲ" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "ಈ ಕೆಳಗಿನ ಪ್ಲಗ್‌ಇನ್‌ ಆಯ್ಕೆಗಳು ಲಭ್ಯವಿವೆ:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "ಮುಂದುವರೆಯಲು ENTER ಅನ್ನು ಒತ್ತಿ, ಅಥವ ನಿರ್ಗಮಿಸಲು CTRL-C ಅನ್ನು ಒತ್ತಿ.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "ಆರ್ಕೈವ್ ಅನ್ನು ಗೂಢಲಿಪೀಕರಿಸಲಾಗುತ್ತಿದೆ..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " ಪ್ಲಗ್‌ಇನ್‌ಗಳನ್ನು ಚಲಾಯಿಸಲಾಗುತ್ತಿದೆ. ದಯವಿಟ್ಟು ಕಾಯಿರಿ ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "ಸಂಕುಚನಗೊಳಿಸಲಾದ ಆರ್ಕೈವನ್ನು ನಿರ್ಮಿಸಲಾಗುತ್ತಿದೆ..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "ಮಾನ್ಯವಾದ ಯಾವುದೆ ಪ್ಲಗ್‌ಇನ್‌ಗಳು ಲಭ್ಯವಿಲ್ಲ" sosreport-3.5/po/lt.po0000644000175000017500000000573113200603014014643 0ustar cariboucaribou# Lithuanian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/uk.po0000644000175000017500000001033613200603014014640 0ustar cariboucaribou# Ukrainian translations for sos package. # Copyright (C) Free Software Foundation # This file is distributed under the same license as the system-config-display package. # Maxim Dzіumanenko , 2009 # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-04-11 08:45\n" "Last-Translator: Maxim Dzіumanenko \n" "Language-Team: \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (версія %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "модуль %s не пройшов перевірку автентичності. Пропускається." #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "модуль %s не пройшов перевірку автентичності. Пропускається." #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "модуль %s не встановлюється. Пропускається." #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "модуль %s не встановлюється. Пропускається." #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "не знайдено модулі" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Наразі увімкнені модулі:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Немає активних модулів." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Наразі вимкнені модулі:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Доступні наступні параметри модулів:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Немає параметрів." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "не знайдено модулі" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Доступні наступні параметри модулів:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Натисніть ENTER для продовження або CTRL-C для виходу.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Виконується кодування архіву..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Виконуються модулі. Зачекайте, будь ласка..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Створюється архів..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "відповідні модулі не увімкнені" sosreport-3.5/po/sr.po0000644000175000017500000001023013200603014014636 0ustar cariboucaribou# Serbian translations for sos # Copyright (C) 2007 Red Hat, Inc. # This file is distributed under the same license as the sos package. # Miloš Komarčević , 2009. # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-28 23:56+0100\n" "Last-Translator: Miloš Komarčević \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (верзија %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "додатак %s се није оверио, прескачем" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "додатак %s се није оверио, прескачем" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "додатак %s се није инсталирао, прескачем" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "додатак %s се није инсталирао, прескачем" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "нису пронађени ваљани додаци" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Следећи додаци су тренутно укључени:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Нема укључених додатака." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Следећи додаци су тренутно искључени:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Доступне су следеће опције додатка:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Нема доступних опција додатка." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "нису пронађени ваљани додаци" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Доступне су следеће опције додатка:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Притисните ENTER за наставак, или CTRL-C за излаз.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Шифрирам архиву..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Покрећем додатке. Молимо сачекајте ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Правим компримовану архиву..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "нису укључени ваљани додаци" sosreport-3.5/po/ar.po0000644000175000017500000000761513200603014014631 0ustar cariboucaribou# sos Arabic translation file # Copyright (C) 2007, Red Hat UK, Ltd. # Imed Chihi , 2007. # Abdalrahim Fakhouri , 2010. msgid "" msgstr "" "Project-Id-Version: sos 1.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-06-08 23:36+0300\n" "Last-Translator: Abdalrahim Fakhouri \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (الإصدار %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "الملحق %s غير سليم، تم تعطيله" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "الملحق %s غير سليم، تم تعطيله" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "لا يمكن تثبيت الملحق %s، تم تعطيله." #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "لا يمكن تثبيت الملحق %s، تم تعطيله." #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "لا توجد ملحقات صالحة" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "تم تفعيل الملحقات التالية" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "لم يتم تفعيل أي ملحق." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "تم تعطيل الملحقات الملحقات التالية" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "يمكن تحديد خيارات الملحقات التالية" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "لا توجد خيارات للملحقات" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "لا توجد ملحقات صالحة" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "يمكن تحديد خيارات الملحقات التالية" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "اضعط زر الإدخال للمتابعة، أو زر التحكّم مع C للخروج.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "جاري تشفير الأرشيف ..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " جاري تشغيل الإضافات. يرجى الانتظار ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "جاري إنشاء الأرشيف المضغوط ..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "لم يتم تفعيل أي ملحقات" sosreport-3.5/po/hu.po0000644000175000017500000000710613200603014014636 0ustar cariboucaribou# Hungarian translations for sos package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: sos trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-16 17:23+0100\n" "Last-Translator: Peter Bojtos \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport·(%s változat)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "%s dugasz érvénytelen, kihagyás" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "%s dugasz érvénytelen, kihagyás" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "%s dugasz nem települ, kihagyás" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "%s dugasz nem települ, kihagyás" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "nincs érvényes dugasz" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "A következő dugaszokat engedélyezték:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Nincs engedélyezett dugasz." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "A következő dugaszokat tiltották le:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "A következő dugasz opciók érhetők el:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Nincs elérhető dugasz opció." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "nincs érvényes dugasz" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "A következő dugasz opciók érhetők el:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Nyomjon ENTER-t a folytatáshoz, vagy CTRL-C-t a kilépéshez.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Archívum titkosítása…" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Plugin-ek futtatása, kérem várjon…" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Tömörített archívum teremtése…" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "nem engedélyeztek érvényes dugaszt" sosreport-3.5/po/sr@latin.po0000644000175000017500000000734213200603014016000 0ustar cariboucaribou# Serbian(Latin) translations for sos # Copyright (C) 2007 Red Hat, Inc. # This file is distributed under the same license as the sos package. # Miloš Komarčević , 2009. # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-28 23:56+0100\n" "Last-Translator: Miloš Komarčević \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (verzija %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "dodatak %s se nije overio, preskačem" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "dodatak %s se nije overio, preskačem" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "dodatak %s se nije instalirao, preskačem" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "dodatak %s se nije instalirao, preskačem" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "nisu pronađeni valjani dodaci" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Sledeći dodaci su trenutno uključeni:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Nema uključenih dodataka." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Sledeći dodaci su trenutno isključeni:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Dostupne su sledeće opcije dodatka:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Nema dostupnih opcija dodatka." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "nisu pronađeni valjani dodaci" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Dostupne su sledeće opcije dodatka:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Pritisnite ENTER za nastavak, ili CTRL-C za izlaz.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Šifriram arhivu..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " Pokrećem dodatke. Molimo sačekajte ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Pravim komprimovanu arhivu..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "nisu uključeni valjani dodaci" sosreport-3.5/po/sos.pot0000644000175000017500000000566313200603014015220 0ustar cariboucaribou# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/de_CH.po0000644000175000017500000000747213200603014015172 0ustar cariboucaribou# German translation of sos # This file is distributed under the same license as the sos package. # Copyright (C) 2007 Red hat, Inc. # # Fabian Affolter , 2009. # msgid "" msgstr "" "Project-Id-Version: SOS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2009-04-18 01:15+0100\n" "Last-Translator: Fabian Affolter \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: KBabel 1.11.4\n" "X-Poedit-Language: Swiss German\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (version %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "Plugin %s validiert nicht, wird ausgelassen" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "Plugin %s validiert nicht, wird ausgelassen" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "Plugin %s installiert sich nicht, wird ausgelassen" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "Plugin %s installiert sich nicht, wird ausgelassen" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "keine gültigen Plugins gefunden" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Die folgenden Plugins sind derzeit aktiviert:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Kein Plugin aktiviert." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Die folgenden Plugins sind derzeit deaktiviert:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Die folgenden Plugin-Optionen stehen zur Verfügung:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Keine Plugin-Optionen verfügbar." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "keine gültigen Plugins gefunden" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Die folgenden Plugin-Optionen stehen zur Verfügung:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" "Drücken Sie die EINGABETASTE, um fortzufahren, oder Ctrl-C, um abzubrechen.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Verschlüssele Archiv ..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Erstelle komprimiertes Archiv ..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "keine gültigen Plugins wurden aktiviert" sosreport-3.5/po/da.po0000644000175000017500000000750413200603014014610 0ustar cariboucaribou# Danish translations for sos package. # Copyright (C) 2007-10 # Automatically generated, 2007. # Kris Thomsen , 2009, 2010. # msgid "" msgstr "" "Project-Id-Version: sos\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-03-12 13:39+0100\n" "Last-Translator: Kris Thomsen \n" "Language-Team: Danish 1);\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (version %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "udvidelsesmodulet %s validerer ikke, springer over" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "udvidelsesmodulet %s validerer ikke, springer over" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "udvidelsesmodulet %s installerer ikke, springer over" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "udvidelsesmodulet %s installerer ikke, springer over" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "ingen gyldige udvidelsesmoduler fundet" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "Følgende udvidelsesmoduler er aktiveret i øjeblikket:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Ingen udvidelsesmoduler aktiveret." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "Følgende udvidelsesmoduler er deaktiveret i øjeblikket:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "Følgende indstillinger for udvidelsesmodul er tilgængelige:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Ingen indstillinger tilgængelige for udvidelsesmodul." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "ingen gyldige udvidelsesmoduler fundet" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "Følgende indstillinger for udvidelsesmodul er tilgængelige:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Tryk ENTER for at fortsætte, eller CTRL-C for at afslutte.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Krypterer arkiv..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Kører udvidelsesmoduler. Vent venligst ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Opretter komprimeret arkiv..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "ingen gyldige udvidelsesmoduler er aktiveret" sosreport-3.5/po/nso.po0000644000175000017500000000555213200603014015024 0ustar cariboucaribou# Language nso translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/fa.po0000644000175000017500000000554513200603014014615 0ustar cariboucaribou# Persian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/po/ja.po0000644000175000017500000001021113200603014014603 0ustar cariboucaribou# translation of ja.po to Japanese # Japanese translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Kiyoto Hashida , 2007, 2010. msgid "" msgstr "" "Project-Id-Version: ja\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-05-31 15:20+0900\n" "Last-Translator: Kiyoto Hashida \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "Plural-Forms: Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Generator: KBabel 1.11.4\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sos レポート (バージョン %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "プラグイン %s は認証できません、スキップします" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "プラグイン %s は認証できません、スキップします" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "プラグイン %s は インストールできません。スキップします" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "プラグイン %s は インストールできません。スキップします" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "有効なプラグインは見付かりません" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "以下のプラグインが現在有効になっています:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "有効なプラグインはありません" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "以下のプラグインは現在無効になっています:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "以下のプラグインオプションが使用できます:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "プラグインオプションは使用できません。" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "有効なプラグインは見付かりません" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "以下のプラグインオプションが使用できます:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "ENTER を押して継続するか、又は CTRL-C で終了します。\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "アーカイブを暗号化しています..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr " プラグインを実行中です。少しお待ち下さい ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "アーカイブを圧縮しています..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "有効な正当プラグインはありませんでした" sosreport-3.5/po/as.po0000644000175000017500000001153113200603014014622 0ustar cariboucaribou# translation of sos.trunk.as.po to Assamese # Assamese translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # # Automatically generated, 2007. # Amitakhya Phukan , 2009. msgid "" msgstr "" "Project-Id-Version: sos.trunk.as\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2009-09-08 19:15+0530\n" "Last-Translator: Amitakhya Phukan \n" "Language-Team: Assamese\n" "Language: as\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sosreport (সংস্কৰণ %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "প্লাগ-ইন %s অনুমোদন কৰা নাযায়, উপেক্ষা কৰা হৈছে" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "প্লাগ-ইন %s অনুমোদন কৰা নাযায়, উপেক্ষা কৰা হৈছে" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "প্লাগ-ইন %s ইনস্টল কৰা নাযায়, উপেক্ষা কৰা হৈছে " #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "প্লাগ-ইন %s ইনস্টল কৰা নাযায়, উপেক্ষা কৰা হৈছে " #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "কোনো বৈধ প্লাগ-ইন পোৱা নাযায়" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "নিম্নলিখিত প্লাগ-ইনসমূহ বৰ্তমানে সক্ৰিয় কৰা হৈছে:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "কোনো প্লাগ-ইন সক্ৰিয় নাই ।" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "নিম্নলিখিত প্লাগ-ইনসমূহ বৰ্তমানে নিষ্ক্ৰিয় অৱস্থাত আছে:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "প্লাগ-ইন সংক্ৰান্ত নিম্নলিখিত বিকল্পসমূহ উপলব্ধ আছে:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "প্লাগ-ইন সংক্ৰান্ত কোনো বিকল্প উপলব্ধ নহয় ।" #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "কোনো বৈধ প্লাগ-ইন পোৱা নাযায়" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "প্লাগ-ইন সংক্ৰান্ত নিম্নলিখিত বিকল্পসমূহ উপলব্ধ আছে:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "আগবঢ়াৰ বাবে ENTER টিপক বা প্ৰস্থান কৰিবলৈ CTRL-C টিপক ।\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "আৰ্কাইভ এনক্ৰিপ্ট কৰা হৈছে..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "কমপ্ৰেছ কৰা আৰ্কাইভ নিৰ্মাণ কৰক..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "কোনো বৈধ প্লাগ-ইন সক্ৰিয় কৰা নহয়" sosreport-3.5/po/nl.po0000644000175000017500000000746213200603014014640 0ustar cariboucaribou# translation of sos.trunk-nl.po to Dutch # Copyright (C) YEAR ORGANIZATION # R.E. van der Luit , 2009, 2010. # Geert Warrink , 2010. msgid "" msgstr "" "Project-Id-Version: sos.trunk-nl\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2010-07-04 18:00+0200\n" "Last-Translator: Geert Warrink \n" "Language-Team: Fedora\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.6.1\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "sos rapport (versie %s)" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "plug-in %s valideerde niet, wordt overgeslagen" #: ../sos/sosreport.py:979 #, fuzzy msgid "does not validate" msgstr "plug-in %s valideerde niet, wordt overgeslagen" #: ../sos/sosreport.py:983 #, fuzzy, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "plug-in %s laat zich niet installeren, wordt overgeslagen" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, fuzzy, python-format msgid "plugin %s does not install, skipping: %s" msgstr "plug-in %s laat zich niet installeren, wordt overgeslagen" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "geen geldige plug-in gevonden" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "De volgende plug-ins zijn momenteel actief:" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "Geen plug-in aangezet." #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "De volgende plug-ins zijn momenteel actief:" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "De volgende plug-in opties zijn beschikbaar:" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "Geen plug-in opties beschikbaar." #: ../sos/sosreport.py:1172 #, fuzzy msgid "no valid profiles found" msgstr "geen geldige plug-in gevonden" #: ../sos/sosreport.py:1174 #, fuzzy msgid "The following profiles are available:" msgstr "De volgende plug-in opties zijn beschikbaar:" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "Druk op ENTER om verder te gaan, of op CTRL-C om te stoppen.\n" #: ../sos/sosreport.py:1216 #, fuzzy msgid " Setting up archive ..." msgstr "Archief bestand wordt versleuteld..." #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 #, fuzzy msgid " Running plugins. Please wait ..." msgstr "Plug-ins worden gedraaid. Wachten a.u.b. ..." #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "Gecomprimeerd archief bestand wordt gemaakt..." #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "er waren geen geldige plug-ins aangezet" sosreport-3.5/po/be.po0000644000175000017500000000555013200603014014611 0ustar cariboucaribou# Belarusian translations for PACKAGE package. # Copyright (C) 2007 ORGANIZATION # Automatically generated, 2007. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-23 19:17+0100\n" "PO-Revision-Date: 2007-10-24 08:45\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" #: ../sos/sosreport.py:745 #, python-format msgid "sosreport (version %s)" msgstr "" #: ../sos/sosreport.py:977 #, python-format msgid "plugin %s does not validate, skipping" msgstr "" #: ../sos/sosreport.py:979 msgid "does not validate" msgstr "" #: ../sos/sosreport.py:983 #, python-format msgid "plugin %s requires root permissionsto execute, skipping" msgstr "" #: ../sos/sosreport.py:985 msgid "requires root" msgstr "" #: ../sos/sosreport.py:993 msgid "excluded" msgstr "" #: ../sos/sosreport.py:997 msgid "skipped" msgstr "" #: ../sos/sosreport.py:1001 msgid "inactive" msgstr "" #: ../sos/sosreport.py:1005 msgid "optional" msgstr "" #: ../sos/sosreport.py:1015 msgid "not specified" msgstr "" #: ../sos/sosreport.py:1023 #, python-format msgid "plugin %s does not install, skipping: %s" msgstr "" #: ../sos/sosreport.py:1027 #, python-format msgid "Unknown or inactive profile(s) provided: %s" msgstr "" #: ../sos/sosreport.py:1120 msgid "no valid plugins found" msgstr "" #: ../sos/sosreport.py:1124 msgid "The following plugins are currently enabled:" msgstr "" #: ../sos/sosreport.py:1130 msgid "No plugin enabled." msgstr "" #: ../sos/sosreport.py:1134 msgid "The following plugins are currently disabled:" msgstr "" #: ../sos/sosreport.py:1145 msgid "The following plugin options are available:" msgstr "" #: ../sos/sosreport.py:1160 msgid "No plugin options available." msgstr "" #: ../sos/sosreport.py:1172 msgid "no valid profiles found" msgstr "" #: ../sos/sosreport.py:1174 msgid "The following profiles are available:" msgstr "" #: ../sos/sosreport.py:1197 msgid "Press ENTER to continue, or CTRL-C to quit.\n" msgstr "" #: ../sos/sosreport.py:1216 msgid " Setting up archive ..." msgstr "" #: ../sos/sosreport.py:1250 msgid " Setting up plugins ..." msgstr "" #: ../sos/sosreport.py:1282 msgid " Running plugins. Please wait ..." msgstr "" #: ../sos/sosreport.py:1490 msgid "Creating compressed archive..." msgstr "" #: ../sos/sosreport.py:1498 #, python-format msgid " %s while finalizing archive" msgstr "" #: ../sos/sosreport.py:1517 #, python-format msgid "Error moving directory: %s" msgstr "" #: ../sos/sosreport.py:1540 #, python-format msgid "Error moving archive file: %s" msgstr "" #: ../sos/sosreport.py:1558 #, python-format msgid "Error moving checksum file: %s" msgstr "" #: ../sos/sosreport.py:1574 msgid "no valid plugins were enabled" msgstr "" sosreport-3.5/README.md0000644000175000017500000000555413200603014014530 0ustar cariboucaribou[![Build Status](https://travis-ci.org/sosreport/sos.svg?branch=master)](https://travis-ci.org/sosreport/sos) # SoS Sos is an extensible, portable, support data collection tool primarily aimed at Linux distributions and other UNIX-like operating systems. This project is hosted at: * http://github.com/sosreport/sos For the latest version, to contribute, and for more information, please visit the project pages or join the mailing list. To clone the current master (development) branch run: ``` git clone git://github.com/sosreport/sos.git ``` ## Reporting bugs Please report bugs via the mailing list or by opening an issue in the [GitHub Issue Tracker][5] ## Mailing list The [sos-devel][4] is the mailing list for any sos-related questions and discussion. Patch submissions and reviews are welcome too. ## Patches and pull requests Patches can be submitted via the mailing list or as GitHub pull requests. If using GitHub please make sure your branch applies to the current master as a 'fast forward' merge (i.e. without creating a merge commit). Use the `git rebase` command to update your branch to the current master if necessary. Please refer to the [contributor guidelines][0] for guidance on formatting patches and commit messages. ## Documentation User and API [documentation][6] is automatically generated using [Sphinx][7] and [Read the Docs][8]. ### Wiki * [How to write a plugin][1] * [How to write a policy][2] * [Plugin options][3] To help get your changes merged quickly with as few revisions as possible please refer to the [Contributor Guidelines][0] when submitting patches or pull requests. ## Installation ### Manual Installation You can simply run from the git checkout now: ``` $ sudo ./sosreport -a ``` Or, if you only have python3 installed: ``` $ sudo python3 ./sosreport -a ``` * Note: the `sosreport` command requires a configuration file: if no `sos.conf` is present in the `/etc` directory (i.e. no system installation of sos exists), use the `--config` option to provide one: ``` $ sudo python ./sosreport -a --config ./sos.conf ``` To install locally (as root): ``` # make install ``` To build an rpm: ``` $ make rpm ``` ### Pre-built Packaging Fedora/RHEL users install via yum: ``` yum install sos ``` Debian(Sid) users install via apt: ``` apt-get install sosreport ``` Ubuntu(14.04 LTS and above) users install via apt: ``` sudo apt-get install sosreport ``` [0]: https://github.com/sosreport/sos/wiki/Contribution-Guidelines [1]: https://github.com/sosreport/sos/wiki/How-to-Write-a-Plugin [2]: https://github.com/sosreport/sos/wiki/How-to-Write-a-Policy [3]: https://github.com/sosreport/sos/wiki/Plugin-options [4]: https://www.redhat.com/mailman/listinfo/sos-devel [5]: https://github.com/sosreport/sos/issues?state=open [6]: http://sos.readthedocs.org/en/latest/index.html# [7]: http://sphinx-doc.org/ [8]: https://www.readthedocs.org/ sosreport-3.5/man/0000755000175000017500000000000013073155336014034 5ustar cariboucaribousosreport-3.5/man/en/0000755000175000017500000000000013203300002014407 5ustar cariboucaribousosreport-3.5/man/en/sosreport.10000644000175000017500000001342013203300002016531 0ustar cariboucaribou.TH SOSREPORT 1 "Mon Mar 25 2013" .SH NAME sosreport \- Collect and package diagnostic and support data .SH SYNOPSIS .B sosreport [-l|--list-plugins]\fR [-n|--skip-plugins plugin-names]\fR [-e|--enable-plugins plugin-names]\fR [-o|--only-plugins plugin-names]\fR [-a|--alloptions] [-v|--verbose]\fR [-k plug.opt|--plugin-option plug.opt]\fR [--no-report] [--config-file conf]\fR [--batch] [--build] [--debug]\fR [--name name] [--case-id id] [--ticket-number nr] [-s|--sysroot SYSROOT]\fR [-c|--chroot {auto|always|never}\fR [--tmp-dir directory]\fR [-p|--profile profile-name]\fR [--list-profiles]\fR [--verify]\fR [--log-size]\fR [--all-logs]\fR [-z|--compression-type method]\fR [--experimental]\fR [-h|--help]\fR .SH DESCRIPTION \fBsosreport\fR generates an archive of configuration and diagnostic information from the running system. The archive may be stored locally or centrally for recording or tracking purposes or may be sent to technical support representatives, developers or system administrators to assist with technical fault-finding and debugging. .LP Sos is modular in design and is able to collect data from a wide range of subsystems and packages that may be installed. An XML or HTML report summarizing the collected information is optionally generated and stored within the archive. .SH OPTIONS .TP .B \-l, \--list-plugins List all available plugins and their options. Plug-ins that would not be enabled by the current configuration are listed separately. .TP .B \-n, --skip-plugins PLUGNAME[,PLUGNAME] Disable the specified plugin(s). Multiple plug-ins may be specified by repeating the option or as a comma-separated list. .TP .B \-e, --enable-plugins PLUGNAME[,PLUGNAME] Enable the specified plugin(s). Multiple plug-ins may be specified by repeating the option or as a comma-separated list. .TP .B \-o, --only-plugins PLUGNAME[,PLUGNAME] Enable the specified plugin(s) only (all other plugins should be disabled). Multiple plugins may be specified by repeating the option or as a comma-separated list. .TP .B \-k PLUGNAME.PLUGOPT[=VALUE], \--plugin-option=PLUGNAME.PLUGOPT[=VALUE] Specify plug-in options. The option PLUGOPT is enabled, or set to the specified value in the plug-in PLUGNAME. .TP .B \-a, \--alloptions Set all boolean options to True for all enabled plug-ins. .TP .B \-v, \--verbose Increase logging verbosity. May be specified multiple times to enable additional debugging messages. .TP .B \-q, \--quiet Only log fatal errors to stderr. .TP .B \--no-report Disable HTML/XML report writing. .TP .B \--config-file CONFIG Specify alternate configuration file. .TP .B \-s, \--sysroot SYSROOT Specify an alternate root file system path. Useful for collecting reports from containers and images. .TP .B \-c, \--chroot {auto|always|never} Set the chroot mode. When \--sysroot is used commands default to executing with SYSROOT as the root directory (unless disabled by a specific plugin). This can be overriden by setting \--chroot to "always" (always chroot) or "never" (always run in the host namespace). .TP .B \--tmp-dir DIRECTORY Specify alternate temporary directory to copy data as well as the compressed report. .TP .B \--list-profiles Display a list of available profiles and the plugins that they enable. .TP .B \-p, \--profile NAME Only run plugins that correspond to the given profile. Multple profiles may be specified as a comma-separated list; the set of plugins executed is the union of each of the profile's plugin sets. Currently defined profiles include: boot, cluster, desktop, debug, hardware, identity, network, openstack, packagemanager, security, services, storage, sysmgmt, system, performance, virt, and webserver. .TP .B \--verify Instructs plugins to perform plugin-specific verification during data collection. This may include package manager verification, log integrity testing or other plugin defined behaviour. Use of \--verify may cause the time taken to generate a report to be considerably longer. .TP .B \--log-size Places a global limit on the size (in MiB) of any collected set of logs. The limit is applied separately for each set of logs collected by any plugin. .TP .B \--all-logs Tell plugins to collect all possible log data ignoring any size limits and including logs in non-default locations. This option may significantly increase the size of reports. .TP .B \-z, \--compression-type METHOD Override the default compression type specified by the active policy. .TP .TP .B \--batch Generate archive without prompting for interactive input. .TP .B \--name NAME Specify a name to be used for the archive. .TP .B \--case-id NUMBER Specify a case identifier to associate with the archive. Identifiers may include alphanumeric characters, commas and periods ('.'). Synonymous with \--ticket-number. .TP .B \--ticket-number NUMBER Specify a ticket number or other identifier to associate with the archive. Identifiers may include alphanumeric characters, commas and periods ('.'). Synonymous with \--case-id. .TP .B \--build Do not archive copied data. Causes sosreport to leave an uncompressed archive as a temporary file or directory tree. .TP .B \--debug Enable interactive debugging using the python debugger. Exceptions in sos or plug-in code will cause a trap to the pdb shell. .TP .B \--experimental Enable plugins marked as experimental. Experimental plugins may not have been tested for this port or may still be under active development. .TP .B \--help Display usage message. .SH MAINTAINER .nf Bryn M. Reeves .fi .SH AUTHORS & CONTRIBUTORS See \fBAUTHORS\fR file in /usr/share/doc/sosreport. .nf .SH TRANSLATIONS .nf Translations are handled by transifex (https://fedorahosted.org/transifex/) .fi .fi sosreport-3.5/man/en/sos.conf.50000644000175000017500000000145413073155336016260 0ustar cariboucaribou.TH "sos.conf" "5" "SOSREPORT" "sosreport configuration file" .SH NAME sos.conf \- sosreport configuration .SH DESCRIPTION .sp sosreport uses a configuration file at /etc/sos.conf. .SH PARAMETERS .sp There are two sections in the sosreport configuration file: plugins, and tunables. Options are set using 'ini'-style \fBname = value\fP pairs. Some options accept a comma separated list of values. .TP \fB[plugins]\fP disable Comma separated list of plugins to disable. .TP \fB[tunables]\fP plugin.option Alter available options for defined plugin. .SH EXAMPLES To disable the 'general' and 'filesys' plugins: .LP [plugins] .br disable = general, filesys .sp To disable rpm package verification in the RPM plugin: .LP [tunables] .br rpm.rpmva = off .br .SH FILES .sp /etc/sos.conf .SH SEE ALSO .sp sosreport(1)