summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/runtime/cases/oe_syslog.py
blob: f3c2bedbaf99dfd07f938351a75c655dd774da36 (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#
# SPDX-License-Identifier: MIT
#

from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage
import time

class SyslogTest(OERuntimeTestCase):

    @OETestDepends(['ssh.SSHTest.test_ssh'])
    @OEHasPackage(["busybox-syslog", "sysklogd", "rsyslog", "syslog-ng"])
    def test_syslog_running(self):
        status, output = self.target.run(self.tc.target_cmds['ps'])
        msg = "Failed to execute %s" % self.tc.target_cmds['ps']
        self.assertEqual(status, 0, msg=msg)
        msg = "No syslog daemon process; %s output:\n%s" % (self.tc.target_cmds['ps'], output)
        hasdaemon = "syslogd" in output or "syslog-ng" in output or "svlogd" in output
        self.assertTrue(hasdaemon, msg=msg)

class SyslogTestConfig(OERuntimeTestCase):

    def verif_not_running(self, pids):
        for pid in pids:
            status, err_output = self.target.run('kill -0 %s' %pid)
            if not status:
                self.logger.debug("previous %s is still running" %pid)
                return 1

    def verify_running(self, names):
        pids = []
        for name in names:
            status, pid = self.target.run('pidof %s' %name)
            if status:
                self.logger.debug("%s is not running" %name)
                return 1, pids
            pids.append(pid)
        return 0, pids


    def restart_sanity(self, names, restart_cmd, pidchange=True):
        status, original_pids = self.verify_running(names)
        if status:
            return False

        status, output = self.target.run(restart_cmd)

        msg = ('Could not restart %s service. Status and output: %s and %s' % (names, status, output))
        self.assertEqual(status, 0, msg)

        if not pidchange:
            return True

        # Always check for an error, most likely a race between shutting down and starting up
        timeout = time.time() + 30

        restarted = False
        status = ""
        while time.time() < timeout:
            # Verify the previous ones are no longer running
            status = self.verif_not_running(original_pids)
            if status:
                status = "Original syslog processes still running"
                continue

            status, pids = self.verify_running(names)
            if status:
                status = "New syslog processes not running"
                continue

            # Everything is fine now, so exit to continue the test
            restarted = True
            break

        msg = ('%s didn\'t appear to restart: %s' % (names, status))
        self.assertTrue(restarted, msg)

        return True

    @OETestDepends(['oe_syslog.SyslogTest.test_syslog_running'])
    def test_syslog_logger(self):
        status, output = self.target.run('logger foobar')
        msg = "Can't log into syslog. Output: %s " % output
        self.assertEqual(status, 0, msg=msg)

        # There is no way to flush the logger to disk in all cases
        time.sleep(1)

        status, output = self.target.run('grep foobar /var/log/messages')
        if status != 0:
            if self.tc.td.get("VIRTUAL-RUNTIME_init_manager") == "systemd":
                status, output = self.target.run('journalctl -o cat | grep foobar')
            else:
                status, output = self.target.run('logread | grep foobar')
        msg = ('Test log string not found in /var/log/messages or logread.'
               ' Output: %s ' % output)
        self.assertEqual(status, 0, msg=msg)


    @OETestDepends(['oe_syslog.SyslogTest.test_syslog_running'])
    def test_syslog_restart(self):
        if self.restart_sanity(['systemd-journald'], 'systemctl restart syslog.service', pidchange=False):
            pass
        elif self.restart_sanity(['rsyslogd'], '/etc/init.d/rsyslog restart'):
            pass
        elif self.restart_sanity(['syslogd', 'klogd'], '/etc/init.d/syslog restart'):
            pass
        else:
            self.logger.info("No syslog found to restart, ignoring")


    @OETestDepends(['oe_syslog.SyslogTestConfig.test_syslog_logger'])
    @OEHasPackage(["busybox-syslog"])
    @skipIfDataVar('VIRTUAL-RUNTIME_init_manager', 'systemd',
                   'Not appropiate for systemd image')
    def test_syslog_startup_config(self):
        cmd = 'echo "LOGFILE=/var/log/test" >> /etc/syslog-startup.conf'
        self.target.run(cmd)

        self.test_syslog_restart()

        cmd = 'logger foobar && grep foobar /var/log/test'
        status,output = self.target.run(cmd)
        msg = 'Test log string not found. Output: %s ' % output
        self.assertEqual(status, 0, msg=msg)

        cmd = "sed -i 's#LOGFILE=/var/log/test##' /etc/syslog-startup.conf"
        self.target.run(cmd)
        self.test_syslog_restart()