Gene6 to Filezilla Server user config converter

Need help with FileZilla Server? Something does not work as expected? In this forum you may find an answer.

Moderator: Project members

Post Reply
Message
Author
Tomaz

Gene6 to Filezilla Server user config converter

#1 Post by Tomaz » 2015-07-23 09:11

For my needs I wrote a python script that converts user config files of Gene6 to Filezilla Server xml style.

I want to share it with you.

It migrates usernames with md5 hash passwords (nonsalted), paths/folders with aliases and their permissions. Simple.

Use at your own risk.

update: added permission migration
update2: some beauty fixes and undefined user group

Code: Select all

import os

users_ini_path = "somewhere\\over_the_rainbow\\users"

output_text = "        "

raw_files = os.listdir(users_ini_path)

for raw_file in raw_files:
    user_name = raw_file.replace(".ini", "")
    raw_acl = []
    passwd = ""
    user_conf = ""
    perm_conf = ""
    user_conf_end = ""

    file_data = open(users_ini_path + "\\" + raw_file, "r")

    for line in file_data:
        if "AccessList" in line:
            raw_acl.append(line)
         
        if "Password=MD5:" in line:

            passwd = line.replace("Password=MD5:", "")
            passwd = passwd.lower()

            user_conf += """<User Name=""" + "\"" + user_name + """">
            <Option Name="Pass">""" + passwd.rstrip() + """</Option>
            <Option Name="Group"></Option>
            <Option Name="Bypass server userlimit">2</Option>
            <Option Name="User Limit">0</Option>
            <Option Name="IP Limit">0</Option>
            <Option Name="Enabled">2</Option>
            <Option Name="Comments"></Option>
            <Option Name="ForceSsl">2</Option>
            <Option Name="8plus3">0</Option>
            <IpFilter>
                <Disallowed />
                <Allowed />
            </IpFilter>
            <Permissions>"""

    for acl_item in raw_acl:
            acl_item_part1 = acl_item.split("=")
            acl_item_part2 = acl_item_part1[1].split(",")
            
            alias = acl_item_part2[0]
            path = acl_item_part2[1]

            file_perm_bits = list(acl_item_part2[2])
            dir_perm_bits = list(acl_item_part2[3])

            perm_conf += """
                <Permission Dir=""" + "\"" + path  + "\"" + """>"""

            if alias != "/":
                perm_conf += """
                    <Aliases>
                        <Alias>""" + alias + """</Alias>
                    </Aliases>"""

            perm_conf += """
                    <Option Name="FileRead">""" + str([0,1][file_perm_bits[0] != "-"]) + """</Option>
                    <Option Name="FileWrite">""" + str([0,1][file_perm_bits[1] != "-"]) + """</Option>
                    <Option Name="FileDelete">""" + str([0,1][file_perm_bits[2] != "-"]) + """</Option>
                    <Option Name="FileAppend">""" + str([0,1][file_perm_bits[3] != "-"]) + """</Option>
                    <Option Name="DirCreate">""" + str([0,1][dir_perm_bits[2] != "-"]) + """</Option>
                    <Option Name="DirDelete">""" + str([0,1][dir_perm_bits[3] != "-"]) + """</Option>
                    <Option Name="DirList">""" + str([0,1][dir_perm_bits[0] != "-"]) + """</Option>
                    <Option Name="DirSubdirs">""" + str([0,1][dir_perm_bits[1] != "-"]) + """</Option>
                    <Option Name="IsHome">""" + str([0,1][alias == "/"]) + """</Option>
                    <Option Name="AutoCreate">0</Option>
                </Permission>"""

    user_conf_end = """
        </Permissions>
        <SpeedLimits DlType="0" DlLimit="10" ServerDlLimitBypass="2" UlType="0" UlLimit="10" ServerUlLimitBypass="2">
            <Download />
            <Upload />
        </SpeedLimits>
    </User>
    """

    output_text += user_conf + perm_conf + user_conf_end

conf_file = open("users.xml", "w")
conf_file.write(output_text)

Post Reply