aboutsummaryrefslogtreecommitdiff
path: root/app/controllers/web_migrate.php
blob: 2637578d98d4e82692842f4e41d48453c87b1ae6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
class WebMigrateController extends StudipController
{
    public function __construct($dispatcher)
    {
        if (basename($dispatcher->trails_uri, '.php') !== 'web_migrate') {
            throw new Exception('Web Migrator cannot be invoked via standard dispatcher.');
        }

        parent::__construct($dispatcher);
    }

    public function before_filter(&$action, &$args)
    {
        $GLOBALS['auth']->login_if(!$GLOBALS['perm']->have_perm('root'));
        $GLOBALS['perm']->check('root');

        parent::before_filter($action, $args);

        $this->target   = Request::int('target');
        $this->branch   = Request::get('branch', '0');
        $this->version  = new DBSchemaVersion('studip', $this->branch);
        $this->migrator = new Migrator(
            "{$GLOBALS['STUDIP_BASE_PATH']}/db/migrations",
            $this->version,
            true
        );

        FileLock::setDirectory($GLOBALS['TMP_PATH']);
        $this->lock = new FileLock('web-migrate');

        $this->setupSidebar($action);

        PageLayout::setTitle(_('Stud.IP Web-Migrator'));
    }

    public function index_action()
    {
        $this->migrations = $this->migrator->relevantMigrations($this->target);
    }

    public function migrate_action()
    {
        ob_start();
        set_time_limit(0);

        $this->lock->lock(['timestamp' => time(), 'user_id' => $GLOBALS['user']->id]);

        $this->migrator->migrateTo($this->target);

        $this->lock->release();

        $announcements = ob_get_clean();
        PageLayout::postSuccess(
            _('Die Datenbank wurde erfolgreich migriert.'),
            array_filter(explode("\n", $announcements))
        );

        $_SESSION['migration-check'] = [
            'timestamp' => time(),
            'count'     => 0,
        ];

        $this->redirect('index');
    }

    public function release_action($target)
    {
        if ($this->lock->isLocked()) {
            $this->lock->release();

            PageLayout::postSuccess(_('Die Sperre wurde aufgehoben.'));
        }

        $this->redirect($this->url_for('index', compact('target')));
    }

    public function history_action()
    {
        $this->migrations = $this->migrator->relevantMigrations(0);
        $this->offset = -1;
        $this->target = 0;
        $this->render_action('index');
    }

    public function setupSidebar($action)
    {
        $views = Sidebar::get()->addWidget(new ViewsWidget());
        $views->addLink(
            _('Migrationen ausführen'),
            $this->url_for('index', ['branch' => $this->branch])
        )->setActive($action === 'index');
        $views->addLink(
            _('Migrationen zurücknehmen'),
            $this->url_for('history', ['branch' => $this->branch])
        )->setActive($action === 'history');

        $widget = new SelectWidget(_('Branch'), $this->url_for($action), 'branch');
        Sidebar::get()->addWidget($widget);

        foreach ($this->version->getAllBranches() as $branch) {
            $element = new SelectElement($branch, $branch ?: 'default', $branch == $this->branch);
            $widget->addElement($element);
        }

        $widget = Sidebar::get()->addWidget(new SidebarWidget());
        $widget->setTitle(_('Aktueller Versionsstand'));
        $widget->addElement(new WidgetElement($this->version->get($this->branch)));
    }
}