2016-06-04 05:42:26 +00:00
|
|
|
import os
|
2020-07-30 13:14:31 +00:00
|
|
|
import errno
|
2016-06-04 05:42:26 +00:00
|
|
|
import sqlite3
|
2016-06-09 03:44:45 +00:00
|
|
|
import shutil
|
|
|
|
import cme
|
2019-11-10 21:42:04 +00:00
|
|
|
import configparser
|
|
|
|
from configparser import ConfigParser, NoSectionError, NoOptionError
|
2016-12-15 07:28:00 +00:00
|
|
|
from cme.loaders.protocol_loader import protocol_loader
|
2016-06-09 03:44:45 +00:00
|
|
|
from subprocess import check_output, PIPE
|
|
|
|
from sys import exit
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2018-03-01 19:36:17 +00:00
|
|
|
CME_PATH = os.path.expanduser('~/.cme')
|
|
|
|
TMP_PATH = os.path.join('/tmp', 'cme_hosted')
|
2020-05-10 18:06:08 +00:00
|
|
|
if os.name == 'nt':
|
|
|
|
TMP_PATH = os.getenv('LOCALAPPDATA') + '\\Temp\\cme_hosted'
|
2018-03-01 19:36:17 +00:00
|
|
|
WS_PATH = os.path.join(CME_PATH, 'workspaces')
|
2016-06-09 03:44:45 +00:00
|
|
|
CERT_PATH = os.path.join(CME_PATH, 'cme.pem')
|
|
|
|
CONFIG_PATH = os.path.join(CME_PATH, 'cme.conf')
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2018-03-01 19:36:17 +00:00
|
|
|
|
2016-06-04 05:42:26 +00:00
|
|
|
def first_run_setup(logger):
|
2016-06-09 03:44:45 +00:00
|
|
|
|
2016-09-12 06:52:50 +00:00
|
|
|
if not os.path.exists(TMP_PATH):
|
|
|
|
os.mkdir(TMP_PATH)
|
|
|
|
|
2016-06-04 05:42:26 +00:00
|
|
|
if not os.path.exists(CME_PATH):
|
2016-06-09 03:44:45 +00:00
|
|
|
logger.info('First time use detected')
|
2016-12-15 07:28:00 +00:00
|
|
|
logger.info('Creating home directory structure')
|
2016-06-04 05:42:26 +00:00
|
|
|
os.mkdir(CME_PATH)
|
2017-03-27 21:09:36 +00:00
|
|
|
|
|
|
|
folders = ['logs', 'modules', 'protocols', 'workspaces', 'obfuscated_scripts']
|
|
|
|
for folder in folders:
|
|
|
|
if not os.path.exists(os.path.join(CME_PATH, folder)):
|
2018-03-01 19:36:17 +00:00
|
|
|
os.mkdir(os.path.join(CME_PATH, folder))
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2016-12-15 07:28:00 +00:00
|
|
|
if not os.path.exists(os.path.join(WS_PATH, 'default')):
|
|
|
|
logger.info('Creating default workspace')
|
|
|
|
os.mkdir(os.path.join(WS_PATH, 'default'))
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2018-03-01 19:36:17 +00:00
|
|
|
p_loader = protocol_loader()
|
2016-12-15 07:28:00 +00:00
|
|
|
protocols = p_loader.get_protocols()
|
|
|
|
for protocol in protocols.keys():
|
|
|
|
try:
|
|
|
|
protocol_object = p_loader.load_protocol(protocols[protocol]['dbpath'])
|
|
|
|
except KeyError:
|
|
|
|
continue
|
|
|
|
|
|
|
|
proto_db_path = os.path.join(WS_PATH, 'default', protocol + '.db')
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2016-12-15 07:28:00 +00:00
|
|
|
if not os.path.exists(proto_db_path):
|
|
|
|
logger.info('Initializing {} protocol database'.format(protocol.upper()))
|
|
|
|
conn = sqlite3.connect(proto_db_path)
|
|
|
|
c = conn.cursor()
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2016-12-15 07:28:00 +00:00
|
|
|
# try to prevent some of the weird sqlite I/O errors
|
|
|
|
c.execute('PRAGMA journal_mode = OFF')
|
|
|
|
c.execute('PRAGMA foreign_keys = 1')
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2016-12-15 07:28:00 +00:00
|
|
|
getattr(protocol_object, 'database').db_schema(c)
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2016-12-15 07:28:00 +00:00
|
|
|
# commit the changes and close everything off
|
|
|
|
conn.commit()
|
|
|
|
conn.close()
|
2016-06-04 05:42:26 +00:00
|
|
|
|
2016-06-09 03:44:45 +00:00
|
|
|
if not os.path.exists(CONFIG_PATH):
|
|
|
|
logger.info('Copying default configuration file')
|
|
|
|
default_path = os.path.join(os.path.dirname(cme.__file__), 'data', 'cme.conf')
|
|
|
|
shutil.copy(default_path, CME_PATH)
|
2017-07-10 05:44:58 +00:00
|
|
|
else:
|
|
|
|
# This is just a quick check to make sure the config file isn't the old 3.x format
|
|
|
|
try:
|
2019-11-10 21:42:04 +00:00
|
|
|
config = configparser.ConfigParser()
|
2017-07-10 05:44:58 +00:00
|
|
|
config.read(CONFIG_PATH)
|
2018-03-01 19:36:17 +00:00
|
|
|
config.get('CME', 'workspace')
|
|
|
|
config.get('CME', 'pwn3d_label')
|
|
|
|
except (NoSectionError, NoOptionError):
|
|
|
|
logger.info('Old configuration file detected, replacing with new version')
|
2017-07-10 05:44:58 +00:00
|
|
|
default_path = os.path.join(os.path.dirname(cme.__file__), 'data', 'cme.conf')
|
|
|
|
shutil.copy(default_path, CME_PATH)
|
2016-06-09 03:44:45 +00:00
|
|
|
|
|
|
|
if not os.path.exists(CERT_PATH):
|
|
|
|
logger.info('Generating SSL certificate')
|
|
|
|
try:
|
2018-03-01 19:36:17 +00:00
|
|
|
check_output(['openssl', 'help'], stderr=PIPE)
|
2016-06-09 03:44:45 +00:00
|
|
|
except OSError as e:
|
2020-07-30 13:14:31 +00:00
|
|
|
if e.errno == errno.ENOENT:
|
2016-06-09 03:44:45 +00:00
|
|
|
logger.error('OpenSSL command line utility is not installed, could not generate certificate')
|
|
|
|
exit(1)
|
|
|
|
else:
|
|
|
|
logger.error('Error while generating SSL certificate: {}'.format(e))
|
|
|
|
exit(1)
|
2020-07-30 13:14:31 +00:00
|
|
|
if os.name != 'nt':
|
|
|
|
os.system('openssl req -new -x509 -keyout {path} -out {path} -days 365 -nodes -subj "/C=US" > /dev/null 2>&1'.format(path=CERT_PATH))
|
|
|
|
else:
|
|
|
|
os.system('openssl req -new -x509 -keyout {path} -out {path} -days 365 -nodes -subj "/C=US"'.format(path=CERT_PATH))
|
|
|
|
|