def save_sample(malware_id, output_dir):
    sample = Malware.details(id=malware_id, fields=VARIANT_SAMPLE_FIELDS)
    if sample.get(m.SAMPLE) == '':
        print 'No sample available for %s, skipping' % sample.get(m.ID)
    try:
        zipfilehandle = cStringIO.StringIO()
        zipfilehandle.write(base64.b64decode(sample.get(m.SAMPLE)))
        with zipfile.ZipFile(zipfilehandle, 'r') as zf:
            for entry in zf.infolist():
                if not os.path.exists(output_dir):
                    os.makedirs(output_dir)
                with open(os.path.join(output_dir, sample.get(m.SHA1)), 'wb') as f:
                    print('Writing to %s' % sample.get(m.SHA1))
                    f.write(zf.read(entry.filename, sample.get(m.PASSWORD)))
    except Exception, e:
        print 'Error saving to file: %s' % str(e)