Test Failed
Push — master ( 13798f...f44782 )
by -
02:03
created

spike_update()   A

Complexity

Conditions 3

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 3
dl 0
loc 20
rs 9.4285
1
#! /usr/bin/env python
2
#
3
# spike-server.py
4
# 
5
# this: v0.8.22 - 2014-10-10
6
#
7
import base64
8
import os
9
import logging
10
import argparse
11
from os.path import dirname, abspath, isdir
12
from shutil import move
13
from time import time, strftime, localtime
14
15
from spike import create_app, seeds, version, model
16
from spike.model import db, Settings, NaxsiRuleSets
17
from spike.model.naxsi_rules import ValueTemplates
18
19
20
def run():
21
    app = create_app(config_file())
22
23
    try:
24
        app_port = int(app.config["APP_PORT"])
25
    except:
26
        app_port = 5555
27
    try:
28
        app_host = app.config["APP_HOST"]
29
    except:
30
        app_host = "127.0.0.1"
31
32
    db.init_app(app)
33
    app.test_request_context().push()
34
35
    try:
36
        backup_dir = Settings.query.filter(Settings.name == 'backup_dir').first()
37
        app.config["BACKUP_DIR"] = backup_dir.value
38
    except:
39
        app.config["BACKUP_DIR"] = "backups"
40
41
    try:
42
        eo_offset = Settings.query.filter(Settings.name == 'rules_offset').first()
43
        app.config["NAXSI_RULES_OFFSET"] = eo_offset.value
44
    except:
45
        app.config["NAXSI_RULES_OFFSET"] = 20000
46
47
    try:
48
        app.config["RULESET_HEADER"] = app.config["RULESET_HEADER"]
49
    except:
50
        app.config["RULESET_HEADER"] = ''
51
52
    logging.info("Spike is running on %s:%s", app_host, app_port)
53
    app.run(debug=True, host=app_host, port=app_port)
54
55
56
def spike_init():
57
    """ Import some data into Spkie internal DB, in order to be able to run it """
58
    it = ts = int(time())
59
    logging.info("Initializing Spike")
60
61
    ds = strftime("%F - %H:%M", localtime(time()))
62
    app = create_app(config_file())
63
64
    bd = seeds.settings_seeds['backup_dir']
65
    if not isdir(bd):
66
        logging.info("rulesets_backup_dir not found, creating: %s", bd)
67
        os.mkdir(bd)
68
69
    db_files = app.config["SQLALCHEMY_BINDS"]
70
71
    for sqldb in db_files:
72
        p1 = os.path.join('spike', db_files[sqldb].replace("sqlite:///", ""))
73
        if os.path.isfile(p1):
74
            logging.info("Existing db found (%s) creating backup", sqldb)
75
            move(p1, os.path.join(p1, it))
76
            logging.info("copy: %s.%s", p1, it)
77
78
    app.test_request_context().push()
79
    db.init_app(app)
80
81
    with app.app_context():
82
        db.create_all()
83
84
    logging.info("filling default_vals")
85
86
    for v in seeds.vtemplate_seeds:
87
        logging.info("adding templates: %s" , v)
88
        for val in seeds.vtemplate_seeds[v]:
89
            db.session.add(ValueTemplates(v, val))
90
91
    for r in seeds.rulesets_seeds:
92
        logging.info("adding ruleset: %s / %s", r, seeds.rulesets_seeds[r])
93
        rmks = "naxsi-ruleset for %s / auto-created %s" % (r, ds)
94
        db.session.add(NaxsiRuleSets(seeds.rulesets_seeds[r], r, rmks, ts, ts))
95
96
    for s in seeds.settings_seeds:
97
        logging.info("adding setting: %s", s)
98
        db.session.add(Settings(s, seeds.settings_seeds[s]))
99
    db.session.commit()
100
101
    with open(config_file(), "a") as f:
102
        f.write('\nSECRET_KEY="%s"' % base64.b64encode(os.urandom(128)))
103
104
    logging.info('Spike initialization completed')
105
106
107
def spike_update():
108
    logging.info('Updating spike')
109
    os.system("git pull 2>&1")
110
    app = create_app(config_file())
111
112
    from spike.model import db
113
    from spike.model import Settings
114
115
    app.test_request_context().push()
116
    db.init_app(app)
117
118
    for s in seeds.settings_seeds:
119
        if not model.check_constraint("settings", s):
120
            logging.info("adding setting: %s", s)
121
            db.session.add(Settings(s, seeds.settings_seeds[s]))
122
        else:
123
            logging.info("Known setting: %s", s)
124
    db.session.commit()
125
126
    logging.info('Spike is now up to date')
127
128
129
def config_file():
130
    return os.path.join(dirname(abspath(__name__)), 'config.cfg')
131
132
133
if __name__ == "__main__":
134
    logging.basicConfig(level=logging.DEBUG, format='%(message)s')
135
    parser = argparse.ArgumentParser(description='Spike %s' % version)
136
    parser.add_argument('command', help='Run the spike server', choices=['run', 'init', 'update'])
137
    args = parser.parse_args()
138
139
    if args.command == 'run':
140
        run()
141
    elif args.command == 'init':
142
        spike_init()
143
    elif args.command == 'update':
144
        spike_update()
145
146