Unattended Client Deployments

Hey all. I’ve been working on mass deploying clients silently with extremely minimal network impact. It’s my first time working with python but I’m familiar with most native windows based languages.

Below is a script, based on the existing one available on the web. It’s using the API uroni has online. I am using the MSI to install the client then a batch file to call this script and restart the service, echoing the output to a log file.

The commented out line at the top is how I’m converting the .py to exe for redistribution. There’s no error handling which would be my next revision along with more logging.

Please give it a shot an let me know any feedback.

#pyinstaller --onefile --icon=logo.ico URBackup_ClientConfig.py
import urbackup_api
import socket
import os
import subprocess

#ExtraArgsFileName = 'extra_args_0.txt'
ExtraArgsFileName = r"C:\Program Files\UrBackup\extra_args_0.txt"
ClientCLIExeName = 'UrBackupClient_cmd.exe'

Server_Name = 'x.x.x.x'
Server_InterfacePort = 'xxxxx'
Server_Username='USERNAMEHERE'
Server_Password='PASSWORDHERE'

Server_API = urbackup_api.urbackup_server("http://"+Server_Name+":"+Server_InterfacePort+"/x", Server_Username, Server_Password)
Server_Settings=Server_API.get_global_settings()
   
Server_InternetAddr = str(Server_Settings["internet_server"])
Server_InternetPort = str(Server_Settings["internet_server_port"])

print("Internet Server Address - "+Server_InternetAddr)
print("Internet Server Port - "+Server_InternetPort)

Client_Name = str(socket.gethostname())

UrBackup_Client = Server_API.get_client_status(Client_Name)

if UrBackup_Client is None:
    print("Create client '"+Client_Name+"'")
    UrBackup_Client = Server_API.add_client(Client_Name)

    if UrBackup_Client is None:
        print("Unable to create new client for "+Client_Name)
        exit(1)
    else:
        print("'"+Client_Name+"' created")
        Client_AuthKey = UrBackup_Client["new_authkey"]
        
        print(UrBackup_Client)
else:
    print("'"+Client_Name+"' already exists")
    Client_AuthKey = Server_API.get_client_authkey(Client_Name)
    
Client_AuthKey=str(Client_AuthKey)

print('Current Directory - '+os.getcwd())
#os.chdir('../Program Files/UrBackup')
os.chdir(r"C:\Program Files\UrBackup")
print('Current Directory - '+os.getcwd())

print('Creating '+ExtraArgsFileName+' config file')
ExtraArgsFile = open(ExtraArgsFileName, "w")

ExtraArgsFile.write("--internet_mode_enabled")
ExtraArgsFile.write('\n')
ExtraArgsFile.write("true")
ExtraArgsFile.write('\n')

ExtraArgsFile.write("--internet_only_mode")
ExtraArgsFile.write('\n')
ExtraArgsFile.write("true")
ExtraArgsFile.write('\n')

ExtraArgsFile.write("--internet_server")
ExtraArgsFile.write('\n')
ExtraArgsFile.write(Server_InternetAddr)
ExtraArgsFile.write('\n')

ExtraArgsFile.write("--internet_server_port")
ExtraArgsFile.write('\n')
ExtraArgsFile.write(Server_InternetPort)
ExtraArgsFile.write('\n')

ExtraArgsFile.write("--computername")
ExtraArgsFile.write('\n')
ExtraArgsFile.write(Client_Name)
ExtraArgsFile.write('\n')

ExtraArgsFile.write("--internet_authkey")
ExtraArgsFile.write('\n')
ExtraArgsFile.write(Client_AuthKey)

ExtraArgsFile.close

print('Configuring UrBackup client using '+ClientCLIExeName)
Command = ClientCLIExeName+' set-settings -k keep_old_settings -v false -k internet_mode_enabled -v true -k internet_only_mode -v true -k internet_server -v '+Server_InternetAddr+' -k internet_server_port -v '+Server_InternetPort+' -k computername -v '+Client_Name+' -k internet_authkey -v '+Client_AuthKey

#print(Command)
subprocess.run(Command, shell=True)

print('Setup complete')