Skip to content

Commit

Permalink
Use locale independant timestamp with creation
Browse files Browse the repository at this point in the history
Fixes #15
  • Loading branch information
johnramsden committed Dec 3, 2018
1 parent 2c31897 commit be49c98
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 13 deletions.
21 changes: 11 additions & 10 deletions zedenv/cli/destroy.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import zedenv.lib.be
import zedenv.lib.check
from zedenv.lib.logger import ZELogger
import zedenv.lib.system


def get_promote_snapshots(be_pool: str, destroy_dataset: str) -> list:
Expand Down Expand Up @@ -74,13 +75,12 @@ def get_clone_origin(destroy_dataset: str) -> Optional[str]:

origin_datetime = None
try:
origin_datetime = datetime.datetime.strptime(
origin_property.split('@')[1], "%Y-%m-%d-%H-%f")
origin_datetime = zedenv.lib.system.parse_time(origin_property)
except ValueError:
try:
origin_datetime = datetime.datetime.strptime(
origin_property.split('@')[1].split("-", 1)[1], "%Y-%m-%d-%H-%f")
except ValueError as e:
origin_datetime = zedenv.lib.system.parse_time(
origin_property.split('@')[1])
except ValueError:
ZELogger.log({
"level": "EXCEPTION",
"message": f"Failed to parse time from origin {origin_property}\n"
Expand All @@ -90,8 +90,9 @@ def get_clone_origin(destroy_dataset: str) -> Optional[str]:
try:
creation_property = pyzfscmds.cmd.zfs_get(destroy_dataset,
columns=['value'],
properties=['creation'])
except RuntimeError:
properties=['creation'],
env_variables_override={"LC_ALL": "C"})
except RuntimeError as e:
ZELogger.log({
"level": "EXCEPTION",
"message": f"Failed to get creation of {creation_property}\n{e}\n"
Expand All @@ -101,9 +102,9 @@ def get_clone_origin(destroy_dataset: str) -> Optional[str]:

creation_datetime = None
try:
creation_datetime = datetime.datetime.strptime(creation_property,
"%a %b %d %H:%M %Y")
except ValueError:
creation_datetime = zedenv.lib.system.parse_time(creation_property,
fmt="%a %b %d %H:%M %Y")
except ValueError as e:
ZELogger.log({
"level": "EXCEPTION",
"message": f"Failed to parse time from origin {origin_property}\n{e}"
Expand Down
4 changes: 3 additions & 1 deletion zedenv/lib/be.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from typing import Optional, List, Dict

import zedenv.lib.check
import zedenv.lib.system
from zedenv.lib.logger import ZELogger

"""
Expand Down Expand Up @@ -105,7 +106,8 @@ def snapshot(boot_environment_name,

dataset_name = f"{boot_environment_root}/{boot_environment_name}"

suffix_time = datetime.datetime.now().strftime(snap_suffix_time_format)
with zedenv.lib.system.setlocale():
suffix_time = datetime.datetime.now().strftime(snap_suffix_time_format)
full_snap_suffix = f"{snap_prefix}-{suffix_time}" if snap_prefix else suffix_time

try:
Expand Down
28 changes: 28 additions & 0 deletions zedenv/lib/system.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,34 @@
import datetime
import subprocess
import platform
from contextlib import contextmanager
import datetime
from typing import List, Optional
import locale


@contextmanager
def setlocale(encoding: str="C"):
"""
See: https://stackoverflow.com/a/24070673
"""
saved = locale.setlocale(locale.LC_ALL)
try:
yield locale.setlocale(locale.LC_ALL, encoding)
finally:
locale.setlocale(locale.LC_ALL, saved)


def parse_time(origin_property: str, fmt: str="%Y-%m-%d-%H-%f",
encoding: str="C", no_setlocale: bool=False) -> datetime:

if no_setlocale:
return datetime.datetime.strptime(origin_property, fmt)

with setlocale(encoding=encoding):
origin_datetime: datetime = datetime.datetime.strptime(origin_property, fmt)

return origin_datetime


def mount(call_args: List[str] = None,
Expand Down
1 change: 0 additions & 1 deletion zedenv/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import os
import signal
import sys
import subprocess
import platform

import click
Expand Down
4 changes: 3 additions & 1 deletion zedenv/plugins/freebsdloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,11 @@ def __init__(self, zedenv_data: dict):
def post_activate(self):
canmount_setting = "canmount=noauto" if self.zfs_be else "canmount=on"

ds = f"{self.be_root}/{self.boot_environment}"

try:
pyzfscmds.cmd.zfs_set(f"{self.be_root}/{self.boot_environment}", canmount_setting)
except RuntimeError:
except RuntimeError as e:
ZELogger.log({
"level": "EXCEPTION",
"message": f"Failed to set {canmount_setting} for {ds}\n{e}\n"
Expand Down

0 comments on commit be49c98

Please sign in to comment.