Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1"""The EtcKeeper helper module.""" 

2from charmhelpers.core import hookenv, unitdata, host, templating 

3from charms.reactive.helpers import any_file_changed 

4from subprocess import check_call 

5 

6 

7class EtcKeeper: 

8 """The EtcKeeper helper class.""" 

9 

10 config_file = "/etc/etckeeper/etckeeper.conf" 

11 

12 def __init__(self): 

13 """Instantiate class variables.""" 

14 self.charm_config = hookenv.config() 

15 self.kv = unitdata.kv() 

16 

17 def run_etckeeper(self, args): 

18 """Run etckeeper with the provided arguments.""" 

19 if len(args) > 0: 

20 cmd = [ 

21 "etckeeper" 

22 ] 

23 cmd.extend(args) 

24 return check_call(cmd) 

25 return False 

26 

27 def render_config(self): 

28 """Render configuration file.""" 

29 hookenv.log( 

30 "Rendering etckeeper configuration to {}".format(self.config_file), 

31 hookenv.DEBUG, 

32 ) 

33 templating.render( 

34 "etckeeper.conf.j2", 

35 self.config_file, 

36 { 

37 "etckeeper_remote": self.charm_config.get("vcs-remote"), 

38 "etckeeper_vcs": self.charm_config.get("vcs") 

39 }, 

40 ) 

41 if any_file_changed([self.config_file]): 

42 self.init_repo() 

43 return True 

44 return False 

45 

46 def init_repo(self): 

47 """Initialise the etckeeper repository.""" 

48 if self.run_etckeeper(["init"]): 

49 self.kv.set("etckeeper_init", True) 

50 else: 

51 return False 

52 

53 def bootstrap_etc(self): 

54 """Set up repo and update KV with status.""" 

55 if self.kv.get("etckeeper_init"): 

56 hookenv.log("Skipping etckeeper init on already-initialised repo.", hookenv.DEBUG) 

57 return True 

58 if self.init_repo(): 

59 return True 

60 return False 

61 

62 def enable_timer(self): 

63 """Enable daily timer for etckeeper.""" 

64 host.service("enable", "etckeeper.timer") 

65 

66 def disable_timer(self): 

67 """Disable daily timer for etckeeper.""" 

68 host.service("disable", "etckeeper.timer") 

69 

70 def configure(self): 

71 """Configure etckeeper.""" 

72 self.render_config() 

73 self.bootstrap_etc() 

74 if self.charm_config.get('daily'): 

75 self.enable_timer() 

76 else: 

77 self.disable_timer() 

78 hookenv.status_set('active', 'etckeeper installed and configured') 

79 

80 def commit(self): 

81 """Commit changes and push to a remote.""" 

82 self.run_etckeeper(["commit", "Charm initiated commit"]) 

83 return True