|
|
|
import os
|
|
|
|
import sqlite3
|
|
|
|
import logging
|
|
|
|
|
|
|
|
from configparser import ConfigParser
|
|
|
|
from get_argv import config_dir
|
|
|
|
|
|
|
|
# Check if config_dir exist
|
|
|
|
if os.path.exists(config_dir) is False:
|
|
|
|
# Create config_dir directory tree
|
|
|
|
try:
|
|
|
|
os.mkdir(os.path.join(config_dir))
|
|
|
|
logging.debug("Created data directory")
|
|
|
|
except OSError:
|
|
|
|
logging.exception("The configuration directory doesn't exist and Bazarr cannot create it (permission issue?).")
|
|
|
|
exit(2)
|
|
|
|
|
|
|
|
if os.path.exists(os.path.join(config_dir, 'config')) is False:
|
|
|
|
os.mkdir(os.path.join(config_dir, 'config'))
|
|
|
|
logging.debug("Created config folder")
|
|
|
|
if os.path.exists(os.path.join(config_dir, 'db')) is False:
|
|
|
|
os.mkdir(os.path.join(config_dir, 'db'))
|
|
|
|
logging.debug("Created db folder")
|
|
|
|
if os.path.exists(os.path.join(config_dir, 'log')) is False:
|
|
|
|
os.mkdir(os.path.join(config_dir, 'log'))
|
|
|
|
logging.debug("Created log folder")
|
|
|
|
|
|
|
|
config_file = os.path.normpath(os.path.join(config_dir, 'config/config.ini'))
|
|
|
|
|
|
|
|
cfg = ConfigParser()
|
|
|
|
try:
|
|
|
|
# Open database connection
|
|
|
|
db = sqlite3.connect(os.path.join(os.path.dirname(__file__), 'data/db/bazarr.db'), timeout=30)
|
|
|
|
c = db.cursor()
|
|
|
|
|
|
|
|
# Get general settings from database table
|
|
|
|
c.execute("SELECT * FROM table_settings_general")
|
|
|
|
general_settings = c.fetchone()
|
|
|
|
c.execute('''SELECT * FROM table_settings_auth''')
|
|
|
|
auth_settings = c.fetchone()
|
|
|
|
c.execute('''SELECT * FROM table_settings_sonarr''')
|
|
|
|
sonarr_settings = c.fetchone()
|
|
|
|
c.execute('''SELECT * FROM table_settings_radarr''')
|
|
|
|
radarr_settings = c.fetchone()
|
|
|
|
|
|
|
|
c.execute("DROP TABLE table_settings_general")
|
|
|
|
c.execute("DROP TABLE table_settings_auth")
|
|
|
|
c.execute("DROP TABLE table_settings_sonarr")
|
|
|
|
c.execute("DROP TABLE table_settings_radarr")
|
|
|
|
|
|
|
|
# Close database connection
|
|
|
|
db.close()
|
|
|
|
|
|
|
|
section = 'general'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'ip', str(general_settings[0]))
|
|
|
|
cfg.set(section, 'port', str(general_settings[1]))
|
|
|
|
cfg.set(section, 'base_url', general_settings[2])
|
|
|
|
cfg.set(section, 'path_mappings', general_settings[3])
|
|
|
|
cfg.set(section, 'log_level', general_settings[4])
|
|
|
|
cfg.set(section, 'branch', general_settings[5])
|
|
|
|
cfg.set(section, 'auto_update', general_settings[6])
|
|
|
|
cfg.set(section, 'single_language', general_settings[9])
|
|
|
|
cfg.set(section, 'minimum_score', general_settings[10])
|
|
|
|
cfg.set(section, 'use_scenename', general_settings[11])
|
|
|
|
cfg.set(section, 'use_postprocessing', general_settings[12])
|
|
|
|
cfg.set(section, 'postprocessing_cmd', general_settings[13])
|
|
|
|
cfg.set(section, 'use_sonarr', general_settings[14])
|
|
|
|
cfg.set(section, 'use_radarr', general_settings[15])
|
|
|
|
cfg.set(section, 'path_mappings_movie', general_settings[16])
|
|
|
|
cfg.set(section, 'serie_default_enabled', general_settings[17])
|
|
|
|
cfg.set(section, 'serie_default_language', general_settings[18])
|
|
|
|
cfg.set(section, 'serie_default_hi', general_settings[19])
|
|
|
|
cfg.set(section, 'movie_default_enabled', general_settings[20])
|
|
|
|
cfg.set(section, 'movie_default_language', general_settings[21])
|
|
|
|
cfg.set(section, 'movie_default_hi', general_settings[22])
|
|
|
|
cfg.set(section, 'page_size', general_settings[23])
|
|
|
|
cfg.set(section, 'minimum_score_movie', general_settings[24])
|
|
|
|
cfg.set(section, 'use_embedded_subs', general_settings[25])
|
|
|
|
cfg.set(section, 'only_monitored', general_settings[26])
|
|
|
|
|
|
|
|
section = 'auth'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'enabled', auth_settings[0])
|
|
|
|
cfg.set(section, 'username', auth_settings[1])
|
|
|
|
cfg.set(section, 'password', auth_settings[2])
|
|
|
|
|
|
|
|
section = 'sonarr'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'ip', sonarr_settings[0])
|
|
|
|
cfg.set(section, 'port', str(sonarr_settings[1]))
|
|
|
|
cfg.set(section, 'base_url', sonarr_settings[2])
|
|
|
|
cfg.set(section, 'ssl', sonarr_settings[3])
|
|
|
|
cfg.set(section, 'apikey', sonarr_settings[4])
|
|
|
|
cfg.set(section, 'full_update', sonarr_settings[5])
|
|
|
|
|
|
|
|
section = 'radarr'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'ip', radarr_settings[0])
|
|
|
|
cfg.set(section, 'port', str(radarr_settings[1]))
|
|
|
|
cfg.set(section, 'base_url', radarr_settings[2])
|
|
|
|
cfg.set(section, 'ssl', radarr_settings[3])
|
|
|
|
cfg.set(section, 'apikey', radarr_settings[4])
|
|
|
|
cfg.set(section, 'full_update', radarr_settings[5])
|
|
|
|
|
|
|
|
with open(config_file, 'w+') as configfile:
|
|
|
|
cfg.write(configfile)
|
|
|
|
|
|
|
|
|
|
|
|
logging.info('Config file succesfully migrated from database')
|
|
|
|
|
|
|
|
except sqlite3.OperationalError:
|
|
|
|
if os.path.exists(config_file) is False:
|
|
|
|
cfg = ConfigParser()
|
|
|
|
|
|
|
|
section = 'general'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'ip', "0.0.0.0")
|
|
|
|
cfg.set(section, 'port', "6767")
|
|
|
|
cfg.set(section, 'base_url', "/")
|
|
|
|
cfg.set(section, 'path_mappings', '[]')
|
|
|
|
cfg.set(section, 'log_level', "INFO")
|
|
|
|
cfg.set(section, 'branch', "master")
|
|
|
|
cfg.set(section, 'auto_update', "True")
|
|
|
|
cfg.set(section, 'single_language', "False")
|
|
|
|
cfg.set(section, 'minimum_score', "90")
|
|
|
|
cfg.set(section, 'use_scenename', "False")
|
|
|
|
cfg.set(section, 'use_postprocessing', "False")
|
|
|
|
cfg.set(section, 'postprocessing_cmd', "False")
|
|
|
|
cfg.set(section, 'use_sonarr', "False")
|
|
|
|
cfg.set(section, 'use_radarr', "False")
|
|
|
|
cfg.set(section, 'path_mappings_movie', '[]')
|
|
|
|
cfg.set(section, 'serie_default_enabled', "False")
|
|
|
|
cfg.set(section, 'serie_default_language', '')
|
|
|
|
cfg.set(section, 'serie_default_hi', "False")
|
|
|
|
cfg.set(section, 'movie_default_enabled', "False")
|
|
|
|
cfg.set(section, 'movie_default_language', '')
|
|
|
|
cfg.set(section, 'movie_default_hi', "False")
|
|
|
|
cfg.set(section, 'page_size', "25")
|
|
|
|
cfg.set(section, 'minimum_score_movie', "70")
|
|
|
|
cfg.set(section, 'use_embedded_subs', "False")
|
|
|
|
cfg.set(section, 'only_monitored', "False")
|
|
|
|
cfg.set(section, 'adaptive_searching', "False")
|
|
|
|
|
|
|
|
section = 'proxy'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'type', "None")
|
|
|
|
cfg.set(section, 'url', "")
|
|
|
|
cfg.set(section, 'port', "")
|
|
|
|
cfg.set(section, 'username', "")
|
|
|
|
cfg.set(section, 'password', "")
|
|
|
|
cfg.set(section, 'exclude', "localhost,127.0.0.1")
|
|
|
|
|
|
|
|
section = 'auth'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'type', "None")
|
|
|
|
cfg.set(section, 'username', "")
|
|
|
|
cfg.set(section, 'password', "")
|
|
|
|
|
|
|
|
section = 'sonarr'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'ip', "127.0.0.1")
|
|
|
|
cfg.set(section, 'port', "8989")
|
|
|
|
cfg.set(section, 'base_url', "/")
|
|
|
|
cfg.set(section, 'ssl', "False")
|
|
|
|
cfg.set(section, 'apikey', "")
|
|
|
|
cfg.set(section, 'full_update', "Daily")
|
|
|
|
|
|
|
|
section = 'radarr'
|
|
|
|
|
|
|
|
if not cfg.has_section(section):
|
|
|
|
cfg.add_section(section)
|
|
|
|
|
|
|
|
cfg.set(section, 'ip', "127.0.0.1")
|
|
|
|
cfg.set(section, 'port', "7878")
|
|
|
|
cfg.set(section, 'base_url', "/")
|
|
|
|
cfg.set(section, 'ssl', "False")
|
|
|
|
cfg.set(section, 'apikey', "")
|
|
|
|
cfg.set(section, 'full_update', "Daily")
|
|
|
|
|
|
|
|
|
|
|
|
with open(config_file, 'w+') as configfile:
|
|
|
|
cfg.write(configfile)
|
|
|
|
|
|
|
|
logging.info('Config file created successfully')
|
|
|
|
try:
|
|
|
|
# Get SQL script from file
|
|
|
|
fd = open(os.path.join(os.path.dirname(__file__), 'create_db.sql'), 'r')
|
|
|
|
script = fd.read()
|
|
|
|
|
|
|
|
# Close SQL script file
|
|
|
|
fd.close()
|
|
|
|
|
|
|
|
# Open database connection
|
|
|
|
db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
|
|
|
|
c = db.cursor()
|
|
|
|
|
|
|
|
# Execute script and commit change to database
|
|
|
|
c.executescript(script)
|
|
|
|
|
|
|
|
# Close database connection
|
|
|
|
db.close()
|
|
|
|
|
|
|
|
logging.info('Database created successfully')
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
|
|
|
# Remove unused settings
|
|
|
|
try:
|
|
|
|
with open(config_file, 'r') as f:
|
|
|
|
cfg.read_file(f)
|
|
|
|
except Exception:
|
|
|
|
pass
|
|
|
|
if cfg.has_section('auth'):
|
|
|
|
if cfg.has_option('auth', 'enabled'):
|
|
|
|
enabled = cfg.getboolean('auth', 'enabled')
|
|
|
|
if enabled is True:
|
|
|
|
cfg.set('auth', 'type', 'basic')
|
|
|
|
elif enabled is False:
|
|
|
|
cfg.set('auth', 'type', 'None')
|
|
|
|
cfg.remove_option('auth', 'enabled')
|
|
|
|
with open(config_file, 'w+') as configfile:
|
|
|
|
cfg.write(configfile)
|
|
|
|
|
|
|
|
from cork import Cork
|
|
|
|
import time
|
|
|
|
if os.path.exists(os.path.normpath(os.path.join(config_dir, 'config/users.json'))) is False:
|
|
|
|
cork = Cork(os.path.normpath(os.path.join(config_dir, 'config')), initialize=True)
|
|
|
|
|
|
|
|
cork._store.roles[''] = 100
|
|
|
|
cork._store.save_roles()
|
|
|
|
|
|
|
|
tstamp = str(time.time())
|
|
|
|
username = password = ''
|
|
|
|
cork._store.users[username] = {
|
|
|
|
'role': '',
|
|
|
|
'hash': cork._hash(username, password),
|
|
|
|
'email_addr': username,
|
|
|
|
'desc': username,
|
|
|
|
'creation_date': tstamp
|
|
|
|
}
|
|
|
|
cork._store.save_users()
|