diff options
Diffstat (limited to 'ldap-site-mngmt/webinterface/roles')
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/menu.dwt | 22 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/role_add.php | 53 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/role_delete.php | 57 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/role_show.dwt | 70 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/role_show.php | 116 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/roles.dwt | 79 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/roles.php | 26 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/roles_footer.inc.php | 18 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/roles_header.inc.php | 19 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/roles_menu.php | 87 | ||||
-rw-r--r-- | ldap-site-mngmt/webinterface/roles/roles_start.dwt | 37 |
11 files changed, 584 insertions, 0 deletions
diff --git a/ldap-site-mngmt/webinterface/roles/menu.dwt b/ldap-site-mngmt/webinterface/roles/menu.dwt new file mode 100644 index 00000000..9aadc1c5 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/menu.dwt @@ -0,0 +1,22 @@ + +<table cellpadding='5' cellspacing='0' border='0' width='100%'> + + + + <!-- BEGIN DYNAMIC BLOCK: Hauptmenu --> + + <tr valign='middle' align='left'>
+
+ <td width='8%' align='right' style="border-style=none;"> </td> + <td width="8%" align="left" style="border-width:1 0 1 1;border-color:#000000;border-style:solid;padding:5;background-color:{FARBE}"> </td>
+ <td width="74%" align="left" style="border-width:1 1 1 0;border-color:#000000;border-style:solid;padding:5;background-color:{FARBE}"> + <a href="{LINK_M}" style="text-decoration:none"><b class="standard_schrift">{TEXT_M}</b></a></td>
+ <td width='10%'> </td> + + </tr> + <tr height='5'></tr> + <!-- END DYNAMIC BLOCK: Hauptmenu -->
+ + + +</table>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/role_add.php b/ldap-site-mngmt/webinterface/roles/role_add.php new file mode 100644 index 00000000..3c628066 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/role_add.php @@ -0,0 +1,53 @@ +<?php + +include('../standard_header.inc.php'); + + +$adduser = $_POST['adduser']; +$role = $_POST['role']; +$menr = $_POST['menr']; + +$exp = explode('_',$adduser); +$adduserDN = $exp[0]; +$adduserUID = $exp[1]; + +echo " +<html> +<head> + <title>Roles Management</title> + <link rel='stylesheet' href='../styles.css' type='text/css'> +</head> +<body> +<table border='0' cellpadding='30' cellspacing='0'> +<tr><td>"; + +# print_r($adduser);echo "<br>"; +# print_r($adduserDN);echo "<br>"; +# print_r($adduserUID);echo "<br>"; +# print_r($role);echo "<br>"; +# print_r($menr);echo "<br><br>"; + +$url = 'role_show.php?role='.$role.'&mnr='.$menr; + +if ($adduser != 'none'){ + $res = new_role_member($adduserDN,$role,$auDN,$domDN); + if ($res == 1){ + $mesg = "Der Benutzer <b>".$adduserUID."</b> wurde erfolgreich als neuer <b>".$role."</b> aufgenommen.<br><br>"; + }else{ + $mesg = "Fehler! Der Benutzer <b>".$adduserUID."</b> konnte nicht aufgenommen werden<br><br>"; + } + $mesg .= "Sie werden automatisch auf die vorherige Seite zurückgeleitet. <br> + Falls nicht, klicken Sie hier <a href='role_show.php?role=$role&mnr=$menr' style='publink'>back</a>"; + redirect(3, $url, $mesg, $addSessionId = TRUE); +} + +else { + $mesg = "Sie haben keinen Benutzer ausgewählt<br><br> + Sie werden automatisch auf die vorherige Seite zurückgeleitet. <br> + Falls nicht, klicken Sie hier <a href='role_show.php?role=$role&mnr=$menr' style='publink'>back</a>"; + redirect(3, $url, $mesg, $addSessionId = TRUE); +} + +echo "</td></tr></table></body> +</html>"; +?>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/role_delete.php b/ldap-site-mngmt/webinterface/roles/role_delete.php new file mode 100644 index 00000000..297136e0 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/role_delete.php @@ -0,0 +1,57 @@ +<?php + +include('../standard_header.inc.php'); + + +$deluser = $_POST['deluser']; +$role = $_POST['role']; +$menr = $_POST['menr']; + +echo " +<html> +<head> + <title>Roles Management</title> + <link rel='stylesheet' href='../styles.css' type='text/css'> +</head> +<body> +<table border='0' cellpadding='30' cellspacing='0'> +<tr><td>"; + +if (isset($_POST['deluser'])){ + + # print_r($deluser);echo "<br>"; + # print_r($role);echo "<br>"; + # print_r($menr);echo "<br>"; + + $url = 'role_show.php?role='.$role.'&mnr='.$menr; + $mesg = ""; + + foreach ($deluser as $item){ + $exp = explode('_',$item); + $deluserDN = $exp[0]; + $deluserUID = $exp[1]; + # print_r($deluserDN);echo "<br>"; + # print_r($deluserUID);echo "<br>"; + $res = delete_role_member($deluserDN,$role,$auDN,$domDN); + if ($res == 1){ + $mesg .= "Der Benutzer <b>".$deluserUID."</b> wurde erfolgreich aus der Rolle <b>".$role."</b> entfernt.<br>"; + }else{ + $mesg .= "<b>Fehler!</b> Der Benutzer <b>".$deluserUID."</b> konnte nicht entfernt werden<br>"; + } + } + $mesg .= "<br>Sie werden automatisch auf die vorherige Seite zurückgeleitet. <br> + Falls nicht, klicken Sie hier <a href='role_show.php?role=$role&mnr=$menr' style='publink'>back</a><br><br>"; + redirect(3, $url, $mesg, $addSessionId = TRUE); + +} + +else { + $mesg .= "<br>Sie haben keinen Benutzer ausgewählt<br><br> + Sie werden automatisch auf die vorherige Seite zurückgeleitet. <br> + Falls nicht, klicken Sie hier <a href='role_show.php?role=$role&mnr=$menr' style='publink'>back</a>"; + redirect(3, $url, $mesg, $addSessionId = TRUE); +} + +echo "</td></tr></table></body> +</html>"; +?>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/role_show.dwt b/ldap-site-mngmt/webinterface/roles/role_show.dwt new file mode 100644 index 00000000..3eb05b79 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/role_show.dwt @@ -0,0 +1,70 @@ +<table border='0' cellpadding='5' cellspacing='0' width='100%'> + <tr> + <td colspan='2'><h3>{ROLE_DESC}</h3></td></tr><tr><td height='20'></td> + </tr> + <tr><td> + <table cellpadding='7' cellspacing='0' border='1' align='left' width='90%' style='border-width: 0 0 0 0;'> + <tr> + <td width='5%' style='border-color: black; border-style: solid; border-width: 0 0 3 0;'> </td> + <td width='25%' style='border-color: black; border-style: solid; border-width: 0 0 3 0;'><b>Benutzer</b></td> + <td width='25%' style='border-color: black; border-style: solid; border-width: 0 0 3 0;'><b>UID</b></td> + <td width='45%' style='border-color: black; border-style: solid; border-width: 0 0 3 0;'><b>Email</b></td> + </tr> + + <form action='role_delete.php' method='post'> + + <!-- BEGIN DYNAMIC BLOCK: Members --> + <tr> + <td style='border-color: black; border-style: solid; border-width: 0 0 1 0;'> + <input type='checkbox' name='deluser[]' value='{VALUE}_{UID}' size='15' class='medium_form_checkbox'></td> + <td style='border-color: black; border-style: solid; border-width: 0 0 1 0;'>{USERNAME} </td> + <td style='border-color: black; border-style: solid; border-width: 0 0 1 0;'>{UID} </td> + <td style='border-color: black; border-style: solid; border-width: 0 0 1 0;'><a href'mailto:{MAIL}' style='publink'>{MAIL}</a> </td> + </tr> + <!-- END DYNAMIC BLOCK: Members --> + <input type='hidden' name='role' value='{ROLE}'> + <input type='hidden' name='menr' value='{MENR}'> + + + <tr> + <td colspan='3' style='border-width: 0 0 0 0;'><input type='Submit' name='delete' value='entfernen' class='small_loginform_button'></td> + + </form> + </tr> + </table></td> + </tr> + + <tr height='30'></tr> + <tr> + <td colspan='2'><h4>Neuen Administrator anlegen:</h4></td> + </tr> + <tr><td height='10'></td></tr> + <tr><td> + <table cellpadding='7' cellspacing='0' border='1' align='left' width='90%' style='border-width: 0 0 0 0;'> + <tr> + + <form action='role_add.php' method='post'> + + <td width='60%' style='border-color: black; border-style: solid; border-width: 3 0 1 0;'> + Wählen Sie einen Benutzer aus <br> + <select name='adduser' size='1' class='medium_form_selectbox'> + <option selected value='none'>----------</option> + + <!-- BEGIN DYNAMIC BLOCK: Users --> + <option value='{UDN}_{USER}'>{USER}</option> + <!-- END DYNAMIC BLOCK: Users --> + + </select> + <input type='hidden' name='role' value='{ROLE}'> + <input type='hidden' name='menr' value='{MENR}'> + </td> + </tr> + <tr> + <td style='border-width: 0 0 0 0;'><input type='Submit' name='add' value='anlegen' class='small_loginform_button'></td> + + </form> + </tr> + </table></td> + </tr> + +</table>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/role_show.php b/ldap-site-mngmt/webinterface/roles/role_show.php new file mode 100644 index 00000000..d209d3e9 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/role_show.php @@ -0,0 +1,116 @@ +<?php +include('../standard_header.inc.php'); + +# 1. Seitentitel - wird in der Titelleiste des Browser angezeigt. +$titel = "Roles Management"; +# 2. Nummer des zugehörigen Hauptmenus (Registerkarte) beginnend bei 0, siehe Dokumentation.doc. +$mainnr = 1; +$mnr = 1; +# 3. Dateiname und evtl. Pfad des Templates für die Webseite +$webseite = "role_show.dwt"; +$role = "MainAdmin"; + +include("../class.FastTemplate.php"); + +include("roles_header.inc.php"); + + +############################################################################### + +$mnr = $_GET['mnr']; + +# Menuleiste erstellen +createMainMenu($rollen, $mainnr); +createRolesMenu($rollen, $mnr, $assocdom); + +#################################### +# Admins anzeigen und loeschen + +$role = $_GET['role']; +$roles_array = get_roles($auDN); +# print_r($roles_array); + +# jeder Rolle entsprechend Members holen und Überschrift setzen +switch ($role){ +case 'MainAdmin': + $template->assign(array("ROLE" => "MainAdmin","ROLE_DESC" => "Haupt Administratoren","MENR" => $mnr)); + $members = $roles_array['MainAdmin']; + break; +case 'HostAdmin': + $template->assign(array("ROLE" => "HostAdmin","ROLE_DESC" => "Administratoren - Rechner, Rechnergruppen, Remote Boot Services (PXE)","MENR" => $mnr)); + $members = $roles_array['HostAdmin']; + break; +case 'DhcpAdmin': + $template->assign(array("ROLE" => "DhcpAdmin","ROLE_DESC" => "Administratoren - DHCP","MENR" => $mnr)); + $members = $roles_array['DhcpAdmin']; + break; +case 'ZoneAdmin': + $template->assign(array("ROLE" => "ZoneAdmin","ROLE_DESC" => "Administratoren - DNS Zone [ {DOM} ]","MENR" => $mnr,"DOM" => $assocdom)); + $members = $roles_array['ZoneAdmin']; + break; +} + +# print_r($members); echo "<br><br>"; + +# für jedes Member Daten holen (Benutzername, UID) +if ( count($members) != 0 ){ + $members_data = array(); + foreach ($members as $item){ + $members_data[] = get_user_data($item,array("dn","cn","uid","mail")); + # print_r(get_user_data($item,array("dn","cn","uid"))); echo "<br>"; + } +} +# echo "<br>"; +# print_r($members_data); echo "<br><br>"; + +if (count($members_data) != 0){ + $template->define_dynamic("Members", "Webseite"); + foreach ($members_data as $item){ + $template->assign(array("VALUE" => $item['dn'], + "USERNAME" => $item['cn'], + "UID" => $item['uid'], + "MAIL" => $item['mail'])); + $template->parse("MEMBERS_LIST", ".Members"); + } +}else{ + $template->assign(array("VALUE" => "","USERNAME" => "","UID" => "","MAIL" => "")); +} + + +############################################## +# Admin anlegen ... +$users_array = get_users(); +# print_r($users_array); echo "<br><br>"; + +if (count($members_data) != 0){ +for ($i=0; $i < count($users_array); $i++){ + foreach ($members_data as $item){ + if ($users_array[$i]['uid'] == $item['uid']){ + array_splice($users_array, $i, 1); + # break; + } + } +} +# print_r($users_array); echo "<br><br>"; +} + +# if (count($users_array) != 0){ + $template->define_dynamic("Users", "Webseite"); + foreach ($users_array as $item){ + $template->assign(array("UDN" => $item['dn'], + "USER" => $item['uid'])); + $template->parse("USERS_LIST", ".Users"); + } +#}else{ +# $template->assign(array("UDN" => "","USER" => "")); +# } + + + + + +############################################################################### + +include("roles_footer.inc.php"); + +?>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/roles.dwt b/ldap-site-mngmt/webinterface/roles/roles.dwt new file mode 100644 index 00000000..8e775327 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/roles.dwt @@ -0,0 +1,79 @@ +<html> + +<head> + <title>{SEITENTITEL}</title> + <link rel='stylesheet' href='../styles.css' type='text/css'></head> +<body> + +<table cellpadding='0' cellspacing='0' border='0' width='95%' height='8%'> + <tr> + <td width='35%'> + <table cellpadding='5' cellspacing='0' border='0' width='100%'> + <tr valign='top'> + <td width='1'></td> + <td><h2>Rechner und IP Management</h2></td> + </tr> + </table> + </td> + + <td width='40%'> + <table cellpadding='5' cellspacing='0' border='0' width='100%'> + <tr valign='top' align='left'> + <td> + <h4><a href='../start.php' class='headerlink'>Startseite</a> + >> <a href='../au/au.php' class='headerlink'>{AU}</a> [ {DOMAIN} ]</h4> + </td> + </tr> + </table> + </td> + <td width='25%'> + <table cellpadding='5' cellspacing='0' border='0' width='100%' align='right'> + <tr valign='top' align='right'> + <td> + {LOGIN} + </td> + </tr> + </table> + </td> + </tr> +</table> +<table cellpadding='5' cellspacing='0' border='0' width='95%' height='7%'> +<tr> + <td>{MAINMENU}</td> +</tr> +</table> + + +<hr align='center' width='98%' noshade> + + + +<table cellpadding='5' cellspacing='0' border='0' width='100%' height='85%'> + + <tr valign='top' height='100%'> + <td width='28%'> + <table cellpadding='5' cellspacing='0' border='0' width='100%'> + <tr><td> + + {NAVIGATION} + + </td></tr> + </table> + </td> + + <td width='72%'> + <table cellpadding='5' cellspacing='0' border='0' width='100%'> + <tr><td> + + {HAUPTFENSTER} + + </td></tr> + </table> + </td> + + </tr> +</table> + +</body> + +</html> diff --git a/ldap-site-mngmt/webinterface/roles/roles.php b/ldap-site-mngmt/webinterface/roles/roles.php new file mode 100644 index 00000000..0ae79cf9 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/roles.php @@ -0,0 +1,26 @@ +<?php +include('../standard_header.inc.php'); + +# 1. Seitentitel - wird in der Titelleiste des Browser angezeigt. +$titel = "Roles Management"; +# 2. Nummer des zugehörigen Hauptmenus (Registerkarte) beginnend bei 0, siehe Dokumentation.doc. +$mainnr = 1; +$mnr = 0; +# 3. Dateiname und evtl. Pfad des Templates für die Webseite +$webseite = "roles_start.dwt"; + +include("../class.FastTemplate.php"); + +include("roles_header.inc.php"); + +################################################################################### + +# Menuleiste erstellen +createMainMenu($rollen, $mainnr); +createRolesMenu($rollen, $mnr, $assocdom); + +################################################################################### + +include("roles_footer.inc.php"); + +?>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/roles_footer.inc.php b/ldap-site-mngmt/webinterface/roles/roles_footer.inc.php new file mode 100644 index 00000000..311721c5 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/roles_footer.inc.php @@ -0,0 +1,18 @@ +<?php + +$template->assign(array("PFAD" => $START_PATH)); + +# Daten in die Vorlage parsen +$template->parse("LOGIN", "Login"); +$template->parse("MAINMENU", "Mmenu"); +$template->parse("NAVIGATION", "Menu"); +$template->parse("HAUPTFENSTER", "Webseite"); +$template->parse("PAGE", "Vorlage"); + +# Fertige Seite an den Browser senden +$template->FastPrint("PAGE"); + +# Abmelden vom LDAP +ldap_unbind($ds); + +?>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/roles_header.inc.php b/ldap-site-mngmt/webinterface/roles/roles_header.inc.php new file mode 100644 index 00000000..74c96f74 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/roles_header.inc.php @@ -0,0 +1,19 @@ +<?php +include("roles_menu.php"); + +$template = new FastTemplate("."); +# dem erstellten Template-Objekt eine Vorlage zuweisen +$definedTemplates = array("Vorlage" => "roles.dwt", + "Login" => "../logout_form.inc.dwt", + "Mmenu" => "../hauptmenue.dwt", + "Menu" => "menu.dwt", + "Webseite" => $webseite); +if (isset($additionalTemplates)) { + foreach ($additionalTemplates as $templateKey => $templateFile) { + $definedTemplates[$templateKey] = $templateFile; + } +} +$template->define($definedTemplates); +$template->assign(array("SEITENTITEL" => $titel, "AU" => $au_ou, "DOMAIN" => $assocdom, "USERCN" => $usercn)); + +?>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/roles_menu.php b/ldap-site-mngmt/webinterface/roles/roles_menu.php new file mode 100644 index 00000000..e389f4e9 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/roles_menu.php @@ -0,0 +1,87 @@ +<?php + + +function createRolesMenu($rollen , $mnr, $assocdom) { + global $template; + global $START_PATH; + # Struktur der Registerkartenleiste + if ($assocdom != ""){ + $hauptmenu = array(array("link" => "roles.php", + "text" => "Übersicht", + "zugriff" => array("MainAdmin")), + array("link" => "role_show.php?role=MainAdmin&mnr=1", + "text" => "Main Admins", + "zugriff" => array("MainAdmin")), + array("link" => "role_show.php?role=HostAdmin&mnr=2", + "text" => "Host Admins", + "zugriff" => array("MainAdmin")), + array("link" => "role_show.php?role=DhcpAdmin&mnr=3", + "text" => "DHCP Admins", + "zugriff" => array("MainAdmin")), + array("link" => "role_show.php?role=ZoneAdmin&mnr=4", + "text" => "DNS Admins", + "zugriff" => array("MainAdmin"))); + }else{ + $hauptmenu = array(array("link" => "roles.php", + "text" => "Übersicht", + "zugriff" => array("MainAdmin")), + array("link" => "role_show.php?role=MainAdmin&mnr=1", + "text" => "Main Admins", + "zugriff" => array("MainAdmin")), + array("link" => "role_show.php?role=HostAdmin&mnr=2", + "text" => "Host Admins", + "zugriff" => array("MainAdmin")), + array("link" => "role_show.php?role=DhcpAdmin&mnr=3", + "text" => "DHCP Admins", + "zugriff" => array("MainAdmin"))); + } + # $rollen = array_keys($roles); + + # Zusammenstellen der Menuleiste + $template->define_dynamic("Hauptmenu", "Menu"); + $i=0; + foreach($hauptmenu as $item) { + if($item['zugriff'] === "alle" || vergleicheArrays($rollen , $item['zugriff'])) { + if ($i==0) { + if ($mnr==0) { + $zwisch=""; + $lastaktive=true; + $farb="#505050"; + } + else { + $zwisch=""; + $farb="#A0A0A0"; + $lastaktive=false; + } + } + else { + if ($mnr==$i) { + $zwisch=""; + $lastaktive=true; + $farb="#505050"; + } + else { + $farb="#A0A0A0"; + if ($lastaktive) {$zwisch="";} + else {$zwisch="";} + $lastaktive=false; + } + } + $template->assign(array("ZWISCHEN" => $zwisch, + "FARBE" => $farb, + "LINK_M" => $item["link"], + "TEXT_M" => $item["text"])); + $template->parse("HAUPTMENU_LIST", ".Hauptmenu"); + + } + $i=$i+1; + } + if ($lastaktive) {$template->assign(array("ENDE" => ""));} + else { + $template->assign(array("ENDE" => "")); + } + +} + + +?>
\ No newline at end of file diff --git a/ldap-site-mngmt/webinterface/roles/roles_start.dwt b/ldap-site-mngmt/webinterface/roles/roles_start.dwt new file mode 100644 index 00000000..22ab0857 --- /dev/null +++ b/ldap-site-mngmt/webinterface/roles/roles_start.dwt @@ -0,0 +1,37 @@ +<table border='0' cellpadding='5' cellspacing='0' width='90%'> + <tr> + <td colspan='2'><h3>Modul - Administratoren Rollen Management: </h3></td> + </tr> + <tr> + <td height='10'></td> + </tr> + <tr> + <td> + <p>Dieses Modul dient der Verwaltung von Administratoren Rollen in ihrer Abteilung. + Benutzen Sie die Navigation links, um die Verwaltungsbereiche der einzelnen Rollen anzusteuern. + Dort koennen Sie dann Benutzer den Rollen zuweisen oder wieder entziehen.</p> + <p>Folgende administrative Rollen stehen zur Verfuegung:</p> + <ul> + <li><p><b>Main Admins</b></p> + Hauptadministratoren, der AU mit uneingeschraenkten Rechten. Sie verwalten: u.a. + untergeordnete AUs (anlegen/loeschen/im DNS anmelden), + Rollen, IP Adressen und deren Delegierung, Rechner (Gruppen), deren Hardware-Profile und + PXE Boot Konfigurationen, sowie die Dienste DHCP und DNS. + </li> + <li><p><b>Host Admins</b></p> + Diese verwalten Rechner (Gruppen), deren Hardware-Profile und PXE Boot Konfigurationen, + und koennen diese im DHCP und DNS anmelden (verwalten im DNS nur deren Namenseintraege). + </li> + <li><p><b>DHCP Admins</b></p> + Verwalten den DHCP Dienst, d.h. Subnetz-, Pool-, Class-Objekte. + </li> + <li><p><b>DNS Admins</b></p> + Sind die Administratoren der mit der AU assozierten DNS Zone. D.h. sie verwalten SOA, + Include Direktiven untergeordneter Include Files, sowie alle Nameneintraege der Zone. + </li> + </ul> + + </td> + </tr> + +</table>
\ No newline at end of file |