Copy of Download custom client installer via Python

A Python 3 script to create a new client on the server and to download and execute a custom client installer:

import http.client as http
import json
from urllib.parse import urlparse
from urllib.parse import urlencode
from base64 import b64encode
import hashlib
import socket
import shutil
import os

#############################
# Settings. Please edit.
#############################

#Your server URL
server_url = 'http://example.com:55414/x'


#If you have basic authentication via .htpasswd
server_basic_username = ''
server_basic_password = ''


#user needs following rights
# "settings": "all"
# "status": "some"
# "add_client": "all"
server_username='admin'
server_password='foo'


#############################
# Global script variables.
# Please do not modify.
#############################

session=""

def get_response(action, params):
    global server_url;
    global server_basic_username;
    global server_basic_password;
    global session;
    
    headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json; charset=UTF-8'
    }
    
    if('server_basic_username' in globals() and len(server_basic_username)>0):
        userAndPass = b64encode(str.encode(server_basic_username+":"+server_basic_password)).decode("ascii")
        headers['Authorization'] = 'Basic %s' %  userAndPass
    
    curr_server_url=server_url+"?"+urlencode({"a": action});
    
    if(len(session)>0):
        params["ses"]=session
    
    curr_server_url+="&"+urlencode(params);
    
    target = urlparse(curr_server_url)
    method = 'GET'
    body = ''
    
    if(target.scheme=='http'):
        h = http.HTTPConnection(target.hostname, target.port)
    elif(target.scheme=='https'):
        h = http.HTTPSConnection(target.hostname, target.port)
    else:
        print('Unkown scheme: '+target.scheme)
        raise Exception("Unkown scheme: "+target.scheme)
    
    h.request(
            method,
            target.path+"?"+target.query,
            body,
            headers)
    
    return h.getresponse();

def get_json(action, params = {}):
    
    response = get_response(action, params)
    
    if(response.status != 200):
        return ""
    
    data = response.readall();
    
    response.close()
        
    return json.loads(data.decode("utf-8"))

def download_file(action, outputfn, params):
    
    response = get_response(action, params);
    
    if(response.status!=200):
        return False
    
    with open(outputfn, 'wb') as outputf:
        shutil.copyfileobj(response, outputf)
        
    
    return True        

def md5(s):
    return hashlib.md5(s.encode()).hexdigest()


print("Logging in...")

salt = get_json("salt", {"username": server_username})

if( not ('ses' in salt) ):
    print('Username does not exist')
    exit(1)
    
session = salt["ses"];
    
if( 'salt' in salt ):
    password_md5 = md5(salt["rnd"]+md5(salt["salt"]+server_password));
    
    login = get_json("login", { "username": server_username,
                                "password": password_md5 })
    
    if('success' not in login or not login['success']):
        print('Error during login. Password wrong?')
        exit(1)
        
    print("Creating client "+socket.gethostname()+"...")
        
    status = get_json("status", { "clientname": socket.gethostname()})
    
    for client in status["client_downloads"]:
        
        if (client["name"] == socket.gethostname()):
            
            print("Downloading Installer...")
            
            if not download_file("download_client", "Client Installer.exe", {"clientid": client["id"]}):
                
                print("Downloading client failed")
                exit(1)
                
            print("Sucessfully downloaded client")
            os.startfile("Client Installer.exe")
            exit(0)
            
    print("Could not find client for download. No permission?")
    exit(1)

 

Use e.g. http://cx-freeze.sourceforge.net/ to create an executable, if you need to.