Linux salto.nuvemidc.com 5.14.0-687.42.1.el9_8.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Aug 27 11:55:12 EDT 2026 x86_64
LiteSpeed
: 177.73.233.61 | : 216.73.217.116
Cant Read [ /etc/named.conf ]
7.4.33
agenci18
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
README
+ Create Folder
+ Create File
/
lib /
python3.9 /
site-packages /
sos /
report /
plugins /
[ HOME SHELL ]
Name
Size
Permission
Action
__pycache__
[ DIR ]
drwxr-xr-x
__init__.py
142.87
KB
-rw-r--r--
aap_containerized.py
11.2
KB
-rw-r--r--
aap_controller.py
3.75
KB
-rw-r--r--
aap_eda.py
4.04
KB
-rw-r--r--
aap_gateway.py
2.55
KB
-rw-r--r--
aap_hub.py
1.99
KB
-rw-r--r--
aap_receptor.py
1.85
KB
-rw-r--r--
abrt.py
1.51
KB
-rw-r--r--
acpid.py
917
B
-rw-r--r--
activemq.py
1.65
KB
-rw-r--r--
aide.py
1.41
KB
-rw-r--r--
alternatives.py
2.27
KB
-rw-r--r--
anaconda.py
1.46
KB
-rw-r--r--
anacron.py
782
B
-rw-r--r--
anbox.py
4.06
KB
-rw-r--r--
ansible.py
1.08
KB
-rw-r--r--
apache.py
6.07
KB
-rw-r--r--
apparmor.py
1.05
KB
-rw-r--r--
apport.py
1.37
KB
-rw-r--r--
apt.py
1.83
KB
-rw-r--r--
arcconf.py
2.17
KB
-rw-r--r--
ata.py
1016
B
-rw-r--r--
auditd.py
1.83
KB
-rw-r--r--
authd.py
2.2
KB
-rw-r--r--
autofs.py
2.77
KB
-rw-r--r--
aws.py
2.53
KB
-rw-r--r--
azure.py
3.8
KB
-rw-r--r--
bcache.py
2.2
KB
-rw-r--r--
bird.py
2.41
KB
-rw-r--r--
block.py
3.12
KB
-rw-r--r--
boom.py
1.19
KB
-rw-r--r--
boot.py
2.11
KB
-rw-r--r--
bootc.py
940
B
-rw-r--r--
btrfs.py
739
B
-rw-r--r--
buildah.py
1.82
KB
-rw-r--r--
candlepin.py
7
KB
-rw-r--r--
canonical_livepatch.py
1.04
KB
-rw-r--r--
canonical_livepatch_onprem.py
1.22
KB
-rw-r--r--
ceph_ansible.py
956
B
-rw-r--r--
ceph_common.py
6.83
KB
-rw-r--r--
ceph_iscsi.py
1.55
KB
-rw-r--r--
ceph_mds.py
4.15
KB
-rw-r--r--
ceph_mgr.py
5.92
KB
-rw-r--r--
ceph_mon.py
10.03
KB
-rw-r--r--
ceph_osd.py
5.27
KB
-rw-r--r--
ceph_rgw.py
4.51
KB
-rw-r--r--
cgroups.py
1.39
KB
-rw-r--r--
charmed_cruise_control.py
4.06
KB
-rw-r--r--
charmed_kafka.py
6.54
KB
-rw-r--r--
charmed_mongodb.py
14.7
KB
-rw-r--r--
charmed_mongos.py
13.09
KB
-rw-r--r--
charmed_mysql.py
9.73
KB
-rw-r--r--
charmed_opensearch.py
5
KB
-rw-r--r--
charmed_opensearch_dashboards....
5.11
KB
-rw-r--r--
charmed_postgresql.py
6.05
KB
-rw-r--r--
charmed_zookeeper.py
6.35
KB
-rw-r--r--
chrony.py
1.84
KB
-rw-r--r--
cifs.py
962
B
-rw-r--r--
clear_containers.py
2.58
KB
-rw-r--r--
cloud_init.py
1.18
KB
-rw-r--r--
cman.py
1.78
KB
-rw-r--r--
cobbler.py
1.29
KB
-rw-r--r--
cockpit.py
968
B
-rw-r--r--
collectd.py
2.24
KB
-rw-r--r--
collectl.py
752
B
-rw-r--r--
command_line_assistant.py
1.34
KB
-rw-r--r--
composer.py
2.11
KB
-rw-r--r--
conntrack.py
2.37
KB
-rw-r--r--
console.py
869
B
-rw-r--r--
container_log.py
1.54
KB
-rw-r--r--
containerd.py
1.37
KB
-rw-r--r--
containers_common.py
3.02
KB
-rw-r--r--
convert2rhel.py
1.04
KB
-rw-r--r--
coredump.py
5.13
KB
-rw-r--r--
corosync.py
2.41
KB
-rw-r--r--
crio.py
3.69
KB
-rw-r--r--
cron.py
1.01
KB
-rw-r--r--
crypto.py
1.38
KB
-rw-r--r--
cs.py
4.5
KB
-rw-r--r--
ctdb.py
1.42
KB
-rw-r--r--
cups.py
3.08
KB
-rw-r--r--
curtin.py
1.74
KB
-rw-r--r--
cxl.py
1.32
KB
-rw-r--r--
date.py
867
B
-rw-r--r--
dbus.py
877
B
-rw-r--r--
dellrac.py
1.69
KB
-rw-r--r--
devicemapper.py
1.13
KB
-rw-r--r--
devices.py
740
B
-rw-r--r--
dhcp.py
1.58
KB
-rw-r--r--
discovery.py
1.15
KB
-rw-r--r--
distupgrade.py
1.51
KB
-rw-r--r--
dlm.py
1.52
KB
-rw-r--r--
dmraid.py
1.29
KB
-rw-r--r--
dnf.py
5.7
KB
-rw-r--r--
docker.py
5.41
KB
-rw-r--r--
docker_distribution.py
1.3
KB
-rw-r--r--
dovecot.py
1007
B
-rw-r--r--
dpkg.py
1.16
KB
-rw-r--r--
dracut.py
1.17
KB
-rw-r--r--
drbd.py
2.81
KB
-rw-r--r--
ds.py
3.6
KB
-rw-r--r--
ebpf.py
3.11
KB
-rw-r--r--
elastic.py
2.5
KB
-rw-r--r--
etcd.py
2.14
KB
-rw-r--r--
fail2ban.py
830
B
-rw-r--r--
fapolicyd.py
1.34
KB
-rw-r--r--
fcoe.py
1018
B
-rw-r--r--
fibrechannel.py
1.77
KB
-rw-r--r--
filesys.py
3.81
KB
-rw-r--r--
firewall_tables.py
5.07
KB
-rw-r--r--
firewalld.py
2.05
KB
-rw-r--r--
flatpak.py
1.29
KB
-rw-r--r--
foreman.py
20.59
KB
-rw-r--r--
foreman_installer.py
3.99
KB
-rw-r--r--
foreman_openscap.py
830
B
-rw-r--r--
foreman_proxy.py
2.65
KB
-rw-r--r--
foremanctl.py
2.17
KB
-rw-r--r--
freeipmi.py
896
B
-rw-r--r--
frr.py
1.79
KB
-rw-r--r--
fwupd.py
1.41
KB
-rw-r--r--
gcp.py
5.3
KB
-rw-r--r--
gdm.py
735
B
-rw-r--r--
getent.py
1.04
KB
-rw-r--r--
gfs2.py
1.36
KB
-rw-r--r--
gluster.py
4.34
KB
-rw-r--r--
gluster_block.py
1.07
KB
-rw-r--r--
grafana.py
2.01
KB
-rw-r--r--
graylog.py
1.45
KB
-rw-r--r--
greenboot.py
905
B
-rw-r--r--
grout.py
2.44
KB
-rw-r--r--
grub.py
988
B
-rw-r--r--
grub2.py
2.81
KB
-rw-r--r--
gssproxy.py
823
B
-rw-r--r--
haproxy.py
2.7
KB
-rw-r--r--
hardware.py
1.13
KB
-rw-r--r--
helm.py
1.14
KB
-rw-r--r--
host.py
1.74
KB
-rw-r--r--
hpasm.py
898
B
-rw-r--r--
hpssm.py
2.65
KB
-rw-r--r--
hts.py
700
B
-rw-r--r--
hyperv.py
886
B
-rw-r--r--
i18n.py
774
B
-rw-r--r--
infiniband.py
2.66
KB
-rw-r--r--
infinidat.py
1.38
KB
-rw-r--r--
insights.py
2.68
KB
-rw-r--r--
instructlab.py
5.45
KB
-rw-r--r--
ipa.py
7.59
KB
-rw-r--r--
ipmitool.py
1.53
KB
-rw-r--r--
iprconfig.py
4.53
KB
-rw-r--r--
ipvs.py
1.04
KB
-rw-r--r--
iscsi.py
2.15
KB
-rw-r--r--
iscsitarget.py
1.25
KB
-rw-r--r--
jars.py
5.39
KB
-rw-r--r--
java.py
978
B
-rw-r--r--
juju.py
8.25
KB
-rw-r--r--
kafka.py
2.07
KB
-rw-r--r--
kata_containers.py
1.34
KB
-rw-r--r--
kdump.py
6.99
KB
-rw-r--r--
kea.py
1.71
KB
-rw-r--r--
keepalived.py
855
B
-rw-r--r--
kernel.py
5.85
KB
-rw-r--r--
kernelrt.py
1.66
KB
-rw-r--r--
keyutils.py
894
B
-rw-r--r--
kimchi.py
1009
B
-rw-r--r--
kpatch.py
1.02
KB
-rw-r--r--
krb5.py
2.88
KB
-rw-r--r--
kubernetes.py
12.86
KB
-rw-r--r--
kvm.py
954
B
-rw-r--r--
landscape.py
3.21
KB
-rw-r--r--
ldap.py
2.99
KB
-rw-r--r--
leapp.py
1.49
KB
-rw-r--r--
libraries.py
1.56
KB
-rw-r--r--
libreswan.py
2.47
KB
-rw-r--r--
libvirt.py
3.76
KB
-rw-r--r--
lightdm.py
1.11
KB
-rw-r--r--
lilo.py
716
B
-rw-r--r--
login.py
1.06
KB
-rw-r--r--
logrotate.py
1.24
KB
-rw-r--r--
logs.py
4.97
KB
-rw-r--r--
loki.py
7.58
KB
-rw-r--r--
lstopo.py
1.2
KB
-rw-r--r--
lustre.py
2.95
KB
-rw-r--r--
lvm2.py
4.6
KB
-rw-r--r--
lxd.py
4.65
KB
-rw-r--r--
maas.py
5.85
KB
-rw-r--r--
manageiq.py
2.86
KB
-rw-r--r--
md.py
1.24
KB
-rw-r--r--
megacli.py
1.01
KB
-rw-r--r--
mellanox_firmware.py
4.7
KB
-rw-r--r--
memcached.py
1.58
KB
-rw-r--r--
memory.py
1.44
KB
-rw-r--r--
microcloud.py
2.72
KB
-rw-r--r--
microk8s.py
4.43
KB
-rw-r--r--
microovn.py
3.4
KB
-rw-r--r--
microshift.py
6.96
KB
-rw-r--r--
microshift_ovn.py
1.69
KB
-rw-r--r--
migration_results.py
637
B
-rw-r--r--
mongodb.py
4.03
KB
-rw-r--r--
monit.py
1.68
KB
-rw-r--r--
mpt.py
732
B
-rw-r--r--
mssql.py
3.02
KB
-rw-r--r--
multipath.py
1011
B
-rw-r--r--
mvcli.py
1003
B
-rw-r--r--
mysql.py
4.31
KB
-rw-r--r--
mysql_router.py
1.31
KB
-rw-r--r--
named.py
2.5
KB
-rw-r--r--
navicli.py
2.47
KB
-rw-r--r--
net_diagram.py
6.81
KB
-rw-r--r--
networking.py
14.61
KB
-rw-r--r--
networkmanager.py
5.27
KB
-rw-r--r--
nfs.py
1.47
KB
-rw-r--r--
nfsganesha.py
1.2
KB
-rw-r--r--
nginx.py
1.53
KB
-rw-r--r--
nis.py
812
B
-rw-r--r--
nodejs.py
1.18
KB
-rw-r--r--
npm.py
2.06
KB
-rw-r--r--
nscd.py
989
B
-rw-r--r--
nss.py
885
B
-rw-r--r--
ntb.py
937
B
-rw-r--r--
ntp.py
1.41
KB
-rw-r--r--
numa.py
1.46
KB
-rw-r--r--
nvidia.py
1.82
KB
-rw-r--r--
nvme.py
1.71
KB
-rw-r--r--
nvmetcli.py
977
B
-rw-r--r--
oddjob.py
871
B
-rw-r--r--
omnipath_client.py
1.92
KB
-rw-r--r--
omnipath_manager.py
2.38
KB
-rw-r--r--
omsa.py
1.64
KB
-rw-r--r--
opencl.py
692
B
-rw-r--r--
opencontrail.py
1.35
KB
-rw-r--r--
opendaylight.py
1.38
KB
-rw-r--r--
opengl.py
694
B
-rw-r--r--
openhpi.py
878
B
-rw-r--r--
opensearch.py
2.56
KB
-rw-r--r--
openshift.py
16.88
KB
-rw-r--r--
openshift_ovn.py
2.95
KB
-rw-r--r--
openssl.py
1.4
KB
-rw-r--r--
openstack_ansible.py
1.31
KB
-rw-r--r--
openstack_aodh.py
3.81
KB
-rw-r--r--
openstack_barbican.py
1.76
KB
-rw-r--r--
openstack_ceilometer.py
3.07
KB
-rw-r--r--
openstack_cinder.py
6.26
KB
-rw-r--r--
openstack_database.py
4.99
KB
-rw-r--r--
openstack_designate.py
3.55
KB
-rw-r--r--
openstack_edpm.py
2.25
KB
-rw-r--r--
openstack_glance.py
4.56
KB
-rw-r--r--
openstack_gnocchi.py
4.27
KB
-rw-r--r--
openstack_heat.py
5.26
KB
-rw-r--r--
openstack_horizon.py
3.37
KB
-rw-r--r--
openstack_instack.py
5.74
KB
-rw-r--r--
openstack_ironic.py
8.21
KB
-rw-r--r--
openstack_keystone.py
4.76
KB
-rw-r--r--
openstack_manila.py
3.68
KB
-rw-r--r--
openstack_masakari.py
2.08
KB
-rw-r--r--
openstack_masakarimonitors.py
1.5
KB
-rw-r--r--
openstack_mistral.py
1.6
KB
-rw-r--r--
openstack_neutron.py
5.86
KB
-rw-r--r--
openstack_nova.py
8.75
KB
-rw-r--r--
openstack_novajoin.py
1.15
KB
-rw-r--r--
openstack_octavia.py
5.16
KB
-rw-r--r--
openstack_placement.py
5.01
KB
-rw-r--r--
openstack_sahara.py
2.57
KB
-rw-r--r--
openstack_swift.py
2.75
KB
-rw-r--r--
openstack_tripleo.py
1.62
KB
-rw-r--r--
openstack_trove.py
2.18
KB
-rw-r--r--
opensvc.py
3.39
KB
-rw-r--r--
openvswitch.py
17.56
KB
-rw-r--r--
oratab.py
1.92
KB
-rw-r--r--
origin.py
8.57
KB
-rw-r--r--
os_net_config.py
800
B
-rw-r--r--
ostree.py
1.05
KB
-rw-r--r--
ovirt.py
9.44
KB
-rw-r--r--
ovirt_engine_backup.py
1.72
KB
-rw-r--r--
ovirt_hosted_engine.py
2.16
KB
-rw-r--r--
ovirt_imageio.py
1.56
KB
-rw-r--r--
ovirt_node.py
1.62
KB
-rw-r--r--
ovirt_provider_ovn.py
1.16
KB
-rw-r--r--
ovn_central.py
9.93
KB
-rw-r--r--
ovn_host.py
3.32
KB
-rw-r--r--
pacemaker.py
5.96
KB
-rw-r--r--
pam.py
1.38
KB
-rw-r--r--
pci.py
1.35
KB
-rw-r--r--
pcp.py
6.05
KB
-rw-r--r--
perccli.py
1.81
KB
-rw-r--r--
perccli2.py
1.82
KB
-rw-r--r--
peripety.py
1.19
KB
-rw-r--r--
perl.py
662
B
-rw-r--r--
pipewire.py
2.43
KB
-rw-r--r--
pmem.py
3.34
KB
-rw-r--r--
podman.py
5.52
KB
-rw-r--r--
postfix.py
4.32
KB
-rw-r--r--
postgresql.py
5.16
KB
-rw-r--r--
powerpath.py
1.82
KB
-rw-r--r--
powerpc.py
4.29
KB
-rw-r--r--
ppp.py
848
B
-rw-r--r--
procenv.py
710
B
-rw-r--r--
process.py
4.29
KB
-rw-r--r--
processor.py
4.02
KB
-rw-r--r--
proxmox.py
2.98
KB
-rw-r--r--
psacct.py
1.29
KB
-rw-r--r--
ptp.py
892
B
-rw-r--r--
pulp.py
7.66
KB
-rw-r--r--
pulpcore.py
11.25
KB
-rw-r--r--
pulseaudio.py
1.56
KB
-rw-r--r--
puppet.py
2.26
KB
-rw-r--r--
python.py
3.79
KB
-rw-r--r--
qaucli.py
1.35
KB
-rw-r--r--
qpid.py
3.53
KB
-rw-r--r--
qpid_dispatch.py
2.19
KB
-rw-r--r--
qt.py
809
B
-rw-r--r--
quagga.py
755
B
-rw-r--r--
rabbitmq.py
2.73
KB
-rw-r--r--
radius.py
1.34
KB
-rw-r--r--
rasdaemon.py
994
B
-rw-r--r--
rear.py
1.31
KB
-rw-r--r--
redis.py
1.95
KB
-rw-r--r--
release.py
1.23
KB
-rw-r--r--
rhc.py
2.31
KB
-rw-r--r--
rhcos.py
1.36
KB
-rw-r--r--
rhel_drivers.py
953
B
-rw-r--r--
rhui.py
2.27
KB
-rw-r--r--
rhui_containerized.py
3.63
KB
-rw-r--r--
rhv_analyzer.py
941
B
-rw-r--r--
rpm.py
2.34
KB
-rw-r--r--
rpmostree.py
1.12
KB
-rw-r--r--
ruby.py
813
B
-rw-r--r--
s390.py
2.38
KB
-rw-r--r--
salt.py
2.14
KB
-rw-r--r--
saltmaster.py
2.67
KB
-rw-r--r--
samba.py
1.79
KB
-rw-r--r--
sanlock.py
1000
B
-rw-r--r--
saphana.py
2.52
KB
-rw-r--r--
sapnw.py
5.03
KB
-rw-r--r--
sar.py
3.95
KB
-rw-r--r--
sas3ircu.py
1.3
KB
-rw-r--r--
scsi.py
2.42
KB
-rw-r--r--
seagate_ses.py
2.1
KB
-rw-r--r--
sedutil.py
1.7
KB
-rw-r--r--
selinux.py
2.02
KB
-rw-r--r--
sendmail.py
1.18
KB
-rw-r--r--
services.py
1.43
KB
-rw-r--r--
shmcli.py
4.21
KB
-rw-r--r--
skydive.py
2.28
KB
-rw-r--r--
slurm.py
3.75
KB
-rw-r--r--
smartcard.py
1.49
KB
-rw-r--r--
smclient.py
1.89
KB
-rw-r--r--
snap.py
2.99
KB
-rw-r--r--
snapm.py
1021
B
-rw-r--r--
snapper.py
741
B
-rw-r--r--
snmp.py
903
B
-rw-r--r--
sos_extras.py
3.74
KB
-rw-r--r--
soundcard.py
980
B
-rw-r--r--
spyre.py
2.98
KB
-rw-r--r--
squid.py
1.25
KB
-rw-r--r--
ssh.py
3.73
KB
-rw-r--r--
ssmtp.py
976
B
-rw-r--r--
sssd.py
2.4
KB
-rw-r--r--
storageconsole.py
1.66
KB
-rw-r--r--
storcli.py
1.8
KB
-rw-r--r--
stratis.py
1.12
KB
-rw-r--r--
stunnel.py
958
B
-rw-r--r--
subscription_manager.py
6.17
KB
-rw-r--r--
sudo.py
1.48
KB
-rw-r--r--
sunbeam.py
6.89
KB
-rw-r--r--
sunbeam_hypervisor.py
3.73
KB
-rw-r--r--
sunrpc.py
818
B
-rw-r--r--
symcli.py
3.46
KB
-rw-r--r--
system.py
1.67
KB
-rw-r--r--
systemd.py
4.06
KB
-rw-r--r--
systemtap.py
881
B
-rw-r--r--
sysvipc.py
886
B
-rw-r--r--
targetcli.py
1.12
KB
-rw-r--r--
teamd.py
1.24
KB
-rw-r--r--
telegraf.py
1.68
KB
-rw-r--r--
tftpserver.py
1.21
KB
-rw-r--r--
tigervnc.py
1.67
KB
-rw-r--r--
tomcat.py
2.08
KB
-rw-r--r--
tpm2.py
989
B
-rw-r--r--
tuned.py
1.17
KB
-rw-r--r--
ubuntu.py
2.23
KB
-rw-r--r--
udev.py
900
B
-rw-r--r--
udisks.py
804
B
-rw-r--r--
ufw.py
987
B
-rw-r--r--
ultrapath.py
1.3
KB
-rw-r--r--
unbound.py
899
B
-rw-r--r--
unity.py
703
B
-rw-r--r--
unpackaged.py
3.48
KB
-rw-r--r--
usb.py
731
B
-rw-r--r--
usbguard.py
813
B
-rw-r--r--
validation_framework.py
1.5
KB
-rw-r--r--
valkey.py
1.75
KB
-rw-r--r--
vault.py
1.74
KB
-rw-r--r--
vdo.py
2.27
KB
-rw-r--r--
vdsm.py
5.05
KB
-rw-r--r--
vectordev.py
1.2
KB
-rw-r--r--
veritas.py
1.33
KB
-rw-r--r--
vhostmd.py
1.71
KB
-rw-r--r--
virsh.py
4.42
KB
-rw-r--r--
virtwho.py
985
B
-rw-r--r--
vmware.py
1.74
KB
-rw-r--r--
vsftpd.py
724
B
-rw-r--r--
vulkan.py
700
B
-rw-r--r--
watchdog.py
2.89
KB
-rw-r--r--
wireless.py
886
B
-rw-r--r--
x11.py
1.38
KB
-rw-r--r--
xdp.py
659
B
-rw-r--r--
xen.py
3.32
KB
-rw-r--r--
xfs.py
1.34
KB
-rw-r--r--
xinetd.py
837
B
-rw-r--r--
zfs.py
1.91
KB
-rw-r--r--
zvm.py
2.76
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : charmed_mongodb.py
# This file is part of the sos project: https://github.com/sosreport/sos # # This copyrighted material is made available to anyone wishing to use, # modify, copy, or redistribute it subject to the terms and conditions of # version 2 of the GNU General Public License. # # See the LICENSE file in the source distribution for further information.# from enum import Enum from urllib.parse import quote_plus, urlencode import os import shutil from pathlib import Path import typing from typing import Dict, Optional, Tuple import yaml from sos.report.plugins import Plugin, PluginOpt, UbuntuPlugin from sos.utilities import is_executable DATE_FORMAT = "%Y-%m-%d-%H" class Substrate(Enum): VM = "vm" K8S = "k8s" Role = typing.Literal["replication", "shard", "config-server"] class CharmedMongoDB(Plugin, UbuntuPlugin): """The Charmed MongoDB plugin is used to collect MongoDB configuration and logs from the Charmed MongoDB snap package or K8s deployment. If all_logs is set to True, it collects all logs by default. The parameters `dbuser` and `dbpass` are used to dump database information, replicaset status, shard status, etc. You can provide those parameters with the environment variables `MONGODB_USER` and `MONGODB_PASSWORD` """ short_desc = "Charmed MongoDB" plugin_name = "charmed_mongodb" # Triggers packages = ("charmed-mongodb",) containers = ("mongod",) snap_package = "charmed-mongodb" snap_path_common = "/var/snap/charmed-mongodb/common" snap_path_current = "/var/snap/charmed-mongodb/current" kube_cmd = "kubectl" selector = "app.kubernetes.io/name=mongodb-k8s" conf_paths = { "MONGODB_CONF": "/etc/mongod", "MONGODB_LOGS": "/var/log/mongodb", } option_list = [ PluginOpt( name="dumpdbs", default=False, val_type=bool, desc="Set to true to dump server information.", ), PluginOpt( "dbuser", default="", val_type=str, desc="Username for database dump collection", ), PluginOpt( "dbpass", default="", val_type=str, desc="Password for database dump collection", ), ] regular_commands: Tuple[Tuple[str, str], ...] = ( ("EJSON.stringify(db.serverStatus())", "server_status.txt"), ("EJSON.stringify(rs.status())", "replicaset_status.txt"), ("EJSON.stringify(db.getUsers())", "db_users.txt"), ("EJSON.stringify(db.getRoles())", "db_roles.txt"), ( "EJSON.stringify(db.adminCommand({listDatabases: 1}))", "db_databases.txt", ), ) config_server_commands: Tuple[Tuple[str, str], ...] = ( ("EJSON.stringify(sh.status())", "shard_cluster_status.txt"), ("EJSON.stringify(sh.listShards())", "shard_shards.txt"), ) def _join_conf_path(self, base: str, *parts: str): stripped_parts = [p.lstrip(os.path.sep) for p in parts] return self.path_join(base, *stripped_parts) @staticmethod def _match_role(role: str) -> Optional[Role]: if role == "configsvr": return "config-server" if role == "shardsvr": return "shard" if role == "replication": return "replication" return None def vm_role(self) -> Optional[Role]: role: str = "replication" conf_path = self._join_conf_path( self.snap_path_current, self.conf_paths["MONGODB_CONF"] ) try: with open( f"{conf_path}/mongod.conf", encoding="utf-8", ) as f: data = yaml.safe_load(f) if sharding_conf := data.get("sharding", {}): role = sharding_conf.get("clusterRole", "") return self._match_role(role) except FileNotFoundError: return None def k8s_role(self, kube_cmd: str, cont: str, pod: str) -> Optional[Role]: role: str = "replication" # Cat the configuration file. cat_conf_cmd = ( f"{kube_cmd} exec -c {cont} {pod} -- " f"cat {self.conf_paths['MONGODB_CONF']}/mongod.conf" ) result = self.exec_cmd(cat_conf_cmd) if result.get("status") != 0: return None data = yaml.safe_load(result.get("output", "")) if sharding_conf := data.get("sharding", {}): role = sharding_conf.get("clusterRole", "") return self._match_role(role) def _get_db_credentials(self) -> Tuple[Optional[str], Optional[str]]: db_user = self.get_option("dbuser") db_pass = self.get_option("dbpass") if not db_user: if "MONGODB_USER" in os.environ: self.soslog.info( "MONGODB_USER present: Using MONGODB_USER environment" "variable, user did not provide username." ) db_user = os.environ["MONGODB_USER"] else: self.soslog.warning("error: Missing credentials (username)") return None, None if not db_pass: if "MONGODB_PWD" in os.environ: self.soslog.info( "MONGODB_PWD present: Using MONGODB_PWD environment " "variable, user did not provide password." ) db_pass = os.environ["MONGODB_PWD"] else: self.soslog.warning("error: Missing credentials (password)") return None, None return db_user, db_pass def _process_snap(self): role = self.vm_role() if not role: # The service is not properly set up by the charm, exiting. return base_conf = self._join_conf_path( self.snap_path_current, self.conf_paths["MONGODB_CONF"] ) base_logs = self._join_conf_path( self.snap_path_common, self.conf_paths["MONGODB_LOGS"] ) all_logs = self.get_option("all_logs") # Hide certificates and cluster keyfile. self.add_forbidden_path( [ f"{base_conf}/*.pem", f"{base_conf}/*.crt", f"{base_conf}/keyFile", ] ) self.add_copy_spec([base_conf]) if all_logs: self.add_copy_spec([f"{base_logs}/*"]) else: self.add_copy_spec([f"{base_logs}/*.log"]) lines = None if all_logs else 500 self.add_journal("snap.charmed-mongodb.*", lines=lines) self.add_cmd_output("snap info charmed-mongodb") # METRICS self.add_cmd_output( "curl http://127.0.0.1:9216/metrics", "mongodb_exporter-metrics" ) if not self.get_option("dumpdbs"): return db_user, db_pass = self._get_db_credentials() if not db_user or not db_pass: return mongodb_uri = self._build_uri(db_user, Substrate.VM) mongos_uri = self._build_uri(db_user, Substrate.VM, 27018) mongodb_cmd = "charmed-mongodb.mongosh" env = {"MONGODB_PWD": db_pass} # --- REGULAR INFORMATION --- for command, suggest_filename in self.regular_commands: self.add_cmd_output( ( f"sh -c '{mongodb_cmd} {mongodb_uri} --quiet " f"--eval \"{command}\"'" ), suggest_filename=suggest_filename, env=env, ) # --- SHARDING INFORMATION --- if role == "config-server": for command, suggest_filename in self.config_server_commands: command = ( f"sh -c '{mongodb_cmd} {mongos_uri} --quiet " f"--eval \"{command}\"'" ) self.add_cmd_output( command, suggest_filename=suggest_filename, env=env, ) def _build_uri( self, db_user: str, substrate: Substrate, port: int = 27017, ) -> str: base_conf = self.conf_paths["MONGODB_CONF"] args: Dict[str, str] = {"authSource": "admin"} if substrate == Substrate.VM: base_conf = self._join_conf_path(self.snap_path_current, base_conf) external_ca = Path(f"{base_conf}/external-ca.crt") external_cert = Path(f"{base_conf}/external-cert.pem") if external_ca.exists() and external_cert.exists(): args |= { "tls": "true", "tlsCertificateKeyFile": f"{external_cert}", "tlsCaFile": f"{external_ca}", } _args = urlencode(args) user = quote_plus(db_user) host = "127.0.0.1" return f"mongodb://{user}:${{MONGODB_PWD}}@{host}:{port}/admin?{_args}" def _determine_namespaces(self) -> list[str]: namespaces = self.exec_cmd( f"{self.kube_cmd} get pods -A -l {self.selector} " "-o jsonpath='{.items[*].metadata.namespace}'" ) if namespaces["status"] == 0: return list(set(namespaces["output"].strip().split())) return [] def _get_pod_names(self, namespace) -> list[str]: pods = self.exec_cmd( f"{self.kube_cmd} -n {namespace} get pods -l {self.selector} " "-o jsonpath='{.items[*].metadata.name}'" ) if pods["status"] == 0: return pods["output"].strip().split() return [] def _remote_exec( self, kube_cmd: str, cont: str, pod: str, mongod_cmd: str, uri: str, password: str, cmd: str, cmd_name: str, ): output_file = f"/tmp/eval_{cmd_name}" # nosec: B108 # We first execute the command and write into a file query_cmd = ( f"{kube_cmd} exec -c {cont} {pod} -- " f'sh -lc \'export MONGODB_PWD="{password}"; {mongod_cmd} {uri} ' f'--quiet --eval "{cmd}" > {output_file}\'' ) self.exec_cmd(query_cmd) # We then cat that file to have the command output. cat_cmd = ( f"{kube_cmd} exec -c {cont} {pod} -- " f"sh -lc 'cat {output_file} && rm {output_file}'" ) self.add_cmd_output( cmds=cat_cmd, suggest_filename=f"{pod}_{cmd_name}", ) def _collect_per_namespace(self, ns: str, all_logs: bool): kube_cmd = f"{self.kube_cmd} -n {ns}" mongodb_cont = "mongod" pods = self._get_pod_names(ns) logs_path = self.conf_paths["MONGODB_LOGS"] conf_path = self.conf_paths["MONGODB_CONF"] # Get the config and logs from each pod dump_files_path = self.get_cmd_output_path() for path in self.conf_paths.values(): for pod in pods: name_prefix = f"{dump_files_path}/pods/{pod}/{path}" os.makedirs(name_prefix, exist_ok=True) copy_cmd = ( f"{kube_cmd} cp -c {mongodb_cont} " f"{pod}:{path} {name_prefix}" ) self.exec_cmd(copy_cmd) for pod in pods: if all_logs: # This is all_logs self.add_copy_spec([f"{dump_files_path}/{pod}/{logs_path}/*"]) else: self.add_copy_spec( [f"{dump_files_path}/{pod}/{logs_path}/*.log"] ) self.add_forbidden_path( [ f"{dump_files_path}/pods/{pod}/{conf_path}/*.pem", f"{dump_files_path}/pods/{pod}/{conf_path}/*.crt", f"{dump_files_path}/pods/{pod}/{conf_path}/keyFile", ] ) self.add_copy_spec([f"{dump_files_path}/pods/{pod}/{conf_path}"]) # METRICS for pod in pods: query_cmd = ( f"{kube_cmd} exec -c {mongodb_cont} {pod} -- " "sh -lc curl localhost:9216/metrics" ) self.add_cmd_output( cmds=query_cmd, suggest_filename=f"mongodb_exporter-metrics-{pod}", ) if not self.get_option("dumpdbs"): return db_user, db_pass = self._get_db_credentials() if not db_user or not db_pass: return mongodb_uri = self._build_uri(db_user, Substrate.K8S) mongos_uri = self._build_uri(db_user, Substrate.K8S, 27018) mongodb_cmd = "mongosh" for pod in pods: role = self.k8s_role(kube_cmd, mongodb_cont, pod) for command, suggest_filename in self.regular_commands: self._remote_exec( kube_cmd=kube_cmd, cont=mongodb_cont, pod=pod, mongod_cmd=mongodb_cmd, uri=mongodb_uri, password=db_pass, cmd=command, cmd_name=suggest_filename, ) # --- SHARDING INFORMATION --- if role == "config-server": for command, suggest_filename in self.config_server_commands: self._remote_exec( kube_cmd=kube_cmd, cont=mongodb_cont, pod=pod, mongod_cmd=mongodb_cmd, uri=mongos_uri, password=db_pass, cmd=command, cmd_name=suggest_filename, ) def _process_k8s(self): all_logs = self.get_option("all_logs") or False namespaces = self._determine_namespaces() for namespace in namespaces: self._collect_per_namespace(namespace, all_logs) def setup(self) -> None: if self.is_installed(self.snap_package): self._process_snap() if is_executable(self.kube_cmd, self.sysroot): self._process_k8s() def postproc(self): if self.is_installed(self.snap_package): substrate = Substrate.VM if not self.vm_role(): # Service was not properly set up. return else: substrate = Substrate.K8S base_conf = self.conf_paths["MONGODB_CONF"] if substrate == Substrate.VM: base_conf = self._join_conf_path(self.snap_path_current, base_conf) else: base_conf = f"{self.get_cmd_output_path()}/pods/*/{base_conf}" shutil.rmtree( f"{self.get_cmd_output_path()}/pods", ignore_errors=True, ) # --- SCRUB PASSWORDS --- self.do_path_regex_sub( f"{base_conf}/*", regexp=r'("queryPassword": ")[^"]*"', subst=r"\1*********", )
Close