borgend/ui.py

Sun, 28 Jan 2018 19:27:34 +0000

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sun, 28 Jan 2018 19:27:34 +0000
changeset 87
a214d475aa28
parent 86
2fe66644c50d
child 89
51cc2e25af38
permissions
-rw-r--r--

Better recovery from errors; fixes to potential race conditions in scheduler and repository queue

1
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 #
40
cfbeeec8cb82 Improved exception reporting etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 38
diff changeset
2 # Borgend MacOS UI
1
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 #
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 import rumps
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
6 import time
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
7 import datetime
86
2fe66644c50d Can use logging.getLogger directly now after proper packageisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 85
diff changeset
8 import logging
79
b075b3db3044 Cleaned up module organisation to simplify borgend.py and not have to import it in other modules.
Tuomo Valkonen <tuomov@iki.fi>
parents: 78
diff changeset
9 import objc
b075b3db3044 Cleaned up module organisation to simplify borgend.py and not have to import it in other modules.
Tuomo Valkonen <tuomov@iki.fi>
parents: 78
diff changeset
10 from threading import Lock, Timer
b075b3db3044 Cleaned up module organisation to simplify borgend.py and not have to import it in other modules.
Tuomo Valkonen <tuomov@iki.fi>
parents: 78
diff changeset
11
80
a409242121d5 Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 79
diff changeset
12 from . import backup
a409242121d5 Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 79
diff changeset
13 from . import dreamtime
a409242121d5 Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 79
diff changeset
14 from . import branding
a409242121d5 Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 79
diff changeset
15 from .config import settings
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
16
86
2fe66644c50d Can use logging.getLogger directly now after proper packageisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 85
diff changeset
17 logger=logging.getLogger(__name__)
31
b4b4bb7a2ec5 More logging detail
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
18
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
19 traynames_ok={
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
20 backup.State.INACTIVE: 'B.',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
21 backup.State.SCHEDULED: 'B.',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
22 backup.State.QUEUED: 'B:',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
23 backup.State.ACTIVE: 'B!',
45
aa2a95dc6093 Further improvements to state reporting; indicate busyness if repository lock cannot be acquired
Tuomo Valkonen <tuomov@iki.fi>
parents: 42
diff changeset
24 }
14
5a988a2c2624 UI: progress percentange support (Borg doesn't seem to be reporting) + error indicator in tray: B?
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
25
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
26 traynames_errors={
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
27 # The first one should never be used
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
28 backup.Errors.OK: traynames_ok[backup.State.INACTIVE],
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
29 backup.Errors.BUSY: 'B⦙',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
30 backup.Errors.OFFLINE: 'B⦙',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
31 backup.Errors.ERRORS: 'B?'
16
d0ffae5550ef Added offline symbol B⦙ (no offline detection yet)
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
32 }
14
5a988a2c2624 UI: progress percentange support (Borg doesn't seem to be reporting) + error indicator in tray: B?
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
33
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
34 def trayname(ste):
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
35 state=ste[0]
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
36 errors=ste[1]
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
37 if not errors.ok():
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
38 return traynames_errors[errors]
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
39 else:
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
40 return traynames_ok[state]
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
41
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
42 def combine_state(a, b):
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
43 return (max(a[0], b[0]), max(a[1], b[1]))
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
44
27
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
45 # Refresh the menu at most once a second to reduce flicker
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
46 refresh_interval=1.0
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
47
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
48 # Workaround to rumps brokenness;
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
49 # see https://github.com/jaredks/rumps/issues/59
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
50 def notification_workaround(title, subtitle, message):
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
51 try:
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
52 NSDictionary = objc.lookUpClass("NSDictionary")
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
53 d=NSDictionary()
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
54
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
55 rumps.notification(title, subtitle, message, data=d)
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
56 except Exception as err:
50
2d8947351727 Logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 49
diff changeset
57 logger.exception("Failed to display notification")
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
58
19
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
59 # Based on code snatched from
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
60 # https://stackoverflow.com/questions/12523586/python-format-size-application-converting-b-to-kb-mb-gb-tb/37423778
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
61 def humanbytes(B):
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
62 'Return the given bytes as a human friendly KB, MB, GB, or TB string'
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
63 B = float(B)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
64 KB = float(1024)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
65 MB = float(KB ** 2) # 1,048,576
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
66 GB = float(KB ** 3) # 1,073,741,824
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
67 TB = float(KB ** 4) # 1,099,511,627,776
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
68
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
69 if B < KB:
20
fdfbe5d7b677 Keychain support and random fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
70 return '{0}B'.format(B)
19
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
71 elif KB <= B < MB:
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
72 return '{0:.2f}KB'.format(B/KB)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
73 elif MB <= B < GB:
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
74 return '{0:.2f}MB'.format(B/MB)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
75 elif GB <= B < TB:
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
76 return '{0:.2f}GB'.format(B/GB)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
77 elif TB <= B:
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
78 return '{0:.2f}TB'.format(B/TB)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
79
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
80 def make_title(status):
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
81 def add_info(info, new):
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
82 if info:
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
83 return "%s; %s" % (info, new)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
84 else:
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
85 return new
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
86
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
87 info=None
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
88 this_need_reconstruct=None
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
89
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
90 if not status.errors.ok():
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
91 info=add_info(info, str(status.errors))
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
92
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
93 if status.state==backup.State.SCHEDULED:
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
94 # Operation scheduled
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
95 when=status.when()
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
96 now=time.time()
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
97
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
98 if when<now:
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
99 whenstr='overdue'
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
100 info=''
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
101 else:
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
102 tnow=datetime.datetime.fromtimestamp(now)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
103 twhen=datetime.datetime.fromtimestamp(when)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
104 tendtoday=twhen.replace(hour=23,minute=59,second=59)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
105 tendtomorrow=tendtoday+datetime.timedelta(days=1)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
106 diff=datetime.timedelta(seconds=when-now)
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
107
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
108 if twhen>tendtomorrow:
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
109 whenday=datetime.date.fromtimestamp(when)
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
110 whenstr='on %s' % twhen.date().isoformat()
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
111 this_need_reconstruct=tendtoday+datetime.timedelta(seconds=1)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
112 elif diff.seconds>=12*60*60: # 12 hours
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
113 whenstr='tomorrow'
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
114 this_need_reconstruct=twhen-datetime.timedelta(hours=12)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
115 else:
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
116 twhen=time.localtime(when)
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
117 if twhen.tm_sec>30:
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
118 # Round up minute display to avoid user confusion
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
119 twhen=time.localtime(when+30)
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
120 whenstr='at %02d:%02d' % (twhen.tm_hour, twhen.tm_min)
38
085a635f23f5 Improved error indicators
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
121
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
122 this_info=''
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
123 if 'reason' in status.detail:
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
124 this_info=status.detail['reason'] + ' '
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
125
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
126 when_how_sched= "%s%s %s" % (this_info, status.operation, whenstr)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
127
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
128 info=add_info(info, when_how_sched)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
129
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
130 elif status.state==backup.State.QUEUED:
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
131 info=add_info(info, "queued")
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
132 elif status.state==backup.State.ACTIVE:
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
133 # Operation running
14
5a988a2c2624 UI: progress percentange support (Borg doesn't seem to be reporting) + error indicator in tray: B?
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
134 progress=''
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
135 d=status.detail
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
136 if 'progress_current' in d and 'progress_total' in d:
85
56a000d15965 On startup, for better scheduling, obtain previous backup time with 'borg list'
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
137 percentage = 100*float(d['progress_current'])/float(d['progress_total'])
56a000d15965 On startup, for better scheduling, obtain previous backup time with 'borg list'
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
138 progress=': %d%%' % int(round(percentage))
56a000d15965 On startup, for better scheduling, obtain previous backup time with 'borg list'
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
139 if 'operation_no' in d:
56a000d15965 On startup, for better scheduling, obtain previous backup time with 'borg list'
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
140 progress='/#%d%s' % (d['operation_no'], progress)
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
141 elif 'original_size' in d and 'deduplicated_size' in d:
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
142 progress=' %s→%s' % (humanbytes(d['original_size']),
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
143 humanbytes(d['deduplicated_size']))
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
144
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
145 howrunning = "running %s%s" % (status.operation, progress)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
146
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
147 info=add_info(info, howrunning)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
148 else:
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
149 pass
15
aaf1a281a3fe More error reporting
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
150
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
151 if info:
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
152 title=status.name + ' (' + info + ')'
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
153 else:
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
154 title=status.name
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
155
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
156 return title, (status.state, status.errors), this_need_reconstruct
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
157
1
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 class BorgendTray(rumps.App):
33
91421eeb4426 Use rumps.application_support instead of xdg paths. Also separated branding into config.py
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
159 def __init__(self, backups):
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
160 self.lock=Lock()
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
161 self.backups=backups
76
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
162 self.refresh_timer=None
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
163 self.refresh_timer_time=None
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
164 self.statuses=[None]*len(backups)
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
165
76
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
166 for index in range(len(backups)):
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
167 self.statuses[index]=backups[index].status()
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
168
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
169 menu, title=self.build_menu_and_timer()
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
170
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
171 super().__init__(title, menu=menu, quit_button=None)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
172
76
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
173 for index in range(len(backups)):
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
174 # Python closures suck dog's balls; hence the _index=index hack
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
175 # See also http://math.andrej.com/2009/04/09/pythons-lambda-is-broken/
87
a214d475aa28 Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents: 86
diff changeset
176 cb=(lambda status, errorlog=None, _index=index:
a214d475aa28 Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents: 86
diff changeset
177 self.__status_callback(_index, status, errorlog=errorlog))
76
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
178 backups[index].set_status_update_callback(cb)
9
aa121291eb0e Rumps/Mac UI stuff is fucked and disables ^C etc.; threading doesn't help
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
179
78
83b43987e61e Renamed the "sleep" module "dreamtime"
Tuomo Valkonen <tuomov@iki.fi>
parents: 76
diff changeset
180 dreamtime.add_callback(self, self.refresh_ui)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
181
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
182 def __rebuild_menu(self):
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
183 menu=[]
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
184 state=(backup.State.INACTIVE, backup.Errors.OK)
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
185 need_reconstruct=None
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
186 for index in range(len(self.backups)):
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
187 b=self.backups[index]
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
188 title, this_state, this_need_reconstruct=make_title(self.statuses[index])
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
189 # Python closures suck dog's balls...
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
190 # first and the last program I write in Python until somebody
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
191 # fixes this brain damage
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
192 cbm=lambda sender, _b=b: self.__menu_select_backup(sender, _b)
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
193 item=rumps.MenuItem(title, callback=cbm)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
194 if not this_state[1].ok():
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
195 item.state=-1
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
196 elif this_state[0]==backup.State.SCHEDULED or this_state[0]==backup.State.QUEUED:
38
085a635f23f5 Improved error indicators
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
197 item.state=1
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
198 menu.append(item)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
199 state=combine_state(state, this_state)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
200
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
201 # Do we have to automatically update menu display?
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
202 if not need_reconstruct:
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
203 need_reconstruct=this_need_reconstruct
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
204 elif this_need_reconstruct:
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
205 need_reconstruct=min(need_reconstruct, this_need_reconstruct)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
206
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
207 menu_log=rumps.MenuItem("Show log", callback=lambda _: showlog())
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
208 menu.append(menu_log)
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
209
30
3dd525652dc8 Added no_quit_menu_entry option
Tuomo Valkonen <tuomov@iki.fi>
parents: 28
diff changeset
210 if not settings['no_quit_menu_entry']:
46
ecb41072a1b7 Unsuccesfull attempts at clean quit on exceptions that fall through
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
211 menu_quit=rumps.MenuItem("Quit...", callback=lambda _: self.quit())
30
3dd525652dc8 Added no_quit_menu_entry option
Tuomo Valkonen <tuomov@iki.fi>
parents: 28
diff changeset
212 menu.append(menu_quit)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
213
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
214 return menu, state, need_reconstruct
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
215
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
216 def build_menu_and_timer(self):
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
217 if self.refresh_timer:
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
218 self.refresh_timer.cancel()
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
219 self.refresh_timer=None
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
220 self.refresh_timer_time=None
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
221 logger.debug('Rebuilding menu')
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
222 menu, state, need_reconstruct=self.__rebuild_menu()
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
223 title=trayname(state)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
224
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
225 if need_reconstruct:
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
226 when=time.mktime(need_reconstruct.timetuple())
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
227 delay=when-time.time()
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
228 self.refresh_timer=Timer(delay, self.refresh_ui)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
229 self.refresh_timer_time=need_reconstruct
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
230 self.refresh_timer.start()
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
231
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
232 return menu, title
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
233
27
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
234 def refresh_ui(self):
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
235 with self.lock:
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
236 menu, title=self.build_menu_and_timer()
27
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
237 self.menu.clear()
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
238 self.menu.update(menu)
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
239 self.title=title
27
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
240
55
407af23d16bb Improved backup main thread loop, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 51
diff changeset
241 def __status_callback(self, index, status, errorlog=None):
75
2a44b9649212 UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
242 logger.debug("Tray status callback")
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
243 with self.lock:
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
244 self.statuses[index]=status
75
2a44b9649212 UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
245 # Time the refresh if it has not been timed, or if the timer
2a44b9649212 UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
246 # is timing for the "long-term" (refresh_timer_time set)
2a44b9649212 UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
247 if not self.refresh_timer or self.refresh_timer_time:
2a44b9649212 UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
248 logger.debug("Timing refresh")
27
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
249 self.refresh_timer=Timer(refresh_interval, self.refresh_ui)
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
250 # refresh_timer_time is only set for "long-term timers"
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
251 self.refresh_timer_time=None
27
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
252 self.refresh_timer.start()
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
253
21
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
254 if errorlog:
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
255 if 'msgid' not in errorlog or not isinstance(errorlog['msgid'], str):
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
256 msgid='UnknownError'
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
257 else:
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
258 msgid=errorlog['msgid']
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
259
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
260 logger.debug("Opening notification for error %s '%s'",
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
261 msgid, errorlog['message'])
21
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
262
79
b075b3db3044 Cleaned up module organisation to simplify borgend.py and not have to import it in other modules.
Tuomo Valkonen <tuomov@iki.fi>
parents: 78
diff changeset
263 notification_workaround(branding.appname_stylised,
33
91421eeb4426 Use rumps.application_support instead of xdg paths. Also separated branding into config.py
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
264 msgid, errorlog['message'])
21
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
265
46
ecb41072a1b7 Unsuccesfull attempts at clean quit on exceptions that fall through
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
266 def quit(self):
28
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
267 rumps.quit_application()
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
268
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
269 def __menu_select_backup(self, sender, b):
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
270 #sender.state=not sender.state
31
b4b4bb7a2ec5 More logging detail
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
271 logger.debug("Manually backup '%s'", b.name)
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
272 try:
49
db33dfa64ad6 Improved scheduler
Tuomo Valkonen <tuomov@iki.fi>
parents: 46
diff changeset
273 b.create()
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
274 except Exception as err:
50
2d8947351727 Logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 49
diff changeset
275 logger.exception("Failure to initialise backup")
79
b075b3db3044 Cleaned up module organisation to simplify borgend.py and not have to import it in other modules.
Tuomo Valkonen <tuomov@iki.fi>
parents: 78
diff changeset
276 notification_workaround(branding.appname_stylised,
33
91421eeb4426 Use rumps.application_support instead of xdg paths. Also separated branding into config.py
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
277 err.__class__.__name__, str(err))
28
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
278
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
279 #
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
280 # Log window
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
281 #
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
282
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
283 logwindow=[None]
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
284 logwindow_lock=Lock()
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
285
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
286 def showlog():
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
287 try:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
288 w=None
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
289 with logwindow_lock:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
290 if not logwindow[0]:
84
b613265bd679 A few things had not been updated to module reorganisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 80
diff changeset
291 lines=loggers.fifo.formatAll()
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
292 msg="\n".join(lines[0:])
84
b613265bd679 A few things had not been updated to module reorganisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 80
diff changeset
293 w=rumps.Window(title=branding.appname_stylised+' log',
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
294 default_text=msg,
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
295 ok='Close',
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
296 dimensions=(640,320))
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
297 logwindow[0]=w
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
298 if w:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
299 try:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
300 w.run()
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
301 finally:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
302 with logwindow_lock:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
303 logwindow[0]=None
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
304 except Exception as err:
50
2d8947351727 Logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 49
diff changeset
305 logger.exception("Failed to display log")
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
306
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
307 #
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
308 # Notification click response => show log window
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
309 #
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
310
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
311 @rumps.notifications
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
312 def notification_center(_):
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
313 showlog()
50
2d8947351727 Logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 49
diff changeset
314

mercurial