import os
def extras():
    print("Criando arquivo para ativar memoria dinamica")
    open("/lib/udev/rules.d/40-vm-hotadd.rules","w").write("""# On Hyper-V and Xen Virtual Machines we want to add memory and cpus as soon as they appear
    ATTR{[dmi/id]sys_vendor}=="Microsoft Corporation", ATTR{[dmi/id]product_name}=="Virtual Machine", GOTO="vm_hotadd_apply"
    ATTR{[dmi/id]sys_vendor}=="Xen", GOTO="vm_hotadd_apply"
    GOTO="vm_hotadd_end"

    LABEL="vm_hotadd_apply"

    # Memory hotadd request
    SUBSYSTEM=="memory", ACTION=="add", DEVPATH=="/devices/system/memory/memory[0-9]*", TEST=="state", ATTR{state}!="online", ATTR{state}="online"

    # CPU hotadd request
    SUBSYSTEM=="cpu", ACTION=="add", DEVPATH=="/devices/system/cpu/cpu[0-9]*", TEST=="online", ATTR{online}!="1", ATTR{online}="1"

    LABEL="vm_hotadd_end"
    """)
    print("O sistema será reiniciado as 02h00")
    os.system("shutdown -r 02:00 &")
    print("Instalando unattended-upgrades e apt-listchanges para atualizações automaticas")
    os.system("apt-get install unattended-upgrades apt-listchanges")
    print("Ativando atualizações automaticas")
    open("/etc/apt/apt.conf.d/20auto-upgrades","w").write("""APT::Periodic::Update-Package-Lists "1";
    APT::Periodic::Unattended-Upgrade "1";
    """)
    print("Modificando o que será atualizado")
    #os.system("gzip /etc/apt/apt.conf.d/50unattended-upgrades")
    open("/etc/apt/apt.conf.d/50unattended-upgrades","w").write("""
    // Unattended-Upgrade::Origins-Pattern controls which packages are
    // upgraded.
    //
    // Lines below have the format "keyword=value,...".  A
    // package will be upgraded only if the values in its metadata match
    // all the supplied keywords in a line.  (In other words, omitted
    // keywords are wild cards.) The keywords originate from the Release
    // file, but several aliases are accepted.  The accepted keywords are:
    //   a,archive,suite (eg, "stable")
    //   c,component     (eg, "main", "contrib", "non-free")
    //   l,label         (eg, "Debian", "Debian-Security")
    //   o,origin        (eg, "Debian", "Unofficial Multimedia Packages")
    //   n,codename      (eg, "jessie", "jessie-updates")
    //     site          (eg, "http.debian.net")
    // The available values on the system are printed by the command
    // "apt-cache policy", and can be debugged by running
    // "unattended-upgrades -d" and looking at the log file.
    //
    // Within lines unattended-upgrades allows 2 macros whose values are
    // derived from /etc/debian_version:
    //   ${distro_id}            Installed origin.
    //   ${distro_codename}      Installed codename (eg, "buster")
    Unattended-Upgrade::Origins-Pattern {
            // Codename based matching:
            // This will follow the migration of a release through different
            // archives (e.g. from testing to stable and later oldstable).
            // Software will be the latest available for the named release,
            // but the Debian release itself will not be automatically upgraded.
    //      "origin=Debian,codename=${distro_codename}-updates";
    //      "origin=Debian,codename=${distro_codename}-proposed-updates";
            "origin=Debian,codename=${distro_codename},label=Debian";
            "origin=Debian,codename=${distro_codename},label=Debian-Security";
            "origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
            "origin=Zabbix";

            // Archive or Suite based matching:
            // Note that this will silently match a different release after
            // migration to the specified archive (e.g. testing becomes the
            // new stable).
    //      "o=Debian,a=stable";
    //      "o=Debian,a=stable-updates";
    //      "o=Debian,a=proposed-updates";
    //      "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
    };

    // Python regular expressions, matching packages to exclude from upgrading
    Unattended-Upgrade::Package-Blacklist {
        // The following matches all packages starting with linux-
    //  "linux-";

        // Use $ to explicitely define the end of a package name. Without
        // the $, "libc6" would match all of them.
    //  "libc6$";
    //  "libc6-dev$";
    //  "libc6-i686$";

        // Special characters need escaping
    //  "libstdc\+\+6$";

        // The following matches packages like xen-system-amd64, xen-utils-4.1,
        // xenstore-utils and libxenstore3.0
    //  "(lib)?xen(store)?";

        // For more information about Python regular expressions, see
        // https://docs.python.org/3/howto/regex.html
    };

    // This option allows you to control if on a unclean dpkg exit
    // unattended-upgrades will automatically run
    //   dpkg --force-confold --configure -a
    // The default is true, to ensure updates keep getting installed
    //Unattended-Upgrade::AutoFixInterruptedDpkg "true";

    // Split the upgrade into the smallest possible chunks so that
    // they can be interrupted with SIGTERM. This makes the upgrade
    // a bit slower but it has the benefit that shutdown while a upgrade
    // is running is possible (with a small delay)
    //Unattended-Upgrade::MinimalSteps "true";

    // Install all updates when the machine is shutting down
    // instead of doing it in the background while the machine is running.
    // This will (obviously) make shutdown slower.
    // Unattended-upgrades increases logind's InhibitDelayMaxSec to 30s.
    // This allows more time for unattended-upgrades to shut down gracefully
    // or even install a few packages in InstallOnShutdown mode, but is still a
    // big step back from the 30 minutes allowed for InstallOnShutdown previously.
    // Users enabling InstallOnShutdown mode are advised to increase
    // InhibitDelayMaxSec even further, possibly to 30 minutes.
    //Unattended-Upgrade::InstallOnShutdown "false";

    // Send email to this address for problems or packages upgrades
    // If empty or unset then no email is sent, make sure that you
    // have a working mail setup on your system. A package that provides
    // 'mailx' must be installed. E.g. "user@example.com"
    //Unattended-Upgrade::Mail "";

    // Set this value to one of:
    //    "always", "only-on-error" or "on-change"
    // If this is not set, then any legacy MailOnlyOnError (boolean) value
    // is used to chose between "only-on-error" and "on-change"
    //Unattended-Upgrade::MailReport "on-change";

    // Remove unused automatically installed kernel-related packages
    // (kernel images, kernel headers and kernel version locked tools).
    Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

    // Do automatic removal of newly unused dependencies after the upgrade
    Unattended-Upgrade::Remove-New-Unused-Dependencies "true";

    // Do automatic removal of unused packages after the upgrade
    // (equivalent to apt-get autoremove)
    Unattended-Upgrade::Remove-Unused-Dependencies "true";

    // Automatically reboot *WITHOUT CONFIRMATION* if
    //  the file /var/run/reboot-required is found after the upgrade
    Unattended-Upgrade::Automatic-Reboot "true";

    // Automatically reboot even if there are users currently logged in
    // when Unattended-Upgrade::Automatic-Reboot is set to true
    //Unattended-Upgrade::Automatic-Reboot-WithUsers "true";

    // If automatic reboot is enabled and needed, reboot at the specific
    // time instead of immediately
    //  Default: "now"
    Unattended-Upgrade::Automatic-Reboot-Time "02:00";

    // Use apt bandwidth limit feature, this example limits the download
    // speed to 70kb/sec
    //Acquire::http::Dl-Limit "70";

    // Enable logging to syslog. Default is False
    // Unattended-Upgrade::SyslogEnable "false";

    // Specify syslog facility. Default is daemon
    // Unattended-Upgrade::SyslogFacility "daemon";

    // Download and install upgrades only on AC power
    // (i.e. skip or gracefully stop updates on battery)
    // Unattended-Upgrade::OnlyOnACPower "true";

    // Download and install upgrades only on non-metered connection
    // (i.e. skip or gracefully stop updates on a metered connection)
    // Unattended-Upgrade::Skip-Updates-On-Metered-Connections "true";

    // Verbose logging
    // Unattended-Upgrade::Verbose "false";

    // Print debugging information both in unattended-upgrades and
    // in unattended-upgrade-shutdown
    // Unattended-Upgrade::Debug "false";

    // Allow package downgrade if Pin-Priority exceeds 1000
    // Unattended-Upgrade::Allow-downgrade "false";

    // When APT fails to mark a package to be upgraded or installed try adjusting
    // candidates of related packages to help APT's resolver in finding a solution
    // where the package can be upgraded or installed.
    // This is a workaround until APT's resolver is fixed to always find a
    // solution if it exists. (See Debian bug #711128.)
    // The fallback is enabled by default, except on Debian's sid release because
    // uninstallable packages are frequent there.
    // Disabling the fallback speeds up unattended-upgrades when there are
    // uninstallable packages at the expense of rarely keeping back packages which
    // could be upgraded or installed.
    // Unattended-Upgrade::Allow-APT-Mark-Fallback "true";""")
    print("Instalando Bacula Client")
    print("Atualizando repositório")
    os.system("apt-get update")
    print("Instalando pacotes necessário")
    os.system("apt-get install apt-transport-https gnupg -y")
    print("Mudando area de trabalho")
    os.system("cd /tmp")
    print("Baixando chave")
    os.system("wget https://www.bacula.org/downloads/Bacula-4096-Distribution-Verification-key.asc")
    print("Adicionando chave")
    os.system("apt-key add Bacula-4096-Distribution-Verification-key.asc")
    os.system("rm Bacula-4096-Distribution-Verification-key.asc")
    print("Instalando repositório")
    open("/etc/apt/sources.list.d/Bacula-Community.list","w").write("""# Bacula Community
    deb https://www.bacula.org/packages/67eb05888f497/debs/15.0.3/ bookworm main""")
    print("Atualizando repositório")
    os.system("apt-get update")
    print("Instalando Bacula Client")
    os.system("apt install bacula-client -y")
    print("Adicionando permissões para o Backup Server")
    open("/etc/bacula/bacula-fd.conf","a").write("""
    # Meu diretor | Backup Server

    Director {
    Name = backupserver-dir
    Password = "johnsplace-1697"        # Director must know this password
    }""")
    print("Reiniciando Bacula File Daemon")
    os.system("systemctl restart bacula-fd.service")
    print( "Pronto!")