Jump to content
XPEnology Community

kggitj

Rookie
  • Posts

    1
  • Joined

  • Last visited

Posts posted by kggitj

  1. since @likeadoc did not keep his word in releasing the serialnumber generator, here the code i sent him (most of the sns will be valid):

     

    from random import randrange
    
    
    def get_digit(number, n):
        return number // 10 ** n % 10
    
    
    def get_cross_sum(number):
        return sum([int(i) for i in str(number)])
    
    
    def get_serial_number(model):
        """
        Generate a serial for the given model
        :param model: The model shall be between 0 and 1 for 0=DS3615 and 1=DS3617
        :return: The serial as string
        """
        model_type = ['LWN', 'ODN']
        lwn = range(1640, 1691, 10)
        odn = [1690] + range(1710, 1791, 10) + range(1810, 1891, 10)
        model_range = [lwn, odn]
        model_sn_count = 10
        bbb_range = range(000, 901, 100)
    
        xyz_range = model_range[model]
        xyz = xyz_range[randrange(len(xyz_range))]
        bbb = bbb_range[randrange(len(bbb_range))]
        element_at = randrange(model_sn_count)  # Every block contains 25 serialnumbers
    
        digit_x = get_digit(xyz, 3)
        digit_y = get_digit(xyz, 2)
        digit_z = get_digit(xyz, 1)
    
        aaa = (10 - digit_z + get_cross_sum(bbb)) % 10
        increment = [digit_x * 10 + digit_y] if (digit_y + digit_z) <= 10 else [digit_x * 10, digit_y]
    
        result = aaa
        for i in range(1, element_at):
            result = result + increment[(i + 1) % len(increment)]
    
        result = "%d%s%03d%03d" % (xyz, model_type[model], result, bbb)
        return result
    
    
    if __name__ == '__main__':
        print "1: DS3615xs"
        print "2: DS3617xs"
        input_value = None
        while input_value is None:
            input_value = raw_input("Which model (1,2): ")
            if input_value == "1" or input_value == "2":
                break
            input_value = None
    
        model = int(input_value) - 1
    
        serial_number = get_serial_number(model)
        print "SerialNumber: " + serial_number
    
    # Algorithm:
    # SerialNumber is divided by -> XYZ ODN AAA BBB.
    # ODN is the model specific code
    # every XYZ/BBB block contains an unknown number of serialnumber and can be 5 or 25, but not too many
    
    # AAA = (10 - (Z) + cross_sum(BBB)) modulo 10
    # BBB = constant value between 000 - 900 in 100 steps
    # next value for AAA -> previous value + Offset
    #
    # Offset is defined by:
    # Y + Z <= 10, the offset is +XY, otherwise its alternated +(X*10), +Y

     

×
×
  • Create New...