Param([string]$srv,$port=135,$timeout=3000,[switch]$verbose)
# Test-Port.ps1
# Does a TCP connection on specified port (135 by default)
$ErrorActionPreference = "SilentlyContinue"
# Create TCP Client
$tcpclient = new-Object system.Net.Sockets.TcpClient
# Tell TCP Client to connect to machine on Port
$iar = $tcpclient.BeginConnect($srv,$port,$null,$null)
# Set the wait time
$wait = $iar.AsyncWaitHandle.WaitOne($timeout,$false)
# Check to see if the connection is done
if(!$wait)
{
# Close the connection and report timeout
$tcpclient.Close()
if($verbose){Write-Host "Connection Timeout"}
Return $false
}
else
{
# Close the connection and report the error if there is one
$error.Clear()
$tcpclient.EndConnect($iar) | out-Null
if(!$?){if($verbose){write-host $error[0]};$failed = $true}
$tcpclient.Close()
}
# Return $true if connection Establish else $False
if($failed){return $false}else{return $true}
#!/usr/bin/python
import httplib
import httplib2
import os
import random
import sys
import time
from apiclient.discovery import build
from apiclient.errors import HttpError
from apiclient.http import MediaFileUpload
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow
# Explicitly tell the underlying HTTP transport library not to retry, since
# we are handling retry logic ourselves.
httplib2.RETRIES = 1
# Maximum number of times to retry before giving up.
MAX_RETRIES = 10
# Always retry when these exceptions are raised.
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, httplib.NotConnected,
httplib.IncompleteRead, httplib.ImproperConnectionState,
httplib.CannotSendRequest, httplib.CannotSendHeader,
httplib.ResponseNotReady, httplib.BadStatusLine)
# Always retry when an apiclient.errors.HttpError with one of these status
# codes is raised.
RETRIABLE_STATUS_CODES = [500, 502, 503, 504]
# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains
# the OAuth 2.0 information for this application, including its client_id and
# client_secret. You can acquire an OAuth 2.0 client ID and client secret from
# the Google Developers Console at
# https://console.developers.google.com/.
# Please ensure that you have enabled the YouTube Data API for your project.
# For more information about using OAuth2 to access the YouTube Data API, see:
# https://developers.google.com/youtube/v3/guides/authentication
# For more information about the client_secrets.json file format, see:
# https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
CLIENT_SECRETS_FILE = "client_secrets.json"
# This OAuth 2.0 access scope allows an application to upload files to the
# authenticated user's YouTube channel, but doesn't allow other types of access.
YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
# This variable defines a message to display if the CLIENT_SECRETS_FILE is
# missing.
MISSING_CLIENT_SECRETS_MESSAGE = """
WARNING: Please configure OAuth 2.0
To make this sample run you will need to populate the client_secrets.json file
found at:
%s
with information from the Developers Console
https://console.developers.google.com/
For more information about the client_secrets.json file format, please visit:
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
""" % os.path.abspath(os.path.join(os.path.dirname(__file__),
CLIENT_SECRETS_FILE))
VALID_PRIVACY_STATUSES = ("public", "private", "unlisted")
def get_authenticated_service(args):
flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
scope=YOUTUBE_UPLOAD_SCOPE,
message=MISSING_CLIENT_SECRETS_MESSAGE)
storage = Storage("%s-oauth2.json" % sys.argv[0])
credentials = storage.get()
if credentials is None or credentials.invalid:
credentials = run_flow(flow, storage, args)
return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
http=credentials.authorize(httplib2.Http()))
def initialize_upload(youtube, options):
tags = None
if options.keywords:
tags = options.keywords.split(",")
body=dict(
snippet=dict(
title=options.title,
description=options.description,
tags=tags,
categoryId=options.category
),
status=dict(
privacyStatus=options.privacyStatus
)
)
# Call the API's videos.insert method to create and upload the video.
insert_request = youtube.videos().insert(
part=",".join(body.keys()),
body=body,
# The chunksize parameter specifies the size of each chunk of data, in
# bytes, that will be uploaded at a time. Set a higher value for
# reliable connections as fewer chunks lead to faster uploads. Set a lower
# value for better recovery on less reliable connections.
#
# Setting "chunksize" equal to -1 in the code below means that the entire
# file will be uploaded in a single HTTP request. (If the upload fails,
# it will still be retried where it left off.) This is usually a best
# practice, but if you're using Python older than 2.6 or if you're
# running on App Engine, you should set the chunksize to something like
# 1024 * 1024 (1 megabyte).
media_body=MediaFileUpload(options.file, chunksize=-1, resumable=True)
)
resumable_upload(insert_request)
# This method implements an exponential backoff strategy to resume a
# failed upload.
def resumable_upload(insert_request):
response = None
error = None
retry = 0
while response is None:
try:
print "Uploading file..."
status, response = insert_request.next_chunk()
if 'id' in response:
print "Video id '%s' was successfully uploaded." % response['id']
else:
exit("The upload failed with an unexpected response: %s" % response)
except HttpError, e:
if e.resp.status in RETRIABLE_STATUS_CODES:
error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status,
e.content)
else:
raise
except RETRIABLE_EXCEPTIONS, e:
error = "A retriable error occurred: %s" % e
if error is not None:
print error
retry += 1
if retry > MAX_RETRIES:
exit("No longer attempting to retry.")
max_sleep = 2 ** retry
sleep_seconds = random.random() * max_sleep
print "Sleeping %f seconds and then retrying..." % sleep_seconds
time.sleep(sleep_seconds)
if __name__ == '__main__':
argparser.add_argument("--file", required=True, help="Video file to upload")
argparser.add_argument("--title", help="Video title", default="Test Title")
argparser.add_argument("--description", help="Video description",
default="Test Description")
argparser.add_argument("--category", default="22",
help="Numeric video category. " +
"See https://developers.google.com/youtube/v3/docs/videoCategories/list")
argparser.add_argument("--keywords", help="Video keywords, comma separated",
default="")
argparser.add_argument("--privacyStatus", choices=VALID_PRIVACY_STATUSES,
default=VALID_PRIVACY_STATUSES[0], help="Video privacy status.")
args = argparser.parse_args()
if not os.path.exists(args.file):
exit("Please specify a valid file using the --file= parameter.")
youtube = get_authenticated_service(args)
try:
initialize_upload(youtube, args)
except HttpError, e:
print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)
そして実行!
-bash-4.2$ ./youtube-upload
Traceback (most recent call last):
File "./youtube-upload", line 4, in <module>
import httplib2
ImportError: No module named httplib2
-bash-4.2$
-bash-4.2$ ./youtube-upload
Traceback (most recent call last):
File "./youtube-upload", line 10, in <module>
from apiclient.discovery import build
ImportError: No module named apiclient.discovery
-bash-4.2$
[root@server ~]# pip install google-api-python-client
Collecting google-api-python-client
Downloading https://files.pythonhosted.org/packages/5b/ba/c4e47e2fdd945145ddb10db06dd29af19b01f6e6d7452348b9bf10375ee9/google-api-python-client-1.7.9.tar.gz (142kB)
Installing collected packages: pyasn1, pyasn1-modules, cachetools, rsa, google-auth, google-auth-httplib2, uritemplate, google-api-python-client
Running setup.py install for google-api-python-client ... done
Successfully installed cachetools-3.1.1 google-api-python-client-1.7.9 google-auth-1.6.3 google-auth-httplib2-0.0.3 pyasn1-0.4.5 pyasn1-modules-0.2.5 rsa-4.0 uritemplate-3.0.0
You are using pip version 8.1.2, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[root@server ~]#
で、改めてスクリプトを実行してみる。
-bash-4.2$ ./youtube-upload --file /mnt/work/fuuka/223779_20190618-0013_best.mpg
The client secrets were invalid:
('Error opening file', 'client_secrets.json', 'No such file or directory', 2)
WARNING: Please configure OAuth 2.0
To make this sample run you will need to populate the client_secrets.json file
found at:
/mnt/work/youtube/client_secrets.json
with information from the Developers Console
https://console.developers.google.com/
For more information about the client_secrets.json file format, please visit:
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
-bash-4.2$
当然のエラー。
client_secrets.json というファイルに認証情報を記載しなければならないようだ。
「Google API Console」にアクセスして、新規プロジェクトを作成。 認証情報タブから「OauthクライアントIDの作成」を選び、「アプリケーションの種類:その他」で作成します。 作成すると、jsonファイルがダウンロードできようになりますので、それをダウンロードし、client_secrets.json という名前で保存します。
また、下記の様なメールがGoogleアカウントのメールに届きます。(「youtube upload by osakanataro」という文字列は、Google API Consoleで設定したものです)
これで認証が終わると、ファイルアップロードが出来るようになります。
-bash-4.2$ ./youtube-upload --file /mnt/work/fuuka/223779_20190618-0013_best.mpg --noauth_local_webserver
Uploading file...
Video id 'IAHhZlSXoDk' was successfully uploaded.
-bash-4.2$
今回のバグは「CentOS Linux release 7.6.1810 (Core)」の文字列からOSバージョン判定をする際に「”6.”があればCentOS6」「”7.”があればCentOS7」「”8.”があればCentOS8」という順番で行っているせいで、「7.6.1810」の中にある「6.」を読み取ってしまい「CentOS6」と判定されていることにより発生している。
このため、/etc/centos-release 内の誤判定要素を無くすことで対処できなくもない。
例えば「 CentOS Linux release 7.6 1810 (Core) 」と、「.」を抜いてしまうとか。
if (strstr(distroLower, "red hat")) {
if (strstr(distroLower, "enterprise")) {
/*
* Looking for "release x" here instead of "x" as there could be
* build version which can be misleading. For example Red Hat
* Enterprise Linux ES release 4 (Nahant Update 3)
*/
int release = 0;
char *releaseStart = strstr(distroLower, "release");
if (releaseStart != NULL) {
sscanf(releaseStart, "release %d", &release);
if (release > 0) {
snprintf(distroShort, distroShortSize, STR_OS_RED_HAT_EN"%d",
release);
}
}
if (release <= 0) {
Str_Strcpy(distroShort, STR_OS_RED_HAT_EN, distroShortSize);
}
} else {
Str_Strcpy(distroShort, STR_OS_RED_HAT, distroShortSize);
}
}
Jul 04 13:15:04 sogod [9257]: SOGoRootPage Login from 'クライアントIPアドレス' for user 'ユーザ名@ドメイン名' might not have worked - password policy: 65535 grace: -1 expire: -1 bound: 0
Apple iPhone XS (香港,マカオモデルも含む,中国モデルは無い?) Apple iPhone XS Max (香港,マカオ,中国モデルは物理的なデュアルSIM) Apple iPhone XR (香港,マカオ,中国モデルは物理的なデュアルSIM) Apple 11インチ iPad Pro Apple 12.9インチ iPad Pro (第3世代) Apple Air (第3世代) Apple iPad mini (第5世代)
Apple Watchについては標準のeSIM対応手順ではないようで、ちょっと厳しいようだ
Apple Watch Series 3 (GPS+Cellularモデル) Apple Watch Series 4 (GPS+Cellularモデル)
Android
Google Pixel 2/3/3XLの日本向け端末ではeSIMのかわりにFelicaモジュールが導入されているため使用できない。一部にオーストラリア版もeSIMがない、という記述があったが、どうやらSIMロックがかかっているPixelがいくつかの携帯電話会社から販売されているようで、それだとeSIMが使えないらしい。 Pixel Phone Helpフォーラム「Pixel 3/3XL eSIM support in Australia」でOptusで買ったデバイスだとeSIMインタフェースが無いという事象の報告と、unlockしたやつだと表示されるという報告。 Pixel Phone Help「Get a SIM card & insert it into a Pixel phone」には「 if the phone was purchased in Japan or if bought with Verizon or Charter service 」という注意書きだった)
Google Pixel 2 (日本以外) Google Pixel 3 (日本以外) Google Pixel 3XL (日本以外) Google Pixel 3a (日本以外) Google Pixel 3a XL (日本以外)
Microsoft Surface Pro LTE Advanced Lenovo Yoga 630 (snapdragon850搭載Windows) HP Spectre Folio 13 (日本ではeSIMモデル未販売) ASUS TransBook Mini T103HAF-LTE,T103HAF-GR079LTE(ただしIIJのeSIMではトラブル発生中) Acer Swift 7 Acer Swift 3(こちらは物理eSIMカードのようだ)
1. List of compatible eSIM devices: Smartphones with embedded eSIM*:iphone XS, iPhone XS Max, iPhone XR, Google Pixel 3 *if your phone is locked to your carrier, you will not be able to install Ubigi on its eSIM. Windows 10 PCs:Lenovo Yoga 630, HP Spectre Folio Tablets with embedded eSIM:iPad Air (3rd Generation) iPad Pro (3rd Generation) iPad Mini (5th Generation) Gemini PDA
Currently supported devices: iPhone XS, XS Max, XR, Pixel 3, Pixel 3 XL *Not supported by iPhone XR and XS Max purchased in Hong Kong, Macau and Mainland China *Not supported by Pixel devices purchased in Australia Same day activation, no contract required!
Watches with eSIM Compatibility Huawei Watch 2 Pro Apple Watch Series 3 Apple Watch Series 4 Samsung Gear S2 Samsung Gear S3 Samsung Galaxy Watch Selected phones with eSIM Compatibility Google Pixel 2 Google Pixel 3 Samsung Galaxy Note 9 Samsung Galaxy S9, S9+ iPhone XS iPhone XS Max
eSIM対応のWWANモジュールを搭載できるコンピューター: HP Elite x2 1012 G2 HP Elite x2 1013 G3 HP EliteBook 1040 G4ノートブックPC HP EliteBook 725 G4ノートブックPC HP EliteBook 735 G5ノートブックPC HP EliteBook 745 G4ノートブックPC HP EliteBook 745 G5ノートブックPC HP EliteBook 755 G4ノートブックPC HP EliteBook 755 G5ノートブックPC HP EliteBook 820 G4ノートブックPC HP EliteBook 828 G4ノートブックPC HP EliteBook 830 G5ノートブックPC HP EliteBook 836 G5ノートブックPC HP EliteBook 840 G4ノートブックPC HP EliteBook 840 G5 Healthcare EditionノートブックPC HP EliteBook 840 G5ノートブックPC HP EliteBook 840r G4ノートブックPC HP EliteBook 846 G5ノートブックPC HP EliteBook 848 G4ノートブックPC HP EliteBook 850 G4ノートブックPC HP EliteBook 850 G5ノートブックPC HP EliteBook x360 1030 G2ノートブックPC HP EliteBook x360 1030 G3ノートブックPC HP EliteBook x360 1040 G5ノートブックPC HP EliteBook x360 830 G5ノートブックPC HP EliteBook x360 830 G6ノートブックPC HP ProBook 430 G4ノートブックPC HP ProBook 440 G4ノートブックPC HP ProBook 450 G4ノートブックPC HP ProBook 640 G3ノートブックPC HP ProBook 640 G4ノートブックPC HP ProBook 645 G3ノートブックPC HP ProBook 645 G4ノートブックPC HP ProBook 650 G3ノートブックPC HP ProBook 650 G4ノートブックPC HP ProBook 655 G3ノートブックPC HP ProBook x360 440 G1ノートブックPC HP ZBook 14u G4 Mobile Workstation HP ZBook 14u G5 Mobile Workstation HP ZBook 15 G4 Mobile Workstation HP ZBook 15 G5 Mobile Workstation HP ZBook 15u G4 Mobile Workstation HP ZBook 15u G5 Mobile Workstation HP ZBook 17 G5 Mobile Workstation HP ZBook Studio G5 Mobile Workstation
gnome-initial-setup also has a session mode which activates gnome-initial-setup when a user first logs in. The gnome-initial-setup-first-login.desktop in the xdg autostart directory utilises gnome-session to check if the user has a gnome-initial-setup-done file in their XDG_CONFIG_DIR if they don’t gnome-initial-setup will launch with pages that are suitable for a non-privileged user and on exiting will write the done file.
$XDG_CONFIG_HOME defines the base directory relative to which user specific configuration files should be stored. If $XDG_CONFIG_HOME is either not set or empty, a default equal to $HOME/.config should be used.
ただ、作者のnewsページを見てみると「aqmail is a joint project of Erwin Hoffmann (s/qmail) and Kai Peter (eqmail) to provide an alternative Qmail. Coming soon.」として「aqmail」というものを始めるらしい。
qmail開発者2人によるジョイントプロジェクト「aqmail」
aqmail is a joint project of Erwin Hoffmann (s/qmail) and Kai Peter (eqmail) to provide an alternative Qmail. Coming soon.」として「aqmail」 が2017年に開始されている。