OLD | NEW |
1 // Copyright 2014 Canonical Ltd. | 1 // Copyright 2014 Canonical Ltd. |
2 // Licensed under the AGPLv3, see LICENCE file for details. | 2 // Licensed under the AGPLv3, see LICENCE file for details. |
3 | 3 |
4 package rsyslog | 4 package rsyslog |
5 | 5 |
6 import ( | 6 import ( |
7 "fmt" | 7 "fmt" |
8 "os" | 8 "os" |
9 "os/user" | 9 "os/user" |
10 "strconv" | 10 "strconv" |
11 "time" | 11 "time" |
12 | 12 |
13 » "github.com/errgo/errgo" | 13 » "github.com/juju/errors" |
14 "github.com/juju/loggo" | 14 "github.com/juju/loggo" |
15 | 15 |
16 "launchpad.net/juju-core/agent" | 16 "launchpad.net/juju-core/agent" |
17 "launchpad.net/juju-core/cert" | 17 "launchpad.net/juju-core/cert" |
18 "launchpad.net/juju-core/names" | 18 "launchpad.net/juju-core/names" |
19 apirsyslog "launchpad.net/juju-core/state/api/rsyslog" | 19 apirsyslog "launchpad.net/juju-core/state/api/rsyslog" |
20 "launchpad.net/juju-core/state/api/watcher" | 20 "launchpad.net/juju-core/state/api/watcher" |
21 "launchpad.net/juju-core/utils" | 21 "launchpad.net/juju-core/utils" |
22 "launchpad.net/juju-core/utils/syslog" | 22 "launchpad.net/juju-core/utils/syslog" |
23 "launchpad.net/juju-core/worker" | 23 "launchpad.net/juju-core/worker" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 return &RsyslogConfigHandler{ | 115 return &RsyslogConfigHandler{ |
116 st: st, | 116 st: st, |
117 mode: mode, | 117 mode: mode, |
118 syslogConfig: syslogConfig, | 118 syslogConfig: syslogConfig, |
119 }, nil | 119 }, nil |
120 } | 120 } |
121 | 121 |
122 func (h *RsyslogConfigHandler) SetUp() (watcher.NotifyWatcher, error) { | 122 func (h *RsyslogConfigHandler) SetUp() (watcher.NotifyWatcher, error) { |
123 if h.mode == RsyslogModeAccumulate { | 123 if h.mode == RsyslogModeAccumulate { |
124 if err := h.ensureCertificates(); err != nil { | 124 if err := h.ensureCertificates(); err != nil { |
125 » » » return nil, errgo.Annotate(err, "failed to write rsyslog
certificates") | 125 » » » return nil, errors.Annotate(err, "failed to write rsyslo
g certificates") |
126 } | 126 } |
127 } | 127 } |
128 return h.st.WatchForEnvironConfigChanges() | 128 return h.st.WatchForEnvironConfigChanges() |
129 } | 129 } |
130 | 130 |
131 var restartRsyslog = syslog.Restart | 131 var restartRsyslog = syslog.Restart |
132 | 132 |
133 func (h *RsyslogConfigHandler) TearDown() error { | 133 func (h *RsyslogConfigHandler) TearDown() error { |
134 if err := os.Remove(h.syslogConfig.ConfigFilePath()); err == nil { | 134 if err := os.Remove(h.syslogConfig.ConfigFilePath()); err == nil { |
135 restartRsyslog() | 135 restartRsyslog() |
136 } | 136 } |
137 return nil | 137 return nil |
138 } | 138 } |
139 | 139 |
140 func (h *RsyslogConfigHandler) Handle() error { | 140 func (h *RsyslogConfigHandler) Handle() error { |
141 cfg, err := h.st.EnvironConfig() | 141 cfg, err := h.st.EnvironConfig() |
142 if err != nil { | 142 if err != nil { |
143 » » return errgo.Annotate(err, "cannot get environ config") | 143 » » return errors.Annotate(err, "cannot get environ config") |
144 } | 144 } |
145 rsyslogCACert := cfg.RsyslogCACert() | 145 rsyslogCACert := cfg.RsyslogCACert() |
146 if rsyslogCACert == "" { | 146 if rsyslogCACert == "" { |
147 return nil | 147 return nil |
148 } | 148 } |
149 // If neither syslog-port nor rsyslog-ca-cert | 149 // If neither syslog-port nor rsyslog-ca-cert |
150 // have changed, we can drop out now. | 150 // have changed, we can drop out now. |
151 if cfg.SyslogPort() == h.syslogPort && rsyslogCACert == h.rsyslogCACert
{ | 151 if cfg.SyslogPort() == h.syslogPort && rsyslogCACert == h.rsyslogCACert
{ |
152 return nil | 152 return nil |
153 } | 153 } |
154 h.syslogConfig.Port = cfg.SyslogPort() | 154 h.syslogConfig.Port = cfg.SyslogPort() |
155 if h.mode == RsyslogModeForwarding { | 155 if h.mode == RsyslogModeForwarding { |
156 if err := writeFileAtomic(h.syslogConfig.CACertPath(), []byte(rs
yslogCACert), 0644, 0, 0); err != nil { | 156 if err := writeFileAtomic(h.syslogConfig.CACertPath(), []byte(rs
yslogCACert), 0644, 0, 0); err != nil { |
157 » » » return errgo.Annotate(err, "cannot write CA certificate"
) | 157 » » » return errors.Annotate(err, "cannot write CA certificate
") |
158 } | 158 } |
159 } | 159 } |
160 data, err := h.syslogConfig.Render() | 160 data, err := h.syslogConfig.Render() |
161 if err != nil { | 161 if err != nil { |
162 » » return errgo.Annotate(err, "failed to render rsyslog configurati
on file") | 162 » » return errors.Annotate(err, "failed to render rsyslog configurat
ion file") |
163 } | 163 } |
164 if err := writeFileAtomic(h.syslogConfig.ConfigFilePath(), []byte(data),
0644, 0, 0); err != nil { | 164 if err := writeFileAtomic(h.syslogConfig.ConfigFilePath(), []byte(data),
0644, 0, 0); err != nil { |
165 » » return errgo.Annotate(err, "failed to write rsyslog configuratio
n file") | 165 » » return errors.Annotate(err, "failed to write rsyslog configurati
on file") |
166 } | 166 } |
167 logger.Debugf("Reloading rsyslog configuration") | 167 logger.Debugf("Reloading rsyslog configuration") |
168 if err := restartRsyslog(); err != nil { | 168 if err := restartRsyslog(); err != nil { |
169 logger.Errorf("failed to reload rsyslog configuration") | 169 logger.Errorf("failed to reload rsyslog configuration") |
170 » » return errgo.Annotate(err, "cannot restart rsyslog") | 170 » » return errors.Annotate(err, "cannot restart rsyslog") |
171 } | 171 } |
172 // Record config values so we don't try again. | 172 // Record config values so we don't try again. |
173 // Do this last so we recover from intermittent | 173 // Do this last so we recover from intermittent |
174 // failures. | 174 // failures. |
175 h.syslogPort = cfg.SyslogPort() | 175 h.syslogPort = cfg.SyslogPort() |
176 h.rsyslogCACert = rsyslogCACert | 176 h.rsyslogCACert = rsyslogCACert |
177 return nil | 177 return nil |
178 } | 178 } |
179 | 179 |
180 var lookupUser = func(username string) (uid, gid int, err error) { | 180 var lookupUser = func(username string) (uid, gid int, err error) { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 } | 255 } |
256 if uid != 0 { | 256 if uid != 0 { |
257 if err := f.Chown(uid, gid); err != nil { | 257 if err := f.Chown(uid, gid); err != nil { |
258 return err | 258 return err |
259 } | 259 } |
260 } | 260 } |
261 return nil | 261 return nil |
262 } | 262 } |
263 return utils.AtomicWriteFileAndChange(path, data, chmodAndChown) | 263 return utils.AtomicWriteFileAndChange(path, data, chmodAndChown) |
264 } | 264 } |
OLD | NEW |