diff -ru WALinuxAgent-2.0.18/waagent WALinuxAgent-2.0.18-new/waagent
--- WALinuxAgent-2.0.18/waagent 2016-04-01 01:29:50.000000000 -0700
+++ WALinuxAgent-2.0.18-new/waagent 2016-04-29 01:03:04.294204270 -0700
@@ -2403,6 +2403,139 @@
Run('/sbin/usermod ' + user + ' -G ""')
super(fedoraDistro, self).DeleteAccount(user)
+
+############################################################
+# photonDistro
+############################################################
+
+class photonDistro(AbstractDistro):
+ """
+ photon Distro concrete class
+ Put photon specific behavior here...
+ """
+ CORE_UID = 500
+
+ def __init__(self):
+ super(photonDistro,self).__init__()
+ self.requiredDeps += [ "/bin/systemctl" ]
+ self.agent_service_name = 'waagent'
+ self.init_script_file='/usr/lib/systemd/system/waagent.service'
+ self.dhcp_client_name='systemd-networkd'
+ self.getpidcmd='pidof '
+ self.shadow_file_mode=0640
+ self.dhcp_enabled=True
+
+ def checkPackageInstalled(self,p):
+ """
+ There is no package manager in Photon. Return 1 since it must be preinstalled.
+ """
+ return 1
+
+ def checkDependencies(self):
+ for a in self.requiredDeps:
+ if Run("which " + a + " > /dev/null 2>&1",chk_err=False):
+ Error("Missing required dependency: " + a)
+ return 1
+ return 0
+
+
+ def checkPackageUpdateable(self,p):
+ """
+ There is no package manager in Photon. Return 0 since it can't be updated via package.
+ """
+ return 0
+
+ def startAgentService(self):
+ return Run('systemctl start ' + self.agent_service_name)
+
+ def stopAgentService(self):
+ return Run('systemctl stop ' + self.agent_service_name)
+
+ def restartSshService(self):
+ return Run('systemctl restart sshd')
+
+ def sshDeployPublicKey(self,fprint,path):
+ """
+ We support PKCS8.
+ """
+ if Run("ssh-keygen -i -m PKCS8 -f " + fprint + " >> " + path):
+ return 1
+ else :
+ return 0
+
+ def RestartInterface(self, iface):
+ Run("systemctl restart systemd-networkd")
+
+ def CreateAccount(self, user, password, expiration, thumbprint):
+ """
+ Create a user account, with 'user', 'password', 'expiration', ssh keys
+ and sudo permissions.
+ Returns None if successful, error string on failure.
+ """
+ userentry = None
+ try:
+ userentry = pwd.getpwnam(user)
+ except:
+ pass
+ uidmin = None
+ try:
+ uidmin = int(GetLineStartingWith("UID_MIN", "/etc/login.defs").split()[1])
+ except:
+ pass
+ if uidmin == None:
+ uidmin = 100
+ if userentry != None and userentry[2] < uidmin and userentry[2] != self.CORE_UID:
+ Error("CreateAccount: " + user + " is a system user. Will not set password.")
+ return "Failed to set password for system user: " + user + " (0x06)."
+ if userentry == None:
+ command = "useradd --create-home --password '*' " + user
+ if expiration != None:
+ command += " --expiredate " + expiration.split('.')[0]
+ if Run(command):
+ Error("Failed to create user account: " + user)
+ return "Failed to create user account: " + user + " (0x07)."
+ else:
+ Log("CreateAccount: " + user + " already exists. Will update password.")
+ if password != None:
+ RunSendStdin("chpasswd", user + ":" + password + "\n")
+ try:
+ if password == None:
+ SetFileContents("/etc/sudoers.d/waagent", user + " ALL = (ALL) NOPASSWD: ALL\n")
+ else:
+ SetFileContents("/etc/sudoers.d/waagent", user + " ALL = (ALL) ALL\n")
+ os.chmod("/etc/sudoers.d/waagent", 0440)
+ except:
+ Error("CreateAccount: Failed to configure sudo access for user.")
+ return "Failed to configure sudo privileges (0x08)."
+ home = MyDistro.GetHome()
+ if thumbprint != None:
+ dir = home + "/" + user + "/.ssh"
+ CreateDir(dir, user, 0700)
+ pub = dir + "/id_rsa.pub"
+ prv = dir + "/id_rsa"
+ Run("ssh-keygen -y -f " + thumbprint + ".prv > " + pub)
+ SetFileContents(prv, GetFileContents(thumbprint + ".prv"))
+ for f in [pub, prv]:
+ os.chmod(f, 0600)
+ ChangeOwner(f, user)
+ SetFileContents(dir + "/authorized_keys", GetFileContents(pub))
+ ChangeOwner(dir + "/authorized_keys", user)
+ Log("Created user account: " + user)
+ return None
+
+ def startDHCP(self):
+ Run("systemctl start " + self.dhcp_client_name, chk_err=False)
+
+ def stopDHCP(self):
+ Run("systemctl stop " + self.dhcp_client_name, chk_err=False)
+
+ def translateCustomData(self, data):
+ return base64.b64decode(data)
+
+ def getConfigurationPath(self):
+ return "/etc/waagent.conf"
+
+
############################################################
# FreeBSD
############################################################
@@ -6934,6 +7067,7 @@
Return MyDistro object.
NOTE: Logging is not initialized at this point.
"""
+ dist_class_name = 'photonDistro'
if dist_class_name == '':
if 'Linux' in platform.system():
Distro=DistInfo()[0]