Coverage for .tox/coverage/lib/python3.11/site-packages/wuttamess/apt.py: 100%

17 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-09-08 07:01 -0500

1# -*- coding: utf-8; -*- 

2################################################################################ 

3# 

4# WuttaMess -- Fabric Automation Helpers 

5# Copyright © 2024-2025 Lance Edgar 

6# 

7# This file is part of Wutta Framework. 

8# 

9# Wutta Framework is free software: you can redistribute it and/or modify it 

10# under the terms of the GNU General Public License as published by the Free 

11# Software Foundation, either version 3 of the License, or (at your option) any 

12# later version. 

13# 

14# Wutta Framework is distributed in the hope that it will be useful, but 

15# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 

16# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 

17# more details. 

18# 

19# You should have received a copy of the GNU General Public License along with 

20# Wutta Framework. If not, see <http://www.gnu.org/licenses/>. 

21# 

22################################################################################ 

23""" 

24APT package management 

25""" 

26 

27 

28def dist_upgrade(c, frontend="noninteractive"): 

29 """ 

30 Run a full dist-upgrade for APT. Essentially this runs: 

31 

32 .. code-block:: sh 

33 

34 apt update 

35 apt dist-upgrade 

36 """ 

37 update(c) 

38 upgrade(c, dist_upgrade=True, frontend=frontend) 

39 

40 

41def install(c, *packages, **kwargs): 

42 """ 

43 Install some package(s) via APT. Essentially this runs: 

44 

45 .. code-block:: sh 

46 

47 apt install PKG [PKG ...] 

48 """ 

49 frontend = kwargs.pop("frontend", "noninteractive") 

50 packages = " ".join(packages) 

51 return c.run(f"DEBIAN_FRONTEND={frontend} apt-get --assume-yes install {packages}") 

52 

53 

54def is_installed(c, package): 

55 """ 

56 Check if the given APT package is installed. 

57 

58 :param c: Fabric connection. 

59 

60 :param package: Name of package to be checked. 

61 

62 :returns: ``True`` if package is installed, else ``False``. 

63 """ 

64 return c.run(f"dpkg-query -s {package}", warn=True).ok 

65 

66 

67def update(c): 

68 """ 

69 Update the APT package lists. Essentially this runs: 

70 

71 .. code-block:: sh 

72 

73 apt update 

74 """ 

75 c.run("apt-get update") 

76 

77 

78def upgrade( # pylint: disable=redefined-outer-name 

79 c, dist_upgrade=False, frontend="noninteractive" 

80): 

81 """ 

82 Upgrade packages via APT. Essentially this runs: 

83 

84 .. code-block:: sh 

85 

86 apt upgrade 

87 

88 # ..or.. 

89 

90 apt dist-upgrade 

91 """ 

92 options = "" 

93 if frontend == "noninteractive": 

94 options = ( 

95 '--option Dpkg::Options::="--force-confdef" ' 

96 '--option Dpkg::Options::="--force-confold"' 

97 ) 

98 upgrade = "dist-upgrade" if dist_upgrade else "upgrade" 

99 c.run(f"DEBIAN_FRONTEND={frontend} apt-get --assume-yes {options} {upgrade}")