52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
import os, sys, json, urllib.request, urllib.parse
|
|
|
|
def refresh():
|
|
client_id = os.getenv('GOOGLE_CLIENT_ID')
|
|
client_secret = os.getenv('GOOGLE_CLIENT_SECRET')
|
|
refresh_token = os.getenv('GOOGLE_REFRESH_TOKEN')
|
|
if not all([client_id, client_secret, refresh_token]):
|
|
sys.stderr.write('Missing one of GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN\n')
|
|
sys.exit(1)
|
|
data = urllib.parse.urlencode({
|
|
'client_id': client_id,
|
|
'client_secret': client_secret,
|
|
'refresh_token': refresh_token,
|
|
'grant_type': 'refresh_token',
|
|
}).encode()
|
|
req = urllib.request.Request('https://oauth2.googleapis.com/token', data=data, method='POST')
|
|
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
|
|
try:
|
|
with urllib.request.urlopen(req) as resp:
|
|
resp_data = json.load(resp)
|
|
except urllib.error.HTTPError as e:
|
|
sys.stderr.write(f'HTTP error {e.code}: {e.read().decode()}\n')
|
|
sys.exit(1)
|
|
access_token = resp_data.get('access_token')
|
|
if not access_token:
|
|
sys.stderr.write('No access_token in response\n')
|
|
sys.exit(1)
|
|
# Update the secrets.env file
|
|
env_path = os.path.expanduser('~/.config/google-calendar/secrets.env')
|
|
# Read existing lines, replace or add GOOGLE_ACCESS_TOKEN
|
|
lines = []
|
|
if os.path.exists(env_path):
|
|
with open(env_path, 'r') as f:
|
|
lines = f.readlines()
|
|
new_lines = []
|
|
token_set = False
|
|
for line in lines:
|
|
if line.startswith('export GOOGLE_ACCESS_TOKEN='):
|
|
new_lines.append(f'export GOOGLE_ACCESS_TOKEN={access_token}\n')
|
|
token_set = True
|
|
else:
|
|
new_lines.append(line)
|
|
if not token_set:
|
|
new_lines.append(f'export GOOGLE_ACCESS_TOKEN={access_token}\n')
|
|
with open(env_path, 'w') as f:
|
|
f.writelines(new_lines)
|
|
print(json.dumps(resp_data, indent=2))
|
|
|
|
if __name__ == '__main__':
|
|
refresh()
|